123456789_123456789_123456789_123456789_123456789_

Class: Bundler::Checksum

Relationships & Source Files
Namespace Children
Classes:
Inherits: Object
Defined in: lib/bundler/checksum.rb

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(algo, digest, source) ⇒ Checksum

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 57

def initialize(algo, digest, source)
  @algo = algo
  @digest = digest
  @sources = [source]
end

Class Method Details

.from_api(digest, source_uri, algo = DEFAULT_ALGORITHM)

[ GitHub ]

  
# File 'lib/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)

[ GitHub ]

  
# File 'lib/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)

[ GitHub ]

  
# File 'lib/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)

[ GitHub ]

  
# File 'lib/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

.to_hexdigest(digest, algo = DEFAULT_ALGORITHM)

[ GitHub ]

  
# File 'lib/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

Instance Attribute Details

#algo (readonly)

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 55

attr_reader :algo, :digest, :sources

#digest (readonly)

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 55

attr_reader :algo, :digest, :sources

#removable?Boolean (readonly)

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 100

def removable?
  sources.all?(&:removable?)
end

#sources (readonly)

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 55

attr_reader :algo, :digest, :sources

Instance Method Details

#==(other) Also known as: #eql?

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 63

def ==(other)
  match?(other) && other.sources == sources
end

#eql?(other)

Alias for #==.

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 67

alias_method :eql?, :==

#formatted_sources

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 96

def formatted_sources
  sources.join("\n    and ").concat("\n")
end

#hash

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 77

def hash
  digest.hash
end

#inspect

[ GitHub ]

  
# File 'lib/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) ⇒ Boolean

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 73

def match?(other)
  other.is_a?(self.class) && other.digest == digest && other.algo == algo
end

#merge!(other)

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 89

def merge!(other)
  return nil unless match?(other)

  @sources.concat(other.sources).uniq!
  self
end

#removal_instructions

[ GitHub ]

  
# File 'lib/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) ⇒ Boolean

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 69

def same_source?(other)
  sources.include?(other.sources.first)
end

#to_lock

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 85

def to_lock
  "#{algo}#{ALGO_SEPARATOR}#{digest}"
end

#to_s

[ GitHub ]

  
# File 'lib/bundler/checksum.rb', line 81

def to_s
  "#{to_lock} (from #{sources.first}#{", ..." if sources.size > 1})"
end