Merge rubygems master from 446cc57a7c

This commit is contained in:
Hiroshi SHIBATA 2022-07-29 14:59:56 +09:00
parent f29f1d22c3
commit bfd09b1116
Notes: git 2022-07-29 15:46:37 +09:00
26 changed files with 174 additions and 58 deletions

View File

@ -218,6 +218,8 @@ module Bundler
"Specify the number of jobs to run in parallel" "Specify the number of jobs to run in parallel"
method_option "local", :type => :boolean, :banner => method_option "local", :type => :boolean, :banner =>
"Do not attempt to fetch gems remotely and use the gem cache instead" "Do not attempt to fetch gems remotely and use the gem cache instead"
method_option "prefer-local", :type => :boolean, :banner =>
"Only attempt to fetch gems remotely if not present locally, even if newer versions are available remotely"
method_option "no-cache", :type => :boolean, :banner => method_option "no-cache", :type => :boolean, :banner =>
"Don't update the existing gem cache." "Don't update the existing gem cache."
method_option "redownload", :type => :boolean, :aliases => "--force", :banner => method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>

View File

@ -70,6 +70,7 @@ module Bundler
@unlock = unlock @unlock = unlock
@optional_groups = optional_groups @optional_groups = optional_groups
@remote = false @remote = false
@prefer_local = false
@specs = nil @specs = nil
@ruby_version = ruby_version @ruby_version = ruby_version
@gemfiles = gemfiles @gemfiles = gemfiles
@ -170,6 +171,13 @@ module Bundler
resolve resolve
end end
def resolve_prefering_local!
@prefer_local = true
@remote = true
sources.remote!
resolve
end
def resolve_with_cache! def resolve_with_cache!
sources.cached! sources.cached!
resolve resolve
@ -528,6 +536,19 @@ module Bundler
@remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source? @remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
end end
def pin_locally_available_names(source_requirements)
source_requirements.each_with_object({}) do |(name, original_source), new_source_requirements|
local_source = original_source.dup
local_source.local_only!
new_source_requirements[name] = if local_source.specs.search(name).any?
local_source
else
original_source
end
end
end
def current_ruby_platform_locked? def current_ruby_platform_locked?
return false unless generic_local_platform == Gem::Platform::RUBY return false unless generic_local_platform == Gem::Platform::RUBY
return false if Bundler.settings[:force_ruby_platform] && !@platforms.include?(Gem::Platform::RUBY) return false if Bundler.settings[:force_ruby_platform] && !@platforms.include?(Gem::Platform::RUBY)
@ -765,7 +786,7 @@ module Bundler
def metadata_dependencies def metadata_dependencies
@metadata_dependencies ||= [ @metadata_dependencies ||= [
Dependency.new("Ruby\0", RubyVersion.system.gem_version), Dependency.new("Ruby\0", Gem.ruby_version),
Dependency.new("RubyGems\0", Gem::VERSION), Dependency.new("RubyGems\0", Gem::VERSION),
] ]
end end
@ -792,7 +813,9 @@ module Bundler
# specs will be available later when the resolver knows where to # specs will be available later when the resolver knows where to
# look for that gemspec (or its dependencies) # look for that gemspec (or its dependencies)
source_requirements = if precompute_source_requirements_for_indirect_dependencies? source_requirements = if precompute_source_requirements_for_indirect_dependencies?
{ :default => sources.default_source }.merge(source_map.all_requirements) all_requirements = source_map.all_requirements
all_requirements = pin_locally_available_names(all_requirements) if @prefer_local
{ :default => sources.default_source }.merge(all_requirements)
else else
{ :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements) { :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
end end
@ -806,7 +829,9 @@ module Bundler
end end
def requested_groups def requested_groups
groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with] values = groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
values &= Bundler.settings[:only] unless Bundler.settings[:only].empty?
values
end end
def lockfiles_equal?(current, proposed, preserve_unknown_sections) def lockfiles_equal?(current, proposed, preserve_unknown_sections)

