class Gemirro::GemsFetcher

The GemsFetcher class is responsible for downloading Gems from an external source.

@!attribute [r] source

@return [Source]

@!attribute [r] versions_file

@return [Gemirro::VersionsFile]

Attributes

source[R]
versions_file[R]

Public Class Methods

new(source, versions_file) click to toggle source

@param [Source] source @param [Gemirro::VersionsFile] versions_file

# File lib/gemirro/gems_fetcher.rb, line 20
def initialize(source, versions_file)
  @source        = source
  @versions_file = versions_file
end

Public Instance Methods

fetch() click to toggle source

Fetches the Gems.

# File lib/gemirro/gems_fetcher.rb, line 28
def fetch
  @source.gems.each do |gem|
    versions_for(gem).each do |versions|
      gem.platform = versions[1] if versions
      version = versions[0] if versions
      if gem.gemspec?
        gemfile = fetch_gemspec(gem, version)
        if gemfile
          Utils.configuration.mirror_gemspecs_directory
               .add_file(gem.gemspec_filename(version), gemfile)
        end
      else
        gemfile = fetch_gem(gem, version)
        if gemfile
          Utils.configuration.mirror_gems_directory
               .add_file(gem.filename(version), gemfile)
        end
      end
    end
  end
end
fetch_from_source(filename, gem, version, gemspec = false) click to toggle source

@param [String] filename @param [Gemirro::Gem] gem @param [Gem::Version] version @return [String]

# File lib/gemirro/gems_fetcher.rb, line 129
def fetch_from_source(filename, gem, version, gemspec = false)
  data = nil
  begin
    data = @source.fetch_gem(filename) unless gemspec
    data = @source.fetch_gemspec(filename) if gemspec
  rescue StandardError => e
    filename = gem.filename(version)
    Utils.logger.error("Failed to retrieve #{filename}: #{e.message}")
    Utils.logger.debug("Adding #{filename} to the list of ignored Gems")

    Utils.configuration.ignore_gem(gem.name, version, gem.platform)
  end

  data
end
fetch_gem(gem, version) click to toggle source

Tries to download the gem file from a given nam and version

@param [Gemirro::Gem] gem @param [Gem::Version] version @return [String]

# File lib/gemirro/gems_fetcher.rb, line 101
def fetch_gem(gem, version)
  filename = gem.filename(version)
  satisfied = if gem.only_latest?
                true
              else
                gem.requirement.satisfied_by?(version)
              end
  name = gem.name

  if gem_exists?(filename) || ignore_gem?(name, version, gem.platform) ||
     !satisfied
    Utils.logger.debug("Skipping #{filename}")
    return
  end

  Utils.configuration.ignore_gem(gem.name, version, gem.platform)
  Utils.logger.info("Fetching #{filename}")

  fetch_from_source(filename, gem, version)
end
fetch_gemspec(gem, version) click to toggle source

Tries to download gemspec from a given name and version

@param [Gemirro::Gem] gem @param [Gem::Version] version @return [String]

# File lib/gemirro/gems_fetcher.rb, line 77
def fetch_gemspec(gem, version)
  filename = gem.gemspec_filename(version)
  satisfied = if gem.only_latest?
                true
              else
                gem.requirement.satisfied_by?(version)
              end

  if gemspec_exists?(filename) || !satisfied
    Utils.logger.debug("Skipping #{filename}")
    return
  end

  Utils.logger.info("Fetching #{filename}")
  fetch_from_source(filename, gem, version, true)
end
gem_exists?(filename) click to toggle source

Checks if a given Gem has already been downloaded.

@param [String] filename @return [TrueClass|FalseClass]

# File lib/gemirro/gems_fetcher.rb, line 151
def gem_exists?(filename)
  Utils.configuration.mirror_gems_directory.file_exists?(filename)
end
gemspec_exists?(filename) click to toggle source

Checks if a given Gemspec has already been downloaded.

@param [String] filename @return [TrueClass|FalseClass]

# File lib/gemirro/gems_fetcher.rb, line 161
def gemspec_exists?(filename)
  Utils.configuration.mirror_gemspecs_directory.file_exists?(filename)
end
ignore_gem?(*args) click to toggle source

@see Gemirro::Configuration#ignore_gem?

# File lib/gemirro/gems_fetcher.rb, line 168
def ignore_gem?(*args)
  Utils.configuration.ignore_gem?(*args)
end
versions_for(gem) click to toggle source

Returns an Array containing the versions that should be fetched for a Gem.

@param [Gemirro::Gem] gem @return [Array]

# File lib/gemirro/gems_fetcher.rb, line 57
def versions_for(gem)
  available = @versions_file.versions_for(gem.name)
  return [available.last] if gem.only_latest?

  versions = available.select do |v|
    gem.requirement.satisfied_by?(v[0])
  end

  versions = [available.last] if versions.empty?

  versions
end