123456789_123456789_123456789_123456789_123456789_

Class: Bundler::CompactIndexClient::Cache

Relationships & Source Files
Inherits: Object
Defined in: lib/bundler/compact_index_client/cache.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(directory, fetcher = nil) ⇒ Cache

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 10

def initialize(directory, fetcher = nil)
  @directory = Pathname.new(directory).expand_path
  @updater = Updater.new(fetcher) if fetcher
  @mutex = Thread::Mutex.new
  @endpoints = Set.new

  @info_root = mkdir("info")
  @special_characters_info_root = mkdir("info-special-characters")
  @info_etag_root = mkdir("info-etags")
end

Instance Attribute Details

#directory (readonly)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 8

attr_reader :directory

Instance Method Details

#already_fetched?(remote_path) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 86

def already_fetched?(remote_path)
  @mutex.synchronize { !@endpoints.add?(remote_path) }
end

#fetch(remote_path, path, etag_path) (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 75

def fetch(remote_path, path, etag_path)
  if already_fetched?(remote_path)
    Bundler::CompactIndexClient.debug { "already fetched #{remote_path}" }
  else
    Bundler::CompactIndexClient.debug { "fetching #{remote_path}" }
    @updater&.update(remote_path, path, etag_path)
  end

  read(path)
end

#info(name, remote_checksum = nil)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 29

def info(name, remote_checksum = nil)
  path = info_path(name)

  if remote_checksum && remote_checksum != SharedHelpers.checksum_for_file(path, :MD5)
    fetch("info/#{name}", path, info_etag_path(name))
  else
    Bundler::CompactIndexClient.debug { "update skipped info/#{name} (#{remote_checksum ? "versions index checksum is nil" : "versions index checksum matches local"})" }
    read(path)
  end
end

#info_etag_path(name) (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 62

def info_etag_path(name)
  name = name.to_s
  @info_etag_root.join("#{name}-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}")
end

#info_path(name) (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 51

def info_path(name)
  name = name.to_s
  # TODO: converge this into the info_root by hashing all filenames like info_etag_path
  if /[^a-z0-9_-]/.match?(name)
    name += "-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}"
    @special_characters_info_root.join(name)
  else
    @info_root.join(name)
  end
end

#mkdir(name) (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 67

def mkdir(name)
  directory.join(name).tap do |dir|
    SharedHelpers.filesystem_access(dir) do
      FileUtils.mkdir_p(dir)
    end
  end
end

#names

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 21

def names
  fetch("names", names_path, names_etag_path)
end

#names_etag_path (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 47

def names_etag_path = directory.join("names.etag")

#names_path (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 46

def names_path = directory.join("names")

#read(path) (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 90

def read(path)
  return unless path.file?
  SharedHelpers.filesystem_access(path, :read, &:read)
end

#reset!

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 40

def reset!
  @mutex.synchronize { @endpoints.clear }
end

#versions

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 25

def versions
  fetch("versions", versions_path, versions_etag_path)
end

#versions_etag_path (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 49

def versions_etag_path = directory.join("versions.etag")

#versions_path (private)

[ GitHub ]

  
# File 'lib/bundler/compact_index_client/cache.rb', line 48

def versions_path = directory.join("versions")