Class: Assembly::ObjectFile

Inherits:
Object
  • Object
show all
Defined in:
lib/assembly/object_file.rb,
lib/assembly/object_file/version.rb

Overview

This class contains generic methods to operate on any file.

Constant Summary collapse

VALID_MIMETYPE_METHODS =
%i[override exif file extension].freeze
VERSION =

Gem version

'2.1.3'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, params = {}) ⇒ ObjectFile

Returns a new instance of ObjectFile.

Parameters:

  • path (String)

    full path to the file to be worked with

  • params (Hash<Symbol => Object>) (defaults to: {})

    options used during content metadata generation

Options Hash (params):

  • :file_attributes (Hash<Symbol => ['yes', 'no']>)

    e.g.: :preserve=>‘yes’,:shelve=>‘no’,:publish=>‘no’, defaults pulled from mimetype

  • :label (String)

    a resource label (files bundled together will just get the first file’s label attribute if set)

  • :provider_md5 (String)

    pre-computed MD5 checksum

  • :provider_sha1 (String)

    pre-computed SHA1 checksum

  • :relative_path (String)

    if you want the file ids in the content metadata it can be set, otherwise content metadata will get the full path

  • :mime_type_order (Array)

    can be set to the order in which you want mimetypes to be determined options are :override (from manual overide mapping if exists),

    :exif (from exif if exists)
    :extension (from file extension)
    :file (from unix file system command)
    

    the default is defined in the private ‘default_mime_type_order` method but you can override to set your own order



52
53
54
55
56
57
58
59
60
# File 'lib/assembly/object_file.rb', line 52

def initialize(path, params = {})
  @path = path
  @label = params[:label]
  @file_attributes = params[:file_attributes]
  @relative_path = params[:relative_path]
  @provider_md5 = params[:provider_md5]
  @provider_sha1 = params[:provider_sha1]
  @mime_type_order = params[:mime_type_order] || default_mime_type_order
end

Instance Attribute Details

#file_attributesObject

Returns the value of attribute file_attributes.



30
31
32
# File 'lib/assembly/object_file.rb', line 30

def file_attributes
  @file_attributes
end

#labelObject

Returns the value of attribute label.



30
31
32
# File 'lib/assembly/object_file.rb', line 30

def label
  @label
end

#mime_type_orderObject

Returns the value of attribute mime_type_order.



30
31
32
# File 'lib/assembly/object_file.rb', line 30

def mime_type_order
  @mime_type_order
end

#pathObject

Returns the value of attribute path.



30
31
32
# File 'lib/assembly/object_file.rb', line 30

def path
  @path
end

#provider_md5Object

Returns the value of attribute provider_md5.



30
31
32
# File 'lib/assembly/object_file.rb', line 30

def provider_md5
  @provider_md5
end

#provider_sha1Object

Returns the value of attribute provider_sha1.



30
31
32
# File 'lib/assembly/object_file.rb', line 30

def provider_sha1
  @provider_sha1
end

#relative_pathObject

Returns the value of attribute relative_path.



30
31
32
# File 'lib/assembly/object_file.rb', line 30

def relative_path
  @relative_path
end

Class Method Details

.common_path(strings) ⇒ String

Example:

puts Assembly::ObjectFile.common_prefix(['/Users/peter/00/test.tif','/Users/peter/05/test.jp2'])
# => '/Users/peter/0'

Parameters:

  • strings (Array)

    Array of filenames with paths

Returns:

  • (String)

    longest common initial path of filenames passed in



16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/assembly/object_file.rb', line 16

def self.common_path(strings)
  return nil if strings.empty?

  n = 0
  x = strings.last
  n += 1 while strings.all? { |s| s[n] && (s[n] == x[n]) }
  common_prefix = x[0...n]
  if common_prefix[-1, 1] == '/' # check if last element of the common string is the end of a directory
    common_prefix # if not, split string along directories, and reject last one
  else
    "#{common_prefix.split('/')[0..-2].join('/')}/" # if it was, then return the common prefix directly
  end
end

Instance Method Details

#dirnameObject



66
67
68
# File 'lib/assembly/object_file.rb', line 66

def dirname
  File.dirname(path)
end

#exifMiniExiftool

Returns exif mini_exiftool gem object wrapper for exiftool.

Returns:

  • (MiniExiftool)

    exif mini_exiftool gem object wrapper for exiftool



79
80
81
82
83
84
85
86
87
88
# File 'lib/assembly/object_file.rb', line 79

def exif
  @exif ||= begin
    check_for_file
    MiniExiftool.new(path, replace_invalid_chars: '?')
  rescue MiniExiftool::Error
    # MiniExiftool may raise an error on files it doesn't know how to handle (disk images for example)
    # but we don't want this to prevent an ObjectFile from being created, so just swallow it.
    nil
  end
end

#extObject



70
71
72
# File 'lib/assembly/object_file.rb', line 70

def ext
  File.extname(path)
end

#file_exists?Boolean

Returns file exists and is not a directory.

Returns:

  • (Boolean)

    file exists and is not a directory



156
157
158
# File 'lib/assembly/object_file.rb', line 156

def file_exists?
  @file_exists ||= (File.exist?(path) && !File.directory?(path))
end

#filenameObject



62
63
64
# File 'lib/assembly/object_file.rb', line 62

def filename
  File.basename(path)
end

#filename_without_extObject



74
75
76
# File 'lib/assembly/object_file.rb', line 74

def filename_without_ext
  File.basename(path, ext)
end

#filesizeInteger

Returns file size in bytes.

Returns:

  • (Integer)

    file size in bytes



150
151
152
153
# File 'lib/assembly/object_file.rb', line 150

def filesize
  check_for_file
  @filesize ||= File.size(path)
end

#image?Boolean

Returns true if the mime-types gem recognizes it as an image.

Returns:

  • (Boolean)

    true if the mime-types gem recognizes it as an image



125
126
127
128
129
130
131
132
# File 'lib/assembly/object_file.rb', line 125

def image?
  return false if object_type != :image

  # We exclude TARGA images here because we've seen where the file is a disk image and
  # when we look for a mime type it is `image/x-tga', however it is not
  # recognizable by exiftool.  See https://github.com/sul-dlss/assembly-objectfile/issues/98
  mimetype != 'image/x-tga'
