class Bundler::CompactIndexClient::Cache
Attributes
directory[R]
Public Class Methods
new(directory)
click to toggle source
# File bundler/compact_index_client/cache.rb, line 10 def initialize(directory) @directory = Pathname.new(directory).expand_path info_roots.each {|dir| mkdir(dir) } mkdir(info_etag_root) end
Public Instance Methods
checksums()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 57 def checksums lines(versions_path).each_with_object({}) do |line, checksums| parse_version_checksum(line, checksums) end end
dependencies(name)
click to toggle source
# File bundler/compact_index_client/cache.rb, line 63 def dependencies(name) lines(info_path(name)).map do |line| parse_gem(line) end end
info_etag_path(name)
click to toggle source
# File bundler/compact_index_client/cache.rb, line 79 def info_etag_path(name) name = name.to_s info_etag_root.join("#{name}-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}") end
info_path(name)
click to toggle source
# File bundler/compact_index_client/cache.rb, line 69 def info_path(name) name = name.to_s if /[^a-z0-9_-]/.match?(name) name += "-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}" info_roots.last.join(name) else info_roots.first.join(name) end end
names()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 16 def names lines(names_path) end
names_etag_path()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 24 def names_etag_path directory.join("names.etag") end
names_path()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 20 def names_path directory.join("names") end
versions()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 28 def versions versions_by_name = Hash.new {|hash, key| hash[key] = [] } info_checksums_by_name = {} lines(versions_path).each do |line| name, versions_string, info_checksum = line.split(" ", 3) info_checksums_by_name[name] = info_checksum || "" versions_string.split(",") do |version| delete = version.delete_prefix!("-") version = version.split("-", 2).unshift(name) if delete versions_by_name[name].delete(version) else versions_by_name[name] << version end end end [versions_by_name, info_checksums_by_name] end
versions_etag_path()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 53 def versions_etag_path directory.join("versions.etag") end
versions_path()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 49 def versions_path directory.join("versions") end
Private Instance Methods
info_etag_root()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 125 def info_etag_root directory.join("info-etags") end
info_roots()
click to toggle source
# File bundler/compact_index_client/cache.rb, line 118 def info_roots [ directory.join("info"), directory.join("info-special-characters"), ] end
lines(path)
click to toggle source
# File bundler/compact_index_client/cache.rb, line 92 def lines(path) return [] unless path.file? lines = SharedHelpers.filesystem_access(path, :read, &:read).split("\n") header = lines.index("---") header ? lines[header + 1..-1] : lines end
mkdir(dir)
click to toggle source
# File bundler/compact_index_client/cache.rb, line 86 def mkdir(dir) SharedHelpers.filesystem_access(dir) do FileUtils.mkdir_p(dir) end end
parse_gem(line)
click to toggle source
# File bundler/compact_index_client/cache.rb, line 99 def parse_gem(line) @dependency_parser ||= GemParser.new @dependency_parser.parse(line) end
parse_version_checksum(line, checksums)
click to toggle source
This is mostly the same as ‘split(“ ”, 3)` but it avoids allocating extra objects. This method gets called at least once for every gem when parsing versions.
# File bundler/compact_index_client/cache.rb, line 106 def parse_version_checksum(line, checksums) line.freeze # allows slicing into the string to not allocate a copy of the line name_end = line.index(" ") checksum_start = line.index(" ", name_end + 1) + 1 checksum_end = line.size - checksum_start # freeze name since it is used as a hash key # pre-freezing means a frozen copy isn't created name = line[0, name_end].freeze checksum = line[checksum_start, checksum_end] checksums[name] = checksum end