module Juniter::HasChildren
Public Class Methods
included(base)
click to toggle source
# File lib/juniter/has_children.rb, line 4 def self.included(base) base.extend(ClassMethods) end
Public Instance Methods
assign_children_from_xml(nodes)
click to toggle source
# File lib/juniter/has_children.rb, line 50 def assign_children_from_xml(nodes) child_map = self.class.child_types.each_with_object({}) do |name, hash| hash[self.class.child_aliases.fetch(name, name).to_s] = name end nodes.each do |node| next if node.is_a?(Ox::Comment) if node.is_a?(String) || node.is_a?(Ox::CData) value = node.is_a?(String) ? node : node.value text_child = self.class.text_child next unless text_child public_send :"#{text_child}=", [ public_send(:"#{text_child}"), value ].join next end name = child_map.fetch(node.value) mapped = self.class.child_processors[name].call(node) if self.class.array_children.include?(name) public_send("#{name}") << mapped else public_send "#{name}=", mapped end end end
children_xml()
click to toggle source
# File lib/juniter/has_children.rb, line 76 def children_xml self.class.child_types.each_with_object([]) do |name, children| value = public_send(name) next if value.nil? element = self.class.child_aliases.fetch(name, name) if self.class.array_children.include?(name) children.concat value.map { |child| child.respond_to?(:to_xml) ? child.to_xml : Ox::Element.new(element).tap { |el| el << child } } elsif self.class.text_child == name children << value else children << (value.respond_to?(:to_xml) ? value.to_xml : Ox::Element.new(element).tap { |el| el << value }) end end end