class Valkyrie::Shrine::Checksum::S3

Attributes

part_size[R]
threshold[R]

Public Class Methods

digest_class() click to toggle source
# File lib/valkyrie/shrine/checksum/s3.rb, line 9
def self.digest_class
  Digest::MD5
end
new(threshold: 15 * 1024 * 1024, part_size: 5 * 1024 * 1024) click to toggle source
# File lib/valkyrie/shrine/checksum/s3.rb, line 13
def initialize(threshold: 15 * 1024 * 1024, part_size: 5 * 1024 * 1024)
  @threshold = threshold
  @part_size = part_size
end

Public Instance Methods

calculate_checksum(result) click to toggle source
# File lib/valkyrie/shrine/checksum/s3.rb, line 18
def calculate_checksum(result)
  result.io.data[:object]&.data&.etag&.delete('"') ||
    checksum_for(result.io)
end
checksum_for(io) click to toggle source
# File lib/valkyrie/shrine/checksum/s3.rb, line 23
def checksum_for(io)
  io.rewind
  io.size < threshold ? simple_digest(io) : multipart_checksum(io)
end

Private Instance Methods

multipart_checksum(io) click to toggle source
# File lib/valkyrie/shrine/checksum/s3.rb, line 30
def multipart_checksum(io)
  parts = 0
  checksums = []
  while (chunk = io.read(part_size))
    parts += 1
    checksums << digest_class.digest(chunk)
  end
  [digest_class.hexdigest(checksums.join('')), parts.to_s].join('-')
end