summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2016-08-12 12:08:07 -0500
committerSamuel Giddins <segiddins@segiddins.me>2016-08-23 11:50:35 -0500
commit38b0e7ed64c3ca1c40f43c5aa9a1ead2f6cd7049 (patch)
tree2acfc76a49f73da1bf0bbfefe2e9706b63d05b42
parentb37eef329ca8d30fa3b7df6438d5aff6c1991264 (diff)
downloadbundler-38b0e7ed64c3ca1c40f43c5aa9a1ead2f6cd7049.tar.gz
[Definition] Handle non-exact ruby version requirements
-rw-r--r--lib/bundler/definition.rb31
-rw-r--r--spec/install/gems/resolving_spec.rb61
2 files changed, 61 insertions, 31 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index b3bb0dc1ae..43547f8be6 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -742,19 +742,10 @@ module Bundler
# the metadata dependencies here
def expanded_dependencies
@expanded_dependencies ||= begin
- ruby_versions = []
- add_ruby_versions = proc do |ruby_version|
- break unless ruby_version
- if ruby_version.patchlevel
- ruby_versions << ruby_version.to_gem_version_with_patchlevel
- else
- ruby_versions += ruby_version.versions.map {|v| "~> #{v}.0" }
- end
- end
- add_ruby_versions.call(@ruby_version)
+ ruby_versions = concat_ruby_version_requirements(@ruby_version)
if ruby_versions.empty? || !@ruby_version.exact?
- add_ruby_versions.call(RubyVersion.system)
- add_ruby_versions.call(locked_ruby_version_object) unless @unlock[:ruby]
+ concat_ruby_version_requirements(RubyVersion.system)
+ concat_ruby_version_requirements(locked_ruby_version_object) unless @unlock[:ruby]
end
metadata_dependencies = [
@@ -765,6 +756,22 @@ module Bundler
end
end
+ def concat_ruby_version_requirements(ruby_version, ruby_versions = [])
+ return ruby_versions unless ruby_version
+ if ruby_version.patchlevel
+ ruby_versions << ruby_version.to_gem_version_with_patchlevel
+ else
+ ruby_versions.concat(ruby_version.versions.map do |version|
+ requirement = Gem::Requirement.new(version)
+ if requirement.exact?
+ "~> #{version}.0"
+ else
+ requirement
+ end
+ end)
+ end
+ end
+
def expand_dependencies(dependencies, remote = false)
deps = []
dependencies.each do |dep|
diff --git a/spec/install/gems/resolving_spec.rb b/spec/install/gems/resolving_spec.rb
index 98ebd8e11b..0204a222f9 100644
--- a/spec/install/gems/resolving_spec.rb
+++ b/spec/install/gems/resolving_spec.rb
@@ -119,35 +119,58 @@ describe "bundle install with install-time dependencies" do
end
context "allows no gems" do
- it "raises an error during resolution" do
+ before do
build_repo2 do
build_gem "require_ruby" do |s|
s.required_ruby_version = "> 9000"
end
end
+ end
- install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2 }
- source "http://localgemserver.test/"
- ruby "#{RUBY_VERSION}"
- gem 'require_ruby'
- G
+ let(:ruby_requirement) { %("#{RUBY_VERSION}") }
+ let(:error_message_requirement) { "~> #{RUBY_VERSION}.0" }
+
+ shared_examples_for "ruby version conflicts" do
+ it "raises an error during resolution" do
+ install_gemfile <<-G, :artifice => "compact_index", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo2 }
+ source "http://localgemserver.test/"
+ ruby #{ruby_requirement}
+ gem 'require_ruby'
+ G
+
+ expect(out).to_not include("Gem::InstallError: require_ruby requires Ruby version > 9000")
+
+ nice_error = strip_whitespace(<<-E).strip
+ Fetching gem metadata from http://localgemserver.test/.
+ Fetching version metadata from http://localgemserver.test/
+ Resolving dependencies...
+ Bundler could not find compatible versions for gem "ruby\0":
+ In Gemfile:
+ ruby\0 (#{error_message_requirement})
+
+ require_ruby was resolved to 1.0, which depends on
+ ruby\0 (> 9000)
+
+ Could not find gem 'ruby\0 (> 9000)', which is required by gem 'require_ruby', in any of the sources.
+ E
+ expect(out).to eq(nice_error)
+ end
+ end
- expect(out).to_not include("Gem::InstallError: require_ruby requires Ruby version > 9000")
+ it_behaves_like "ruby version conflicts"
- nice_error = strip_whitespace(<<-E).strip
- Fetching gem metadata from http://localgemserver.test/.
- Fetching version metadata from http://localgemserver.test/
- Resolving dependencies...
- Bundler could not find compatible versions for gem "ruby\0":
- In Gemfile:
- ruby\0 (~> #{RUBY_VERSION}.0)
+ describe "with a < requirement" do
+ let(:ruby_requirement) { %("< 5000") }
+ let(:error_message_requirement) { "< 5000" }
+
+ it_behaves_like "ruby version conflicts"
+ end
- require_ruby was resolved to 1.0, which depends on
- ruby\0 (> 9000)
+ describe "with a compound requirement" do
+ let(:ruby_requirement) { %("< 5000", "> 0.1") }
+ let(:error_message_requirement) { "< 5000, > 0.1" }
- Could not find gem 'ruby\0 (> 9000)', which is required by gem 'require_ruby', in any of the sources.
- E
- expect(out).to eq(nice_error)
+ it_behaves_like "ruby version conflicts"
end
end
end