* lib/rubygems: Update to RubyGems master b9213d7. Changes include:

Fixed tests on Windows (I hope) by forcing platform for
  platform-dependent tests.

  Fixed File.exists? warnings.

  Improved testing infrastructure.

* test/rubygems:  ditto.

* test/rdoc/test_rdoc_rubygems_hook.rb:  Switch to util_spec like
  RubyGems.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
drbrain 2013-11-12 00:16:41 +00:00
parent 8f3934261a
commit 44d0a6dcd7
45 changed files with 1068 additions and 906 deletions

View file

@ -56,8 +56,6 @@ class Gem::Source
# Returns a Set that can fetch specifications from this source.
def dependency_resolver_set # :nodoc:
uri = api_uri
bundler_api_uri = api_uri + './api/v1/dependencies'
begin

View file

@ -1393,7 +1393,7 @@ class Gem::Specification < Gem::BasicSpecification
# Returns the build_args used to install the gem
def build_args
if File.exists? build_info_file
if File.exist? build_info_file
File.readlines(build_info_file).map { |x| x.strip }
else
[]

View file

@ -30,7 +30,6 @@ require 'fileutils'
require 'tmpdir'
require 'uri'
require 'rubygems/package'
require 'rubygems/test_utilities'
require 'pp'
require 'zlib'
require 'pathname'
@ -84,6 +83,8 @@ end
class Gem::TestCase < MiniTest::Unit::TestCase
attr_accessor :fetcher # :nodoc:
def assert_activate expected, *specs
specs.each do |spec|
case spec
@ -197,7 +198,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase
@orig_gem_path = ENV['GEM_PATH']
@current_dir = Dir.pwd
@ui = Gem::MockGemUi.new
@fetcher = nil
@ui = Gem::MockGemUi.new
tmpdir = File.expand_path Dir.tmpdir
tmpdir.untaint
@ -378,7 +380,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
gem = File.join @tempdir, "gems", "#{spec.full_name}.gem"
unless File.exists? gem
unless File.exist? gem then
use_ui Gem::MockGemUi.new do
Dir.chdir @tempdir do
Gem::Package.build spec
@ -503,28 +505,11 @@ class Gem::TestCase < MiniTest::Unit::TestCase
return spec
end
def quick_spec name, version = '2'
# TODO: deprecate
require 'rubygems/specification'
##
# TODO: remove in RubyGems 3.0
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = name
s.version = version
s.author = 'A User'
s.email = 'example@example.com'
s.homepage = 'http://example.com'
s.summary = "this is a summary"
s.description = "This is a test description"
yield(s) if block_given?
end
spec.loaded_from = spec.spec_file
Gem::Specification.add_spec spec
return spec
def quick_spec name, version = '2' # :nodoc:
util_spec name, version
end
##
@ -561,7 +546,9 @@ class Gem::TestCase < MiniTest::Unit::TestCase
def util_clear_gems
FileUtils.rm_rf File.join(@gemhome, "gems") # TODO: use Gem::Dirs
FileUtils.mkdir File.join(@gemhome, "gems")
FileUtils.rm_rf File.join(@gemhome, "specifications")
FileUtils.mkdir File.join(@gemhome, "specifications")
Gem::Specification.reset
end
@ -612,10 +599,11 @@ class Gem::TestCase < MiniTest::Unit::TestCase
end
##
# Create a new spec (or gem if passed an array of files) and set it
# up properly. Use this instead of util_spec and util_gem.
# new_spec is deprecated as it is never used.
#
# TODO: remove in RubyGems 3.0
def new_spec name, version, deps = nil, *files
def new_spec name, version, deps = nil, *files # :nodoc:
require 'rubygems/specification'
spec = Gem::Specification.new do |s|
@ -656,7 +644,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase
end
def new_default_spec(name, version, deps = nil, *files)
spec = new_spec(name, version, deps)
spec = util_spec name, version, deps
spec.loaded_from = File.join(@default_spec_dir, spec.spec_name)
spec.files = files
@ -674,24 +663,38 @@ class Gem::TestCase < MiniTest::Unit::TestCase
end
##
# Creates a spec with +name+, +version+ and +deps+.
# Creates a spec with +name+, +version+. +deps+ can specify the dependency
# or a +block+ can be given for full customization of the specification.
def util_spec(name, version, deps = nil, &block)
# TODO: deprecate
raise "deps or block, not both" if deps and block
def util_spec name, version = 2, deps = nil # :yields: specification
raise "deps or block, not both" if deps and block_given?
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = name
s.version = version
s.author = 'A User'
s.email = 'example@example.com'
s.homepage = 'http://example.com'
s.summary = "this is a summary"
s.description = "This is a test description"
yield s if block_given?
end
if deps then
block = proc do |s|
# Since Hash#each is unordered in 1.8, sort
# the keys and iterate that way so the tests are
# deteriminstic on all implementations.
deps.keys.sort.each do |n|
s.add_dependency n, (deps[n] || '>= 0')
end
# Since Hash#each is unordered in 1.8, sort the keys and iterate that
# way so the tests are deterministic on all implementations.
deps.keys.sort.each do |n|
spec.add_dependency n, (deps[n] || '>= 0')
end
end
quick_spec(name, version, &block)
spec.loaded_from = spec.spec_file
Gem::Specification.add_spec spec
return spec
end
##
@ -1132,38 +1135,8 @@ Also, a list:
# end
def spec_fetcher
gems = {}
fetcher = Object.new
fetcher.instance_variable_set :@test, self
fetcher.instance_variable_set :@gems, gems
def fetcher.gem name, version, dependencies = nil, &block
spec, gem = @test.util_gem name, version, dependencies, &block
@gems[spec] = gem
spec
end
def fetcher.spec name, version, dependencies = nil, &block
spec = @test.util_spec name, version, dependencies, &block
@gems[spec] = nil
spec
end
yield fetcher
util_setup_fake_fetcher unless @fetcher
util_setup_spec_fetcher(*gems.keys)
gems.each do |spec, gem|
next unless gem
@fetcher.data["http://gems.example.com/gems/#{spec.file_name}"] =
Gem.read_binary(gem)
Gem::TestCase::SpecFetcherSetup.declare self do |spec_fetcher_setup|
yield spec_fetcher_setup if block_given?
end
end
@ -1318,3 +1291,6 @@ Also, a list:
end if defined?(OpenSSL::SSL)
end
require 'rubygems/test_utilities'

