Skip to content

Commit a4ba1a4

Browse files
Warn (rather than crash) when setting nil specification versions
1 parent d84551b commit a4ba1a4

File tree

5 files changed

+40
-8
lines changed

5 files changed

+40
-8
lines changed

lib/rubygems/specification.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2653,6 +2653,8 @@ def validate_permissions
26532653

26542654
def version=(version)
26552655
@version = Gem::Version.create(version)
2656+
return if @version.nil?
2657+
26562658
# skip to set required_ruby_version when pre-released rubygems.
26572659
# It caused to raise CircularDependencyError
26582660
if @version.prerelease? && (@name.nil? || @name.strip != "rubygems")

lib/rubygems/version.rb

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,7 @@ def version
171171
# True if the +version+ string matches RubyGems' requirements.
172172

173173
def self.correct?(version)
174-
unless Gem::Deprecate.skip
175-
warn "nil versions are discouraged and will be deprecated in Rubygems 4" if version.nil?
176-
end
174+
nil_versions_are_discouraged! if version.nil?
177175

178176
!!(version.to_s =~ ANCHORED_VERSION_PATTERN)
179177
end
@@ -190,6 +188,8 @@ def self.create(input)
190188
if self === input # check yourself before you wreck yourself
191189
input
192190
elsif input.nil?
191+
nil_versions_are_discouraged!
192+
193193
nil
194194
else
195195
new input
@@ -206,6 +206,14 @@ def self.new(version) # :nodoc:
206206
@@all[version] ||= super
207207
end
208208

209+
def self.nil_versions_are_discouraged!
210+
unless Gem::Deprecate.skip
211+
warn "nil versions are discouraged and will be deprecated in Rubygems 4"
212+
end
213+
end
214+
215+
private_class_method :nil_versions_are_discouraged!
216+
209217
##
210218
# Constructs a Version from the +version+ string. A version string is a
211219
# series of digits or ASCII letters separated by dots.

test/rubygems/test_gem_requirement.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,9 @@ def test_satisfied_by_eh_bang_equal
129129
assert_satisfied_by "1.3", r
130130

131131
assert_raise ArgumentError do
132-
assert_satisfied_by nil, r
132+
Gem::Deprecate.skip_during do
133+
assert_satisfied_by nil, r
134+
end
133135
end
134136
end
135137

@@ -141,7 +143,9 @@ def test_satisfied_by_eh_blank
141143
refute_satisfied_by "1.3", r
142144

143145
assert_raise ArgumentError do
144-
assert_satisfied_by nil, r
146+
Gem::Deprecate.skip_during do
147+
assert_satisfied_by nil, r
148+
end
145149
end
146150
end
147151

@@ -153,7 +157,9 @@ def test_satisfied_by_eh_equal
153157
refute_satisfied_by "1.3", r
154158

155159
assert_raise ArgumentError do
156-
assert_satisfied_by nil, r
160+
Gem::Deprecate.skip_during do
161+
assert_satisfied_by nil, r
162+
end
157163
end
158164
end
159165

test/rubygems/test_gem_specification.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,15 @@ def test_initialize_prerelease_version_before_name
12201220
assert_equal "1.0.0.dev", spec.version.to_s
12211221
end
12221222

1223+
def test_initialize_nil_version
1224+
expected = "nil versions are discouraged and will be deprecated in Rubygems 4\n"
1225+
actual_stdout, actual_stderr = capture_output do
1226+
Gem::Specification.new.version = nil
1227+
end
1228+
assert_empty actual_stdout
1229+
assert_equal(expected, actual_stderr)
1230+
end
1231+
12231232
def test__dump
12241233
@a2.platform = Gem::Platform.local
12251234
@a2.instance_variable_set :@original_platform, "old_platform"

test/rubygems/test_gem_version.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,15 @@ def test_bump_one_level
3232
def test_class_create
3333
real = Gem::Version.new(1.0)
3434

35-
assert_same real, Gem::Version.create(real)
36-
assert_nil Gem::Version.create(nil)
35+
assert_same real, Gem::Version.create(real)
36+
37+
expected = "nil versions are discouraged and will be deprecated in Rubygems 4\n"
38+
actual_stdout, actual_stderr = capture_output do
39+
assert_nil Gem::Version.create(nil)
40+
end
41+
assert_empty actual_stdout
42+
assert_equal(expected, actual_stderr)
43+
3744
assert_equal v("5.1"), Gem::Version.create("5.1")
3845

3946
ver = "1.1".freeze

0 commit comments

Comments
 (0)