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