View File

@ -268,7 +268,14 @@ module Bundler
return false if @definition.nothing_changed? && !@definition.missing_specs? return false if @definition.nothing_changed? && !@definition.missing_specs?
end end
options["local"] ? @definition.resolve_with_cache! : @definition.resolve_remotely! if options["local"]
@definition.resolve_with_cache!
elsif options["prefer-local"]
@definition.resolve_prefering_local!
else
@definition.resolve_remotely!
end
true true
end end

View File

@ -74,6 +74,10 @@ Creates a directory (defaults to \fB~/bin\fR) and place any executables from the
In deployment mode, Bundler will \'roll\-out\' the bundle for \fBproduction\fR use\. Please check carefully if you want to have this option enabled in \fBdevelopment\fR or \fBtest\fR environments\. In deployment mode, Bundler will \'roll\-out\' the bundle for \fBproduction\fR use\. Please check carefully if you want to have this option enabled in \fBdevelopment\fR or \fBtest\fR environments\.
. .
.TP .TP
\fBonly\fR
A space\-separated list of groups to install only gems of the specified groups\.
.
.TP
\fBpath\fR \fBpath\fR
The location to install the specified gems to\. This defaults to Rubygems\' setting\. Bundler shares this location with Rubygems, \fBgem install \.\.\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \.\.\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\. The location to install the specified gems to\. This defaults to Rubygems\' setting\. Bundler shares this location with Rubygems, \fBgem install \.\.\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \.\.\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\.
. .
@ -223,6 +227,9 @@ The following is a list of all configuration keys and their purpose\. You can le
\fBno_prune\fR (\fBBUNDLE_NO_PRUNE\fR): Whether Bundler should leave outdated gems unpruned when caching\. \fBno_prune\fR (\fBBUNDLE_NO_PRUNE\fR): Whether Bundler should leave outdated gems unpruned when caching\.
. .
.IP "\(bu" 4 .IP "\(bu" 4
\fBonly\fR (\fBBUNDLE_ONLY\fR): A space\-separated list of groups to install only gems of the specified groups\.
.
.IP "\(bu" 4
\fBpath\fR (\fBBUNDLE_PATH\fR): The location on disk where all gems in your bundle will be located regardless of \fB$GEM_HOME\fR or \fB$GEM_PATH\fR values\. Bundle gems not found in this location will be installed by \fBbundle install\fR\. Defaults to \fBGem\.dir\fR\. When \-\-deployment is used, defaults to vendor/bundle\. \fBpath\fR (\fBBUNDLE_PATH\fR): The location on disk where all gems in your bundle will be located regardless of \fB$GEM_HOME\fR or \fB$GEM_PATH\fR values\. Bundle gems not found in this location will be installed by \fBbundle install\fR\. Defaults to \fBGem\.dir\fR\. When \-\-deployment is used, defaults to vendor/bundle\.
. .
.IP "\(bu" 4 .IP "\(bu" 4

View File

@ -74,6 +74,9 @@ The options that can be configured are:
`production` use. Please check carefully if you want to have this option `production` use. Please check carefully if you want to have this option
enabled in `development` or `test` environments. enabled in `development` or `test` environments.
* `only`:
A space-separated list of groups to install only gems of the specified groups.
* `path`: * `path`:
The location to install the specified gems to. This defaults to Rubygems' The location to install the specified gems to. This defaults to Rubygems'
setting. Bundler shares this location with Rubygems, `gem install ...` will setting. Bundler shares this location with Rubygems, `gem install ...` will
@ -218,6 +221,8 @@ learn more about their operation in [bundle install(1)](bundle-install.1.html).
Whether `bundle package` should skip installing gems. Whether `bundle package` should skip installing gems.
* `no_prune` (`BUNDLE_NO_PRUNE`): * `no_prune` (`BUNDLE_NO_PRUNE`):
Whether Bundler should leave outdated gems unpruned when caching. Whether Bundler should leave outdated gems unpruned when caching.
* `only` (`BUNDLE_ONLY`):
A space-separated list of groups to install only gems of the specified groups.
* `path` (`BUNDLE_PATH`): * `path` (`BUNDLE_PATH`):
The location on disk where all gems in your bundle will be located regardless The location on disk where all gems in your bundle will be located regardless
of `$GEM_HOME` or `$GEM_PATH` values. Bundle gems not found in this location of `$GEM_HOME` or `$GEM_PATH` values. Bundle gems not found in this location

