class Transmogrifier::Rules::Update
Public Class Methods
new(selector, new_value)
click to toggle source
# File lib/transmogrifier/rules/update.rb, line 4 def initialize(selector, new_value) @selector, @new_value = selector, new_value end
Public Instance Methods
apply!(input_hash)
click to toggle source
# File lib/transmogrifier/rules/update.rb, line 8 def apply!(input_hash) top = Node.for(input_hash) *parent_keys, child_key = Selector.from_string(@selector).keys parents = top.find_all(parent_keys) raise SelectorNotFoundError, "#{parent_keys} does not select a node" unless parents.length > 0 parents.each do |parent| if parent.class == HashNode raise SelectorNotFoundError, "no mapping for #{child_key} in parent node" unless parent.raw.has_key?(child_key) parent.append({child_key => @new_value}) elsif parent.class == ArrayNode deleted_node = parent.delete(child_key) raise SelectorNotFoundError, "no node found with specified attributes" if deleted_node.nil? parent.append(@new_value) end end top.raw end