View file

@ -159,6 +159,164 @@ class Gem::RemoteFetcher
end
# :startdoc:
##
# The SpecFetcherSetup allows easy setup of a remote source in RubyGems tests:
#
# spec_fetcher do |f|
# f.gem 'a', 1
# f.spec 'a', 2
# f.gem 'b', 1' 'a' => '~> 1.0'
# f.clear
# end
#
# The above declaration creates two gems, a-1 and b-1, with a dependency from
# b to a. The declaration creates an additional spec a-2, but no gem for it
# (so it cannot be installed).
#
# After the gems are created they are removed from Gem.dir.
class Gem::TestCase::SpecFetcherSetup
##
# Executes a SpecFetcher setup block. Yields an instance then creates the
# gems and specifications defined in the instance.
def self.declare test
setup = new test
yield setup
setup.execute
end
def initialize test # :nodoc:
@test = test
@gems = {}
@installed = []
@operations = []
end
##
# Removes any created gems or specifications from Gem.dir (the default
# install location).
def clear
@operations << [:clear]
end
def created_specs
created = {}
@gems.keys.each do |spec|
created[spec.full_name] = spec
end
created
end
##
# Creates any defined gems or specifications
def execute # :nodoc:
execute_operations
setup_fetcher
created_specs
end
def execute_operations # :nodoc:
@operations.each do |operation, *arguments|
case operation
when :clear then
@test.util_clear_gems
@installed.clear
when :gem then
spec, gem = @test.util_gem(*arguments, &arguments.pop)
write_spec spec
@gems[spec] = gem
@installed << spec
when :spec then
spec = @test.util_spec(*arguments, &arguments.pop)
write_spec spec
@gems[spec] = nil
@installed << spec
end
end
end
##
# Creates a gem with +name+, +version+ and +deps+. The created gem can be
# downloaded and installed.
#
# The specification will be yielded before gem creation for customization,
# but only the block or the dependencies may be set, not both.
def gem name, version, dependencies = nil, &block
@operations << [:gem, name, version, dependencies, block]
end
##
# Creates a legacy platform spec with the name 'pl' and version 1
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;
require 'zlib'
require 'socket'
require 'rubygems/remote_fetcher'
@test.fetcher = Gem::FakeFetcher.new
Gem::RemoteFetcher.fetcher = @test.fetcher
Gem::Specification.reset
@test.util_setup_spec_fetcher(*@gems.keys)
# This works around util_setup_spec_fetcher adding all created gems to the
# installed set.
Gem::Specification.reset
Gem::Specification.add_specs(*@installed)
@gems.each do |spec, gem|
next unless gem
@test.fetcher.data["http://gems.example.com/gems/#{spec.file_name}"] =
Gem.read_binary(gem)
FileUtils.cp gem, spec.cache_file
end
end
##
# Creates a spec with +name+, +version+ and +deps+. The created gem can be
# downloaded and installed.
#
# The specification will be yielded before creation for customization,
# but only the block or the dependencies may be set, not both.
def spec name, version, dependencies = nil, &block
@operations << [:spec, name, version, dependencies, block]
end
def write_spec spec # :nodoc:
open spec.spec_file, 'w' do |io|
io.write spec.to_ruby_for_cache
end
end
end
##
# A StringIO duck-typed class that uses Tempfile instead of String as the
# backing store.