diff options
author | Samuel Giddins <segiddins@segiddins.me> | 2017-03-28 14:28:30 -0500 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2017-03-30 14:28:36 -0500 |
commit | f6e0244435061ed7faf9c742abd5db623ed3b3c7 (patch) | |
tree | d6d8e56fc099dee81469a05f81f94f8d7cd04839 | |
parent | 2f0187a9dcad5dd74b5beef48d2e584dd751ac31 (diff) | |
download | bundler-f6e0244435061ed7faf9c742abd5db623ed3b3c7.tar.gz |
[VersionRanges] Say that != x, = x is empty
-rw-r--r-- | lib/bundler/version_ranges.rb | 13 | ||||
-rw-r--r-- | spec/bundler/version_ranges_spec.rb | 37 |
2 files changed, 47 insertions, 3 deletions
diff --git a/lib/bundler/version_ranges.rb b/lib/bundler/version_ranges.rb index 6eca976ee8..3470df7742 100644 --- a/lib/bundler/version_ranges.rb +++ b/lib/bundler/version_ranges.rb @@ -26,6 +26,12 @@ module Bundler def empty? left.version == right.version && !(left.inclusive && right.inclusive) end + + def single? + left.version == right.version + end + + UNIVERSAL = ReqR.new(ReqR::Endpoint.new(Gem::Version.new("0.a"), true), ReqR::Endpoint.new(ReqR::INFINITY, false)).freeze end def self.for_many(requirements) @@ -46,17 +52,18 @@ module Bundler when "<" then ReqR.new(ReqR::Endpoint.new(ReqR::ZERO, true), ReqR::Endpoint.new(v, false)) when "<=" then ReqR.new(ReqR::Endpoint.new(ReqR::ZERO, true), ReqR::Endpoint.new(v, true)) when "~>" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(v.bump, false)) + else raise "unknown version op #{op} in requirement #{requirement}" end end.uniq ranges, neqs = ranges.partition {|r| !r.is_a?(NEq) } - ranges << ReqR.new(ReqR::Endpoint.new(Gem::Version.new("0.a"), true), ReqR::Endpoint.new(ReqR::INFINITY, false)) if ranges.empty? - [ranges.sort_by {|range| [range.left.version, range.left.inclusive ? 0 : 1] }, neqs] + [ranges.sort_by {|range| [range.left.version, range.left.inclusive ? 0 : 1] }, neqs.map(&:version)] end def self.empty?(ranges, neqs) - !ranges.reduce do |last_range, curr_range| + !ranges.reduce(ReqR::UNIVERSAL) do |last_range, curr_range| next false unless last_range + next false if curr_range.single? && neqs.include?(curr_range.left.version) next curr_range if last_range.right.version == ReqR::INFINITY case last_range.right.version <=> curr_range.left.version when 1 then next curr_range diff --git a/spec/bundler/version_ranges_spec.rb b/spec/bundler/version_ranges_spec.rb new file mode 100644 index 0000000000..f746aa88ad --- /dev/null +++ b/spec/bundler/version_ranges_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +require "spec_helper" +require "bundler/version_ranges" + +RSpec.describe Bundler::VersionRanges do + describe ".empty?" do + shared_examples_for "empty?" do |exp, *req| + it "returns #{exp} for #{req}" do + r = Gem::Requirement.new(*req) + ranges = described_class.for(r) + expect(described_class.empty?(*ranges)).to eq(exp), "expected `#{r}` #{exp ? "" : "not "}to be empty" + end + end + + include_examples "empty?", false + include_examples "empty?", false, "!= 1" + include_examples "empty?", false, "!= 1", "= 2" + include_examples "empty?", false, "!= 1", "> 1" + include_examples "empty?", false, "!= 1", ">= 1" + include_examples "empty?", false, "= 1", ">= 0.1", "<= 1.1" + include_examples "empty?", false, "= 1", ">= 1", "<= 1" + include_examples "empty?", false, "= 1", "~> 1" + include_examples "empty?", false, ">= 0.z", "= 0" + include_examples "empty?", false, ">= 0" + include_examples "empty?", false, ">= 1.0.0", "< 2.0.0" + include_examples "empty?", false, "~> 1" + include_examples "empty?", false, "~> 2.0", "~> 2.1" + include_examples "empty?", true, "!= 1", "< 2", "> 2" + include_examples "empty?", true, "!= 1", "<= 1", ">= 1" + include_examples "empty?", true, "< 2", "> 2" + include_examples "empty?", true, "= 1", "!= 1" + include_examples "empty?", true, "= 1", "= 2" + include_examples "empty?", true, "= 1", "~> 2" + include_examples "empty?", true, ">= 0", "<= 0.a" + include_examples "empty?", true, "~> 2.0", "~> 3" + end +end |