View File

@ -30,4 +30,7 @@ bundle inject \'rack\' \'> 0\'
.IP "" 0 .IP "" 0
. .
.P .P
This will inject the \'rack\' gem with a version greater than 0 in your [\fBGemfile(5)\fR][Gemfile(5)] and Gemfile\.lock This will inject the \'rack\' gem with a version greater than 0 in your [\fBGemfile(5)\fR][Gemfile(5)] and Gemfile\.lock\.
.
.P
The \fBbundle inject\fR command was deprecated in Bundler 2\.1 and will be removed in Bundler 3\.0\.

View File

@ -19,4 +19,6 @@ Example:
bundle inject 'rack' '> 0' bundle inject 'rack' '> 0'
This will inject the 'rack' gem with a version greater than 0 in your This will inject the 'rack' gem with a version greater than 0 in your
[`Gemfile(5)`][Gemfile(5)] and Gemfile.lock [`Gemfile(5)`][Gemfile(5)] and Gemfile.lock.
The `bundle inject` command was deprecated in Bundler 2.1 and will be removed in Bundler 3.0.

View File

@ -70,6 +70,10 @@ The maximum number of parallel download and install jobs\. The default is the nu
Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if an appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\. Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if an appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\.
. .
.TP .TP
\fB\-\-prefer\-local\fR
Force using locally installed gems, or gems already present in Rubygems\' cache or in \fBvendor/cache\fR, when resolving, even if newer versions are available remotely\. Only attempt to connect to \fBrubygems\.org\fR for gems that are not present locally\.
.
.TP
\fB\-\-no\-cache\fR \fB\-\-no\-cache\fR
Do not update the cache in \fBvendor/cache\fR with the newly bundled gems\. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install\. Do not update the cache in \fBvendor/cache\fR with the newly bundled gems\. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install\.
. .

View File

@ -109,6 +109,12 @@ automatically and that requires `bundler` to silently remember them. Since
appropriate platform-specific gem exists on `rubygems.org` it will not be appropriate platform-specific gem exists on `rubygems.org` it will not be
found. found.
* `--prefer-local`:
Force using locally installed gems, or gems already present in Rubygems' cache
or in `vendor/cache`, when resolving, even if newer versions are available
remotely. Only attempt to connect to `rubygems.org` for gems that are not
present locally.
* `--no-cache`: * `--no-cache`:
Do not update the cache in `vendor/cache` with the newly bundled gems. This Do not update the cache in `vendor/cache` with the newly bundled gems. This
does not remove any gems in the cache but keeps the newly bundled gems from does not remove any gems in the cache but keeps the newly bundled gems from

View File

@ -81,7 +81,7 @@ Show the source location of a particular gem in the bundle
Show all of the outdated gems in the current bundle Show all of the outdated gems in the current bundle
. .
.TP .TP
\fBbundle console(1)\fR \fBbundle console(1)\fR (deprecated)
Start an IRB session in the current bundle Start an IRB session in the current bundle
. .
.TP .TP
@ -129,5 +129,8 @@ These commands are obsolete and should no longer be used:
.IP "\(bu" 4 .IP "\(bu" 4
\fBbundle cache(1)\fR \fBbundle cache(1)\fR
. .
.IP "\(bu" 4
\fBbundle inject(1)\fR
.
.IP "" 0 .IP "" 0

View File

