class Gem::TestCase::SpecFetcherSetup

def self.declare(test, repository)

def self.declare(test, repository)
  setup = new test, repository
  yield setup
  setup.execute
end

def created_specs

def created_specs
  created = {}
  @gems.keys.each do |spec|
    created[spec.full_name] = spec
  end
  created
end

def download(name, version, dependencies = nil, &block)

def download(name, version, dependencies = nil, &block)
  @operations << [:download, name, version, dependencies, block]
end

def execute # :nodoc:

:nodoc:
def execute # :nodoc:
  execute_operations
  setup_fetcher
  created_specs
end

def execute_operations # :nodoc:

:nodoc:
def execute_operations # :nodoc:
  @operations.each do |operation, *arguments|
    block = arguments.pop
    case operation
    when :gem then
      spec, gem = @test.util_gem(*arguments, &block)
      write_spec spec
      @gems[spec] = gem
      @installed << spec
    when :download then
      spec, gem = @test.util_gem(*arguments, &block)
      @gems[spec] = gem
      @downloaded << spec
    when :spec then
      spec = @test.util_spec(*arguments, &block)
      write_spec spec
      @gems[spec] = nil
      @installed << spec
    end
  end
end

def gem(name, version, dependencies = nil, &block)

def gem(name, version, dependencies = nil, &block)
  @operations << [:gem, name, version, dependencies, block]
end

def initialize(test, repository) # :nodoc:

:nodoc:
def initialize(test, repository) # :nodoc:
  @test       = test
  @repository = repository
  @gems       = {}
  @downloaded = []
  @installed  = []
  @operations = []
end

def legacy_platform

def legacy_platform
  spec 'pl', 1 do |s|
    s.platform = Gem::Platform.new 'i386-linux'
    s.instance_variable_set :@original_platform, 'i386-linux'
  end
end

def setup_fetcher # :nodoc:

:nodoc:
def setup_fetcher # :nodoc:
  require 'zlib'
  require 'socket'
  require 'rubygems/remote_fetcher'
  unless @test.fetcher
    @test.fetcher = Gem::FakeFetcher.new
    Gem::RemoteFetcher.fetcher = @test.fetcher
  end
  Gem::Specification.reset
  begin
    gem_repo, @test.gem_repo = @test.gem_repo, @repository
    @test.uri = URI @repository
    @test.util_setup_spec_fetcher(*@downloaded)
  ensure
    @test.gem_repo = gem_repo
    @test.uri = URI gem_repo
  end
  @gems.each do |spec, gem|
    next unless gem
    @test.fetcher.data["#{@repository}gems/#{spec.file_name}"] =
      Gem.read_binary(gem)
    FileUtils.cp gem, spec.cache_file
  end
end

def spec(name, version, dependencies = nil, &block)

def spec(name, version, dependencies = nil, &block)
  @operations << [:spec, name, version, dependencies, block]
end

def write_spec(spec) # :nodoc:

:nodoc:
def write_spec(spec) # :nodoc:
  File.open spec.spec_file, 'w' do |io|
    io.write spec.to_ruby_for_cache
  end
end