From e4bb33747ab21f125d80e6d2c466d4449b26c27f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20=C5=A0im=C3=A1nek?= Date: Mon, 25 Oct 2021 02:47:04 +0200 Subject: [PATCH] Warn on empty or open required_ruby_version specification attribute. --- lib/rubygems/specification_policy.rb | 8 +++ .../specifications/rubyforge-0.0.1.gemspec | 21 ++++---- .../test_gem_commands_build_command.rb | 2 + test/rubygems/test_gem_specification.rb | 49 +++++++++++++++++++ 4 files changed, 70 insertions(+), 10 deletions(-) diff --git a/lib/rubygems/specification_policy.rb b/lib/rubygems/specification_policy.rb index 27c2681533f4..516c26f53c8a 100644 --- a/lib/rubygems/specification_policy.rb +++ b/lib/rubygems/specification_policy.rb @@ -103,6 +103,8 @@ def validate_optional(strict) validate_dependencies + validate_required_ruby_version + validate_extensions validate_removed_attributes @@ -227,6 +229,12 @@ def validate_dependencies # :nodoc: end end + def validate_required_ruby_version + if @specification.required_ruby_version.requirements == [Gem::Requirement::DefaultRequirement] + warning "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" + end + end + ## # Issues a warning for each file to be packaged which is world-readable. # diff --git a/test/rubygems/specifications/rubyforge-0.0.1.gemspec b/test/rubygems/specifications/rubyforge-0.0.1.gemspec index 49619bf56916..0421b675a0f9 100644 --- a/test/rubygems/specifications/rubyforge-0.0.1.gemspec +++ b/test/rubygems/specifications/rubyforge-0.0.1.gemspec @@ -1,14 +1,15 @@ # frozen_string_literal: true Gem::Specification.new do |s| - s.name = "rubyforge" - s.version = "0.0.1" - s.platform = "ruby" - s.require_paths = ["lib"] - s.summary = "A very bar gem" - s.authors = ["unknown"] - s.license = "MIT" - s.homepage = "http://example.com" - s.files = ["README.md"] - s.rubyforge_project = "abc" + s.name = "rubyforge" + s.version = "0.0.1" + s.platform = "ruby" + s.require_paths = ["lib"] + s.summary = "A very bar gem" + s.authors = ["unknown"] + s.license = "MIT" + s.homepage = "http://example.com" + s.files = ["README.md"] + s.rubyforge_project = "abc" + s.required_ruby_version = ">= 1.9.3" end diff --git a/test/rubygems/test_gem_commands_build_command.rb b/test/rubygems/test_gem_commands_build_command.rb index 983cf7b47228..d44126d2046a 100644 --- a/test/rubygems/test_gem_commands_build_command.rb +++ b/test/rubygems/test_gem_commands_build_command.rb @@ -28,6 +28,7 @@ def setup @gem = util_spec "some_gem" do |s| s.license = "AGPL-3.0-only" s.files = ["README.md"] + s.required_ruby_version = "2.3.0" end @cmd = Gem::Commands::BuildCommand.new @@ -178,6 +179,7 @@ def test_execute_rubyforge_project_warning def test_execute_strict_with_warnings bad_gem = util_spec "some_bad_gem" do |s| s.files = ["README.md"] + s.required_ruby_version = ">= 1.9.3" end gemspec_file = File.join(@tempdir, bad_gem.spec_name) diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index 9aa88fd5a3aa..9e05649f7cfd 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -90,6 +90,7 @@ def setup Gem.instance_variable_set(:'@default_source_date_epoch', nil) @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" @@ -2707,6 +2708,53 @@ def test_validate_dependencies_allowed_duplicates 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 <<-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 + def test_validate_prerelease_dependencies_with_prerelease_version util_setup_validate @@ -3683,6 +3731,7 @@ def test_metadata_link_validation_warns_for_duplicates 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 = {