@ -67,7 +67,7 @@ We divide `bundle` subcommands into primary commands and utilities:
* [`bundle outdated(1)`](bundle-outdated.1.html): * [`bundle outdated(1)`](bundle-outdated.1.html):
Show all of the outdated gems in the current bundle Show all of the outdated gems in the current bundle
* `bundle console(1)`: * `bundle console(1)` (deprecated):
Start an IRB session in the current bundle Start an IRB session in the current bundle
* [`bundle open(1)`](bundle-open.1.html): * [`bundle open(1)`](bundle-open.1.html):
@ -108,3 +108,4 @@ and execute it, passing down any extra arguments to it.
These commands are obsolete and should no longer be used: These commands are obsolete and should no longer be used:
* `bundle cache(1)` * `bundle cache(1)`
* `bundle inject(1)`

View File

@ -32,12 +32,12 @@ module Bundler
@engine = engine && engine.to_s || "ruby" @engine = engine && engine.to_s || "ruby"
@engine_versions = (engine_version && Array(engine_version)) || @versions @engine_versions = (engine_version && Array(engine_version)) || @versions
@engine_gem_version = Gem::Requirement.create(@engine_versions.first).requirements.first.last @engine_gem_version = Gem::Requirement.create(@engine_versions.first).requirements.first.last
@patchlevel = patchlevel @patchlevel = patchlevel || (@gem_version.prerelease? ? "-1" : nil)
end end
def to_s(versions = self.versions) def to_s(versions = self.versions)
output = String.new("ruby #{versions_string(versions)}") output = String.new("ruby #{versions_string(versions)}")
output << "p#{patchlevel}" if patchlevel output << "p#{patchlevel}" if patchlevel && patchlevel != "-1"
output << " (#{engine} #{versions_string(engine_versions)})" unless engine == "ruby" output << " (#{engine} #{versions_string(engine_versions)})" unless engine == "ruby"
output output
@ -46,7 +46,7 @@ module Bundler
# @private # @private
PATTERN = / PATTERN = /
ruby\s ruby\s
([\d.]+) # ruby version (\d+\.\d+\.\d+(?:\.\S+)?) # ruby version
(?:p(-?\d+))? # optional patchlevel (?:p(-?\d+))? # optional patchlevel
(?:\s\((\S+)\s(.+)\))? # optional engine info (?:\s\((\S+)\s(.+)\))? # optional engine info
/xo.freeze /xo.freeze
@ -103,8 +103,8 @@ module Bundler
def self.system def self.system
ruby_engine = RUBY_ENGINE.dup ruby_engine = RUBY_ENGINE.dup
ruby_version = RUBY_VERSION.dup ruby_version = Gem.ruby_version.to_s
ruby_engine_version = RUBY_ENGINE_VERSION.dup ruby_engine_version = RUBY_ENGINE == "ruby" ? ruby_version : RUBY_ENGINE_VERSION.dup
patchlevel = RUBY_PATCHLEVEL.to_s patchlevel = RUBY_PATCHLEVEL.to_s
@ruby_version ||= RubyVersion.new(ruby_version, patchlevel, ruby_engine, ruby_engine_version) @ruby_version ||= RubyVersion.new(ruby_version, patchlevel, ruby_engine, ruby_engine_version)

View File

@ -17,6 +17,15 @@ require "rubygems/source"
require_relative "match_platform" require_relative "match_platform"
# Cherry-pick fixes to `Gem.ruby_version` to be useful for modern Bundler
# versions and ignore patchlevels
# (https://github.com/rubygems/rubygems/pull/5472,
# https://github.com/rubygems/rubygems/pull/5486). May be removed once RubyGems
# 3.3.12 support is dropped.
unless Gem.ruby_version.to_s == RUBY_VERSION || RUBY_PATCHLEVEL == -1
Gem.instance_variable_set(:@ruby_version, Gem::Version.new(RUBY_VERSION))
end
module Gem module Gem
class Specification class Specification
include ::Bundler::MatchPlatform include ::Bundler::MatchPlatform

View File

