Class: SmartXmlLogger
- Inherits:
-
Object
- Object
- SmartXmlLogger
- Includes:
- Term::ANSIColor
- Defined in:
- lib/reactor/tools/smart_xml_logger.rb
Instance Method Summary collapse
- #configure(key, options) ⇒ Object
-
#initialize(forward_to, method = nil) ⇒ SmartXmlLogger
constructor
A new instance of SmartXmlLogger.
- #log(text) ⇒ Object
- #log_xml(key, xml) ⇒ Object
-
#print_node(node, indent = 0) ⇒ Object
private.
Constructor Details
#initialize(forward_to, method = nil) ⇒ SmartXmlLogger
Returns a new instance of SmartXmlLogger.
9 10 11 12 |
# File 'lib/reactor/tools/smart_xml_logger.rb', line 9 def initialize(forward_to, method = nil) @logger = forward_to @method = method end |
Instance Method Details
#configure(key, options) ⇒ Object
14 15 16 17 |
# File 'lib/reactor/tools/smart_xml_logger.rb', line 14 def configure(key, ) @configuration ||= {} @configuration[key] = end |
#log(text) ⇒ Object
19 20 21 22 |
# File 'lib/reactor/tools/smart_xml_logger.rb', line 19 def log(text) return unless @logger @logger.send(@method, text) end |
#log_xml(key, xml) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/reactor/tools/smart_xml_logger.rb', line 24 def log_xml(key, xml) return unless @logger = @configuration[key] dom = Nokogiri::XML::Document.parse(xml) node_set = [:xpath] ? dom.xpath([:xpath]) : dom self.log(if node_set.respond_to?(:each) node_set.map{|node| self.print_node(node, [:start_indent] || 0)}.join else self.print_node(node_set, [:start_indent] || 0) end) end |
#print_node(node, indent = 0) ⇒ Object
private
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/reactor/tools/smart_xml_logger.rb', line 42 def print_node(node, indent = 0) return '' if node.text? empty = node.children.empty? has_text = node.children.detect{|child| child.text?} out = ' ' * indent attrs = node.attributes.values.map{|attr| %|#{attr.name}="#{red(attr.value)}"|}.join(' ') attrs = " #{attrs}" if attrs.present? out << "<#{green(node.name)}#{attrs}#{'/' if empty}>" if has_text out << "#{red(node.text)}" else out << "\n" end node.children.each do |child| out << self.print_node(child, indent + 2) end out << ' ' * indent unless has_text || empty out << "</#{green(node.name)}>\n" unless empty out end |