class MyData::XmlGenerator

Attributes

class_name[R]
container[R]
mappings[R]
parent_namespace[R]
resource[R]

Public Class Methods

new(resource, parent_namespace: nil) click to toggle source
# File lib/my_data/xml_generator.rb, line 7
def initialize(resource, parent_namespace: nil)
  @resource = resource
  @mappings = resource.class.mappings
  @class_name = resource.class.name
  @container = resource.class.container
  @parent_namespace = parent_namespace
end

Public Instance Methods

namespace() click to toggle source
# File lib/my_data/xml_generator.rb, line 15
def namespace
  @namespace ||= resource.class.module_parent_name.split("::").last.downcase
end
to_xml() click to toggle source
# File lib/my_data/xml_generator.rb, line 19
def to_xml
  to_doc.parent.to_xml
end
to_xml_structure() click to toggle source
# File lib/my_data/xml_generator.rb, line 23
def to_xml_structure
  resource.attributes.each_with_object([]) do |(key, value), structure|
    next if value.nil? || (value.respond_to?(:empty?) && value.empty?)

    value = value_to_xml_structure(key, value)

    structure.push(*extract_attributes(key, value))
  end
end

Private Instance Methods

attr_structure(key, value) click to toggle source
# File lib/my_data/xml_generator.rb, line 72
def attr_structure(key, value)
  prefix = parent_namespace && namespace != parent_namespace ? "#{namespace}:" : ""

  {
    name: [prefix, key.camelize(:lower)].join,
    value: value
  }
end
create_node(xml, name, value) click to toggle source
# File lib/my_data/xml_generator.rb, line 99
def create_node(xml, name, value)
  xml.send(name) do
    value.is_a?(String) ? (xml << value) : create_nodes(xml, value)
  end
end
create_nodes(xml, structure) click to toggle source
# File lib/my_data/xml_generator.rb, line 89
def create_nodes(xml, structure)
  if structure.is_a?(Array)
    structure.each do |es|
      create_node(xml, es[:name], es[:value])
    end
  else
    create_node(xml, structure[:name], structure[:value])
  end
end
extract_attributes(key, value) click to toggle source
# File lib/my_data/xml_generator.rb, line 58
def extract_attributes(key, value)
  collection, collection_element_name = mappings[key].values_at(:collection, :collection_element_name)

  if !collection
    [attr_structure(key, value)]
  elsif collection_element_name
    attrs = value.map { |v| attr_structure(collection_element_name, v) }

    [attr_structure(key, attrs)]
  else
    value.map { |v| attr_structure(key, v) }
  end
end
to_doc() click to toggle source
# File lib/my_data/xml_generator.rb, line 81
def to_doc
  Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
    xml.send(container[:name], container[:attributes]) do
      create_nodes(xml, to_xml_structure)
    end
  end
end
value_to_string(key, value) click to toggle source
# File lib/my_data/xml_generator.rb, line 35
def value_to_string(key, value)
  case mappings[key][:type]
  when :date
    value.strftime("%Y-%m-%d")
  else
    value.to_s
  end
end
value_to_xml_structure(key, value) click to toggle source
# File lib/my_data/xml_generator.rb, line 44
def value_to_xml_structure(key, value)
  is_resource = mappings[key][:resource].present?

  transform = lambda do |v|
    if is_resource
      self.class.new(v, parent_namespace: namespace).to_xml_structure
    else
      value_to_string(key, v)
    end
  end

  value.is_a?(Array) ? value.map(&transform) : transform.call(value)
end