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