codeclimate/codeclimate-yaml

View on GitHub
lib/cc/yaml/nodes/node.rb

Summary

Maintainability
A
3 hrs
Test Coverage
module CC
  module Yaml
    module Nodes
      class Node
        def self.has_default?
          false
        end

        attr_accessor :parent

        def initialize(parent)
          @nested_warnings = []
          @parent          = parent
          prepare
          yield self if block_given?
        end

        def warnings?
          warnings.any?
        end

        def errors?
          errors.any?
        end

        def warnings
          @warnings ||= []
        end

        def nested_warning(message, *prefix)
          @nested_warnings << [prefix, message]
        end

        def nested_warnings(*prefix)
          messages  = errors + warnings
          prefixed  = messages.map { |warning| [prefix, warning] }
          prefixed += @nested_warnings.map { |p, w| [prefix + p, w] }
          prefixed
        end

        def errors
          @errors ||= []
        end

        def warning(message, *params)
          warnings << message % params
        end

        def error(message, *params)
          errors << message % params
        end

        def prepare
        end

        def verify
        end

        def deep_verify
          verify
        end

        def visit_unexpected(visitor, value, message = nil)
          error(message || "unexpected %p", value)
        end

        def visit_mapping(visitor, value)
          visit_unexpected(visitor, value, "unexpected mapping")
        end

        def visit_pair(visitor, key, value)
          visit_unexpected(visitor, value, "unexpected pair")
        end

        def visit_scalar(visitor, type, value, implicit = true)
          visit_unexpected(visitor, value, "unexpected scalar") unless type == :null
        end

        def visit_sequence(visitor, value)
          visit_unexpected(visitor, value, "unexpected sequence")
        end

        def visit_child(visitor, value)
          visit_unexpected(visitor, value, "unexpected child")
        end

        def respond_to_missing?(method, include_private = false)
          __getobj__.respond_to?(method, false)
        end

        def method_missing(method, *args, &block)
          return super unless __getobj__.respond_to?(method)
          __getobj__.public_send(method, *args, &block)
        end

        def to_s
          __getobj__.to_s
        end

        def as_json(options = nil)
          __getobj__.as_json(options)
        end

        def with_value(value)
          node = dup
          node.with_value!(value)
          node
        end

        def dup
          super.dup_values
        end

        protected

          def dup_values
            self
          end
      end
    end
  end
end