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