@ -57,6 +57,7 @@ module Bundler
].freeze ].freeze
ARRAY_KEYS = %w[ ARRAY_KEYS = %w[
only
with with
without without
].freeze ].freeze

View File

@ -5,7 +5,7 @@ module Bundler
class Metadata < Source class Metadata < Source
def specs def specs
@specs ||= Index.build do |idx| @specs ||= Index.build do |idx|
idx << Gem::Specification.new("Ruby\0", RubyVersion.system.gem_version) idx << Gem::Specification.new("Ruby\0", Gem.ruby_version)
idx << Gem::Specification.new("RubyGems\0", Gem::VERSION) do |s| idx << Gem::Specification.new("RubyGems\0", Gem::VERSION) do |s|
s.required_rubygems_version = Gem::Requirement.default s.required_rubygems_version = Gem::Requirement.default
end end

View File

@ -427,9 +427,8 @@ RSpec.describe "Bundler::RubyVersion and its subclasses" do
end end
describe "#version" do describe "#version" do
it "should return a copy of the value of RUBY_VERSION" do it "should return the value of Gem.ruby_version as a string" do
expect(subject.versions).to eq([RUBY_VERSION]) expect(subject.versions).to eq([Gem.ruby_version.to_s])
expect(subject.versions.first).to_not be(RUBY_VERSION)
end end
end end
@ -446,13 +445,12 @@ RSpec.describe "Bundler::RubyVersion and its subclasses" do
describe "#engine_version" do describe "#engine_version" do
context "engine is ruby" do context "engine is ruby" do
before do before do
stub_const("RUBY_ENGINE_VERSION", "2.2.4") allow(Gem).to receive(:ruby_version).and_return(Gem::Version.new("2.2.4"))
stub_const("RUBY_ENGINE", "ruby") stub_const("RUBY_ENGINE", "ruby")
end end
it "should return a copy of the value of RUBY_ENGINE_VERSION" do it "should return the value of Gem.ruby_version as a string" do
expect(bundler_system_ruby_version.engine_versions).to eq(["2.2.4"]) expect(bundler_system_ruby_version.engine_versions).to eq(["2.2.4"])
expect(bundler_system_ruby_version.engine_versions.first).to_not be(RUBY_ENGINE_VERSION)
end end
end end

View File

@ -522,14 +522,14 @@ RSpec.describe "bundle install with gem sources" do
ruby '~> 1.2' ruby '~> 1.2'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
expect(err).to include("Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified ~> 1.2") expect(err).to include("Your Ruby version is #{Gem.ruby_version}, but your Gemfile specified ~> 1.2")
end end
end end
context "and using a supported Ruby version" do context "and using a supported Ruby version" do
before do before do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
end end
@ -555,7 +555,7 @@ RSpec.describe "bundle install with gem sources" do
it "updates Gemfile.lock with updated yet still compatible ruby version" do it "updates Gemfile.lock with updated yet still compatible ruby version" do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION[0..2]}' ruby '~> #{current_ruby_minor}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
@ -913,7 +913,7 @@ RSpec.describe "bundle install with gem sources" do
gemfile <<-G gemfile <<-G
source "https://gem.repo4" source "https://gem.repo4"
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
gem "loofah", "~> 2.12.0" gem "loofah", "~> 2.12.0"
G G
@ -1000,6 +1000,50 @@ RSpec.describe "bundle install with gem sources" do
end end
end end
context "with only option" do
before do
bundle "config set only a:b"
end
it "installs only gems of the specified groups" do
install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}"
gem "rails"
gem "rack", group: :a
gem "rake", group: :b
gem "yard", group: :c
G
expect(out).to include("Installing rack")
expect(out).to include("Installing rake")
expect(out).not_to include("Installing yard")
end
end
context "with --prefer-local flag" do
before do
build_repo4 do
build_gem "foo", "1.0.1"
build_gem "foo", "1.0.0"
build_gem "bar", "1.0.0"
end
system_gems "foo-1.0.0", :path => default_bundle_path, :gem_repo => gem_repo4
end
it "fetches remote sources only when not available locally" do
install_gemfile <<-G, :"prefer-local" => true, :verbose => true
source "#{file_uri_for(gem_repo4)}"
gem "foo"
gem "bar"
G
expect(out).to include("Using foo 1.0.0").and include("Fetching bar 1.0.0").and include("Installing bar 1.0.0")
expect(last_command).to be_success
end
end
context "with a symlinked configured as bundle path and a gem with symlinks" do context "with a symlinked configured as bundle path and a gem with symlinks" do
before do before do
symlinked_bundled_app = tmp("bundled_app-symlink") symlinked_bundled_app = tmp("bundled_app-symlink")

