lib/xcodeproj/scheme/xml_element_wrapper.rb
module Xcodeproj class XCScheme # Abstract base class used for other XCScheme classes wrapping an XML element # class XMLElementWrapper # @return [REXML::Element] # The XML node wrapped and manipulated by this XMLElementWrapper object # attr_reader :xml_element # @return [String] # The XML representation of the node this XMLElementWrapper wraps, # formatted in the same way that Xcode would. def to_s formatter = XMLFormatter.new(2) formatter.compact = false out = '' formatter.write(@xml_element, out) out.gsub!("<?xml version='1.0' encoding='UTF-8'?>", '') out << "\n" out end private # This is a method intended to be used to facilitate the implementation of the initializers. # # - Create the @xml_element attribute based on the node passed as parameter, only if # that parameter is of type REXML::Element and its name matches the tag_name given. # - Otherwise, create a brand new REXML::Element with the proper tag name and # execute the block given as a fallback to let the caller the chance to configure it # # @param [REXML::Element, *] node # The node this XMLElementWrapper is expected to wrap # or any other object (typically an AbstractTarget instance, or nil) the initializer might expect # # @param [String] tag_name # The expected name for the node, which will also be the name used to create the new node # if that `node` parameter is not a REXML::Element itself. # # @yield a parameter-less block if the `node` parameter is not actually a REXML::Element # # @raise Informative # If the `node` parameter is a REXML::Element instance but the node's name # doesn't match the one provided by the `tag_name` parameter. # def create_xml_element_with_fallback(node, tag_name) if node && node.is_a?(REXML::Element) raise Informative, 'Wrong XML tag name' unless node.name == tag_name @xml_element = node else @xml_element = REXML::Element.new(tag_name) yield if block_given? end end # @param [Bool] # The boolean we want to represent as a string # # @return [String] # The string representaiton of that boolean used in the XML ('YES' or 'NO') # def bool_to_string(flag) flag ? 'YES' : 'NO' end # @param [String] # The string representaiton of a boolean used in the XML ('YES' or 'NO') # # @return [Bool] # The boolean interpretation of that string # # @raise Informative # If the string is not representing a boolean (i.e. is neither 'YES' nor 'NO') # def string_to_bool(str) raise Informative, 'Invalid tag value. Expected YES or NO.' unless %w(YES NO).include?(str) str == 'YES' end end end end