Class: XML::MappingExtensions::NodeBase

Inherits:
XML::Mapping::SingleAttributeNode
  • Object
show all
Defined in:
lib/xml/mapping_extensions/node_base.rb

Overview

Base class for simple single-attribute nodes that convert XML strings to object values.

Usage:

  • extend this class
  • override to_value (and, optionally, to_xml_text) to do your conversion
  • call ::XML::Mapping.add_node_class to add your new node class

Direct Known Subclasses

DateNode, MimeTypeNode, TimeNode, TypesafeEnumNode, UriNode

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ NodeBase

See ::XML::Mapping::SingleAttributeNode#initialize



16
17
18
19
20
# File 'lib/xml/mapping_extensions/node_base.rb', line 16

def initialize(*args)
  path, *args = super(*args)
  @path = ::XML::XXPath.new(path)
  args
end

Instance Method Details

#extract_attr_value(xml) ⇒ Object?

Implements ::XML::Mapping::SingleAttributeNode#extract_attr_value.



25
26
27
28
29
30
31
# File 'lib/xml/mapping_extensions/node_base.rb', line 25

def extract_attr_value(xml)
  xml_text = default_when_xpath_err { @path.first(xml).text }
  to_value(xml_text) if xml_text
rescue => e
  bad_value = xml_text ? "'#{xml_text}'" : 'nil'
  raise e, "#{@owner}.#{@attrname}: Can't parse #{bad_value} as #{self.class}: #{e.message}"
end

#set_attr_value(xml, value)

Implements ::XML::Mapping::SingleAttributeNode#set_attr_value. The object value is passed to to_xml_text for string conversion.



37
38
39
40
# File 'lib/xml/mapping_extensions/node_base.rb', line 37

def set_attr_value(xml, value)
  text = to_xml_text(value)
  @path.first(xml, ensure_created: true).text = text
end

#to_value(xml_text) ⇒ Object

Override this method to convert XML text to an object value



45
46
47
# File 'lib/xml/mapping_extensions/node_base.rb', line 45

def to_value(xml_text) # rubocop:disable Lint/UnusedMethodArgument
  fail NoMethodError, "#{self.class} should override #to_value to convert an XML string to an object value"
end

#to_xml_text(value) ⇒ String

Override this method to convert object values to XML text. The default implementation simply calls to_s.



53
54
55
# File 'lib/xml/mapping_extensions/node_base.rb', line 53

def to_xml_text(value)
  value.to_s
end