View File

@ -541,11 +541,9 @@ RSpec.describe "bundle lock" do
end end
it "respects lower bound ruby requirements" do it "respects lower bound ruby requirements" do
skip "this spec does not work with prereleases because their version is actually lower than their reported `RUBY_VERSION`" if RUBY_PATCHLEVEL == -1
build_repo4 do build_repo4 do
build_gem "our_private_gem", "0.1.0" do |s| build_gem "our_private_gem", "0.1.0" do |s|
s.required_ruby_version = ">= #{RUBY_VERSION}" s.required_ruby_version = ">= #{Gem.ruby_version}"
end end
end end

View File

@ -983,7 +983,7 @@ RSpec.describe "bundle update --ruby" do
context "when the Gemfile removes the ruby" do context "when the Gemfile removes the ruby" do
before do before do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
@ -1013,12 +1013,12 @@ RSpec.describe "bundle update --ruby" do
context "when the Gemfile specified an updated Ruby version" do context "when the Gemfile specified an updated Ruby version" do
before do before do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
gemfile <<-G gemfile <<-G
ruby '~> #{RUBY_VERSION[0..2]}' ruby '~> #{current_ruby_minor}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
end end
@ -1047,7 +1047,7 @@ RSpec.describe "bundle update --ruby" do
context "when a different Ruby is being used than has been versioned" do context "when a different Ruby is being used than has been versioned" do
before do before do
install_gemfile <<-G install_gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
@ -1083,7 +1083,7 @@ RSpec.describe "bundle update --ruby" do
L L
gemfile <<-G gemfile <<-G
ruby '~> #{RUBY_VERSION}' ruby '~> #{Gem.ruby_version}'
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
G G
end end

View File

@ -11,13 +11,13 @@ RSpec.describe "ruby requirement" do
it "allows adding gems" do it "allows adding gems" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
gem "rack" gem "rack"
G G
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
gem "rack" gem "rack"
gem "rack-obama" gem "rack-obama"
G G
@ -28,7 +28,7 @@ RSpec.describe "ruby requirement" do
it "allows removing the ruby version requirement" do it "allows removing the ruby version requirement" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby "~> #{RUBY_VERSION}" ruby "~> #{Gem.ruby_version}"
gem "rack" gem "rack"
G G
@ -46,7 +46,7 @@ RSpec.describe "ruby requirement" do
it "allows changing the ruby version requirement to something compatible" do it "allows changing the ruby version requirement to something compatible" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby ">= #{RUBY_VERSION[0..2]}.0" ruby ">= #{current_ruby_minor}"
gem "rack" gem "rack"
G G
@ -55,7 +55,7 @@ RSpec.describe "ruby requirement" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby ">= #{RUBY_VERSION}" ruby ">= #{Gem.ruby_version}"
gem "rack" gem "rack"
G G
@ -93,7 +93,7 @@ RSpec.describe "ruby requirement" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby ">= #{RUBY_VERSION[0..2]}.0" ruby ">= #{current_ruby_minor}"
gem "rack" gem "rack"
G G
@ -104,7 +104,7 @@ RSpec.describe "ruby requirement" do
it "allows requirements with trailing whitespace" do it "allows requirements with trailing whitespace" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo1)}" source "#{file_uri_for(gem_repo1)}"
ruby "#{RUBY_VERSION}\\n \t\\n" ruby "#{Gem.ruby_version}\\n \t\\n"
gem "rack" gem "rack"
G G

