From 31b4d6c59fb0ad755f2d52e382063eb0b1fca735 Mon Sep 17 00:00:00 2001 From: elijah Date: Fri, 8 Apr 2016 12:39:40 -0700 Subject: environments: clean up the json inheritence system with a proper environment class, and fix bugs with partials and inheritance. requires latest leap_platform. --- lib/leap_cli/config/object.rb | 66 ++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 36 deletions(-) (limited to 'lib/leap_cli/config/object.rb') diff --git a/lib/leap_cli/config/object.rb b/lib/leap_cli/config/object.rb index bde5fe7..b117c2f 100644 --- a/lib/leap_cli/config/object.rb +++ b/lib/leap_cli/config/object.rb @@ -11,33 +11,6 @@ require 'ya2yaml' # pure ruby yaml module LeapCli module Config - # - # A proxy for Manager that binds to a particular object - # (so that we can bind to a particular environment) - # - class ManagerBinding - def initialize(manager, object) - @manager = manager - @object = object - end - - def services - @manager.env(@object.environment).services - end - - def tags - @manager.env(@object.environment).tags - end - - def provider - @manager.env(@object.environment).provider - end - - def method_missing(*args) - @manager.send(*args) - end - end - # # This class represents the configuration for a single node, service, or tag. # Also, all the nested hashes are also of this type. @@ -46,21 +19,27 @@ module LeapCli # class Object < Hash + attr_reader :env attr_reader :node - def initialize(manager=nil, node=nil) - # keep a global pointer around to the config manager. used a lot in the eval strings and templates - # (which are evaluated in the context of Config::Object) - @manager = manager - - # an object that is a node as @node equal to self, otherwise all the child objects point back to the top level node. + def initialize(environment=nil, node=nil) + raise ArgumentError unless environment.nil? || environment.is_a?(Config::Environment) + @env = environment + # an object that is a node as @node equal to self, otherwise all the + # child objects point back to the top level node. @node = node || self end def manager - ManagerBinding.new(@manager, self) + @env.manager + end + + # + # TODO: deprecate node.global() + # + def global + @env end - alias :global :manager def environment=(e) self.store('environment', e) @@ -70,6 +49,11 @@ module LeapCli self['environment'] end + def duplicate(env) + new_object = self.deep_dup + new_object.set_environment(env, new_object) + end + # # export YAML # @@ -218,7 +202,7 @@ module LeapCli # merge hashes elsif old_value.is_a?(Hash) || new_value.is_a?(Hash) - value = Config::Object.new(@manager, @node) + value = Config::Object.new(@env, @node) old_value.is_a?(Hash) ? value.deep_merge!(old_value) : (value[key] = old_value if !old_value.nil?) new_value.is_a?(Hash) ? value.deep_merge!(new_value, prefer_self) : (value[key] = new_value if !new_value.nil?) @@ -269,6 +253,16 @@ module LeapCli self end + def set_environment(env, node) + @env = env + @node = node + self.each do |key, value| + if value.is_a?(Config::Object) + value.set_environment(env, node) + end + end + end + # # like a reverse deep merge # (self takes precedence) -- cgit v1.2.3