]> gitweb.fluxo.info Git - leap/leap_cli.git/commitdiff
fixed merge errors and warn when REQUIRED properties are unset.
authorelijah <elijah@riseup.net>
Thu, 28 Feb 2013 07:51:40 +0000 (23:51 -0800)
committerelijah <elijah@riseup.net>
Thu, 28 Feb 2013 07:51:40 +0000 (23:51 -0800)
lib/leap_cli/config/object.rb

index 4425a59e5b8c0b562e1dac2e234addd90324d79c..5a5c7b14262895d56690f5cda0cc35b4e8480437 100644 (file)
@@ -140,17 +140,8 @@ module LeapCli
           elsif old_value.nil?
             value = new_value
 
-          # merge boolean
-          elsif old_value.is_a?(Boolean) && new_value.is_a?(Boolean)
-            # FalseClass and TrueClass are different classes, so we must handle them separately
-            if prefer_self
-              value = old_value
-            else
-              value = new_value
-            end
-
           # catch errors
-          elsif old_value.class != new_value.class
+          elsif type_mismatch?(old_value, new_value)
             raise 'Type mismatch. Cannot merge %s (%s) with %s (%s). Key is "%s", name is "%s".' % [
               old_value.inspect, old_value.class,
               new_value.inspect, new_value.class,
@@ -393,39 +384,42 @@ module LeapCli
       end
 
       def evaluate_now(key, value)
+        result = nil
         if LeapCli.log_level >= 2
-          @node.instance_eval(value)
+          result = @node.instance_eval(value)
         else
-          evaluate_now!(key, value)
-        end
-      end
-
-      def evaluate_now!(key, value)
-        return @node.instance_eval(value)
-      rescue SystemStackError => exc
-        Util::log 0, :error, "while evaluating node '#{@node.name}'"
-        Util::log 0, "offending key: #{key}", :indent => 1
-        Util::log 0, "offending string: #{value}", :indent => 1
-        Util::log 0, "STACK OVERFLOW, BAILING OUT. There must be an eval loop of death (variables with circular dependencies).", :indent => 1
-        raise SystemExit.new()
-      rescue FileMissing => exc
-        Util::bail! do
-          if exc.options[:missing]
-            Util::log :missing, exc.options[:missing].gsub('$node', @node.name)
-          else
-            Util::log :error, "while evaluating node '#{@node.name}'"
-            Util::log "offending key: #{key}", :indent => 1
-            Util::log "offending string: #{value}", :indent => 1
-            Util::log "error message: no file '#{exc}'", :indent => 1
+          begin
+            result = @node.instance_eval(value)
+          rescue SystemStackError => exc
+            Util::log 0, :error, "while evaluating node '#{@node.name}'"
+            Util::log 0, "offending key: #{key}", :indent => 1
+            Util::log 0, "offending string: #{value}", :indent => 1
+            Util::log 0, "STACK OVERFLOW, BAILING OUT. There must be an eval loop of death (variables with circular dependencies).", :indent => 1
+            raise SystemExit.new(1)
+          rescue FileMissing => exc
+            Util::bail! do
+              if exc.options[:missing]
+                Util::log :missing, exc.options[:missing].gsub('$node', @node.name)
+              else
+                Util::log :error, "while evaluating node '#{@node.name}'"
+                Util::log "offending key: #{key}", :indent => 1
+                Util::log "offending string: #{value}", :indent => 1
+                Util::log "error message: no file '#{exc}'", :indent => 1
+              end
+            end
+          rescue SyntaxError, StandardError => exc
+            Util::bail! do
+              Util::log :error, "while evaluating node '#{@node.name}'"
+              Util::log "offending key: #{key}", :indent => 1
+              Util::log "offending string: #{value}", :indent => 1
+              Util::log "error message: #{exc.inspect}", :indent => 1
+            end
           end
         end
-      rescue SyntaxError, StandardError => exc
-        Util::bail! do
-          Util::log :error, "while evaluating node '#{@node.name}'"
-          Util::log "offending key: #{key}", :indent => 1
-          Util::log "offending string: #{value}", :indent => 1
-          Util::log "error message: #{exc.inspect}", :indent => 1
+        if result == "REQUIRED"
+          Util::log 0, :warning, "required key \"#{key}\" is not set in node \"#{node.name}\"."
         end
+        return result
       end
 
       #
@@ -467,6 +461,26 @@ module LeapCli
         return return_value
       end
 
+      #
+      # when merging, we raise an error if this method returns true for the two values.
+      #
+      def type_mismatch?(old_value, new_value)
+        if old_value.is_a?(Boolean) && new_value.is_a?(Boolean)
+          # note: FalseClass and TrueClass are different classes
+          # so we can't do old_value.class == new_value.class
+          return false
+        elsif old_value.is_a?(String) && old_value =~ /^=/
+          # pass through macros, since we don't know what the type will eventually be.
+          return false
+        elsif new_value.is_a?(String) && new_value =~ /^=/
+          return false
+        elsif old_value.class == new_value.class
+          return false
+        else
+          return true
+        end
+      end
+
     end # class
   end # module
 end # module
\ No newline at end of file