class Bundler::CompactIndexClient - bundler: Ruby Standard Library Documentation

# class Bundler::CompactIndexClient

The `CompactIndexClient` is responsible for fetching and parsing the compact index.

The compact index is a set of caching optimized files that are used to fetch gem information. The files are:

- names: a list of all gem names

- versions: a list of all gem versions

- info/: a list of all versions of a gem

The client is instantiated with:

- ‘directory`: the root directory where the cache files are stored.

- ‘fetcher`: (optional) an object that responds to call(uri_path, headers) and returns an http response.

If the ‘fetcher` is not provided, the client will only read cached files from disk.

The client is organized into:

- ‘Updater`: updates the cached files on disk using the fetcher.

- ‘Cache`: calls the updater, caches files, read and return them from disk

- ‘Parser`: parses the compact index file data

- ‘CacheFile`: a concurrency safe file reader/writer that verifies checksums

The client is intended to optimize memory usage and performance. It is called 100s or 1000s of times, parsing files with hundreds of thousands of lines. It may be called concurrently without global interpreter lock in some Rubies. As a result, some methods may look more complex than necessary to save memory or time.

### Constants

DEBUG_MUTEX
GemParser
INFO_DEPS
INFO_NAME

  info returns an Array of INFO Arrays. Each INFO Array has the following indices:

INFO_PLATFORM
INFO_REQS
INFO_VERSION
SUPPORTED_DIGESTS

  NOTE: MD5 is here not because we expect a server to respond with it, but because we use it to generate the etag on first request during the upgrade to the compact index client that uses opaque etags saved to files. Remove once 2.5.0 has been out for a while.

### Public Class Methods

debug() click to toggle source

    # File bundler/compact_index_client.rb, line 45
    def self.debug
      return unless ENV["DEBUG_COMPACT_INDEX"]
      DEBUG_MUTEX.synchronize { warn("[#{self}] #{yield}") }
    end

new(directory, fetcher = nil) click to toggle source

    # File bundler/compact_index_client.rb, line 57
    def initialize(directory, fetcher = nil)
      @cache = Cache.new(directory, fetcher)
      @parser = Parser.new(@cache)
    end

### Public Instance Methods

available?() click to toggle source

    # File bundler/compact_index_client.rb, line 87
    def available?
      Bundler::CompactIndexClient.debug { "available?" }
      @parser.available?
    end

dependencies(names) click to toggle source

    # File bundler/compact_index_client.rb, line 72
    def dependencies(names)
      Bundler::CompactIndexClient.debug { "dependencies(#{names})" }
      names.map {|name| info(name) }
    end

info(name) click to toggle source

    # File bundler/compact_index_client.rb, line 77
    def info(name)
      Bundler::CompactIndexClient.debug { "info(#{name})" }
      @parser.info(name)
    end

latest_version(name) click to toggle source

    # File bundler/compact_index_client.rb, line 82
    def latest_version(name)
      Bundler::CompactIndexClient.debug { "latest_version(#{name})" }
      @parser.info(name).map {|d| Gem::Version.new(d[INFO_VERSION]) }.max
    end

names() click to toggle source

    # File bundler/compact_index_client.rb, line 62
    def names
      Bundler::CompactIndexClient.debug { "names" }
      @parser.names
    end

reset!() click to toggle source

    # File bundler/compact_index_client.rb, line 92
    def reset!
      Bundler::CompactIndexClient.debug { "reset!" }
      @cache.reset!
    end

versions() click to toggle source

    # File bundler/compact_index_client.rb, line 67
    def versions
      Bundler::CompactIndexClient.debug { "versions" }
      @parser.versions
    end