Module: OM::XML::Document
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/om/xml/document.rb
Defined Under Namespace
Modules: ClassMethods
Instance Attribute Summary collapse
-
#ox_namespaces ⇒ Object
Returns a hash combining the current documents namespaces (provided by nokogiri) and any namespaces that have been set up by your Terminology.
Instance Method Summary collapse
-
#add_child_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a
node_type
template and add it as a child oftarget_node
, wheretarget_node
is one of: * a Nokogiri::XML::Node * a single-element Nokogiri::XML::NodeSet * aterm_pointer
array resolving to a single-element Nokogiri::XML::NodeSet Additional arguments will be passed to the template unaltered. -
#add_next_sibling_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a
node_type
template and insert it as the following sibling oftarget_node
. -
#add_previous_sibling_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a
node_type
template and insert it as the preceding sibling oftarget_node
. -
#after_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a
node_type
template and insert it as the following sibling oftarget_node
. -
#before_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a
node_type
template and insert it as the preceding sibling oftarget_node
. -
#find_by_terms(*term_pointer) ⇒ Object
term_pointer
Variable length array of values in format [:accessor_name, :accessor_name …] or [:accessor_name=>index, :accessor_name …] @example: find_by_terms( => 1, :first_name ) Currently, indexes must be integers. -
#find_by_terms_and_value(*term_pointer) ⇒ Object
Applies the property’s corresponding xpath query, returning the result Nokogiri::XML::NodeSet.
- #find_by_xpath(xpath) ⇒ Object
- #method_missing(method_name, *args) ⇒ Object
- #ng_xml_changed? ⇒ Boolean
-
#ng_xml_will_change! ⇒ Object
This ensures that the stored XML is deleted.
-
#node_exists?(*term_pointer) ⇒ Boolean
Test whether the document has a node corresponding to the given term_pointer.
-
#replace_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a
node_type
template and replacetarget_node
with it. -
#swap_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a
node_type
template and replacetarget_node
with it. - #template(node_type, *args) ⇒ Object
-
#template_registry ⇒ Object
Access the class’s template registry.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args) ⇒ Object
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/om/xml/document.rb', line 104 def method_missing(method_name, *args) if matches = /([^=]+)=$/.match(method_name.to_s) name = matches[1].to_sym end name ||= method_name begin term = self.class.terminology.retrieve_term(name) if /=$/.match(method_name.to_s) node = OM::XML::DynamicNode.new(name, nil, self, term) return node.val=args else return OM::XML::DynamicNode.new(name, args.first, self, term) end rescue OM::XML::Terminology::BadPointerError super end end |
Instance Attribute Details
#ox_namespaces ⇒ Object
Returns a hash combining the current documents namespaces (provided by nokogiri) and any namespaces that have been set up by your Terminology. Most importantly, this matches the ‘oxns’ namespace to the namespace you provided in your Terminology’s root term config
85 86 87 |
# File 'lib/om/xml/document.rb', line 85 def ox_namespaces @ox_namespaces end |
Instance Method Details
#add_child_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a node_type
template and add it as a child of target_node
, where target_node
is one of:
-
a Nokogiri::XML::Node
-
a single-element Nokogiri::XML::NodeSet
-
a
term_pointer
array resolving to a single-element Nokogiri::XML::NodeSet
Additional arguments will be passed to the template unaltered.
Returns the new Nokogiri::XML::Node.
172 173 174 |
# File 'lib/om/xml/document.rb', line 172 def add_child_node(target_node, node_type, *args, &block) manipulate_node(:add_child, target_node, node_type, *args, &block) end |
#add_next_sibling_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a node_type
template and insert it as the following sibling of target_node
. Returns the new Nokogiri::XML::Node.
178 179 180 |
# File 'lib/om/xml/document.rb', line 178 def add_next_sibling_node(target_node, node_type, *args, &block) manipulate_node(:add_next_sibling, target_node, node_type, *args, &block) end |
#add_previous_sibling_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a node_type
template and insert it as the preceding sibling of target_node
. Returns the new Nokogiri::XML::Node.
184 185 186 |
# File 'lib/om/xml/document.rb', line 184 def add_previous_sibling_node(target_node, node_type, *args, &block) manipulate_node(:add_previous_sibling, target_node, node_type, *args, &block) end |
#after_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a node_type
template and insert it as the following sibling of target_node
. Returns target_node
.
190 191 192 |
# File 'lib/om/xml/document.rb', line 190 def after_node(target_node, node_type, *args, &block) manipulate_node(:after, target_node, node_type, *args, &block) end |
#before_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a node_type
template and insert it as the preceding sibling of target_node
. Returns target_node
.
196 197 198 |
# File 'lib/om/xml/document.rb', line 196 def before_node(target_node, node_type, *args, &block) manipulate_node(:before, target_node, node_type, *args, &block) end |
#find_by_terms(*term_pointer) ⇒ Object
term_pointer
Variable length array of values in format [:accessor_name, :accessor_name …] or [:accessor_name=>index, :accessor_name …] @example:
find_by_terms( {:person => 1}, :first_name )
Currently, indexes must be integers.
145 146 147 148 |
# File 'lib/om/xml/document.rb', line 145 def find_by_terms(*term_pointer) xpath = self.class.terminology.xpath_with_indexes(*term_pointer) find_by_xpath(xpath) unless xpath.nil? end |
#find_by_terms_and_value(*term_pointer) ⇒ Object
Applies the property’s corresponding xpath query, returning the result Nokogiri::XML::NodeSet
131 132 133 134 |
# File 'lib/om/xml/document.rb', line 131 def find_by_terms_and_value(*term_pointer) xpath = self.class.terminology.xpath_for(*term_pointer) find_by_xpath(xpath) unless xpath.nil? end |
#find_by_xpath(xpath) ⇒ Object
126 127 128 |
# File 'lib/om/xml/document.rb', line 126 def find_by_xpath(xpath) ng_xml.xpath(xpath, ox_namespaces) end |
#ng_xml_changed? ⇒ Boolean
100 101 102 |
# File 'lib/om/xml/document.rb', line 100 def ng_xml_changed? changed.include?('ng_xml') end |
#ng_xml_will_change! ⇒ Object
This ensures that the stored XML is deleted
90 91 92 93 94 95 96 97 98 |
# File 'lib/om/xml/document.rb', line 90 def ng_xml_will_change! # throw away older version. # This clears both @attributes_changed_by_setter and @mutations_from_database clear_attribute_changes [:ng_xml] # This clears the cached changes @cached_changed_attributes[:ng_xml] = nil if defined? @cached_changed_attributes attribute_will_change!(:ng_xml) end |
#node_exists?(*term_pointer) ⇒ Boolean
Test whether the document has a node corresponding to the given term_pointer
152 153 154 |
# File 'lib/om/xml/document.rb', line 152 def node_exists?(*term_pointer) !find_by_terms(*term_pointer).empty? end |
#replace_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a node_type
template and replace target_node
with it. Returns the new Nokogiri::XML::Node.
202 203 204 |
# File 'lib/om/xml/document.rb', line 202 def replace_node(target_node, node_type, *args, &block) manipulate_node(:replace, target_node, node_type, *args, &block) end |
#swap_node(target_node, node_type, *args, &block) ⇒ Object
Instantiate a node_type
template and replace target_node
with it. Returns target_node
.
208 209 210 |
# File 'lib/om/xml/document.rb', line 208 def swap_node(target_node, node_type, *args, &block) manipulate_node(:swap, target_node, node_type, *args, &block) end |
#template(node_type, *args) ⇒ Object
161 162 163 |
# File 'lib/om/xml/document.rb', line 161 def template(node_type, *args) template_registry.instantiate(node_type, *args) end |
#template_registry ⇒ Object
Access the class’s template registry
157 158 159 |
# File 'lib/om/xml/document.rb', line 157 def template_registry self.class.template_registry end |