Util::ScopedHashOverride
This commit is contained in:
parent
ccc4da0d32
commit
0c612f695f
|
@ -0,0 +1,40 @@
|
||||||
|
module Vagrant
|
||||||
|
module Util
|
||||||
|
# This allows for hash options to be overridden by a scope key
|
||||||
|
# prefix. An example speaks best here. Imagine the following hash:
|
||||||
|
#
|
||||||
|
# original = {
|
||||||
|
# :id => "foo",
|
||||||
|
# :mitchellh__id => "bar",
|
||||||
|
# :mitchellh__other => "foo"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# scoped = scoped_hash_override(original, "mitchellh")
|
||||||
|
#
|
||||||
|
# scoped == {
|
||||||
|
# :id => "bar",
|
||||||
|
# :other => "foo"
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
module ScopedHashOverride
|
||||||
|
def scoped_hash_override(original, scope)
|
||||||
|
result = original.dup
|
||||||
|
|
||||||
|
original.each do |key, value|
|
||||||
|
parts = key.to_s.split("__", 2)
|
||||||
|
|
||||||
|
# If we don't have the proper parts, then bail
|
||||||
|
next if parts.length != 2
|
||||||
|
|
||||||
|
# If this is our scope, then override
|
||||||
|
if parts[0] == scope
|
||||||
|
result[parts[1].to_sym] = value
|
||||||
|
result.delete(key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,48 @@
|
||||||
|
require File.expand_path("../../../base", __FILE__)
|
||||||
|
|
||||||
|
require "vagrant/util/scoped_hash_override"
|
||||||
|
|
||||||
|
describe Vagrant::Util::ScopedHashOverride do
|
||||||
|
let(:klass) do
|
||||||
|
Class.new do
|
||||||
|
extend Vagrant::Util::ScopedHashOverride
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not mess with non-overrides" do
|
||||||
|
original = {
|
||||||
|
:key => "value",
|
||||||
|
:another_value => "foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
klass.scoped_hash_override(original, "foo").should == original
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should override if the scope matches" do
|
||||||
|
original = {
|
||||||
|
:key => "value",
|
||||||
|
:scope__key => "replaced"
|
||||||
|
}
|
||||||
|
|
||||||
|
expected = {
|
||||||
|
:key => "replaced"
|
||||||
|
}
|
||||||
|
|
||||||
|
klass.scoped_hash_override(original, "scope").should == expected
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should ignore non-matching scopes" do
|
||||||
|
original = {
|
||||||
|
:key => "value",
|
||||||
|
:scope__key => "replaced",
|
||||||
|
:another__key => "value"
|
||||||
|
}
|
||||||
|
|
||||||
|
expected = {
|
||||||
|
:key => "replaced",
|
||||||
|
:another__key => "value"
|
||||||
|
}
|
||||||
|
|
||||||
|
klass.scoped_hash_override(original, "scope").should == expected
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue