Module: FilePipeline

Defined in:
lib/file_pipeline.rb,
lib/file_pipeline/errors.rb,
lib/file_pipeline/pipeline.rb,
lib/file_pipeline/versions.rb,
lib/file_pipeline/versioned_file.rb,
lib/file_pipeline/file_operations.rb,
lib/file_pipeline/versions/history.rb,
lib/file_pipeline/file_operations/results.rb,
lib/file_pipeline/errors/source_file_error.rb,
lib/file_pipeline/errors/source_directory_error.rb,
lib/file_pipeline/file_operations/file_operation.rb,
lib/file_pipeline/file_operations/log_data_parser.rb,
lib/file_pipeline/errors/failed_modification_error.rb,
lib/file_pipeline/file_operations/exif_manipulable.rb,
lib/file_pipeline/errors/missing_version_file_error.rb,
lib/file_pipeline/file_operations/captured_data_tags.rb,
lib/file_pipeline/file_operations/default_operations/scale.rb,
lib/file_pipeline/file_operations/default_operations/exif_recovery.rb,
lib/file_pipeline/file_operations/default_operations/exif_redaction.rb,
lib/file_pipeline/file_operations/default_operations/exif_restoration.rb,
lib/file_pipeline/file_operations/default_operations/ptiff_conversion.rb

Overview

Module that contains classes to build a file processing pipeline that applies a defined batch of file operations non-destructively to a VersionedFile.

Defined Under Namespace

Modules: Errors, FileOperations, Versions Classes: Pipeline, VersionedFile

Constant Summary collapse

DEFAULT_DIR =

Constant for the defualt directory for file operations.

'file_pipeline/file_operations/default_operations'

Class Method Summary collapse

Class Method Details

.<<(directory) ⇒ Object

Adds directory to the Array of #source_directories which will be searched for source files when loading file operations. directory will be prepended. Therefore, directories will be searcherd in reverse order of them being added.



21
22
23
24
25
26
27
28
29
# File 'lib/file_pipeline.rb', line 21

def self.<<(directory)
  directory_path = File.expand_path directory
  return source_directories if source_directories.include? directory_path

  no_dir = !File.directory?(directory_path)
  raise Errors::SourceDirectoryError, dir: directory if no_dir

  @src_directories.prepend directory_path
end

.load(file_operation) ⇒ Object

Returns the constant for the file_operation class. If the constant is not defined, will try to require the source file.



33
34
35
36
37
38
39
40
# File 'lib/file_pipeline.rb', line 33

def self.load(file_operation)
  const = file_operation.split('_').map(&:capitalize).join
  FilePipeline.load_file(file_operation) unless const_defined? const
  const_get 'FileOperations::' + const
rescue NameError
  # TODO: implement autogenerating module names from file_operation src path
  const_get const
end

.load_file(src_file) ⇒ Object

Will search for src_file in .source_directories and require the file if.



44
45
46
47
48
49
50
51
52
53
# File 'lib/file_pipeline.rb', line 44

def self.load_file(src_file)
  src_file += '.rb' unless src_file.end_with? '.rb'
  src_path = FilePipeline.source_path src_file
  if src_path.nil?
    raise Errors::SourceFileError,
          file: src_file,
          directories: FilePipeline.source_directories
  end
  require src_path
end

.new_basename(kind = :timestamp) ⇒ Object

Creates a file basename consisting of either a timestamp or a UUID, depending on the kind argument (:timestamp or :random; default: :timestamp)



58
59
60
61
62
63
64
65
# File 'lib/file_pipeline.rb', line 58

def self.new_basename(kind = :timestamp)
  case kind
  when :random
    SecureRandom.uuid
  when :timestamp
    Time.now.strftime('%Y-%m-%dT%H:%M:%S.%N')
  end
end

.path(dir, filename) ⇒ Object

Returns a String with the /directory/filename.



68
69
70
# File 'lib/file_pipeline.rb', line 68

def self.path(dir, filename)
  File.join dir, filename
end

.source_directoriesObject

Returns an array of directory paths that may contain source files for file operation classes.



74
75
76
77
78
# File 'lib/file_pipeline.rb', line 74

def self.source_directories
  return @src_directories if @src_directories

  @src_directories = [FilePipeline.path(__dir__, DEFAULT_DIR)]
end

.source_path(file) ⇒ Object

Searches .source_directories and for file, and returns the full path (directory and filename) for the first match or nil if the file is nowhere found. Since directories are added in reverse order (see .<<) this will give redefinitions of file operations in custom directories precedence over the default directory, thus allowing overriding of file operation definitions.



86
87
88
89
90
91
92
# File 'lib/file_pipeline.rb', line 86

def self.source_path(file)
  FilePipeline.source_directories.each do |dir|
    full_path = FilePipeline.path(dir, file)
    return full_path if File.exist? full_path
  end
  nil
end