# frozen_string_literal: truemoduleBundlerclassRubyVersionattr_reader:versions,:patchlevel,:engine,:engine_versions,:gem_version,:engine_gem_versiondefinitialize(versions,patchlevel,engine,engine_version)# The parameters to this method must satisfy the# following constraints, which are verified in# the DSL:## * If an engine is specified, an engine version# must also be specified# * If an engine version is specified, an engine# must also be specified# * If the engine is "ruby", the engine version# must not be specified, or the engine version# specified must match the version.@versions=Array(versions).mapdo|v|op,v=Gem::Requirement.parse(v)op=="="?v.to_s:"#{op}#{v}"end@gem_version=Gem::Requirement.create(@versions.first).requirements.first.last@input_engine=engine&&engine.to_s@engine=engine&&engine.to_s||"ruby"@engine_versions=(engine_version&&Array(engine_version))||@versions@engine_gem_version=Gem::Requirement.create(@engine_versions.first).requirements.first.last@patchlevel=patchlevelenddefto_s(versions=self.versions)output=String.new("ruby #{versions_string(versions)}")output<<"p#{patchlevel}"ifpatchleveloutput<<" (#{engine}#{versions_string(engine_versions)})"unlessengine=="ruby"outputend# @privatePATTERN=/
ruby\s
([\d.]+) # ruby version
(?:p(-?\d+))? # optional patchlevel
(?:\s\((\S+)\s(.+)\))? # optional engine info
/xo# Returns a RubyVersion from the given string.# @param [String] the version string to match.# @return [RubyVersion,Nil] The version if the string is a valid RubyVersion# description, and nil otherwise.defself.from_string(string)new($1,$2,$3,$4)ifstring=~PATTERNenddefsingle_version_stringto_s(gem_version)enddef==(other)versions==other.versions&&engine==other.engine&&engine_versions==other.engine_versions&&patchlevel==other.patchlevelenddefhost@host||=[RbConfig::CONFIG["host_cpu"],RbConfig::CONFIG["host_vendor"],RbConfig::CONFIG["host_os"]].join("-")end# Returns a tuple of these things:# [diff, this, other]# The priority of attributes are# 1. engine# 2. ruby_version# 3. engine_versiondefdiff(other)raiseArgumentError,"Can only diff with a RubyVersion, not a #{other.class}"unlessother.is_a?(RubyVersion)ifengine!=other.engine&&@input_engine[:engine,engine,other.engine]elsifversions.empty?||!matches?(versions,other.gem_version)[:version,versions_string(versions),versions_string(other.versions)]elsif@input_engine&&!matches?(engine_versions,other.engine_gem_version)[:engine_version,versions_string(engine_versions),versions_string(other.engine_versions)]elsifpatchlevel&&(!patchlevel.is_a?(String)||!other.patchlevel.is_a?(String)||!matches?(patchlevel,other.patchlevel))[:patchlevel,patchlevel,other.patchlevel]endenddefversions_string(versions)Array(versions).join(", ")enddefself.systemruby_engine=ifdefined?(RUBY_ENGINE)&&!RUBY_ENGINE.nil?RUBY_ENGINE.dupelse# not defined in ruby 1.8.7"ruby"end# :sob: mocking RUBY_VERSION breaks stuff on 1.8.7ruby_version=ENV.fetch("BUNDLER_SPEC_RUBY_VERSION"){RUBY_VERSION}.dupruby_engine_version=caseruby_enginewhen"ruby"ruby_versionwhen"rbx"Rubinius::VERSION.dupwhen"jruby"JRUBY_VERSION.dupelseraiseBundlerError,"RUBY_ENGINE value #{RUBY_ENGINE} is not recognized"endpatchlevel=RUBY_PATCHLEVEL.to_s@ruby_version||=RubyVersion.new(ruby_version,patchlevel,ruby_engine,ruby_engine_version)enddefto_gem_version_with_patchlevel@gem_version_with_patch||=beginGem::Version.create("#{@gem_version}.#{@patchlevel}")rescueArgumentError@gem_versionendenddefexact?return@exactifdefined?(@exact)@exact=versions.all?{|v|Gem::Requirement.create(v).exact?}endprivatedefmatches?(requirements,version)# Handles RUBY_PATCHLEVEL of -1 for instances like ruby-headreturnrequirements==versionifrequirements.to_s=="-1"||version.to_s=="-1"Array(requirements).all?do|requirement|Gem::Requirement.create(requirement).satisfied_by?(Gem::Version.create(version))endendendend