# class Bundler::CompactIndexClient::Cache

### Attributes

directory[R]

### Public Class Methods

new(directory) click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 8
    def initialize(directory)
      @directory = Pathname.new(directory).expand_path
      info_roots.each do |dir|
        SharedHelpers.filesystem_access(dir) do
          FileUtils.mkdir_p(dir)
        end
      end
    end

### Public Instance Methods

checksums() click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 50
    def checksums
      checksums = {}

      lines(versions_path).each do |line|
        name, _, checksum = line.split(" ", 3)
        checksums[name] = checksum
      end

      checksums
    end

dependencies(name) click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 61
    def dependencies(name)
      lines(info_path(name)).map do |line|
        parse_gem(line)
      end
    end

info_path(name) click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 67
    def info_path(name)
      name = name.to_s
      if name =~ /[^a-z0-9_-]/
        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 lib/bundler/compact_index_client/cache.rb, line 17
    def names
      lines(names_path)
    end

names_path() click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 21
    def names_path
      directory.join("names")
    end

specific_dependency(name, version, platform) click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 77
    def specific_dependency(name, version, platform)
      pattern = [version, platform].compact.join("-")
      return nil if pattern.empty?

      gem_lines = info_path(name).read
      gem_line = gem_lines[/^#{Regexp.escape(pattern)}\b.*/, 0]
      gem_line ? parse_gem(gem_line) : nil
    end

versions() click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 25
    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(",").each do |version|
          if version.start_with?("-")
            version = version[1..-1].split("-", 2).unshift(name)
            versions_by_name[name].delete(version)
          else
            version = version.split("-", 2).unshift(name)
            versions_by_name[name] << version
          end
        end
      end

      [versions_by_name, info_checksums_by_name]
    end

versions_path() click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 46
    def versions_path
      directory.join("versions")
    end

### Private Instance Methods

info_roots() click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 110
    def info_roots
      [
        directory.join("info"),
        directory.join("info-special-characters"),
      ]
    end

lines(path) click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 88
    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

parse_dependency(string) click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 104
    def parse_dependency(string)
      dependency = string.split(":")
      dependency[-1] = dependency[-1].split("&") if dependency.size > 1
      dependency
    end

parse_gem(string) click to toggle source

    # File lib/bundler/compact_index_client/cache.rb, line 95
    def parse_gem(string)
      version_and_platform, rest = string.split(" ", 2)
      version, platform = version_and_platform.split("-", 2)
      dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
      dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
      requirements = requirements ? requirements.map {|r| parse_dependency(r) } : []
      [version, platform, dependencies, requirements]
    end