Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lib/rubygems.rb
Original file line number Diff line number Diff line change
Expand Up @@ -918,6 +918,12 @@ def self.ruby_version
@ruby_version = Gem::Version.new version
end

##
# A Gem::Version for the current Ruby engine.
def self.ruby_engine_version
@engine_version ||= Gem::Version.new RUBY_ENGINE_VERSION
end

##
# A Gem::Version for the currently running RubyGems

Expand Down
13 changes: 13 additions & 0 deletions lib/rubygems/installer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -610,6 +610,18 @@ def ensure_required_ruby_version_met # :nodoc:
end
end

def ensure_required_engine_version_met # :nodoc:
rev = spec.required_engine_version

rev.each do |engine, requirement|
if engine.downcase.to_s == Gem.ruby_engine then
unless requirement.satisfied_by?(Gem.ruby_engine_version) then
raise Gem::InstallError, "#{engine} requires Ruby engine version #{requirement}."
end
end
end
end

def ensure_required_rubygems_version_met # :nodoc:
if rrgv = spec.required_rubygems_version then
unless rrgv.satisfied_by? Gem.rubygems_version then
Expand Down Expand Up @@ -823,6 +835,7 @@ def pre_install_checks

ensure_required_ruby_version_met
ensure_required_rubygems_version_met
ensure_required_engine_version_met
ensure_dependencies_met unless @ignore_dependencies

true
Expand Down
45 changes: 40 additions & 5 deletions lib/rubygems/specification.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,13 @@ class Gem::Specification < Gem::BasicSpecification
# Now forward-compatible with future versions
# 3 1.3.2 2009-01-03 Added Fixnum validation to specification_version
# 4 1.9.0 2011-06-07 Added metadata
# 5 2.3.0 2016-02-10 Added required_engine_version
#--
# When updating this number, be sure to also update #to_ruby.
#
# NOTE RubyGems < 1.2 cannot load specification versions > 2.

CURRENT_SPECIFICATION_VERSION = 4 # :nodoc:
CURRENT_SPECIFICATION_VERSION = 5 # :nodoc:

##
# An informal list of changes to the specification. The highest-valued
Expand All @@ -90,6 +91,9 @@ class Gem::Specification < Gem::BasicSpecification
],
4 => [
'Added sandboxed freeform metadata to the specification version.'
],
5 => [
'Added required_engine_version to the specification version.'
]
}

Expand All @@ -99,6 +103,7 @@ class Gem::Specification < Gem::BasicSpecification
2 => 16,
3 => 17,
4 => 18,
5 => 19
}

today = Time.now.utc
Expand Down Expand Up @@ -155,6 +160,7 @@ class Gem::Specification < Gem::BasicSpecification
:summary => nil,
:test_files => [],
:version => nil,
:required_engine_version => {},
}

Dupable = { } # :nodoc:
Expand Down Expand Up @@ -428,6 +434,11 @@ def files

attr_reader :required_ruby_version

##
# The Ruby engine required by this gem

attr_reader :required_engine_version

##
# The RubyGems version required by this gem

Expand Down Expand Up @@ -651,6 +662,28 @@ def required_rubygems_version= req
@required_rubygems_version = Gem::Requirement.create req
end

##
# The Ruby engine required by this gem, e.g. 'ruby', 'jruby', 'rubinius', and
# the version required for that engine.
#
# Usage:
#
# spec.required_engine_version = {
# :ruby => '>= 1.9.3',
# :jruby => '>= 1.7.24',
# :rubinius => '~> 3.0'
# }
#
def required_engine_version= req
@required_engine_version = {}

req.each do |engine, value|
@required_engine_version[engine] = Gem::Requirement.create value
end

@required_engine_version
end

##
# Lists the external (to RubyGems) requirements that must be met for this gem
# to work. It's simply information for the user.
Expand Down Expand Up @@ -1342,11 +1375,12 @@ def self._load(str)
spec.instance_variable_set :@homepage, array[14]
spec.instance_variable_set :@has_rdoc, array[15]
spec.instance_variable_set :@new_platform, array[16]
spec.instance_variable_set :@platform, array[16].to_s
spec.instance_variable_set :@license, array[17]
spec.instance_variable_set :@metadata, array[18]
spec.instance_variable_set :@platform, array[17].to_s
spec.instance_variable_set :@license, array[18]
spec.instance_variable_set :@metadata, array[19]
spec.instance_variable_set :@loaded, false
spec.instance_variable_set :@activated, false
spec.instance_variable_set :@required_engine_version, array[20]

spec
end
Expand Down Expand Up @@ -1388,7 +1422,8 @@ def _dump(limit)
true, # has_rdoc
@new_platform,
@licenses,
@metadata
@metadata,
@required_engine_version
]
end

Expand Down
9 changes: 8 additions & 1 deletion test/rubygems/test_gem_specification.rb
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,7 @@ def test_self_attribute_names
post_install_message
rdoc_options
require_paths
required_engine_version
required_ruby_version
required_rubygems_version
requirements
Expand Down Expand Up @@ -1166,6 +1167,7 @@ def test_initialize
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({}, spec.required_engine_version)
end

def test_initialize_future
Expand Down Expand Up @@ -1199,6 +1201,7 @@ def test_initialize_copy
s.extensions = 'ext/extconf.rb'
s.requirements = 'requirement'
s.add_dependency 'some_gem'
s.required_engine_version = {:ruby => '>= 1.9.3', :jruby => '>= 1.7.24'}
end

new_spec = spec.dup
Expand Down Expand Up @@ -1252,6 +1255,10 @@ def test_initialize_copy
assert_equal '>= 0', spec.required_rubygems_version.to_s
assert_same spec.required_rubygems_version,
new_spec.required_rubygems_version

engines = [Gem::Requirement.new('>= 1.9.3'), Gem::Requirement.new('>= 1.7.24')]
assert_equal({:ruby => engines[0], :jruby => engines[1]}, spec.required_engine_version)
assert_same spec.required_engine_version, new_spec.required_engine_version
end

def test_initialize_copy_broken
Expand Down Expand Up @@ -2422,7 +2429,7 @@ def test_to_ruby_fancy
s.test_files = ["test/suite.rb".freeze]

if s.respond_to? :specification_version then
s.specification_version = 4
s.specification_version = 5

if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rake>.freeze, [\"> 0.4\"])
Expand Down