View File

@ -211,7 +211,7 @@ RSpec.describe "bundle install with install-time dependencies" do
end end
install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s } install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s }
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
source "http://localgemserver.test/" source "http://localgemserver.test/"
gem 'rack' gem 'rack'
G G
@ -232,7 +232,7 @@ RSpec.describe "bundle install with install-time dependencies" do
end end
install_gemfile <<-G, :artifice => "endpoint", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s } install_gemfile <<-G, :artifice => "endpoint", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s }
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
source "http://localgemserver.test/" source "http://localgemserver.test/"
gem 'rack' gem 'rack'
G G
@ -309,7 +309,7 @@ RSpec.describe "bundle install with install-time dependencies" do
end end
install_gemfile <<-G, :artifice => "compact_index_rate_limited", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s } install_gemfile <<-G, :artifice => "compact_index_rate_limited", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
source "http://localgemserver.test/" source "http://localgemserver.test/"
gem 'rack' gem 'rack'
gem 'foo1' gem 'foo1'
@ -333,7 +333,7 @@ RSpec.describe "bundle install with install-time dependencies" do
simulate_platform mingw do simulate_platform mingw do
install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s } install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
ruby "#{RUBY_VERSION}" ruby "#{Gem.ruby_version}"
source "http://localgemserver.test/" source "http://localgemserver.test/"
gem 'rack' gem 'rack'
G G
@ -354,8 +354,8 @@ RSpec.describe "bundle install with install-time dependencies" do
end end
end end
let(:ruby_requirement) { %("#{RUBY_VERSION}") } let(:ruby_requirement) { %("#{Gem.ruby_version}") }
let(:error_message_requirement) { "= #{RUBY_VERSION}" } let(:error_message_requirement) { "= #{Gem.ruby_version}" }
it "raises a proper error that mentions the current Ruby version during resolution" do it "raises a proper error that mentions the current Ruby version during resolution" do
install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s }, :raise_on_error => false install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2.to_s }, :raise_on_error => false

View File

@ -94,7 +94,8 @@ RSpec.describe "bundle install" do
end end
context "when ruby version is specified in gemspec and gemfile" do context "when ruby version is specified in gemspec and gemfile" do
it "installs when patch level is not specified and the version matches" do it "installs when patch level is not specified and the version matches",
:if => RUBY_PATCHLEVEL >= 0 do
build_lib("foo", :path => bundled_app) do |s| build_lib("foo", :path => bundled_app) do |s|
s.required_ruby_version = "~> #{RUBY_VERSION}.0" s.required_ruby_version = "~> #{RUBY_VERSION}.0"
end end

View File

@ -1174,7 +1174,7 @@ RSpec.describe "the lockfile format" do
it "captures the Ruby version in the lockfile" do it "captures the Ruby version in the lockfile" do
install_gemfile <<-G install_gemfile <<-G
source "#{file_uri_for(gem_repo2)}/" source "#{file_uri_for(gem_repo2)}/"
ruby '#{RUBY_VERSION}' ruby '#{Gem.ruby_version}'
gem "rack", "> 0.9", "< 1.0" gem "rack", "> 0.9", "< 1.0"
G G
@ -1191,7 +1191,7 @@ RSpec.describe "the lockfile format" do
rack (> 0.9, < 1.0) rack (> 0.9, < 1.0)
RUBY VERSION RUBY VERSION
ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} #{Bundler::RubyVersion.system}
BUNDLED WITH BUNDLED WITH
#{Bundler::VERSION} #{Bundler::VERSION}

View File