end

#jp2able?Boolean

Returns true if we can create a jp2 from the file.

Returns:

  • (Boolean)

    true if we can create a jp2 from the file



143
144
145
146
147
# File 'lib/assembly/object_file.rb', line 143

def jp2able?
  return false unless exif

  Assembly::VALID_IMAGE_MIMETYPES.include?(mimetype)
end

#md5String

Returns computed md5 checksum.

Returns:

  • (String)

    computed md5 checksum



91
92
93
94
# File 'lib/assembly/object_file.rb', line 91

def md5
  check_for_file unless @md5
  @md5 ||= Digest::MD5.file(path).hexdigest
end

#mimetypeString

Returns mimetype information for the current file based on the ordering set in default_mime_type_order

We stop computing mimetypes as soon as we have a method that returns a value

Returns:

  • (String)

    mimetype of the file



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/assembly/object_file.rb', line 105

def mimetype
  @mimetype ||= begin
    check_for_file
    mimetype = ''
    mime_type_order.each do |mime_type_method|
      mimetype = send("#{mime_type_method}_mimetype") if VALID_MIMETYPE_METHODS.include?(mime_type_method)
      break if mimetype.present?
    end
    mimetype
  end
end

#object_typeSymbol

Returns the type of object, could be :application (for PDF or Word, etc), :audio, :image, :message, :model, :multipart, :text or :video.

Returns:

  • (Symbol)

    the type of object, could be :application (for PDF or Word, etc), :audio, :image, :message, :model, :multipart, :text or :video



119
120
121
122
# File 'lib/assembly/object_file.rb', line 119

def object_type
  lookup = MIME::Types[mimetype][0]
  lookup.nil? ? :other : lookup.media_type.to_sym
end

#sha1String

Returns computed sha1 checksum.

Returns:

  • (String)

    computed sha1 checksum



97
98
99
100
# File 'lib/assembly/object_file.rb', line 97

def sha1
  check_for_file unless @sha1
  @sha1 ||= Digest::SHA1.file(path).hexdigest
end

#valid_image?Boolean

Returns true if the mime-types gem recognizes it as an image AND it is a jp2 or jp2able?.

Returns:

  • (Boolean)

    true if the mime-types gem recognizes it as an image AND it is a jp2 or jp2able?



136
137
138
139
140
# File 'lib/assembly/object_file.rb', line 136

def valid_image?
  return false unless image?

  mimetype == 'image/jp2' || jp2able?
end