Merge pull request #8334 from chrisroberts/fix/box-sorting

Sort box list results
This commit is contained in:
Chris Roberts 2017-03-06 08:30:45 -08:00 committed by GitHub
commit 649cb2427e
2 changed files with 102 additions and 1 deletions

View File

@ -246,7 +246,10 @@ module Vagrant
end
end
end
# Sort the list to group like providers and properly ordered versions
results.sort_by! do |box_result|
[box_result[0], box_result[2], Gem::Version.new(box_result[1])]
end
results
end

View File

@ -43,6 +43,75 @@ describe Vagrant::BoxCollection, :skip_windows do
expect { subject.all }.to_not raise_error
end
end
context "with multiple versions of the same box" do
before do
environment.box3("foo", "1.0", :virtualbox)
environment.box3("foo", "2.0.3", :virtualbox)
environment.box3("foo", "2.0.4", :virtualbox)
environment.box3("foo", "10.3", :virtualbox)
environment.box3("foo", "1.0", :vmware)
environment.box3("foo", "0.4.3", :vmware)
environment.box3("foo", "2.0.1", :vmware)
environment.box3("foo", "2.0.2.dev", :vmware)
environment.box3("foo", "2.0.2", :vmware)
environment.box3("bar", "20161203.2", :ec2)
environment.box3("bar", "20161203.2.3", :ec2)
environment.box3("bar", "20151102.0.0", :ec2)
environment.box3("foo-VAGRANTSLASH-bar", "1.0", :virtualbox)
environment.box3("foo-VAGRANTCOLON-colon", "1.0", :virtualbox)
end
it "should sort boxes by name" do
result = subject.all.map(&:first).uniq
expect(result).to eq(["bar", "foo", "foo/bar", "foo:colon"])
end
it "should group boxes by provider" do
expect do
current = ""
seen_pairs = {}
subject.all.each do |box_info|
box_key = "#{box_info[0]}_#{box_info[2]}"
if current != box_key
if seen_pairs[box_key]
raise KeyError.new("Box/provider pair already seen. Invalid sort!")
else
current = box_key
seen_pairs[box_key] = true
end
end
end
end.not_to raise_error
end
it "should sort boxes by version" do
box_list = subject.all.find_all do |box_info|
box_info[0] == "foo" && box_info[2].to_s == "virtualbox"
end
result = box_list.map{|box_info| box_info[1]}
expect(result).to eq([
"1.0",
"2.0.3",
"2.0.4",
"10.3"
])
end
it "should sort boxes with pre-release versions" do
box_list = subject.all.find_all do |box_info|
box_info[0] == "foo" && box_info[2].to_s == "vmware"
end
result = box_list.map{|box_info| box_info[1]}
expect(result).to eq([
"0.4.3",
"1.0",
"2.0.1",
"2.0.2.dev",
"2.0.2"
])
end
end
end
describe "#clean" do
@ -218,6 +287,35 @@ describe Vagrant::BoxCollection, :skip_windows do
result = subject.find("foo", :virtualbox, "> 1.0, < 1.5")
expect(result).to be_nil
end
context "with multiple versions of the same box" do
before do
environment.box3("foo", "1.0", :virtualbox)
environment.box3("foo", "2.0.3", :virtualbox)
environment.box3("foo", "2.0.4", :virtualbox)
environment.box3("foo", "10.3", :virtualbox)
environment.box3("foo", "1.0", :vmware)
environment.box3("foo", "0.4.3", :vmware)
environment.box3("foo", "2.0.1", :vmware)
environment.box3("foo", "2.0.2.dev", :vmware)
environment.box3("foo", "2.0.2", :vmware)
environment.box3("bar", "20161203.2", :ec2)
environment.box3("bar", "20161203.2.3", :ec2)
environment.box3("bar", "20151102.0.0", :ec2)
environment.box3("foo-VAGRANTSLASH-bar", "1.0", :virtualbox)
environment.box3("foo-VAGRANTCOLON-colon", "1.0", :virtualbox)
end
it "should return expected latest version" do
result = subject.find("foo", :virtualbox, "> 2, < 3")
expect(result.version).to eq("2.0.4")
end
it "should sort boxes with pre-release versions" do
result = subject.find("foo", :vmware, "> 2, < 3")
expect(result.version).to eq("2.0.2")
end
end
end
describe "#add" do