class Bundler::Checksum

Constants

ALGO_SEPARATOR
DEFAULT_ALGORITHM
DEFAULT_BLOCK_SIZE

Attributes

algo[R]
digest[R]
sources[R]

Public Class Methods

from_api(digest, source_uri, algo = DEFAULT_ALGORITHM) click to toggle source
# File bundler/checksum.rb, line 31
def from_api(digest, source_uri, algo = DEFAULT_ALGORITHM)
  return if Bundler.settings[:disable_checksum_validation]

  Checksum.new(algo, to_hexdigest(digest, algo), Source.new(:api, source_uri))
end
from_gem(io, pathname, algo = DEFAULT_ALGORITHM) click to toggle source
# File bundler/checksum.rb, line 24
def from_gem(io, pathname, algo = DEFAULT_ALGORITHM)
  digest = Bundler::SharedHelpers.digest(algo.upcase).new
  buf = String.new(capacity: DEFAULT_BLOCK_SIZE)
  digest << io.readpartial(DEFAULT_BLOCK_SIZE, buf) until io.eof?
  Checksum.new(algo, digest.hexdigest!, Source.new(:gem, pathname))
end
from_gem_package(gem_package, algo = DEFAULT_ALGORITHM) click to toggle source
# File bundler/checksum.rb, line 12
def from_gem_package(gem_package, algo = DEFAULT_ALGORITHM)
  return if Bundler.settings[:disable_checksum_validation]
  return unless source = gem_package.instance_variable_get(:@gem)
  return unless source.respond_to?(:with_read_io)

  source.with_read_io do |io|
    from_gem(io, source.path)
  ensure
    io.rewind
  end
end
from_lock(lock_checksum, lockfile_location) click to toggle source
# File bundler/checksum.rb, line 37
def from_lock(lock_checksum, lockfile_location)
  algo, digest = lock_checksum.strip.split(ALGO_SEPARATOR, 2)
  Checksum.new(algo, to_hexdigest(digest, algo), Source.new(:lock, lockfile_location))
end
new(algo, digest, source) click to toggle source
# File bundler/checksum.rb, line 57
def initialize(algo, digest, source)
  @algo = algo
  @digest = digest
  @sources = [source]
end
to_hexdigest(digest, algo = DEFAULT_ALGORITHM) click to toggle source
# File bundler/checksum.rb, line 42
def to_hexdigest(digest, algo = DEFAULT_ALGORITHM)
  return digest unless algo == DEFAULT_ALGORITHM
  return digest if digest.match?(/\A[0-9a-f]{64}\z/i)

  if digest.match?(%r{\A[-0-9a-z_+/]{43}={0,2}\z}i)
    digest = digest.tr("-_", "+/") # fix urlsafe base64
    digest.unpack1("m0").unpack1("H*")
  else
    raise ArgumentError, "#{digest.inspect} is not a valid SHA256 hex or base64 digest"
  end
end

Public Instance Methods

==(other) click to toggle source
# File bundler/checksum.rb, line 63
def ==(other)
  match?(other) && other.sources == sources
end
Also aliased as: eql?
eql?(other)
Alias for: ==
formatted_sources() click to toggle source
# File bundler/checksum.rb, line 96
def formatted_sources
  sources.join("\n    and ").concat("\n")
end
hash() click to toggle source
# File bundler/checksum.rb, line 77
def hash
  digest.hash
end
inspect() click to toggle source
# File bundler/checksum.rb, line 114
def inspect
  abbr = "#{algo}#{ALGO_SEPARATOR}#{digest[0, 8]}"
  from = "from #{sources.join(" and ")}"
  "#<#{self.class}:#{object_id} #{abbr} #{from}>"
end
match?(other) click to toggle source
# File bundler/checksum.rb, line 73
def match?(other)
  other.is_a?(self.class) && other.digest == digest && other.algo == algo
end
merge!(other) click to toggle source
# File bundler/checksum.rb, line 89
def merge!(other)
  return nil unless match?(other)

  @sources.concat(other.sources).uniq!
  self
end
removable?() click to toggle source
# File bundler/checksum.rb, line 100
def removable?
  sources.all?(&:removable?)
end
removal_instructions() click to toggle source
# File bundler/checksum.rb, line 104
def removal_instructions
  msg = +""
  i = 1
  sources.each do |source|
    msg << "  #{i}. #{source.removal}\n"
    i += 1
  end
  msg << "  #{i}. run `bundle install`\n"
end
same_source?(other) click to toggle source
# File bundler/checksum.rb, line 69
def same_source?(other)
  sources.include?(other.sources.first)
end
to_lock() click to toggle source
# File bundler/checksum.rb, line 85
def to_lock
  "#{algo}#{ALGO_SEPARATOR}#{digest}"
end
to_s() click to toggle source
# File bundler/checksum.rb, line 81
def to_s
  "#{to_lock} (from #{sources.first}#{", ..." if sources.size > 1})"
end