diff options
Diffstat (limited to 'test/rubygems/test_gem_specification.rb')
-rw-r--r-- | test/rubygems/test_gem_specification.rb | 1386 |
1 files changed, 811 insertions, 575 deletions
diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index 8b4a07d23b..f9f063c797 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -1,16 +1,17 @@ # frozen_string_literal: true -require 'benchmark' -require_relative 'helper' -require 'date' -require 'pathname' -require 'stringio' -require 'rubygems/ext' -require 'rubygems/specification' -require 'rubygems/installer' -require 'rubygems/platform' + +require "benchmark" +require_relative "helper" +require "date" +require "pathname" +require "stringio" +require "rubygems/ext" +require "rubygems/specification" +require "rubygems/installer" +require "rubygems/platform" class TestGemSpecification < Gem::TestCase - LEGACY_YAML_SPEC = <<-EOF.freeze + LEGACY_YAML_SPEC = <<-EOF --- !ruby/object:Gem::Specification rubygems_version: "1.0" name: keyedlist @@ -29,7 +30,7 @@ email: flgr@ccan.de has_rdoc: true EOF - LEGACY_RUBY_SPEC = <<-EOF.freeze + LEGACY_RUBY_SPEC = <<-EOF Gem::Specification.new do |s| s.name = %q{keyedlist} s.version = %q{0.4.0} @@ -44,33 +45,31 @@ end EOF def make_spec_c1 - @c1 = util_spec 'a', '1' do |s| - s.executable = 'exec' - s.extensions << 'ext/a/extconf.rb' - s.test_file = 'test/suite.rb' - s.requirements << 'A working computer' - s.license = 'MIT' - - s.add_dependency 'rake', '> 0.4' - s.add_dependency 'jabber4r', '> 0.0.0' - s.add_dependency 'pqa', ['> 0.4', '<= 0.6'] - - s.mark_version + @c1 = util_spec "a", "1" do |s| + s.executable = "exec" + s.extensions << "ext/a/extconf.rb" + s.test_file = "test/suite.rb" + s.requirements << "A working computer" + s.license = "MIT" + + s.add_dependency "rake", "> 0.4" + s.add_dependency "jabber4r", "> 0.0.0" + s.add_dependency "pqa", ["> 0.4", "<= 0.6"] + s.files = %w[lib/code.rb] end end def ext_spec(platform: Gem::Platform::RUBY) - @ext = util_spec 'ext', '1' do |s| - s.executable = 'exec' - s.test_file = 'test/suite.rb' + @ext = util_spec "ext", "1" do |s| + s.executable = "exec" + s.test_file = "test/suite.rb" s.extensions = %w[ext/extconf.rb] - s.license = 'MIT' + s.license = "MIT" s.platform = platform - s.mark_version s.files = %w[lib/code.rb] - s.installed_by_version = v('2.2') + s.installed_by_version = v("2.2") end end @@ -88,40 +87,40 @@ end # is not set. Gem.instance_variable_set(:'@default_source_date_epoch', nil) - @a1 = util_spec 'a', '1' do |s| - s.executable = 'exec' - s.test_file = 'test/suite.rb' - s.requirements << 'A working computer' - s.license = 'MIT' + @a1 = util_spec "a", "1" do |s| + s.required_ruby_version = ">= 2.3.0" + s.executable = "exec" + s.test_file = "test/suite.rb" + s.requirements << "A working computer" + s.license = "MIT" - s.mark_version s.files = %w[lib/code.rb] end - @a2 = util_spec 'a', '2' do |s| + @a2 = util_spec "a", "2" do |s| s.files = %w[lib/code.rb] end - @a3 = util_spec 'a', '3' do |s| - s.metadata['allowed_push_host'] = "https://privategemserver.com" + @a3 = util_spec "a", "3" do |s| + s.metadata["allowed_push_host"] = "https://privategemserver.com" end @current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION end def test_self_find_active_stub_by_path - spec = util_spec('a', '1', nil, 'lib/foo.rb') + spec = util_spec("a", "1", nil, "lib/foo.rb") spec.activated = true # There used to be a bug (introduced in a9c1aaf) when Gem::Specification # objects are present in the @stubs collection. This test verifies that # this scenario works correctly. Gem::Specification.all = [spec] - assert_equal spec, Gem::Specification.find_active_stub_by_path('foo') + assert_equal spec, Gem::Specification.find_active_stub_by_path("foo") end def test_self_activate - foo = util_spec 'foo', '1' + foo = util_spec "foo", "1" assert_activate %w[foo-1], foo end @@ -147,7 +146,7 @@ end end def test_find_in_unresolved_tree_is_not_exponentiental - pend "currently slower in CI on TruffleRuby" if RUBY_ENGINE == 'truffleruby' + pend "currently slower in CI on TruffleRuby" if RUBY_ENGINE == "truffleruby" num_of_pkg = 7 num_of_version_per_pkg = 3 packages = (0..num_of_pkg).map do |pkgi| @@ -158,7 +157,7 @@ end util_spec "pkg#{pkgi}", pkg_version.to_s, deps end end - base = util_spec "pkg_base", "1", {"pkg0" => ">= 0"} + base = util_spec "pkg_base", "1", { "pkg0" => ">= 0" } Gem::Specification.reset install_specs(*packages.flatten.reverse) @@ -166,7 +165,7 @@ end base.activate tms = Benchmark.measure do - assert_raise(LoadError) { require 'no_such_file_foo' } + assert_raise(LoadError) { require "no_such_file_foo" } end assert_operator tms.total, :<=, 10 end @@ -305,10 +304,10 @@ end def test_require_should_not_conflict base = util_spec "0", "1", "A" => ">= 1" - a1 = util_spec "A", "1", {"c" => ">= 2", "b" => "> 0"}, "lib/a.rb" - a2 = util_spec "A", "2", {"c" => ">= 2", "b" => "> 0"}, "lib/a.rb" - b1 = util_spec "b", "1", {"c" => "= 1"}, "lib/d#{$$}.rb" - b2 = util_spec "b", "2", {"c" => "= 2"}, "lib/d#{$$}.rb" + a1 = util_spec "A", "1", { "c" => ">= 2", "b" => "> 0" }, "lib/a.rb" + a2 = util_spec "A", "2", { "c" => ">= 2", "b" => "> 0" }, "lib/a.rb" + b1 = util_spec "b", "1", { "c" => "= 1" }, "lib/d#{$$}.rb" + b2 = util_spec "b", "2", { "c" => "= 2" }, "lib/d#{$$}.rb" c1 = util_spec "c", "1", {}, "lib/c.rb" c2 = util_spec "c", "2", {}, "lib/c.rb" c3 = util_spec "c", "3", {}, "lib/c.rb" @@ -372,13 +371,13 @@ end # [B] ~> 1.0 (satisfied by 1.0) def test_self_activate_checks_dependencies - a = util_spec 'a', '1.0' - a.add_dependency 'c', '= 1.0' - a.add_dependency 'b', '~> 1.0' + a = util_spec "a", "1.0" + a.add_dependency "c", "= 1.0" + a.add_dependency "b", "~> 1.0" - b1 = util_spec 'b', '1.0' - b2 = util_spec 'b', '2.0' - c = util_spec 'c', '1.0', 'b' => '= 2.0' + b1 = util_spec "b", "1.0" + b2 = util_spec "b", "2.0" + c = util_spec "c", "1.0", "b" => "= 2.0" install_specs b1, b2, c, a e = assert_raise Gem::LoadError do @@ -396,10 +395,10 @@ end # [B] = 2.0 def test_self_activate_divergent - a = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0' - b1 = util_spec 'b', '1.0' - b2 = util_spec 'b', '2.0' - c = util_spec 'c', '1.0', 'b' => '= 2.0' + a = util_spec "a", "1.0", "b" => "~> 1.0", "c" => "= 1.0" + b1 = util_spec "b", "1.0" + b2 = util_spec "b", "2.0" + c = util_spec "c", "1.0", "b" => "= 2.0" install_specs b1, b2, c, a @@ -415,9 +414,9 @@ end # DOC def test_self_activate_old_required - e1, = util_spec 'e', '1', 'd' => '= 1' - @d1 = util_spec 'd', '1' - @d2 = util_spec 'd', '2' + e1, = util_spec "e", "1", "d" => "= 1" + @d1 = util_spec "d", "1" + @d2 = util_spec "d", "2" install_specs @d1, @d2, e1 @@ -428,17 +427,17 @@ end # DOC def test_self_activate_platform_alternate - @x1_m = util_spec 'x', '1' do |s| + @x1_m = util_spec "x", "1" do |s| s.platform = Gem::Platform.new %w[cpu my_platform 1] end - @x1_o = util_spec 'x', '1' do |s| + @x1_o = util_spec "x", "1" do |s| s.platform = Gem::Platform.new %w[cpu other_platform 1] end - @w1 = util_spec 'w', '1', 'x' => nil + @w1 = util_spec "w", "1", "x" => nil - util_set_arch 'cpu-my_platform1' + util_set_arch "cpu-my_platform1" install_specs @x1_m, @x1_o, @w1 assert_activate %w[x-1-cpu-my_platform-1 w-1], @w1, @x1_m @@ -448,13 +447,13 @@ end # DOC def test_self_activate_platform_bump - @y1 = util_spec 'y', '1' + @y1 = util_spec "y", "1" - @y1_1_p = util_spec 'y', '1.1' do |s| + @y1_1_p = util_spec "y", "1.1" do |s| s.platform = Gem::Platform.new %w[cpu my_platform 1] end - @z1 = util_spec 'z', '1', 'y' => nil + @z1 = util_spec "z", "1", "y" => nil install_specs @y1, @y1_1_p, @z1 assert_activate %w[y-1 z-1], @z1, @y1 @@ -467,11 +466,11 @@ end # [A] >= 0 (satisfied by 1.a) def test_self_activate_prerelease - @c1_pre = util_spec 'c', '1.a', "a" => "1.a", "b" => "1" - @a1_pre = util_spec 'a', '1.a' - @b1 = util_spec 'b', '1' do |s| - s.add_dependency 'a' - s.add_development_dependency 'aa' + @c1_pre = util_spec "c", "1.a", "a" => "1.a", "b" => "1" + @a1_pre = util_spec "a", "1.a" + @b1 = util_spec "b", "1" do |s| + s.add_dependency "a" + s.add_development_dependency "aa" end install_specs @a1_pre, @b1, @c1_pre @@ -533,7 +532,7 @@ end end def test_self_activate_loaded - foo = util_spec 'foo', '1' + foo = util_spec "foo", "1" assert foo.activate refute foo.activate @@ -545,9 +544,9 @@ end # [C] depends on nothing def test_self_activate_unrelated - a = util_spec 'a', '1.0', 'b' => '>= 1.0' - b = util_spec 'b', '1.0' - c = util_spec 'c', '1.0' + a = util_spec "a", "1.0", "b" => ">= 1.0" + b = util_spec "b", "1.0" + c = util_spec "c", "1.0" install_specs b, c, a assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b" @@ -563,11 +562,11 @@ end # TODO: move these to specification def test_self_activate_over - a = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '= 1.0' - install_specs util_spec 'b', '1.0' - install_specs util_spec 'b', '1.1' - install_specs util_spec 'b', '2.0' - install_specs util_spec 'c', '1.0', 'b' => '~> 1.0' + a = util_spec "a", "1.0", "b" => ">= 1.0", "c" => "= 1.0" + install_specs util_spec "b", "1.0" + install_specs util_spec "b", "1.1" + install_specs util_spec "b", "2.0" + install_specs util_spec "c", "1.0", "b" => "~> 1.0" install_specs a a.activate @@ -588,10 +587,10 @@ end # first resolve through a dependency that is later pruned. def test_self_activate_under - a = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0' - b1 = util_spec 'b', '1.0' - b1_1 = util_spec 'b', '1.1' - c = util_spec 'c', '1.0', 'b' => '= 1.0' + a = util_spec "a", "1.0", "b" => "~> 1.0", "c" => "= 1.0" + b1 = util_spec "b", "1.0" + b1_1 = util_spec "b", "1.1" + c = util_spec "c", "1.0", "b" => "= 1.0" install_specs b1, b1_1, c, a @@ -607,10 +606,10 @@ end # [C1] depends on nothing def test_self_activate_dropped - a1 = util_spec 'a', '1', 'b' => nil - b1 = util_spec 'b', '1', 'c' => nil - b2 = util_spec 'b', '2' - c1 = util_spec 'c', '1' + a1 = util_spec "a", "1", "b" => nil + b1 = util_spec "b", "1", "c" => nil + b2 = util_spec "b", "2" + c1 = util_spec "c", "1" install_specs c1, b1, b2, a1 assert_activate %w[b-2 a-1], a1, "b" @@ -627,11 +626,11 @@ end # resolve. def test_self_activate_raggi_the_edgecase_generator - a = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '>= 1.0' - b1 = util_spec 'b', '1.0' - b1_0 = util_spec 'b', '1.1', 'z' => '>= 1.0' - c = util_spec 'c', '1.0', 'b' => '= 1.0' - z = util_spec 'z', '1' + a = util_spec "a", "1.0", "b" => ">= 1.0", "c" => ">= 1.0" + b1 = util_spec "b", "1.0" + b1_0 = util_spec "b", "1.1", "z" => ">= 1.0" + c = util_spec "c", "1.0", "b" => "= 1.0" + z = util_spec "z", "1" install_specs z, b1, b1_0, c, z @@ -639,8 +638,8 @@ end end def test_self_activate_conflict - install_specs util_spec 'b', '1.0' - install_specs util_spec 'b', '2.0' + install_specs util_spec "b", "1.0" + install_specs util_spec "b", "2.0" gem "b", "= 1.0" @@ -655,7 +654,7 @@ end install_specs a Gem::Specification.all = [a] - assert_equal a, Gem::Specification.find_inactive_by_path('foo') + assert_equal a, Gem::Specification.find_inactive_by_path("foo") end def test_self_attribute_names @@ -691,20 +690,20 @@ end version ] - actual_value = Gem::Specification.attribute_names.map {|a| a.to_s }.sort + actual_value = Gem::Specification.attribute_names.map(&:to_s).sort assert_equal expected_value, actual_value end def test_self__load_future spec = Gem::Specification.new - spec.name = 'a' - spec.version = '1' + spec.name = "a" + spec.version = "1" spec.specification_version = @current_version + 1 load_spec = Marshal.load Marshal.dump(spec) - assert_equal 'a', load_spec.name + assert_equal "a", load_spec.name assert_equal Gem::Version.new(1), load_spec.version assert_equal @current_version, load_spec.specification_version end @@ -783,37 +782,17 @@ dependencies: [] end def test_self_load_relative - File.open 'a-2.gemspec', 'w' do |io| + File.open "a-2.gemspec", "w" do |io| io.write @a2.to_ruby_for_cache end - spec = Gem::Specification.load 'a-2.gemspec' + spec = Gem::Specification.load "a-2.gemspec" @a2.files.clear assert_equal @a2, spec - assert_equal File.join(@tempdir, 'a-2.gemspec'), spec.loaded_from - end - - if RUBY_ENGINE == 'ruby' and RUBY_VERSION < '2.7' - def test_self_load_tainted - full_path = @a2.spec_file - write_file full_path do |io| - io.write @a2.to_ruby_for_cache - end - - full_path.taint - loader = Thread.new { $SAFE = 1; Gem::Specification.load full_path } - spec = loader.value - - @a2.files.clear - - assert_equal @a2, spec - - ensure - $SAFE = 0 - end + assert_equal File.join(@tempdir, "a-2.gemspec"), spec.loaded_from end def test_self_load_escape_curly @@ -874,13 +853,13 @@ dependencies: [] end def test_self_load_utf8_with_ascii_encoding - with_internal_encoding('US-ASCII') do + with_internal_encoding("US-ASCII") do spec2 = @a2.dup bin = "\u5678".dup spec2.authors = [bin] full_path = spec2.spec_file write_file full_path do |io| - io.write spec2.to_ruby_for_cache.force_encoding('BINARY').sub("\\u{5678}", bin.force_encoding('BINARY')) + io.write spec2.to_ruby_for_cache.force_encoding("BINARY").sub("\\u{5678}", bin.force_encoding("BINARY")) end spec = Gem::Specification.load full_path @@ -895,10 +874,10 @@ dependencies: [] spec = Gem::Deprecate.skip_during do eval LEGACY_RUBY_SPEC end - assert_equal 'keyedlist', spec.name - assert_equal '0.4.0', spec.version.to_s + assert_equal "keyedlist", spec.name + assert_equal "0.4.0", spec.version.to_s assert_kind_of Time, spec.date - assert spec.required_ruby_version.satisfied_by?(Gem::Version.new('1')) + assert spec.required_ruby_version.satisfied_by?(Gem::Version.new("1")) assert_equal false, spec.has_unit_tests? end @@ -933,9 +912,9 @@ dependencies: [] def test_self_outdated spec_fetcher do |fetcher| - fetcher.download 'a', 4 + fetcher.download "a", 4 - fetcher.spec 'a', 3 + fetcher.spec "a", 3 end assert_equal %w[a], Gem::Specification.outdated @@ -943,16 +922,16 @@ dependencies: [] def test_self_outdated_and_latest_remotes spec_fetcher do |fetcher| - fetcher.download 'a', 4 - fetcher.download 'b', 3 + fetcher.download "a", 4 + fetcher.download "b", 3 - fetcher.spec 'a', '3.a' - fetcher.spec 'b', 2 + fetcher.spec "a", "3.a" + fetcher.spec "b", 2 end expected = [ - [Gem::Specification.stubs.find {|s| s.full_name == 'a-3.a' }, v(4)], - [Gem::Specification.stubs.find {|s| s.full_name == 'b-2' }, v(3)], + [Gem::Specification.stubs.find {|s| s.full_name == "a-3.a" }, v(4)], + [Gem::Specification.stubs.find {|s| s.full_name == "b-2" }, v(3)], ] assert_equal expected, Gem::Specification.outdated_and_latest_version.to_a @@ -961,18 +940,18 @@ dependencies: [] def test_self_remove_spec install_specs @a1 - assert_includes Gem::Specification.all_names, 'a-1' - assert_includes Gem::Specification.stubs.map {|s| s.full_name }, 'a-1' + assert_includes Gem::Specification.all_names, "a-1" + assert_includes Gem::Specification.stubs.map(&:full_name), "a-1" uninstall_gem @a1 Gem::Specification.reset - refute_includes Gem::Specification.all_names, 'a-1' - refute_includes Gem::Specification.stubs.map {|s| s.full_name }, 'a-1' + refute_includes Gem::Specification.all_names, "a-1" + refute_includes Gem::Specification.stubs.map(&:full_name), "a-1" end def test_self_remove_spec_removed - File.open @a1.spec_file, 'w' do |io| + File.open @a1.spec_file, "w" do |io| io.write @a1.to_ruby end @@ -982,40 +961,40 @@ dependencies: [] Gem::Specification.reset - refute_includes Gem::Specification.all_names, 'a-1' - refute_includes Gem::Specification.stubs.map {|s| s.full_name }, 'a-1' + refute_includes Gem::Specification.all_names, "a-1" + refute_includes Gem::Specification.stubs.map(&:full_name), "a-1" end def test_self_stubs_for_lazy_loading Gem.loaded_specs.clear Gem::Specification.class_variable_set(:@@stubs, nil) - dir_standard_specs = File.join Gem.dir, 'specifications' + dir_standard_specs = File.join Gem.dir, "specifications" - save_gemspec('a-1', '1', dir_standard_specs){|s| s.name = 'a' } - save_gemspec('b-1', '1', dir_standard_specs){|s| s.name = 'b' } + save_gemspec("a-1", "1", dir_standard_specs) {|s| s.name = "a" } + save_gemspec("b-1", "1", dir_standard_specs) {|s| s.name = "b" } - assert_equal ['a-1'], Gem::Specification.stubs_for('a').map {|s| s.full_name } + assert_equal ["a-1"], Gem::Specification.stubs_for("a").map(&:full_name) assert_equal 1, Gem::Specification.class_variable_get(:@@stubs_by_name).length - assert_equal ['b-1'], Gem::Specification.stubs_for('b').map {|s| s.full_name } + assert_equal ["b-1"], Gem::Specification.stubs_for("b").map(&:full_name) assert_equal 2, Gem::Specification.class_variable_get(:@@stubs_by_name).length assert_equal( - Gem::Specification.stubs_for('a').map {|s| s.object_id }, - Gem::Specification.stubs_for('a').map {|s| s.object_id } + Gem::Specification.stubs_for("a").map(&:object_id), + Gem::Specification.stubs_for("a").map(&:object_id) ) - Gem.loaded_specs.delete 'a' - Gem.loaded_specs.delete 'b' + Gem.loaded_specs.delete "a" + Gem.loaded_specs.delete "b" Gem::Specification.class_variable_set(:@@stubs, nil) end def test_self_stubs_for_no_lazy_loading_after_all_specs_setup - Gem::Specification.all = [util_spec('a', '1')] + Gem::Specification.all = [util_spec("a", "1")] - save_gemspec('b-1', '1', File.join(Gem.dir, 'specifications')){|s| s.name = 'b' } + save_gemspec("b-1", "1", File.join(Gem.dir, "specifications")) {|s| s.name = "b" } - assert_equal [], Gem::Specification.stubs_for('b').map {|s| s.full_name } + assert_equal [], Gem::Specification.stubs_for("b").map(&:full_name) end def test_self_stubs_for_mult_platforms @@ -1025,30 +1004,30 @@ dependencies: [] orig_platform = Gem.platforms.dup # create user spec - user_spec_dir = File.join Gem.user_dir, 'specifications' + user_spec_dir = File.join Gem.user_dir, "specifications" FileUtils.mkdir_p(user_spec_dir) unless Dir.exist? user_spec_dir # dirs doesn't include user ? Gem::Specification.dirs << user_spec_dir - gem = 'mingw' - v = '1.1.1' - platforms = ['x86-mingw32', 'x64-mingw32'] + gem = "mingw" + v = "1.1.1" + platforms = ["x86-mingw32", "x64-mingw32"] - #create specs + # create specs platforms.each do |plat| spec = Gem::Specification.new(gem, v) {|s| s.platform = plat } - File.open File.join(user_spec_dir, "#{gem}-#{v}-#{plat}.gemspec"), 'w' do |io| + File.open File.join(user_spec_dir, "#{gem}-#{v}-#{plat}.gemspec"), "w" do |io| io.write spec.to_ruby end end platforms.each do |plat| cur_plat = Gem::Platform.new plat - Gem.platforms = ['ruby', cur_plat] + Gem.platforms = ["ruby", cur_plat] Gem::Specification.class_variable_set :@@stubs, nil Gem::Specification.stubs if plat == platforms.last # test loading via stubs - t = Gem::Specification.stubs_for 'mingw' + t = Gem::Specification.stubs_for "mingw" assert_equal 1, t.length assert_equal cur_plat, t.first.platform @@ -1058,21 +1037,56 @@ dependencies: [] end def test_self_stubs_returns_only_specified_named_specs - dir_standard_specs = File.join Gem.dir, 'specifications' + dir_standard_specs = File.join Gem.dir, "specifications" - save_gemspec('a-1', '1', dir_standard_specs){|s| s.name = 'a' } - save_gemspec('a-2', '2', dir_standard_specs){|s| s.name = 'a' } - save_gemspec('a-a', '3', dir_standard_specs){|s| s.name = 'a-a' } + save_gemspec("a-1", "1", dir_standard_specs) {|s| s.name = "a" } + save_gemspec("a-2", "2", dir_standard_specs) {|s| s.name = "a" } + save_gemspec("a-a", "3", dir_standard_specs) {|s| s.name = "a-a" } - assert_equal ['a-1', 'a-2'], Gem::Specification.stubs_for('a').map(&:full_name).sort + assert_equal ["a-1", "a-2"], Gem::Specification.stubs_for("a").map(&:full_name).sort end def test_handles_private_null_type - path = File.expand_path "../data/null-type.gemspec.rz", __FILE__ + yaml_defined = Object.const_defined?("YAML") + + path = File.expand_path "data/pry-0.4.7.gemspec.rz", __dir__ data = Marshal.load Gem::Util.inflate(Gem.read_binary(path)) - assert_nil data.signing_key + assert_instance_of Gem::Specification, data + + assert_equal(yaml_defined, Object.const_defined?("YAML")) + end + + def test_handles_dependencies_with_syck_requirements_bug + yaml_defined = Object.const_defined?("YAML") + + path = File.expand_path "data/excon-0.7.7.gemspec.rz", __dir__ + + data = Marshal.load Gem::Util.inflate(Gem.read_binary(path)) + + assert_instance_of Gem::Specification, data + + assert_equal(yaml_defined, Object.const_defined?("YAML")) + end + + def test_handles_dependencies_with_other_syck_requirements_argument_error + yaml_defined = Object.const_defined?("YAML") + + data = Marshal.dump(Gem::Specification.new do |s| + v = Gem::Version.allocate + v.instance_variable_set :@version, "YAML::Syck::DefaultKey" + s.instance_variable_set :@version, v + end) + + assert_raise(ArgumentError) { Marshal.load(data) } + out, err = capture_output do + assert_raise(ArgumentError) { Marshal.load(data) } + end + assert_empty out + assert_empty err + + assert_equal(yaml_defined, Object.const_defined?("YAML")) end def test_initialize @@ -1094,9 +1108,9 @@ dependencies: [] assert_equal [], spec.extensions assert_equal [], spec.requirements assert_equal [], spec.dependencies - assert_equal 'bin', spec.bindir - assert_equal '>= 0', spec.required_ruby_version.to_s - assert_equal '>= 0', spec.required_rubygems_version.to_s + assert_equal "bin", spec.bindir + assert_equal ">= 0", spec.required_ruby_version.to_s + assert_equal ">= 0", spec.required_rubygems_version.to_s end def test_initialize_future @@ -1118,18 +1132,18 @@ dependencies: [] spec = Gem::Specification.new do |s| s.name = "blah" s.version = "1.3.5" - s.summary = 'summary' - s.description = 'description' - s.authors = 'author a', 'author b' - s.licenses = 'BSD-2-Clause' - s.files = 'lib/file.rb' - s.test_files = 'test/file.rb' - s.rdoc_options = '--foo' - s.extra_rdoc_files = 'README.txt' - s.executables = 'exec' - s.extensions = 'ext/extconf.rb' - s.requirements = 'requirement' - s.add_dependency 'some_gem' + s.summary = "summary" + s.description = "description" + s.authors = "author a", "author b" + s.licenses = "BSD-2-Clause" + s.files = "lib/file.rb" + s.test_files = "test/file.rb" + s.rdoc_options = "--foo" + s.extra_rdoc_files = "README.txt" + s.executables = "exec" + s.extensions = "ext/extconf.rb" + s.requirements = "requirement" + s.add_dependency "some_gem" end dup_spec = spec.dup @@ -1143,84 +1157,96 @@ dependencies: [] assert_equal Gem::Platform::RUBY, spec.platform assert_same spec.platform, dup_spec.platform - assert_equal 'summary', spec.summary + assert_equal "summary", spec.summary assert_same spec.summary, dup_spec.summary assert_equal %w[README.txt bin/exec ext/extconf.rb lib/file.rb test/file.rb].sort, spec.files - refute_same spec.files, dup_spec.files, 'files' + refute_same spec.files, dup_spec.files, "files" assert_equal %w[test/file.rb], spec.test_files - refute_same spec.test_files, dup_spec.test_files, 'test_files' + refute_same spec.test_files, dup_spec.test_files, "test_files" assert_equal %w[--foo], spec.rdoc_options - refute_same spec.rdoc_options, dup_spec.rdoc_options, 'rdoc_options' + refute_same spec.rdoc_options, dup_spec.rdoc_options, "rdoc_options" assert_equal %w[README.txt], spec.extra_rdoc_files refute_same spec.extra_rdoc_files, dup_spec.extra_rdoc_files, - 'extra_rdoc_files' + "extra_rdoc_files" assert_equal %w[exec], spec.executables - refute_same spec.executables, dup_spec.executables, 'executables' + refute_same spec.executables, dup_spec.executables, "executables" assert_equal %w[ext/extconf.rb], spec.extensions - refute_same spec.extensions, dup_spec.extensions, 'extensions' + refute_same spec.extensions, dup_spec.extensions, "extensions" assert_equal %w[requirement], spec.requirements - refute_same spec.requirements, dup_spec.requirements, 'requirements' + refute_same spec.requirements, dup_spec.requirements, "requirements" - assert_equal [Gem::Dependency.new('some_gem', Gem::Requirement.default)], + assert_equal [Gem::Dependency.new("some_gem", Gem::Requirement.default)], spec.dependencies - refute_same spec.dependencies, dup_spec.dependencies, 'dependencies' + refute_same spec.dependencies, dup_spec.dependencies, "dependencies" - assert_equal 'bin', spec.bindir + assert_equal "bin", spec.bindir assert_same spec.bindir, dup_spec.bindir - assert_equal '>= 0', spec.required_ruby_version.to_s - assert_same spec.required_ruby_version, dup_spec.required_ruby_version + assert_equal ">= 0", spec.required_ruby_version.to_s + assert_equal spec.required_ruby_version, dup_spec.required_ruby_version + refute_same spec.required_ruby_version, dup_spec.required_ruby_version - assert_equal '>= 0', spec.required_rubygems_version.to_s - assert_same spec.required_rubygems_version, + assert_equal ">= 0", spec.required_rubygems_version.to_s + assert_equal spec.required_rubygems_version, + dup_spec.required_rubygems_version + refute_same spec.required_rubygems_version, dup_spec.required_rubygems_version end def test_initialize_copy_broken spec = Gem::Specification.new do |s| - s.name = 'a' - s.version = '1' + s.name = "a" + s.version = "1" end - spec.instance_variable_set :@licenses, (class << (Object.new);self;end) - spec.loaded_from = '/path/to/file' + spec.instance_variable_set :@licenses, (class << Object.new;self;end) + spec.loaded_from = "/path/to/file" e = assert_raise Gem::FormatException do spec.dup end - assert_equal 'a-1 has an invalid value for @licenses', e.message - assert_equal '/path/to/file', e.file_path + assert_equal "a-1 has an invalid value for @licenses", e.message + assert_equal "/path/to/file", e.file_path end def test_initialize_prerelease_version_before_name spec = Gem::Specification.new do |s| - s.version = '1.0.0.dev' - s.name = 'a' + s.version = "1.0.0.dev" + s.name = "a" end assert_equal "a", spec.name assert_equal "1.0.0.dev", spec.version.to_s end + def test_initialize_nil_version + expected = "nil versions are discouraged and will be deprecated in Rubygems 4\n" + actual_stdout, actual_stderr = capture_output do + Gem::Specification.new.version = nil + end + assert_empty actual_stdout + assert_equal(expected, actual_stderr) + end + def test__dump @a2.platform = Gem::Platform.local - @a2.instance_variable_set :@original_platform, 'old_platform' + @a2.instance_variable_set :@original_platform, "old_platform" data = Marshal.dump @a2 same_spec = Marshal.load data - assert_equal 'old_platform', same_spec.original_platform + assert_equal "old_platform", same_spec.original_platform end def test_activate @@ -1235,11 +1261,11 @@ dependencies: [] awesome.add_dependency :gem_name end - assert_equal %w[true gem_name], gem.dependencies.map {|dep| dep.name } + assert_equal %w[true gem_name], gem.dependencies.map(&:name) end def test_add_dependency_from_existing_dependency - dep = Gem::Dependency.new("existing_dep", Gem::Requirement.new('> 1'), :runtime) + dep = Gem::Dependency.new("existing_dep", Gem::Requirement.new("> 1"), :runtime) spec = Gem::Specification.new {|s| s.add_dependency dep } assert_equal dep, spec.dependencies.first end @@ -1254,22 +1280,22 @@ dependencies: [] end def test_author - assert_equal 'A User', @a1.author + assert_equal "A User", @a1.author end def test_authors - assert_equal ['A User'], @a1.authors + assert_equal ["A User"], @a1.authors end def test_bindir_equals - @a1.bindir = 'apps' + @a1.bindir = "apps" - assert_equal 'apps', @a1.bindir + assert_equal "apps", @a1.bindir end def test_bindir_equals_nil @a2.bindir = nil - @a2.executable = 'app' + @a2.executable = "app" assert_nil @a2.bindir assert_equal %w[app lib/code.rb].sort, @a2.files @@ -1305,14 +1331,12 @@ dependencies: [] assert_empty @ext.build_args - File.open @ext.build_info_file, 'w' do |io| - io.puts - end + File.open @ext.build_info_file, "w", &:puts assert_empty @ext.build_args - File.open @ext.build_info_file, 'w' do |io| - io.puts '--with-foo-dir=wherever' + File.open @ext.build_info_file, "w" do |io| + io.puts "--with-foo-dir=wherever" end assert_equal %w[--with-foo-dir=wherever], @ext.build_args @@ -1322,13 +1346,13 @@ dependencies: [] pend "extensions don't quite work on jruby" if Gem.java_platform? ext_spec - assert_path_not_exist @ext.extension_dir, 'sanity check' - refute_empty @ext.extensions, 'sanity check' + assert_path_not_exist @ext.extension_dir, "sanity check" + refute_empty @ext.extensions, "sanity check" extconf_rb = File.join @ext.gem_dir, @ext.extensions.first FileUtils.mkdir_p File.dirname extconf_rb - File.open extconf_rb, 'w' do |f| + File.open extconf_rb, "w" do |f| f.write <<-'RUBY' File.open 'Makefile', 'w' do |f| f.puts "clean:\n\techo clean" @@ -1344,13 +1368,13 @@ dependencies: [] end def test_default_spec_stub_is_marked_default - default = new_default_spec 'default', 2 + default = new_default_spec "default", 2 install_default_gems default - stub = Gem::Specification.stubs.find {|s| s.name == 'default' } + stub = Gem::Specification.stubs.find {|s| s.name == "default" } assert_predicate stub, :default_gem? - stub = Gem::Specification.find_all_by_name('default').first + stub = Gem::Specification.find_all_by_name("default").first assert_predicate stub, :default_gem? end @@ -1358,28 +1382,28 @@ dependencies: [] pend "extensions don't quite work on jruby" if Gem.java_platform? ext_spec - refute_empty @ext.extensions, 'sanity check' + refute_empty @ext.extensions, "sanity check" gem_build_complete = - File.join @ext.extension_dir, 'gem.build_complete' + File.join @ext.extension_dir, "gem.build_complete" FileUtils.mkdir_p @ext.extension_dir FileUtils.touch gem_build_complete @ext.build_extensions - gem_make_out = File.join @ext.extension_dir, 'gem_make.out' + gem_make_out = File.join @ext.extension_dir, "gem_make.out" assert_path_not_exist gem_make_out end def test_build_extensions_default_gem - spec = new_default_spec 'default', 1 - spec.extensions << 'extconf.rb' + spec = new_default_spec "default", 1 + spec.extensions << "extconf.rb" extconf_rb = File.join spec.gem_dir, spec.extensions.first FileUtils.mkdir_p File.dirname extconf_rb - File.open extconf_rb, 'w' do |f| + File.open extconf_rb, "w" do |f| f.write <<-'RUBY' File.open 'Makefile', 'w' do |f| f.puts "default:\n\techo built" @@ -1397,7 +1421,7 @@ dependencies: [] pend "extensions don't quite work on jruby" if Gem.java_platform? ext_spec - refute_empty @ext.extensions, 'sanity check' + refute_empty @ext.extensions, "sanity check" assert_raise Gem::Ext::BuildError do @ext.build_extensions @@ -1405,18 +1429,18 @@ dependencies: [] end def test_build_extensions_extensions_dir_unwritable - pend 'chmod not supported' if Gem.win_platform? - pend 'skipped in root privilege' if Process.uid.zero? + pend "chmod not supported" if Gem.win_platform? + pend "skipped in root privilege" if Process.uid.zero? pend "extensions don't quite work on jruby" if Gem.java_platform? ext_spec - refute_empty @ext.extensions, 'sanity check' + refute_empty @ext.extensions, "sanity check" extconf_rb = File.join @ext.gem_dir, @ext.extensions.first FileUtils.mkdir_p File.dirname extconf_rb - File.open extconf_rb, 'w' do |f| + File.open extconf_rb, "w" do |f| f.write <<-'RUBY' File.open 'Makefile', 'w' do |f| f.puts "clean:\n\techo clean" @@ -1426,30 +1450,30 @@ dependencies: [] RUBY end - FileUtils.mkdir_p File.join @ext.base_dir, 'extensions' - FileUtils.chmod 0555, @ext.base_dir - FileUtils.chmod 0555, File.join(@ext.base_dir, 'extensions') + FileUtils.mkdir_p File.join @ext.base_dir, "extensions" + FileUtils.chmod 0o555, @ext.base_dir + FileUtils.chmod 0o555, File.join(@ext.base_dir, "extensions") @ext.build_extensions assert_path_not_exist @ext.extension_dir ensure - unless ($DEBUG or win_platform? or Process.uid.zero? or Gem.java_platform?) - FileUtils.chmod 0755, File.join(@ext.base_dir, 'extensions') - FileUtils.chmod 0755, @ext.base_dir + unless $DEBUG || Gem.win_platform? || Process.uid.zero? || Gem.java_platform? + FileUtils.chmod 0o755, File.join(@ext.base_dir, "extensions") + FileUtils.chmod 0o755, @ext.base_dir end end def test_build_extensions_no_extensions_dir_unwritable - pend 'chmod not supported' if Gem.win_platform? + pend "chmod not supported" if Gem.win_platform? pend "extensions don't quite work on jruby" if Gem.java_platform? ext_spec - refute_empty @ext.extensions, 'sanity check' + refute_empty @ext.extensions, "sanity check" extconf_rb = File.join @ext.gem_dir, @ext.extensions.first FileUtils.mkdir_p File.dirname extconf_rb - File.open extconf_rb, 'w' do |f| + File.open extconf_rb, "w" do |f| f.write <<-'RUBY' File.open 'Makefile', 'w' do |f| f.puts "clean:\n\techo clean" @@ -1459,20 +1483,20 @@ dependencies: [] RUBY end - FileUtils.rm_r File.join @gemhome, 'extensions' - FileUtils.chmod 0555, @gemhome + FileUtils.rm_r File.join @gemhome, "extensions" + FileUtils.chmod 0o555, @gemhome @ext.build_extensions - gem_make_out = File.join @ext.extension_dir, 'gem_make.out' + gem_make_out = File.join @ext.extension_dir, "gem_make.out" assert_path_not_exist gem_make_out ensure - FileUtils.chmod 0755, @gemhome + FileUtils.chmod 0o755, @gemhome end def test_build_extensions_none - assert_path_not_exist @a1.extension_dir, 'sanity check' - assert_empty @a1.extensions, 'sanity check' + assert_path_not_exist @a1.extension_dir, "sanity check" + assert_empty @a1.extensions, "sanity check" @a1.build_extensions @@ -1486,7 +1510,7 @@ dependencies: [] extconf_rb = File.join @ext.gem_dir, @ext.extensions.first FileUtils.mkdir_p File.dirname extconf_rb - File.open extconf_rb, 'w' do |f| + File.open extconf_rb, "w" do |f| f.write <<-'RUBY' File.open 'Makefile', 'w' do |f| f.puts "clean:\n\techo clean" @@ -1496,22 +1520,22 @@ dependencies: [] RUBY end - refute_empty @ext.extensions, 'sanity check' + refute_empty @ext.extensions, "sanity check" - @ext.installed_by_version = v('2.2.0.preview.2') + @ext.installed_by_version = v("2.2.0.preview.2") @ext.build_extensions - gem_make_out = File.join @ext.extension_dir, 'gem_make.out' + gem_make_out = File.join @ext.extension_dir, "gem_make.out" assert_path_exist gem_make_out end def test_contains_requirable_file_eh - code_rb = File.join @a1.gem_dir, 'lib', 'code.rb' + code_rb = File.join @a1.gem_dir, "lib", "code.rb" FileUtils.mkdir_p File.dirname code_rb FileUtils.touch code_rb - assert @a1.contains_requirable_file? 'code' + assert @a1.contains_requirable_file? "code" end def test_contains_requirable_file_eh_extension @@ -1519,10 +1543,10 @@ dependencies: [] ext_spec _, err = capture_output do - refute @ext.contains_requirable_file? 'nonexistent' + refute @ext.contains_requirable_file? "nonexistent" end - expected = "Ignoring ext-1 because its extensions are not built. " + + expected = "Ignoring ext-1 because its extensions are not built. " \ "Try: gem pristine ext --version 1\n" assert_equal expected, err @@ -1532,12 +1556,23 @@ dependencies: [] ext_spec(platform: Gem::Platform.new("java")) _, err = capture_output do - refute @ext.contains_requirable_file? 'nonexistent' + refute @ext.contains_requirable_file? "nonexistent" end assert_empty err end + def test_contains_requirable_file_extension_soext + ext_spec + dlext = RbConfig::CONFIG["DLEXT"] + @ext.files += ["lib/ext.#{dlext}"] + + FileUtils.mkdir_p @ext.extension_dir + FileUtils.touch File.join(@ext.extension_dir, "ext.#{dlext}") + FileUtils.touch File.join(@ext.extension_dir, "gem.build_complete") + assert @ext.contains_requirable_file? "ext.so" + end + def test_date assert_date @a1.date end @@ -1548,13 +1583,13 @@ dependencies: [] end def test_date_equals_string - @a1.date = '2003-09-17' + @a1.date = "2003-09-17" assert_equal Time.utc(2003, 9, 17, 0,0,0), @a1.date end def test_date_equals_string_bad assert_raise Gem::InvalidSpecificationException do - @a1.date = '9/11/2003' + @a1.date = "9/11/2003" end end @@ -1575,12 +1610,12 @@ dependencies: [] def test_date_tolerates_hour_sec_zulu @a1.date = "2012-01-12 11:22:33.4444444 Z" - assert_equal Time.utc(2012,01,12,0,0,0), @a1.date + assert_equal Time.utc(2012,1,12,0,0,0), @a1.date end def test_date_tolerates_hour_sec_and_timezone @a1.date = "2012-01-12 11:22:33.4444444 +02:33" - assert_equal Time.utc(2012,01,12,0,0,0), @a1.date + assert_equal Time.utc(2012,1,12,0,0,0), @a1.date end def test_date_use_env_source_date_epoch @@ -1601,7 +1636,7 @@ dependencies: [] assert_empty @gem.dependent_gems - bonobo = util_spec 'bonobo', 1 + bonobo = util_spec "bonobo", 1 install_gem bonobo install_gem @gem @@ -1613,11 +1648,11 @@ dependencies: [] end def test_doc_dir - assert_equal File.join(@gemhome, 'doc', 'a-1'), @a1.doc_dir + assert_equal File.join(@gemhome, "doc", "a-1"), @a1.doc_dir end def test_doc_dir_type - assert_equal File.join(@gemhome, 'doc', 'a-1', 'ri'), @a1.doc_dir('ri') + assert_equal File.join(@gemhome, "doc", "a-1", "ri"), @a1.doc_dir("ri") end def test_runtime_dependencies @@ -1631,12 +1666,12 @@ dependencies: [] end def test_description - assert_equal 'This is a test description', @a1.description + assert_equal "This is a test description", @a1.description end def test_eql_eh - g1 = util_spec 'gem', 1 - g2 = util_spec 'gem', 1 + g1 = util_spec "gem", 1 + g2 = util_spec "gem", 1 assert_equal g1, g2 assert_equal g1.hash, g2.hash @@ -1645,55 +1680,55 @@ dependencies: [] def test_eql_eh_extensions spec = @a1.dup - spec.extensions = 'xx' + spec.extensions = "xx" refute_operator @a1, :eql?, spec refute_operator spec, :eql?, @a1 end def test_executables - @a1.executable = 'app' + @a1.executable = "app" assert_equal %w[app], @a1.executables end def test_executable_equals - @a2.executable = 'app' - assert_equal 'app', @a2.executable + @a2.executable = "app" + assert_equal "app", @a2.executable assert_equal %w[bin/app lib/code.rb].sort, @a2.files end def test_extensions - assert_equal ['ext/extconf.rb'], ext_spec.extensions + assert_equal ["ext/extconf.rb"], ext_spec.extensions end def test_extension_dir - enable_shared, RbConfig::CONFIG['ENABLE_SHARED'] = - RbConfig::CONFIG['ENABLE_SHARED'], 'no' + enable_shared = RbConfig::CONFIG["ENABLE_SHARED"] + RbConfig::CONFIG["ENABLE_SHARED"] = "no" ext_spec refute_empty @ext.extensions expected = - File.join(@ext.base_dir, 'extensions', Gem::Platform.local.to_s, + File.join(@ext.base_dir, "extensions", Gem::Platform.local.to_s, "#{Gem.ruby_api_version}-static", @ext.full_name) assert_equal expected, @ext.extension_dir ensure - RbConfig::CONFIG['ENABLE_SHARED'] = enable_shared + RbConfig::CONFIG["ENABLE_SHARED"] = enable_shared end def test_extension_dir_override - enable_shared, RbConfig::CONFIG['ENABLE_SHARED'] = - RbConfig::CONFIG['ENABLE_SHARED'], 'no' + enable_shared = RbConfig::CONFIG["ENABLE_SHARED"] + RbConfig::CONFIG["ENABLE_SHARED"] = "no" class << Gem - alias orig_default_ext_dir_for default_ext_dir_for + alias_method :orig_default_ext_dir_for, :default_ext_dir_for remove_method :default_ext_dir_for def Gem.default_ext_dir_for(base_dir) - 'elsewhere' + "elsewhere" end end @@ -1701,16 +1736,16 @@ dependencies: [] refute_empty @ext.extensions - expected = File.join @tempdir, 'elsewhere', @ext.full_name + expected = File.join @tempdir, "elsewhere", @ext.full_name assert_equal expected, @ext.extension_dir ensure - RbConfig::CONFIG['ENABLE_SHARED'] = enable_shared + RbConfig::CONFIG["ENABLE_SHARED"] = enable_shared class << Gem remove_method :default_ext_dir_for - alias default_ext_dir_for orig_default_ext_dir_for + alias_method :default_ext_dir_for, :orig_default_ext_dir_for end end @@ -1795,9 +1830,9 @@ dependencies: [] end def test_for_cache - @a2.add_runtime_dependency 'b', '1' + @a2.add_runtime_dependency "b", "1" @a2.dependencies.first.instance_variable_set :@type, nil - @a2.required_rubygems_version = Gem::Requirement.new '> 0' + @a2.required_rubygems_version = Gem::Requirement.new "> 0" @a2.test_files = %w[test/test_b.rb] refute_empty @a2.files @@ -1813,16 +1848,16 @@ dependencies: [] end def test_full_gem_path - assert_equal File.join(@gemhome, 'gems', @a1.full_name), @a1.full_gem_path + assert_equal File.join(@gemhome, "gems", @a1.full_name), @a1.full_gem_path - @a1.original_platform = 'mswin32' + @a1.original_platform = "mswin32" - assert_equal File.join(@gemhome, 'gems', @a1.original_name), + assert_equal File.join(@gemhome, "gems", @a1.original_name), @a1.full_gem_path end def test_full_gem_path_double_slash - gemhome = @gemhome.to_s.sub(/\w\//, '\&/') + gemhome = @gemhome.to_s.sub(%r{\w/}, '\&/') @a1.loaded_from = File.join gemhome, "specifications", @a1.spec_name expected = File.join @gemhome, "gems", @a1.full_name @@ -1830,40 +1865,40 @@ dependencies: [] end def test_full_name - assert_equal 'a-1', @a1.full_name + assert_equal "a-1", @a1.full_name @a1 = Gem::Specification.new "a", 1 - @a1.platform = Gem::Platform.new ['universal', 'darwin', nil] - assert_equal 'a-1-universal-darwin', @a1.full_name + @a1.platform = Gem::Platform.new ["universal", "darwin", nil] + assert_equal "a-1-universal-darwin", @a1.full_name @a1 = Gem::Specification.new "a", 1 - @a1.instance_variable_set :@new_platform, 'mswin32' - assert_equal 'a-1-mswin32', @a1.full_name, 'legacy' + @a1.instance_variable_set :@new_platform, "mswin32" + assert_equal "a-1-mswin32", @a1.full_name, "legacy" - return if win_platform? + return if Gem.win_platform? @a1 = Gem::Specification.new "a", 1 - @a1.platform = 'current' - assert_equal 'a-1-x86-darwin-8', @a1.full_name + @a1.platform = "current" + assert_equal "a-1-x86-darwin-8", @a1.full_name end def test_full_name_windows test_cases = { - 'i386-mswin32' => 'a-1-x86-mswin32-60', - 'i386-mswin32_80' => 'a-1-x86-mswin32-80', - 'i386-mingw32' => 'a-1-x86-mingw32', + "i386-mswin32" => "a-1-x86-mswin32-60", + "i386-mswin32_80" => "a-1-x86-mswin32-80", + "i386-mingw32" => "a-1-x86-mingw32", } test_cases.each do |arch, expected| @a1 = Gem::Specification.new "a", 1 util_set_arch arch - @a1.platform = 'current' + @a1.platform = "current" assert_equal expected, @a1.full_name end end def test_gem_build_complete_path - expected = File.join @a1.extension_dir, 'gem.build_complete' + expected = File.join @a1.extension_dir, "gem.build_complete" assert_equal expected, @a1.gem_build_complete_path end @@ -1907,23 +1942,23 @@ dependencies: [] end def test_license - assert_equal 'MIT', @a1.license + assert_equal "MIT", @a1.license end def test_licenses - assert_equal ['MIT'], @a1.licenses + assert_equal ["MIT"], @a1.licenses end def test_name - assert_equal 'a', @a1.name + assert_equal "a", @a1.name end def test_original_name - assert_equal 'a-1', @a1.full_name + assert_equal "a-1", @a1.full_name - @a1.platform = 'i386-linux' - @a1.instance_variable_set :@original_platform, 'i386-linux' - assert_equal 'a-1-i386-linux', @a1.original_name + @a1.platform = "i386-linux" + @a1.instance_variable_set :@original_platform, "i386-linux" + assert_equal "a-1-i386-linux", @a1.original_name end def test_platform @@ -1952,10 +1987,10 @@ dependencies: [] assert_equal Gem::Platform::RUBY, @a1.platform test_cases = { - 'i386-mswin32' => ['x86', 'mswin32', '60'], - 'i386-mswin32_80' => ['x86', 'mswin32', '80'], - 'i386-mingw32' => ['x86', 'mingw32', nil ], - 'x86-darwin8' => ['x86', 'darwin', '8' ], + "i386-mswin32" => ["x86", "mswin32", "60"], + "i386-mswin32_80" => ["x86", "mswin32", "80"], + "i386-mingw32" => ["x86", "mingw32", nil], + "x86-darwin8" => ["x86", "darwin", "8"], } test_cases.each do |arch, expected| @@ -1972,29 +2007,23 @@ dependencies: [] end def test_platform_equals_legacy - @a1.platform = 'mswin32' - assert_equal Gem::Platform.new('x86-mswin32'), @a1.platform - - @a1.platform = 'i586-linux' - assert_equal Gem::Platform.new('x86-linux'), @a1.platform + @a1.platform = "mswin32" + assert_equal Gem::Platform.new("x86-mswin32"), @a1.platform - @a1.platform = 'powerpc-darwin' - assert_equal Gem::Platform.new('ppc-darwin'), @a1.platform - end + @a1.platform = "i586-linux" + assert_equal Gem::Platform.new("x86-linux"), @a1.platform - def test_prerelease_spec_adds_required_rubygems_version - @prerelease = util_spec('tardis', '2.2.0.a') - refute @prerelease.required_rubygems_version.satisfied_by?(Gem::Version.new('1.3.1')) - assert @prerelease.required_rubygems_version.satisfied_by?(Gem::Version.new('1.4.0')) + @a1.platform = "powerpc-darwin" + assert_equal Gem::Platform.new("ppc-darwin"), @a1.platform end def test_require_paths - enable_shared 'no' do + enable_shared "no" do ext_spec - @ext.require_paths = 'lib' + @ext.require_paths = "lib" - assert_equal [@ext.extension_dir, 'lib'], @ext.require_paths + assert_equal [@ext.extension_dir, "lib"], @ext.require_paths end end @@ -2006,15 +2035,15 @@ dependencies: [] end def Gem.default_ext_dir_for(base_dir) - '/foo' + "/foo" end - enable_shared 'no' do + enable_shared "no" do ext_spec - @ext.require_paths = 'lib' + @ext.require_paths = "lib" - assert_equal [File.expand_path('/foo/ext-1'), 'lib'], @ext.require_paths + assert_equal [File.expand_path("/foo/ext-1"), "lib"], @ext.require_paths end ensure class << Gem @@ -2032,7 +2061,7 @@ dependencies: [] ext_spec @ext.require_paths = %w[lib ext foo] - @ext.extensions << 'bar/baz' + @ext.extensions << "bar/baz" expected = %w[ lib @@ -2047,10 +2076,10 @@ dependencies: [] def test_full_require_paths ext_spec - @ext.require_paths = 'lib' + @ext.require_paths = "lib" expected = [ - File.join(@gemhome, 'gems', @ext.original_name, 'lib'), + File.join(@gemhome, "gems", @ext.original_name, "lib"), @ext.extension_dir, ] @@ -2060,10 +2089,10 @@ dependencies: [] def test_to_fullpath ext_spec - @ext.require_paths = 'lib' + @ext.require_paths = "lib" - dir = File.join(@gemhome, 'gems', @ext.original_name, 'lib') - expected_rb = File.join(dir, 'code.rb') + dir = File.join(@gemhome, "gems", @ext.original_name, "lib") + expected_rb = File.join(dir, "code.rb") FileUtils.mkdir_p dir FileUtils.touch expected_rb @@ -2097,10 +2126,10 @@ dependencies: [] def test_fullpath_return_rb_extension_file_when_exist_the_same_name_file ext_spec - @ext.require_paths = 'lib' + @ext.require_paths = "lib" - dir = File.join(@gemhome, 'gems', @ext.original_name, 'lib') - expected_rb = File.join(dir, 'code.rb') + dir = File.join(@gemhome, "gems", @ext.original_name, "lib") + expected_rb = File.join(dir, "code.rb") FileUtils.mkdir_p dir FileUtils.touch expected_rb @@ -2152,12 +2181,12 @@ dependencies: [] end def test_requirements - assert_equal ['A working computer'], @a1.requirements + assert_equal ["A working computer"], @a1.requirements end def test_allowed_push_host - assert_nil @a1.metadata['allowed_push_host'] - assert_equal 'https://privategemserver.com', @a3.metadata['allowed_push_host'] + assert_nil @a1.metadata["allowed_push_host"] + assert_equal "https://privategemserver.com", @a3.metadata["allowed_push_host"] end def test_runtime_dependencies_legacy @@ -2169,58 +2198,58 @@ dependencies: [] expected = %w[rake jabber4r pqa] - assert_equal expected, @c1.runtime_dependencies.map {|d| d.name } + assert_equal expected, @c1.runtime_dependencies.map(&:name) end def test_spaceship_name - s1 = util_spec 'a', '1' - s2 = util_spec 'b', '1' + s1 = util_spec "a", "1" + s2 = util_spec "b", "1" assert_equal(-1, (s1 <=> s2)) - assert_equal(0, (s1 <=> s1)) + assert_equal(0, (s1 <=> s1)) # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands assert_equal(1, (s2 <=> s1)) end def test_spaceship_platform - s1 = util_spec 'a', '1' - s2 = util_spec 'a', '1' do |s| - s.platform = Gem::Platform.new 'x86-my_platform1' + s1 = util_spec "a", "1" + s2 = util_spec "a", "1" do |s| + s.platform = Gem::Platform.new "x86-my_platform1" end assert_equal(-1, (s1 <=> s2)) - assert_equal(0, (s1 <=> s1)) + assert_equal(0, (s1 <=> s1)) # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands assert_equal(1, (s2 <=> s1)) end def test_spaceship_version - s1 = util_spec 'a', '1' - s2 = util_spec 'a', '2' + s1 = util_spec "a", "1" + s2 = util_spec "a", "2" assert_equal(-1, (s1 <=> s2)) - assert_equal(0, (s1 <=> s1)) + assert_equal(0, (s1 <=> s1)) # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands assert_equal(1, (s2 <=> s1)) end def test_spec_file - assert_equal File.join(@gemhome, 'specifications', 'a-1.gemspec'), + assert_equal File.join(@gemhome, "specifications", "a-1.gemspec"), @a1.spec_file end def test_spec_name - assert_equal 'a-1.gemspec', @a1.spec_name + assert_equal "a-1.gemspec", @a1.spec_name end def test_summary - assert_equal 'this is a summary', @a1.summary + assert_equal "this is a summary", @a1.summary end def test_test_files - @a1.test_file = 'test/suite.rb' - assert_equal ['test/suite.rb'], @a1.test_files + @a1.test_file = "test/suite.rb" + assert_equal ["test/suite.rb"], @a1.test_files end def test_runtime_predicate_true - @a2.add_runtime_dependency 'b', '1' + @a2.add_runtime_dependency "b", "1" assert_predicate @a2.dependencies.first, :runtime? @a2.dependencies.first.instance_variable_set :@type, nil @@ -2228,15 +2257,15 @@ dependencies: [] end def test_runtime_predicate_false - @a2.add_development_dependency 'b', '1' + @a2.add_development_dependency "b", "1" refute_predicate @a2.dependencies.first, :runtime? end def test_to_ruby - @a2.add_runtime_dependency 'b', '1' + @a2.add_runtime_dependency "b", "1" @a2.dependencies.first.instance_variable_set :@type, nil - @a2.required_rubygems_version = Gem::Requirement.new '> 0' - @a2.require_paths << 'other' + @a2.required_rubygems_version = Gem::Requirement.new "> 0" + @a2.require_paths << "other" ruby_code = @a2.to_ruby @@ -2246,7 +2275,7 @@ dependencies: [] Gem::Specification.new do |s| s.name = "a".freeze - s.version = "2" + s.version = "2".freeze s.required_rubygems_version = Gem::Requirement.new(\"> 0\".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze, "other".freeze] @@ -2259,15 +2288,9 @@ Gem::Specification.new do |s| s.rubygems_version = "#{Gem::VERSION}".freeze s.summary = "this is a summary".freeze - if s.respond_to? :specification_version then - s.specification_version = #{Gem::Specification::CURRENT_SPECIFICATION_VERSION} - end + s.specification_version = #{Gem::Specification::CURRENT_SPECIFICATION_VERSION} - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q<b>.freeze, [\"= 1\"]) - else - s.add_dependency(%q<b>.freeze, [\"= 1\"]) - end + s.add_runtime_dependency(%q<b>.freeze, [\"= 1\".freeze]) end SPEC @@ -2279,8 +2302,8 @@ end end def test_to_ruby_with_rsa_key - require 'rubygems/openssl' - pend 'openssl is missing' unless defined?(OpenSSL::PKey::RSA) + require "rubygems/openssl" + pend "openssl is missing" unless defined?(OpenSSL::PKey::RSA) rsa_key = OpenSSL::PKey::RSA.new(2048) @a2.signing_key = rsa_key @@ -2292,7 +2315,7 @@ end Gem::Specification.new do |s| s.name = "a".freeze - s.version = "2" + s.version = "2".freeze s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] @@ -2311,9 +2334,9 @@ end end def test_to_ruby_for_cache - @a2.add_runtime_dependency 'b', '1' + @a2.add_runtime_dependency "b", "1" @a2.dependencies.first.instance_variable_set :@type, nil - @a2.required_rubygems_version = Gem::Requirement.new '> 0' + @a2.required_rubygems_version = Gem::Requirement.new "> 0" @a2.installed_by_version = Gem.rubygems_version # cached specs do not have spec.files populated: @@ -2325,7 +2348,7 @@ end Gem::Specification.new do |s| s.name = "a".freeze - s.version = "2" + s.version = "2".freeze s.required_rubygems_version = Gem::Requirement.new(\"> 0\".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] @@ -2337,17 +2360,11 @@ Gem::Specification.new do |s| s.rubygems_version = "#{Gem::VERSION}".freeze s.summary = "this is a summary".freeze - s.installed_by_version = "#{Gem::VERSION}" if s.respond_to? :installed_by_version + s.installed_by_version = "#{Gem::VERSION}".freeze if s.respond_to? :installed_by_version - if s.respond_to? :specification_version then - s.specification_version = #{Gem::Specification::CURRENT_SPECIFICATION_VERSION} - end + s.specification_version = #{Gem::Specification::CURRENT_SPECIFICATION_VERSION} - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q<b>.freeze, [\"= 1\"]) - else - s.add_dependency(%q<b>.freeze, [\"= 1\"]) - end + s.add_runtime_dependency(%q<b>.freeze, ["= 1".freeze]) end SPEC @@ -2367,19 +2384,19 @@ end ruby_code = @c1.to_ruby local = Gem::Platform.local - expected_platform = "[#{local.cpu.inspect}, #{local.os.inspect}, #{local.version.inspect}]" + expected_platform = "[#{local.cpu.inspect}.freeze, #{local.os.inspect}.freeze, #{local.version.inspect}.freeze]" stub_require_paths = @c1.instance_variable_get(:@require_paths).join "\u0000" extensions = @c1.extensions.join "\u0000" expected = <<-SPEC # -*- encoding: utf-8 -*- -# stub: a 1 #{win_platform? ? "x86-mswin32-60" : "x86-darwin-8"} #{stub_require_paths} +# stub: a 1 #{Gem.win_platform? ? "x86-mswin32-60" : "x86-darwin-8"} #{stub_require_paths} # stub: #{extensions} Gem::Specification.new do |s| s.name = "a".freeze - s.version = "1" + s.version = "1".freeze s.platform = Gem::Platform.new(#{expected_platform}) s.required_rubygems_version = Gem::Requirement.new(\">= 0\".freeze) if s.respond_to? :required_rubygems_version= @@ -2398,19 +2415,11 @@ Gem::Specification.new do |s| s.summary = "this is a summary".freeze s.test_files = ["test/suite.rb".freeze] - if s.respond_to? :specification_version then - s.specification_version = 4 - end + s.specification_version = 4 - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q<rake>.freeze, [\"> 0.4\"]) - s.add_runtime_dependency(%q<jabber4r>.freeze, [\"> 0.0.0\"]) - s.add_runtime_dependency(%q<pqa>.freeze, [\"> 0.4\", \"<= 0.6\"]) - else - s.add_dependency(%q<rake>.freeze, [\"> 0.4\"]) - s.add_dependency(%q<jabber4r>.freeze, [\"> 0.0.0\"]) - s.add_dependency(%q<pqa>.freeze, [\"> 0.4\", \"<= 0.6\"]) - end + s.add_runtime_dependency(%q<rake>.freeze, [\"> 0.4\".freeze]) + s.add_runtime_dependency(%q<jabber4r>.freeze, [\"> 0.0.0\".freeze]) + s.add_runtime_dependency(%q<pqa>.freeze, [\"> 0.4\".freeze, \"<= 0.6\".freeze]) end SPEC @@ -2422,11 +2431,11 @@ end end def test_to_ruby_keeps_requirements_as_originally_specified - spec = util_spec 'a', '1' do |s| - s.add_dependency 'b', ['~> 1.0', '>= 1.0.0'] + spec = util_spec "a", "1" do |s| + s.add_dependency "b", ["~> 1.0", ">= 1.0.0"] end - assert_includes spec.to_ruby, '"~> 1.0", ">= 1.0.0"' + assert_includes spec.to_ruby, '"~> 1.0".freeze, ">= 1.0.0".freeze' end def test_to_ruby_legacy @@ -2441,30 +2450,30 @@ end def test_to_ruby_nested_hash metadata = {} - metadata[metadata] = metadata + metadata[:metadata] = {} @a2.metadata = metadata ruby = @a2.to_ruby - assert_match %r%^ s\.metadata = \{ "%, ruby + assert_match(/^ s\.metadata = \{ "/, ruby) end def test_to_ruby_platform @a2.platform = Gem::Platform.local - @a2.instance_variable_set :@original_platform, 'old_platform' + @a2.instance_variable_set :@original_platform, "old_platform" ruby_code = @a2.to_ruby same_spec = eval ruby_code - assert_equal 'old_platform', same_spec.original_platform + assert_equal "old_platform", same_spec.original_platform end def test_to_yaml yaml_str = @a1.to_yaml - refute_match %r{!!null}, yaml_str + refute_match(/!!null/, yaml_str) same_spec = Gem::Specification.from_yaml(yaml_str) @@ -2483,27 +2492,47 @@ end end def test_to_yaml_platform_empty_string - @a1.instance_variable_set :@original_platform, '' + @a1.instance_variable_set :@original_platform, "" - assert_match %r{^platform: ruby$}, @a1.to_yaml + assert_match(/^platform: ruby$/, @a1.to_yaml) end def test_to_yaml_platform_legacy - @a1.platform = 'powerpc-darwin7.9.0' - @a1.instance_variable_set :@original_platform, 'powerpc-darwin7.9.0' + @a1.platform = "powerpc-darwin7.9.0" + @a1.instance_variable_set :@original_platform, "powerpc-darwin7.9.0" yaml_str = @a1.to_yaml same_spec = load_yaml yaml_str - assert_equal Gem::Platform.new('powerpc-darwin7'), same_spec.platform - assert_equal 'powerpc-darwin7.9.0', same_spec.original_platform + assert_equal Gem::Platform.new("powerpc-darwin7"), same_spec.platform + assert_equal "powerpc-darwin7.9.0", same_spec.original_platform end def test_to_yaml_platform_nil @a1.instance_variable_set :@original_platform, nil - assert_match %r{^platform: ruby$}, @a1.to_yaml + assert_match(/^platform: ruby$/, @a1.to_yaml) + end + + def test_to_yaml_no_autorequire + yaml_str = @a1.to_yaml + + refute_match(/^autorequire:/, yaml_str) + end + + def test_to_yaml_no_signing_key + @a1.signing_key = nil + yaml_str = @a1.to_yaml + + refute_match(/^signing_key:/, yaml_str) + end + + def test_to_yaml_no_post_install_message + @a1.post_install_message = nil + yaml_str = @a1.to_yaml + + refute_match(/^post_install_message:/, yaml_str) end def test_validate @@ -2514,10 +2543,21 @@ end end end - def x(s); s.gsub(/xxx/, ''); end - def w; x "WARxxxNING"; end - def t; x "TOxxxDO"; end - def f; x "FxxxIXME"; end + def x(s) + s.gsub(/xxx/, "") + end + + def w + x "WARxxxNING" + end + + def t + x "TOxxxDO" + end + + def f + x "FxxxIXME" + end def test_validate_authors util_setup_validate @@ -2529,7 +2569,7 @@ end @a1.validate end - assert_match "#{w}: no author specified\n", @ui.error, 'error' + assert_match "#{w}: no author specified\n", @ui.error, "error" @a1.authors = [Object.new] @@ -2563,14 +2603,14 @@ end util_setup_validate Dir.chdir @tempdir do - @a1.autorequire = 'code' + @a1.autorequire = "code" use_ui @ui do @a1.validate end assert_match "#{w}: deprecated autorequire specified\n", - @ui.error, 'error' + @ui.error, "error" end end @@ -2578,19 +2618,19 @@ end util_setup_validate Dir.chdir @tempdir do - @a1.add_runtime_dependency 'b', '>= 1.0.rc1' - @a1.add_development_dependency 'c', '>= 2.0.rc2' - @a1.add_runtime_dependency 'd', '~> 1.2.3' - @a1.add_runtime_dependency 'e', '~> 1.2.3.4' - @a1.add_runtime_dependency 'g', '~> 1.2.3', '>= 1.2.3.4' - @a1.add_runtime_dependency 'h', '>= 1.2.3', '<= 2' - @a1.add_runtime_dependency 'i', '>= 1.2' - @a1.add_runtime_dependency 'j', '>= 1.2.3' - @a1.add_runtime_dependency 'k', '> 1.2' - @a1.add_runtime_dependency 'l', '> 1.2.3' - @a1.add_runtime_dependency 'm', '~> 2.1.0' - @a1.add_runtime_dependency 'n', '~> 0.1.0' - @a1.add_runtime_dependency 'o' + @a1.add_runtime_dependency "b", ">= 1.0.rc1" + @a1.add_development_dependency "c", ">= 2.0.rc2" + @a1.add_runtime_dependency "d", "~> 1.2.3" + @a1.add_runtime_dependency "e", "~> 1.2.3.4" + @a1.add_runtime_dependency "g", "~> 1.2.3", ">= 1.2.3.4" + @a1.add_runtime_dependency "h", ">= 1.2.3", "<= 2" + @a1.add_runtime_dependency "i", ">= 1.2" + @a1.add_runtime_dependency "j", ">= 1.2.3" + @a1.add_runtime_dependency "k", "> 1.2" + @a1.add_runtime_dependency "l", "> 1.2.3" + @a1.add_runtime_dependency "m", "~> 2.1.0" + @a1.add_runtime_dependency "n", "~> 0.1.0" + @a1.add_runtime_dependency "o" use_ui @ui do @a1.validate @@ -2601,22 +2641,22 @@ end #{w}: prerelease dependency on c (>= 2.0.rc2, development) is not recommended #{w}: open-ended dependency on i (>= 1.2) is not recommended if i is semantically versioned, use: - add_runtime_dependency 'i', '~> 1.2' + add_runtime_dependency "i", "~> 1.2" #{w}: open-ended dependency on j (>= 1.2.3) is not recommended if j is semantically versioned, use: - add_runtime_dependency 'j', '~> 1.2', '>= 1.2.3' + add_runtime_dependency "j", "~> 1.2", ">= 1.2.3" #{w}: open-ended dependency on k (> 1.2) is not recommended if k is semantically versioned, use: - add_runtime_dependency 'k', '~> 1.2', '> 1.2' + add_runtime_dependency "k", "~> 1.2", "> 1.2" #{w}: open-ended dependency on l (> 1.2.3) is not recommended if l is semantically versioned, use: - add_runtime_dependency 'l', '~> 1.2', '> 1.2.3' + add_runtime_dependency "l", "~> 1.2", "> 1.2.3" #{w}: open-ended dependency on o (>= 0) is not recommended - use a bounded requirement, such as '~> x.y' + use a bounded requirement, such as "~> x.y" #{w}: See https://guides.rubygems.org/specification-reference/ for help EXPECTED - assert_equal expected, @ui.error, 'warning' + assert_equal expected, @ui.error, "warning" end end @@ -2624,10 +2664,10 @@ end util_setup_validate Dir.chdir @tempdir do - @a1.add_runtime_dependency 'b', '~> 1.2' - @a1.add_runtime_dependency 'b', '>= 1.2.3' - @a1.add_development_dependency 'c', '~> 1.2' - @a1.add_development_dependency 'c', '>= 1.2.3' + @a1.add_runtime_dependency "b", "~> 1.2" + @a1.add_runtime_dependency "b", ">= 1.2.3" + @a1.add_development_dependency "c", "~> 1.2" + @a1.add_development_dependency "c", ">= 1.2.3" use_ui @ui do e = assert_raise Gem::InvalidSpecificationException do @@ -2636,9 +2676,9 @@ end expected = <<-EXPECTED duplicate dependency on b (>= 1.2.3), (~> 1.2) use: - add_runtime_dependency 'b', '>= 1.2.3', '~> 1.2' + add_runtime_dependency "b", ">= 1.2.3", "~> 1.2" duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: - add_development_dependency 'c', '>= 1.2.3', '~> 1.2' + add_development_dependency "c", ">= 1.2.3", "~> 1.2" EXPECTED assert_equal expected, e.message @@ -2654,14 +2694,61 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: util_setup_validate Dir.chdir @tempdir do - @a1.add_runtime_dependency 'b', '~> 1.2' - @a1.add_development_dependency 'b', '= 1.2.3' + @a1.add_runtime_dependency "b", "~> 1.2" + @a1.add_development_dependency "b", "= 1.2.3" + + use_ui @ui do + @a1.validate + end + + assert_equal "", @ui.error, "warning" + end + end + + def test_validate_no_required_ruby_versions + util_setup_validate + + Dir.chdir @tempdir do + use_ui @ui do + @a1.required_ruby_version = nil # reset + @a1.validate + end + + assert_equal <<-EXPECTED, @ui.error +#{w}: make sure you specify the oldest ruby version constraint (like \">= 3.0\") that you want your gem to support by setting the `required_ruby_version` gemspec attribute +#{w}: See https://guides.rubygems.org/specification-reference/ for help + EXPECTED + end + end + + def test_validate_open_required_ruby_versions + util_setup_validate + + Dir.chdir @tempdir do + @a1.required_ruby_version = ">= 0" use_ui @ui do @a1.validate end - assert_equal '', @ui.error, 'warning' + assert_equal <<-EXPECTED, @ui.error +#{w}: make sure you specify the oldest ruby version constraint (like \">= 3.0\") that you want your gem to support by setting the `required_ruby_version` gemspec attribute +#{w}: See https://guides.rubygems.org/specification-reference/ for help + EXPECTED + end + end + + def test_validate_valid_required_ruby_versions + util_setup_validate + + Dir.chdir @tempdir do + @a1.required_ruby_version = ">= 2.3.0" + + use_ui @ui do + @a1.validate + end + + assert_equal "", @ui.error, "warning" end end @@ -2669,14 +2756,31 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: util_setup_validate Dir.chdir @tempdir do - @a1.version = '1.0.0.beta.1' - @a1.add_runtime_dependency 'b', '~> 1.2.0.beta.1' + @a1.version = "1.0.0.beta.1" + @a1.add_runtime_dependency "b", "~> 1.2.0.beta.1" + + use_ui @ui do + @a1.validate + end + + assert_equal "", @ui.error, "warning" + end + end + + def test_validate_self_referencing_dependencies + util_setup_validate + + Dir.chdir @tempdir do + @a1.add_runtime_dependency @a1.name, "1" use_ui @ui do @a1.validate end - assert_equal '', @ui.error, 'warning' + assert_equal <<-EXPECTED, @ui.error +#{w}: Self referencing dependency is unnecessary and strongly discouraged. +#{w}: See https://guides.rubygems.org/specification-reference/ for help + EXPECTED end end @@ -2684,14 +2788,14 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: util_setup_validate Dir.chdir @tempdir do - @a1.extensions = ['Rakefile'] - File.write File.join(@tempdir, 'Rakefile'), '' + @a1.extensions = ["Rakefile"] + File.write File.join(@tempdir, "Rakefile"), "" use_ui @ui do @a1.validate end - assert_match(/add rake as a dependency/, @ui.error) + assert_match(/add rake as a runtime dependency/, @ui.error) end end @@ -2699,15 +2803,48 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: util_setup_validate Dir.chdir @tempdir do - @a1.extensions = ['Rakefile'] - @a1.add_runtime_dependency 'rake' - File.write File.join(@tempdir, 'Rakefile'), '' + @a1.extensions = ["Rakefile"] + @a1.add_runtime_dependency "rake" + File.write File.join(@tempdir, "Rakefile"), "" use_ui @ui do @a1.validate end - refute_match(/add rake as a dependency/, @ui.error) + refute_match(/add rake as a runtime dependency/, @ui.error) + end + end + + def test_validate_rust_extension_have_missing_cargo_toml_error + util_setup_validate + + Dir.chdir @tempdir do + @a1.extensions = ["Cargo.toml"] + File.write File.join(@tempdir, "Cargo.toml"), "" + + e = assert_raise Gem::InvalidSpecificationException do + use_ui @ui do + @a1.validate + end + end + + assert_match(/but Cargo.lock is not part of the gem files/, e.message) + end + end + + def test_validate_rust_extension_have_no_missing_cargo_toml_error + util_setup_validate + + Dir.chdir @tempdir do + @a1.extensions = ["Cargo.toml"] + @a1.files << "Cargo.toml" + @a1.files << "Cargo.lock" + File.write File.join(@tempdir, "Cargo.toml"), "" + File.write File.join(@tempdir, "Cargo.lock"), "" + + use_ui @ui do + @a1.validate + end end end @@ -2715,7 +2852,7 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: util_setup_validate Dir.chdir @tempdir do - @a1.description = '' + @a1.description = "" use_ui @ui do @a1.validate @@ -2805,7 +2942,7 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: Gem::Specification.new.validate end - assert_equal 'missing value for attribute name', e.message + assert_equal "missing value for attribute name", e.message end def test_validate_error @@ -2815,15 +2952,15 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: end end - assert_match 'See https://guides.rubygems.org/specification-reference/ for help', @ui.error + assert_match "See https://guides.rubygems.org/specification-reference/ for help", @ui.error end def test_validate_executables util_setup_validate - FileUtils.mkdir_p File.join(@tempdir, 'bin') - File.write File.join(@tempdir, 'bin', 'exec'), '' - FileUtils.mkdir_p File.join(@tempdir, 'exec') + FileUtils.mkdir_p File.join(@tempdir, "bin") + File.write File.join(@tempdir, "bin", "exec"), "" + FileUtils.mkdir_p File.join(@tempdir, "exec") use_ui @ui do Dir.chdir @tempdir do @@ -2833,13 +2970,13 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: assert_equal %w[exec], @a1.executables - assert_equal '', @ui.output, 'output' - assert_match "#{w}: bin/exec is missing #! line\n", @ui.error, 'error' + assert_equal "", @ui.output, "output" + assert_match "#{w}: bin/exec is missing #! line\n", @ui.error, "error" end def test_validate_empty_require_paths - if win_platform? - pend 'test_validate_empty_require_paths skipped on MS Windows (symlink)' + if Gem.win_platform? + pend "test_validate_empty_require_paths skipped on MS Windows (symlink)" else util_setup_validate @@ -2848,26 +2985,26 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: @a1.validate end - assert_equal 'specification must have at least one require_path', + assert_equal "specification must have at least one require_path", e.message end end def test_validate_files - pend 'test_validate_files skipped on MS Windows (symlink)' if win_platform? + pend "test_validate_files skipped on MS Windows (symlink)" if Gem.win_platform? util_setup_validate - @a1.files += ['lib', 'lib2'] - @a1.extensions << 'ext/a/extconf.rb' + @a1.files += ["lib", "lib2"] + @a1.extensions << "ext/a/extconf.rb" Dir.chdir @tempdir do - FileUtils.ln_s 'lib/code.rb', 'lib2' unless vc_windows? + FileUtils.ln_s "lib/code.rb", "lib2" unless vc_windows? use_ui @ui do @a1.validate end - assert_match 'WARNING: lib2 is a symlink, which is not supported on all platforms', @ui.error + assert_match "WARNING: lib2 is a symlink, which is not supported on all platforms", @ui.error end assert_equal %w[bin/exec ext/a/extconf.rb lib/code.rb lib2 test/suite.rb].sort, @@ -2883,7 +3020,7 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use: { b: Gem::Dependency.new("x","1") } end - specification.define_singleton_method(:find_all_by_name) do |dep_name| + specification.define_singleton_method(:find_all_by_name) do |_dep_name| [] end @@ -2910,7 +3047,7 @@ Please report a bug if this causes problems. { b: Gem::Dependency.new("x","1") } end - specification.define_singleton_method(:find_all_by_name) do |dep_name| + specification.define_singleton_method(:find_all_by_name) do |_dep_name| [ specification.new {|s| s.name = "z", s.version = Gem::Version.new("1") }, specification.new {|s| s.name = "z", s.version = Gem::Version.new("2") }, @@ -2945,7 +3082,7 @@ Please report a bug if this causes problems. def set_orig(cls) s_cls = cls.singleton_class - s_cls.send :alias_method, :orig_unresolved_deps , :unresolved_deps + s_cls.send :alias_method, :orig_unresolved_deps, :unresolved_deps s_cls.send :alias_method, :orig_find_all_by_name, :find_all_by_name end @@ -2973,19 +3110,19 @@ Please report a bug if this causes problems. @a1.validate end - assert_match "#{w}: no homepage specified\n", @ui.error, 'error' + assert_match "#{w}: no homepage specified\n", @ui.error, "error" @ui = Gem::MockGemUi.new - @a1.homepage = '' + @a1.homepage = "" use_ui @ui do @a1.validate end - assert_match "#{w}: no homepage specified\n", @ui.error, 'error' + assert_match "#{w}: no homepage specified\n", @ui.error, "error" - @a1.homepage = 'over at my cool site' + @a1.homepage = "over at my cool site" e = assert_raise Gem::InvalidSpecificationException do @a1.validate @@ -2993,7 +3130,7 @@ Please report a bug if this causes problems. assert_equal '"over at my cool site" is not a valid HTTP URI', e.message - @a1.homepage = 'ftp://rubygems.org' + @a1.homepage = "ftp://rubygems.org" e = assert_raise Gem::InvalidSpecificationException do @a1.validate @@ -3001,12 +3138,11 @@ Please report a bug if this causes problems. assert_equal '"ftp://rubygems.org" is not a valid HTTP URI', e.message - @a1.homepage = 'https://rubygems.org/' + @a1.homepage = "https://rubygems.org/" assert_equal true, @a1.validate - @a1.homepage = 'https://rubygems.org' + @a1.homepage = "https://rubygems.org" assert_equal true, @a1.validate - end end @@ -3019,11 +3155,23 @@ Please report a bug if this causes problems. end assert_match <<-WARNING, @ui.error -WARNING: licenses is empty, but is recommended. Use a license identifier from -http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. +WARNING: licenses is empty, but is recommended. Use an license identifier from +https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, +or set it to nil if you don't want to specify a license. WARNING end + def test_validate_nil_license + util_setup_validate + + use_ui @ui do + @a1.license = nil + @a1.validate + end + + assert_empty @ui.error + end + def test_validate_license_in_a_non_packaging_context util_setup_validate @@ -3036,14 +3184,14 @@ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. end def test_removed_methods - assert_equal Gem::Specification::REMOVED_METHODS, [:rubyforge_project=] + assert_equal Gem::Specification::REMOVED_METHODS, [:rubyforge_project=, :mark_version] end def test_validate_removed_rubyforge_project util_setup_validate use_ui @ui do - @a1.rubyforge_project = 'invalid-attribute' + @a1.rubyforge_project = "invalid-attribute" @a1.validate end @@ -3054,13 +3202,14 @@ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. util_setup_validate use_ui @ui do - @a1.licenses = ['BSD'] + @a1.licenses = ["BSD"] @a1.validate end assert_match <<-WARNING, @ui.error -WARNING: license value 'BSD' is invalid. Use a license identifier from -http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. +WARNING: License identifier 'BSD' is invalid. Use an identifier from +https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, +or set it to nil if you don't want to specify a license. WARNING end @@ -3068,29 +3217,33 @@ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. util_setup_validate use_ui @ui do - @a1.licenses = ['LicenseRef-LICENSE.md'] + @a1.licenses = ["LicenseRef-LICENSE.md"] @a1.validate end assert_empty @ui.error end - def test_validate_license_values_plus + def test_validate_deprecated_license_values_plus util_setup_validate use_ui @ui do - @a1.licenses = ['GPL-2.0+'] + @a1.licenses = ["GPL-2.0+"] @a1.validate end - assert_empty @ui.error + assert_match <<-WARNING, @ui.error +WARNING: License identifier 'GPL-2.0+' is deprecated. Use an identifier from +https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, +or set it to nil if you don't want to specify a license. + WARNING end def test_validate_license_values_or_later util_setup_validate use_ui @ui do - @a1.licenses = ['GPL-2.0-or-later'] + @a1.licenses = ["GPL-2.0-or-later"] @a1.validate end @@ -3101,7 +3254,7 @@ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. util_setup_validate use_ui @ui do - @a1.licenses = ['GPL-2.0+ WITH Autoconf-exception-2.0'] + @a1.licenses = ["GPL-2.0-or-later WITH Autoconf-exception-2.0"] @a1.validate end @@ -3112,17 +3265,19 @@ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. util_setup_validate use_ui @ui do - @a1.licenses = ['GPL-2.0+ FOO', 'GPL-2.0 FOO'] + @a1.licenses = ["GPL-2.0+ FOO", "GPL-2.0 FOO"] @a1.validate end assert_match <<-WARNING, @ui.error -WARNING: license value 'GPL-2.0+ FOO' is invalid. Use a license identifier from -http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. +WARNING: License identifier 'GPL-2.0+ FOO' is invalid. Use an identifier from +https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, +or set it to nil if you don't want to specify a license. WARNING assert_match <<-WARNING, @ui.error -WARNING: license value 'GPL-2.0 FOO' is invalid. Use a license identifier from -http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. +WARNING: License identifier 'GPL-2.0+ FOO' is invalid. Use an identifier from +https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, +or set it to nil if you don't want to specify a license. WARNING end @@ -3130,13 +3285,29 @@ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. util_setup_validate use_ui @ui do - @a1.licenses = ['GPL-2.0+ WITH Autocofn-exception-2.0'] + @a1.licenses = ["GPL-2.0-only WITH Autocofn-exception-2.0"] + @a1.validate + end + + assert_match <<-WARNING, @ui.error +WARNING: License identifier 'GPL-2.0-only WITH Autocofn-exception-2.0' is invalid. Use an identifier from +https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, +or set it to nil if you don't want to specify a license. + WARNING + end + + def test_validate_license_with_deprecated_exception + util_setup_validate + + use_ui @ui do + @a1.licenses = ["GPL-2.0-only WITH Nokia-Qt-exception-1.1"] @a1.validate end assert_match <<-WARNING, @ui.error -WARNING: license value 'GPL-2.0+ WITH Autocofn-exception-2.0' is invalid. Use a license identifier from -http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. +WARNING: Exception identifier at 'GPL-2.0-only WITH Nokia-Qt-exception-1.1' is deprecated. Use an identifier from +https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, +or set it to nil if you don't want to specify a license. WARNING end @@ -3144,13 +3315,14 @@ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. util_setup_validate use_ui @ui do - @a1.licenses = ['ruby'] + @a1.licenses = ["ruby"] @a1.validate end assert_match <<-WARNING, @ui.error -WARNING: license value 'ruby' is invalid. Use a license identifier from -http://spdx.org/licenses or 'Nonstandard' for a nonstandard license. +WARNING: License identifier 'ruby' is invalid. Use an identifier from +https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, +or set it to nil if you don't want to specify a license. Did you mean 'Ruby'? WARNING end @@ -3248,19 +3420,19 @@ Did you mean 'Ruby'? spec.validate end - assert_match %r{^#{name}}, e.message + assert_match(/^#{name}/, e.message) end end end def test_validate_permissions - pend 'chmod not supported' if Gem.win_platform? + pend "chmod not supported" if Gem.win_platform? util_setup_validate Dir.chdir @tempdir do - File.chmod 0640, File.join('lib', 'code.rb') - File.chmod 0640, File.join('bin', 'exec') + File.chmod 0o640, File.join("lib", "code.rb") + File.chmod 0o640, File.join("bin", "exec") use_ui @ui do @a1.validate @@ -3273,12 +3445,12 @@ Did you mean 'Ruby'? end def test_validate_permissions_of_missing_file_non_packaging - pend 'chmod not supported' if Gem.win_platform? + pend "chmod not supported" if Gem.win_platform? util_setup_validate Dir.chdir @tempdir do - File.delete File.join('lib', 'code.rb') + File.delete File.join("lib", "code.rb") use_ui @ui do assert @a1.validate(false) @@ -3290,13 +3462,13 @@ Did you mean 'Ruby'? util_setup_validate Dir.chdir @tempdir do - @a1.platform = 'mswin32' + @a1.platform = "mswin32" assert @a1.validate - @a1.platform = 'i586-linux' + @a1.platform = "i586-linux" assert @a1.validate - @a1.platform = 'powerpc-darwin' + @a1.platform = "powerpc-darwin" assert @a1.validate end end @@ -3305,19 +3477,24 @@ Did you mean 'Ruby'? util_setup_validate @a1.rubygems_version = "3" - e = assert_raise Gem::InvalidSpecificationException do + + use_ui @ui do @a1.validate end - assert_equal "expected RubyGems version #{Gem::VERSION}, was 3", - e.message + expected = <<~EXPECTED + #{w}: expected RubyGems version #{Gem::VERSION}, was 3 + #{w}: See https://guides.rubygems.org/specification-reference/ for help + EXPECTED + + assert_equal expected, @ui.error end def test_validate_specification_version util_setup_validate Dir.chdir @tempdir do - @a1.specification_version = '1.0' + @a1.specification_version = "1.0" e = assert_raise Gem::InvalidSpecificationException do use_ui @ui do @@ -3325,7 +3502,7 @@ Did you mean 'Ruby'? end end - err = 'specification_version must be an Integer (did you mean version?)' + err = "specification_version must be an Integer (did you mean version?)" assert_equal err, e.message end end @@ -3334,13 +3511,13 @@ Did you mean 'Ruby'? util_setup_validate Dir.chdir @tempdir do - @a1.summary = '' + @a1.summary = "" use_ui @ui do @a1.validate end - assert_match "#{w}: no summary specified\n", @ui.error, 'error' + assert_match "#{w}: no summary specified\n", @ui.error, "error" @a1.summary = "#{f} (describe your package)" @@ -3368,11 +3545,11 @@ Did you mean 'Ruby'? @a1.validate end - assert_match 'See https://guides.rubygems.org/specification-reference/ for help', @ui.error + assert_match "See https://guides.rubygems.org/specification-reference/ for help", @ui.error end def test_version - assert_equal Gem::Version.new('1'), @a1.version + assert_equal Gem::Version.new("1"), @a1.version end def test_version_change_reset_full_name @@ -3408,7 +3585,7 @@ Did you mean 'Ruby'? capture_output do Gem::Specification.load(specfile.path) end - rescue => e + rescue StandardError => e name_rexp = Regexp.new(Regexp.escape(specfile.path)) assert e.backtrace.grep(name_rexp).any? end @@ -3418,22 +3595,22 @@ Did you mean 'Ruby'? def test_latest_specs spec_fetcher do |fetcher| - fetcher.spec 'a', 1 do |s| - s.platform = Gem::Platform.new 'x86-my_platform1' + fetcher.spec "a", 1 do |s| + s.platform = Gem::Platform.new "x86-my_platform1" end - fetcher.spec 'a', 2 + fetcher.spec "a", 2 - fetcher.spec 'a', 2 do |s| - s.platform = Gem::Platform.new 'x86-my_platform1' + fetcher.spec "a", 2 do |s| + s.platform = Gem::Platform.new "x86-my_platform1" end - fetcher.spec 'a', 2 do |s| - s.platform = Gem::Platform.new 'x86-other_platform1' + fetcher.spec "a", 2 do |s| + s.platform = Gem::Platform.new "x86-other_platform1" end - fetcher.spec 'a', 3 do |s| - s.platform = Gem::Platform.new 'x86-other_platform1' + fetcher.spec "a", 3 do |s| + s.platform = Gem::Platform.new "x86-other_platform1" end end @@ -3450,13 +3627,13 @@ Did you mean 'Ruby'? util_setup_validate Dir.chdir @tempdir do - @m1 = quick_gem 'm', '1' do |s| + @m1 = quick_gem "m", "1" do |s| s.files = %w[lib/code.rb] s.metadata = { - "one" => "two", - "home" => "three", + "one" => "two", + "home" => "three", "homepage_uri" => "https://example.com/user/repo", - "funding_uri" => "https://example.com/donate", + "funding_uri" => "https://example.com/donate", } end @@ -3470,7 +3647,7 @@ Did you mean 'Ruby'? util_setup_validate Dir.chdir @tempdir do - @m2 = quick_gem 'm', '2' do |s| + @m2 = quick_gem "m", "2" do |s| s.files = %w[lib/code.rb] s.metadata = { 1 => "fail" } end @@ -3487,7 +3664,7 @@ Did you mean 'Ruby'? util_setup_validate Dir.chdir @tempdir do - @m2 = quick_gem 'm', '2' do |s| + @m2 = quick_gem "m", "2" do |s| s.files = %w[lib/code.rb] s.metadata = { ("x" * 129) => "fail" } end @@ -3504,9 +3681,9 @@ Did you mean 'Ruby'? util_setup_validate Dir.chdir @tempdir do - @m2 = quick_gem 'm', '2' do |s| + @m2 = quick_gem "m", "2" do |s| s.files = %w[lib/code.rb] - s.metadata = { 'fail' => [] } + s.metadata = { "fail" => [] } end e = assert_raise Gem::InvalidSpecificationException do @@ -3521,9 +3698,9 @@ Did you mean 'Ruby'? util_setup_validate Dir.chdir @tempdir do - @m2 = quick_gem 'm', '2' do |s| + @m2 = quick_gem "m", "2" do |s| s.files = %w[lib/code.rb] - s.metadata = { 'fail' => ("x" * 1025) } + s.metadata = { "fail" => ("x" * 1025) } end e = assert_raise Gem::InvalidSpecificationException do @@ -3538,9 +3715,9 @@ Did you mean 'Ruby'? util_setup_validate Dir.chdir @tempdir do - @m2 = quick_gem 'm', '2' do |s| + @m2 = quick_gem "m", "2" do |s| s.files = %w[lib/code.rb] - s.metadata = { 'homepage_uri' => 'http:/example.com' } + s.metadata = { "homepage_uri" => "http:/example.com" } end e = assert_raise Gem::InvalidSpecificationException do @@ -3551,10 +3728,43 @@ Did you mean 'Ruby'? end end + def test_metadata_link_validation_warns_for_duplicates + util_setup_validate + + Dir.chdir @tempdir do + @m2 = quick_gem "m", "2" do |s| + s.required_ruby_version = ">= 2.3.0" + s.files = %w[lib/code.rb] + s.licenses = "BSD-2-Clause" + s.metadata = { + "source_code_uri" => "http://example.com", + "homepage_uri" => "http://example.com", + "changelog_uri" => "http://example.com/changelog", + } + end + + use_ui @ui do + @m2.validate + end + + expected = <<~EXPECTED + #{w}: You have specified the uri: + http://example.com + for all of the following keys: + homepage_uri + source_code_uri + Only the first one will be shown on rubygems.org + #{w}: See https://guides.rubygems.org/specification-reference/ for help + EXPECTED + + assert_equal expected, @ui.error, "warning" + end + end + def test_metadata_specs - @m1 = quick_gem 'm', '1' do |s| + @m1 = quick_gem "m", "1" do |s| s.files = %w[lib/code.rb] - s.metadata = { 'one' => "two", 'two' => "three" } + s.metadata = { "one" => "two", "two" => "three" } end valid_ruby_spec = <<-EOF @@ -3563,7 +3773,7 @@ Did you mean 'Ruby'? Gem::Specification.new do |s| s.name = "m".freeze - s.version = "1" + s.version = "1".freeze s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.metadata = { "one" => "two", "two" => "three" } if s.respond_to? :metadata= @@ -3591,7 +3801,7 @@ end extconf_rb = File.join @ext.gem_dir, @ext.extensions.first FileUtils.mkdir_p File.dirname extconf_rb - File.open extconf_rb, 'w' do |f| + File.open extconf_rb, "w" do |f| f.write <<-'RUBY' File.open 'Makefile', 'w' do |f| f.puts "clean:\n\techo clean" @@ -3607,8 +3817,8 @@ end end def test_missing_extensions_eh_default_gem - spec = new_default_spec 'default', 1 - spec.extensions << 'extconf.rb' + spec = new_default_spec "default", 1 + spec.extensions << "extconf.rb" refute spec.missing_extensions? end @@ -3618,7 +3828,7 @@ end end def test_find_all_by_full_name - pl = Gem::Platform.new 'i386-linux' + pl = Gem::Platform.new "i386-linux" a1 = util_spec "a", "1" a1_pre = util_spec "a", "1.0.0.pre.1" @@ -3662,6 +3872,13 @@ end assert Gem::Specification.find_by_name "q" end + def test_find_by_name_with_only_prereleases_with_requirements + q = util_spec "q", "2.a" + install_specs q + + assert Gem::Specification.find_by_name "q", ">= 1" + end + def test_find_by_name_prerelease b = util_spec "b", "2.a" @@ -3669,6 +3886,8 @@ end install_specs b + Gem::Specification.reset + assert Gem::Specification.find_by_name "b" assert_raise Gem::MissingSpecVersionError do @@ -3678,14 +3897,31 @@ end assert Gem::Specification.find_by_name "b", ">1" end + def test_find_by_full_name + pl = Gem::Platform.new "x86_64-linux" + + a = util_spec "a", "1" + install_specs a + + a_pl = util_spec("a", "1") {|s| s.platform = pl } + install_specs a_pl + + assert_equal a, Gem::Specification.find_by_full_name("a-1") + assert_equal a_pl, Gem::Specification.find_by_full_name("a-1-x86_64-linux") + + assert_nil Gem::Specification.find_by_full_name("a-2") + assert_nil Gem::Specification.find_by_full_name("b-1") + assert_nil Gem::Specification.find_by_full_name("a-1-arm64-linux") + end + def test_find_by_path a = util_spec "foo", "1", nil, "lib/foo.rb" install_specs a - assert_equal a, Gem::Specification.find_by_path('foo') + assert_equal a, Gem::Specification.find_by_path("foo") a.activate - assert_equal a, Gem::Specification.find_by_path('foo') + assert_equal a, Gem::Specification.find_by_path("foo") end def test_find_inactive_by_path @@ -3693,9 +3929,9 @@ end install_specs a - assert_equal a, Gem::Specification.find_inactive_by_path('foo') + assert_equal a, Gem::Specification.find_inactive_by_path("foo") a.activate - assert_nil Gem::Specification.find_inactive_by_path('foo') + assert_nil Gem::Specification.find_inactive_by_path("foo") end def test_load_default_gem @@ -3735,7 +3971,7 @@ end FileUtils.touch File.join("lib", "code.rb") FileUtils.touch File.join("test", "suite.rb") - File.open "bin/exec", "w", 0755 do |fp| + File.open "bin/exec", "w", 0o755 do |fp| fp.puts "#!#{Gem.ruby}" end ensure |