class Transmogrifier::ArrayNode

Public Class Methods

new(array) click to toggle source
# File lib/transmogrifier/nodes/array_node.rb, line 7
def initialize(array)
  @array = array
end

Public Instance Methods

clone(key) click to toggle source
# File lib/transmogrifier/nodes/array_node.rb, line 21
def clone(key)
  matching_nodes = find_nodes(key)
  raise "Multiple nodes match #{key}, clone criteria ambiguous" if matching_nodes.length > 1

  Marshal.load(Marshal.dump(matching_nodes.first))
end
delete(key) click to toggle source
# File lib/transmogrifier/nodes/array_node.rb, line 28
def delete(key)
  matching_nodes = find_nodes(key)
  deleted_nodes = matching_nodes.each { |n| @array.delete(n) }
  deleted_nodes.length > 1 ? deleted_nodes : deleted_nodes.first
end
find_all(keys) click to toggle source
# File lib/transmogrifier/nodes/array_node.rb, line 11
def find_all(keys)
  first_key, *remaining_keys = keys

  if first_key.nil?
    [self]
  else
    find_nodes(first_key).flat_map { |x| Node.for(x).find_all(remaining_keys) }
  end
end

Private Instance Methods

find_nodes(attributes) click to toggle source
# File lib/transmogrifier/nodes/array_node.rb, line 39
def find_nodes(attributes)
  return @array if attributes.empty?

  filtered = @array.clone
  attributes.each do |attr|
    case attr[0]
      when "="
        filtered.select! { |node| node.merge(Hash[*attr[1..-1]]) == node }
      when "!="
        filtered.reject! { |node| node.merge(Hash[*attr[1..-1]]) == node }
      else
        raise "Unsupported attribute filter #{attr.inspect}"
    end
  end
  filtered
end