Top merges things in each key one by one by calling `merge`

This commit is contained in:
Mitchell Hashimoto 2012-01-11 21:22:55 -08:00
parent d13dd482b5
commit bfb52ba7dc
2 changed files with 62 additions and 0 deletions

View File

@ -7,6 +7,8 @@ module Vagrant
#
# If you're looking to create your own configuration class, see {Base}.
class Top < Base
attr_reader :keys
def initialize(registry=nil)
@keys = {}
@registry = registry || Vagrant.config_keys
@ -28,6 +30,24 @@ module Vagrant
end
end
# Custom implementation to merge each key separately.
def merge(other)
result = self.class.new
@keys.each do |key, value|
result.keys[key] = value.merge(other.send(key))
end
other.keys.each do |key, value|
if !@keys.has_key?(key)
# This is a key that the other configuration class has
# that we don't, so just copy it in.
result.keys[key] = value.dup
end
end
result
end
# Validates the configuration classes of this instance and raises an
# exception if they are invalid. If you are implementing a custom configuration
# class, the method you want to implement is {Base#validate}. This is

View File

@ -24,4 +24,46 @@ describe Vagrant::Config::Top do
it "still raises a method missing error if invalid key" do
expect { instance.foo }.to raise_error(NoMethodError)
end
describe "merging" do
let(:foo_class) do
Class.new do
attr_accessor :one
attr_accessor :two
def merge(other)
result = self.class.new
result.one = other.one || one
result.two = other.two || two
result
end
end
end
it "merges each key by calling `merge` on the class" do
registry.register(:foo, foo_class)
instance.foo.one = 1
instance.foo.two = 2
another = described_class.new(registry)
another.foo.one = 2
result = instance.merge(another)
result.foo.one.should == 2
result.foo.two.should == 2
end
it "merges keys that aren't in the source instance" do
reg = Vagrant::Registry.new
reg.register(:foo, foo_class)
another = described_class.new(reg)
another.foo.one = 2
result = instance.merge(another)
result.foo.one.should == 2
result.foo.two.should be_nil
end
end
end