diff options
author | ryan <ryan@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-06-01 03:45:05 +0000 |
---|---|---|
committer | ryan <ryan@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-06-01 03:45:05 +0000 |
commit | d22130922e7842226d38d59680e4bbb48a28a5f0 (patch) | |
tree | 39594d3a14641dd5488a99a5e633239296fa5742 /lib/rubygems/test_case.rb | |
parent | 4752539e3f3e563d559732c52424206bd6f12dbd (diff) | |
download | ruby-d22130922e7842226d38d59680e4bbb48a28a5f0.tar.gz |
Import rubygems 1.8.5 (released @ 137c80f)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31885 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems/test_case.rb')
-rw-r--r-- | lib/rubygems/test_case.rb | 188 |
1 files changed, 118 insertions, 70 deletions
diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb index 895002df05..3b26d31611 100644 --- a/lib/rubygems/test_case.rb +++ b/lib/rubygems/test_case.rb @@ -17,6 +17,7 @@ begin rescue Gem::LoadError end +require "rubygems/deprecate" require 'minitest/autorun' require 'fileutils' require 'tmpdir' @@ -25,6 +26,7 @@ require 'rubygems/package' require 'rubygems/test_utilities' require 'pp' require 'zlib' +require 'pathname' Gem.load_yaml require 'rubygems/mock_gem_ui' @@ -44,6 +46,8 @@ module Gem # requiring 'rubygems/test_case' def self.source_index=(si) + raise "This method is not supported" + Gem::Specification.reset if si # HACK @@source_index = si end @@ -82,12 +86,24 @@ end class Gem::TestCase < MiniTest::Unit::TestCase + # TODO: move to minitest + def assert_path_exists path, msg = nil + msg = message(msg) { "Expected path '#{path}' to exist" } + assert File.exist?(path), msg + end + + # TODO: move to minitest + def refute_path_exists path, msg = nil + msg = message(msg) { "Expected path '#{path}' to not exist" } + refute File.exist?(path), msg + end + include Gem::DefaultUserInteraction undef_method :default_test if instance_methods.include? 'default_test' or instance_methods.include? :default_test - @@project_dir = Dir.pwd unless defined?(@@project_dir) + @@project_dir = Dir.pwd ## # #setup prepares a sandboxed location to install gems. All installs are @@ -106,14 +122,15 @@ class Gem::TestCase < MiniTest::Unit::TestCase @orig_gem_home = ENV['GEM_HOME'] @orig_gem_path = ENV['GEM_PATH'] - @current_dir = Dir.pwd @ui = Gem::MockGemUi.new + tmpdir = nil Dir.chdir Dir.tmpdir do tmpdir = Dir.pwd end # HACK OSX /private/tmp + if ENV['KEEP_FILES'] then - @tempdir = File.join tmpdir, "test_rubygems_#{$$}.#{Time.now.to_i}" + @tempdir = File.join(tmpdir, "test_rubygems_#{$$}.#{Time.now.to_i}") else - @tempdir = File.join tmpdir, "test_rubygems_#{$$}" + @tempdir = File.join(tmpdir, "test_rubygems_#{$$}") end @tempdir.untaint @gemhome = File.join @tempdir, 'gemhome' @@ -126,6 +143,9 @@ class Gem::TestCase < MiniTest::Unit::TestCase Gem.ensure_gem_subdirectories @gemhome + @orig_LOAD_PATH = $LOAD_PATH.dup + $LOAD_PATH.map! { |s| File.expand_path s } + Dir.chdir @tempdir @orig_ENV_HOME = ENV['HOME'] @@ -136,6 +156,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase FileUtils.mkdir_p @userhome Gem.use_paths(@gemhome) + Gem.loaded_specs.clear Gem.unresolved_deps.clear @@ -191,8 +212,6 @@ class Gem::TestCase < MiniTest::Unit::TestCase Gem.pre_uninstall do |uninstaller| @pre_uninstall_hook_arg = uninstaller end - - @orig_LOAD_PATH = $LOAD_PATH.dup end ## @@ -209,15 +228,13 @@ class Gem::TestCase < MiniTest::Unit::TestCase Gem::RemoteFetcher.fetcher = nil end - Dir.chdir @current_dir + Dir.chdir @@project_dir FileUtils.rm_rf @tempdir unless ENV['KEEP_FILES'] ENV['GEM_HOME'] = @orig_gem_home ENV['GEM_PATH'] = @orig_gem_path - Gem.clear_paths - _ = @orig_ruby Gem.class_eval { @ruby = _ } if _ @@ -240,7 +257,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase end end - gem = File.join(@tempdir, spec.file_name).untaint + gem = File.join(@tempdir, File.basename(spec.cache_file)).untaint Gem::Installer.new(gem, :wrappers => true).install end @@ -250,9 +267,19 @@ class Gem::TestCase < MiniTest::Unit::TestCase def uninstall_gem spec require 'rubygems/uninstaller' - uninstaller = Gem::Uninstaller.new spec.name, :executables => true, - :user_install => true - uninstaller.uninstall + Gem::Uninstaller.new(spec.name, + :executables => true, :user_install => true).uninstall + end + + ## + # creates a temporary directory with hax + + def create_tmpdir + tmpdir = nil + Dir.chdir Dir.tmpdir do tmpdir = Dir.pwd end # HACK OSX /private/tmp + tmpdir = File.join tmpdir, "test_rubygems_#{$$}" + FileUtils.mkdir_p tmpdir + return tmpdir end ## @@ -285,7 +312,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase # Writes a binary file to +path+ which is relative to +@gemhome+ def write_file(path) - path = File.join @gemhome, path + path = File.join @gemhome, path unless Pathname.new(path).absolute? dir = File.dirname path FileUtils.mkdir_p dir @@ -296,6 +323,10 @@ class Gem::TestCase < MiniTest::Unit::TestCase path end + def all_spec_names + Gem::Specification.map(&:full_name) + end + ## # Creates a Gem::Specification with a minimum of extra work. +name+ and # +version+ are the gem's name and version, platform, author, email, @@ -317,26 +348,27 @@ class Gem::TestCase < MiniTest::Unit::TestCase s.author = 'A User' s.email = 'example@example.com' s.homepage = 'http://example.com' - s.has_rdoc = true s.summary = "this is a summary" s.description = "This is a test description" yield(s) if block_given? end - path = File.join "specifications", spec.spec_name - written_path = write_file path do |io| - io.write(spec.to_ruby) + Gem::Specification.map # HACK: force specs to (re-)load before we write + + written_path = write_file spec.spec_file do |io| + io.write spec.to_ruby_for_cache end - spec.loaded_from = written_path + spec.loaded_from = spec.loaded_from = written_path - Gem.source_index.add_spec spec + Gem::Specification.add_spec spec.for_cache return spec end def quick_spec name, version = '2' + # TODO: deprecate require 'rubygems/specification' spec = Gem::Specification.new do |s| @@ -346,16 +378,15 @@ class Gem::TestCase < MiniTest::Unit::TestCase s.author = 'A User' s.email = 'example@example.com' s.homepage = 'http://example.com' - s.has_rdoc = true s.summary = "this is a summary" s.description = "This is a test description" yield(s) if block_given? end - spec.loaded_from = @gemhome + spec.loaded_from = spec.spec_file - Gem.source_index.add_spec spec + Gem::Specification.add_spec spec return spec end @@ -365,7 +396,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase # 'cache'</tt>. Automatically creates files based on +spec.files+ def util_build_gem(spec) - dir = File.join(@gemhome, 'gems', spec.full_name) + dir = spec.gem_dir FileUtils.mkdir_p dir Dir.chdir dir do @@ -379,8 +410,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase Gem::Builder.new(spec).build end - FileUtils.mv spec.file_name, - Gem.cache_gem("#{spec.original_name}.gem") + cache = spec.cache_file + FileUtils.mv File.basename(cache), cache end end @@ -388,19 +419,16 @@ class Gem::TestCase < MiniTest::Unit::TestCase # Removes all installed gems from +@gemhome+. def util_clear_gems - FileUtils.rm_rf File.join(@gemhome, 'gems') - FileUtils.rm_rf File.join(@gemhome, 'specifications') - Gem.source_index.refresh! + FileUtils.rm_rf File.join(@gemhome, "gems") # TODO: use Gem::Dirs + FileUtils.rm_rf File.join(@gemhome, "specifications") + Gem::Specification.reset end ## # Install the provided specs def install_specs(*specs) - specs.each do |spec| - # TODO: inverted responsibility - Gem.source_index.add_spec spec - end + Gem::Specification.add_specs(*specs) Gem.searcher = nil end @@ -409,19 +437,42 @@ class Gem::TestCase < MiniTest::Unit::TestCase # up properly. Use this instead of util_spec and util_gem. def new_spec name, version, deps = nil, *files - # TODO: unfactor and deprecate util_gem and util_spec - spec, = unless files.empty? then - util_gem name, version do |s| - Array(deps).each do |n,v| - s.add_dependency n, v - end - s.files.push(*files) - end - else - util_spec name, version, deps - end - spec.loaded_from = File.join @gemhome, 'specifications', spec.spec_name - spec.loaded = false + require 'rubygems/specification' + + 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" + + Array(deps).each do |n, req| + s.add_dependency n, (req || '>= 0') + end + + s.files.push(*files) unless files.empty? + + yield s if block_given? + end + + spec.loaded_from = spec.spec_file + + unless files.empty? then + write_file spec.spec_file do |io| + io.write spec.to_ruby_for_cache + end + + util_build_gem spec + + cache_file = File.join @tempdir, 'gems', "#{spec.full_name}.gem" + FileUtils.mkdir_p File.dirname cache_file + FileUtils.mv spec.cache_file, cache_file + FileUtils.rm spec.spec_file + end + spec end @@ -429,6 +480,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase # Creates a spec with +name+, +version+ and +deps+. def util_spec(name, version, deps = nil, &block) + # TODO: deprecate raise "deps or block, not both" if deps and block if deps then @@ -449,6 +501,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase # location are returned. def util_gem(name, version, deps = nil, &block) + # TODO: deprecate raise "deps or block, not both" if deps and block if deps then @@ -465,11 +518,10 @@ class Gem::TestCase < MiniTest::Unit::TestCase cache_file = File.join @tempdir, 'gems', "#{spec.original_name}.gem" FileUtils.mkdir_p File.dirname cache_file - FileUtils.mv Gem.cache_gem("#{spec.original_name}.gem"), cache_file - FileUtils.rm File.join(@gemhome, 'specifications', spec.spec_name) + FileUtils.mv spec.cache_file, cache_file + FileUtils.rm spec.spec_file spec.loaded_from = nil - spec.loaded = false [spec, cache_file] end @@ -517,8 +569,8 @@ class Gem::TestCase < MiniTest::Unit::TestCase This line is really, really long. So long, in fact, that it is more than eighty characters long! The purpose of this line is for testing wrapping behavior because sometimes people don't wrap their text to eighty characters. Without the wrapping, the text might not look good in the RSS feed. Also, a list: - * An entry that's actually kind of sort - * an entry that's really long, which will probably get wrapped funny. That's ok, somebody wasn't thinking straight when they made it more than eighty characters. + * An entry that\'s actually kind of sort + * an entry that\'s really long, which will probably get wrapped funny. That's ok, somebody wasn't thinking straight when they made it more than eighty characters. DESC end @@ -557,9 +609,7 @@ Also, a list: util_build_gem spec end - FileUtils.rm_r File.join(@gemhome, 'gems', @pl1.original_name) - - Gem.source_index = nil + FileUtils.rm_r File.join(@gemhome, "gems", @pl1.original_name) end ## @@ -589,6 +639,7 @@ Also, a list: @fetcher = Gem::FakeFetcher.new util_make_gems(prerelease) + Gem::Specification.reset @all_gems = [@a1, @a2, @a3a, @a_evil9, @b2, @c1_2].sort @all_gem_names = @all_gems.map { |gem| gem.full_name } @@ -596,14 +647,6 @@ Also, a list: gem_names = [@a1.full_name, @a2.full_name, @a3a.full_name, @b2.full_name] @gem_names = gem_names.sort.join("\n") - @source_index = Gem::SourceIndex.new - @source_index.add_spec @a1 - @source_index.add_spec @a2 - @source_index.add_spec @a3a - @source_index.add_spec @a_evil9 - @source_index.add_spec @c1_2 - @source_index.add_spec @a2_pre if prerelease - Gem::RemoteFetcher.fetcher = @fetcher end @@ -612,37 +655,42 @@ Also, a list: # Best used with +@all_gems+ from #util_setup_fake_fetcher. def util_setup_spec_fetcher(*specs) - specs = Hash[*specs.map { |spec| [spec.full_name, spec] }.flatten] - si = Gem::SourceIndex.new specs + specs -= Gem::Specification._all + Gem::Specification.add_specs(*specs) spec_fetcher = Gem::SpecFetcher.fetcher + prerelease, _ = Gem::Specification.partition { |spec| + spec.version.prerelease? + } + spec_fetcher.specs[@uri] = [] - si.gems.sort_by { |_, spec| spec }.each do |_, spec| + Gem::Specification.each do |spec| spec_tuple = [spec.name, spec.version, spec.original_platform] spec_fetcher.specs[@uri] << spec_tuple end spec_fetcher.latest_specs[@uri] = [] - si.latest_specs.sort.each do |spec| + Gem::Specification.latest_specs.each do |spec| spec_tuple = [spec.name, spec.version, spec.original_platform] spec_fetcher.latest_specs[@uri] << spec_tuple end spec_fetcher.prerelease_specs[@uri] = [] - si.prerelease_specs.sort.each do |spec| + prerelease.each do |spec| spec_tuple = [spec.name, spec.version, spec.original_platform] spec_fetcher.prerelease_specs[@uri] << spec_tuple end - (si.gems.merge si.prerelease_gems).sort_by { |_,spec| spec }.each do |_, spec| - path = "#{@gem_repo}quick/Marshal.#{Gem.marshal_version}/#{spec.original_name}.gemspec.rz" + v = Gem.marshal_version + Gem::Specification.each do |spec| + path = "#{@gem_repo}quick/Marshal.#{v}/#{spec.original_name}.gemspec.rz" data = Marshal.dump spec data_deflate = Zlib::Deflate.deflate data @fetcher.data[path] = data_deflate end - si + nil # force errors end ## |