puppet-pacemaker/lib/pacemaker/xml/xml.rb

66 lines
2.2 KiB
Ruby

module Pacemaker
# functions that are used to generate XML documents and create XML patches
module Xml
# create a new xml document
# @param path [String,Array<String>] create this sequence of path elements
# @param root [REXML::Document] use existing element as a root instead of creating a new one
# @return [REXML::Element] element point to the last path component
# use .root to get the document root
def xml_document(path = [], root = nil)
root = REXML::Document.new unless root
element = root
path = Array(path) unless path.is_a? Array
path.each do |component|
element = element.add_element component
end
element
end
# convert hash to xml element
# @param tag [String] what xml tag to create
# @param hash [Hash] attributes data structure
# @param skip_attributes [String,Array<String>] skip these hash keys
# @return [REXML::Element]
def xml_element(tag, hash, skip_attributes = nil)
return unless hash.is_a? Hash
element = REXML::Element.new tag.to_s
hash.each do |attribute, value|
attribute = attribute.to_s
# skip attributes that were specified to be skipped
next if skip_attributes == attribute ||
(skip_attributes.respond_to?(:include?) && skip_attributes.include?(attribute))
# skip array and hash values. add only scalar ones
next if value.is_a?(Array) || value.is_a?(Hash)
element.add_attribute attribute, value
end
element
end
# output xml element as the actual xml text with indentation
# @param element [REXML::Element]
# @return [String]
def xml_pretty_format(element)
return unless element.is_a? REXML::Element
formatter = REXML::Formatters::Pretty.new
formatter.compact = true
xml = ''
formatter.write element, xml
xml + "\n"
end
end
end
# external REXML module patching
module REXML
# make REXML's attributes to be sorted by their name
# when iterating through them instead of randomly placing them each time
# it's required to generate stable XML texts for unit testing
class Attributes
def each_value # :yields: attribute
keys.sort.each do |key|
yield fetch key
end
end
end
end