@ -19,7 +19,7 @@ Your app has gems that work on these platforms:
* #{specific_local_platform} * #{specific_local_platform}
Your Gemfile specifies a Ruby version requirement: Your Gemfile specifies a Ruby version requirement:
* ruby #{RUBY_VERSION} * ruby #{Gem.ruby_version}
Your current platform satisfies the Ruby version requirement. Your current platform satisfies the Ruby version requirement.
G G
@ -42,7 +42,7 @@ Your app has gems that work on these platforms:
* #{specific_local_platform} * #{specific_local_platform}
Your Gemfile specifies a Ruby version requirement: Your Gemfile specifies a Ruby version requirement:
* ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} * #{Bundler::RubyVersion.system.single_version_string}
Your current platform satisfies the Ruby version requirement. Your current platform satisfies the Ruby version requirement.
G G
@ -85,7 +85,7 @@ Your app has gems that work on these platforms:
Your Gemfile specifies a Ruby version requirement: Your Gemfile specifies a Ruby version requirement:
* ruby #{not_local_ruby_version} * ruby #{not_local_ruby_version}
Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified #{not_local_ruby_version} Your Ruby version is #{Gem.ruby_version}, but your Gemfile specified #{not_local_ruby_version}
G G
end end
end end
@ -255,18 +255,18 @@ G
end end
end end
let(:ruby_version_correct) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{local_engine_version}\"" } let(:ruby_version_correct) { "ruby \"#{Gem.ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{local_engine_version}\"" }
let(:ruby_version_correct_engineless) { "ruby \"#{RUBY_VERSION}\"" } let(:ruby_version_correct_engineless) { "ruby \"#{Gem.ruby_version}\"" }
let(:ruby_version_correct_patchlevel) { "#{ruby_version_correct}, :patchlevel => '#{RUBY_PATCHLEVEL}'" } let(:ruby_version_correct_patchlevel) { "#{ruby_version_correct}, :patchlevel => '#{RUBY_PATCHLEVEL}'" }
let(:ruby_version_incorrect) { "ruby \"#{not_local_ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_ruby_version}\"" } let(:ruby_version_incorrect) { "ruby \"#{not_local_ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_ruby_version}\"" }
let(:engine_incorrect) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{not_local_tag}\", :engine_version => \"#{RUBY_VERSION}\"" } let(:engine_incorrect) { "ruby \"#{Gem.ruby_version}\", :engine => \"#{not_local_tag}\", :engine_version => \"#{Gem.ruby_version}\"" }
let(:engine_version_incorrect) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_engine_version}\"" } let(:engine_version_incorrect) { "ruby \"#{Gem.ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_engine_version}\"" }
let(:patchlevel_incorrect) { "#{ruby_version_correct}, :patchlevel => '#{not_local_patchlevel}'" } let(:patchlevel_incorrect) { "#{ruby_version_correct}, :patchlevel => '#{not_local_patchlevel}'" }
let(:patchlevel_fixnum) { "#{ruby_version_correct}, :patchlevel => #{RUBY_PATCHLEVEL}1" } let(:patchlevel_fixnum) { "#{ruby_version_correct}, :patchlevel => #{RUBY_PATCHLEVEL}1" }
def should_be_ruby_version_incorrect def should_be_ruby_version_incorrect
expect(exitstatus).to eq(18) expect(exitstatus).to eq(18)
expect(err).to be_include("Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified #{not_local_ruby_version}") expect(err).to be_include("Your Ruby version is #{Gem.ruby_version}, but your Gemfile specified #{not_local_ruby_version}")
end end
def should_be_engine_incorrect def should_be_engine_incorrect

View File

@ -476,7 +476,7 @@ module Spec
end end
def current_ruby_minor def current_ruby_minor
Gem.ruby_version.segments[0..1].join(".") Gem.ruby_version.segments.tap {|s| s.delete_at(2) }.join(".")
end end
def next_ruby_minor def next_ruby_minor

View File

@ -71,7 +71,7 @@ module Spec
end end
def local_engine_version def local_engine_version
RUBY_ENGINE_VERSION RUBY_ENGINE == "ruby" ? Gem.ruby_version : RUBY_ENGINE_VERSION
end end
def not_local_engine_version def not_local_engine_version