From 38b0e7ed64c3ca1c40f43c5aa9a1ead2f6cd7049 Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Fri, 12 Aug 2016 12:08:07 -0500 Subject: [Definition] Handle non-exact ruby version requirements --- lib/bundler/definition.rb | 31 +++++++++++-------- spec/install/gems/resolving_spec.rb | 61 +++++++++++++++++++++++++------------ 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 -- cgit v1.2.1