lib/vagrant/config/v2/dummy_config.rb in vagrant-unbundled-2.2.19.0 vs lib/vagrant/config/v2/dummy_config.rb in vagrant-unbundled-2.3.2.0

- old
+ new

@@ -1,12 +1,56 @@ module Vagrant module Config module V2 # This is a configuration object that can have anything done # to it. Anything, and it just appears to keep working. - class DummyConfig + class DummyConfig < Vagrant::Plugin::V2::Config + LOG = Log4r::Logger.new("vagrant::config::v2::dummy_config") + def method_missing(name, *args, &block) - DummyConfig.new + # There are a few scenarios where ruby will attempt to implicity + # coerce a given object into a certain type. DummyConfigs can end up + # in some of these scenarios when they're being shipped around in + # callbacks with splats. If method_missing allows these methods to be + # called but continues to return DummyConfig back, Ruby will raise a + # TypeError. Doing the normal thing of raising NoMethodError allows + # DummyConfig to behave normally as its being passed through splats. + # + # For a bit more detail and some keywords for further searching, see: + # https://ruby-doc.org/core-2.7.2/doc/implicit_conversion_rdoc.html + if [:to_hash, :to_ary].include?(name) + return super + end + + # Trying to define a variable + if name.to_s.match(/^[\w]*=/) + LOG.debug("found name #{name}") + LOG.debug("setting instance variable name #{name.to_s.split("=")[0]}") + var_name = "@#{name.to_s.split("=")[0]}" + self.instance_variable_set(var_name, args[0]) + else + DummyConfig.new + end + end + + def merge(c) + c + end + + def set_options(options) + options.each do |key, value| + if key.to_s.match(/^[\w]*=/) + var_name = "@#{key.to_s}" + self.instance_variable_set(var_name, value) + end + end + end + + def instance_variables_hash + instance_variables.inject({}) do |acc, iv| + acc[iv.to_s[1..-1]] = instance_variable_get(iv) + acc + end end end end end end