lib/happymapper.rb in happymapper-0.3.1 vs lib/happymapper.rb in happymapper-0.3.2
- old
+ new
@@ -11,38 +11,51 @@
def self.included(base)
base.instance_variable_set("@attributes", {})
base.instance_variable_set("@elements", {})
base.extend ClassMethods
end
-
+
module ClassMethods
def attribute(name, type, options={})
attribute = Attribute.new(name, type, options)
@attributes[to_s] ||= []
@attributes[to_s] << attribute
attr_accessor attribute.method_name.intern
end
-
+
def attributes
@attributes[to_s] || []
end
-
+
def element(name, type, options={})
element = Element.new(name, type, options)
@elements[to_s] ||= []
@elements[to_s] << element
attr_accessor element.method_name.intern
end
-
+
+ def content(name)
+ @content = name
+ attr_accessor name
+ end
+
+ def after_parse_callbacks
+ @after_parse_callbacks ||= []
+ end
+
+ def after_parse(&block)
+ after_parse_callbacks.push(block)
+ end
+
def elements
@elements[to_s] || []
end
-
+
def has_one(name, type, options={})
element name, type, {:single => true}.merge(options)
end
-
+
def has_many(name, type, options={})
element name, type, {:single => false}.merge(options)
end
# Specify a namespace if a node and all its children are all namespaced
@@ -54,15 +67,15 @@
end
def tag(new_tag_name)
@tag_name = new_tag_name.to_s
end
-
+
def tag_name
@tag_name ||= to_s.split('::')[-1].downcase
end
-
+
def parse(xml, options = {})
if xml.is_a?(XML::Node)
node = xml
else
if xml.is_a?(XML::Document)
@@ -78,25 +91,29 @@
namespace = "#{DEFAULT_NS}:#{namespace}" if namespace
xpath = root ? '/' : './/'
xpath += "#{DEFAULT_NS}:" if namespace
xpath += tag_name
-
+
nodes = node.find(xpath, Array(namespace))
collection = nodes.collect do |n|
obj = new
-
- attributes.each do |attr|
- obj.send("#{attr.method_name}=",
+
+ attributes.each do |attr|
+ obj.send("#{attr.method_name}=",
attr.from_xml_node(n, namespace))
end
-
+
elements.each do |elem|
- obj.send("#{elem.method_name}=",
+ obj.send("#{elem.method_name}=",
elem.from_xml_node(n, namespace))
end
-
+
+ obj.send("#{@content}=", n.content) if @content
+
+ obj.class.after_parse_callbacks.each { |callback| callback.call(obj) }
+
obj
end
# per http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Document.html#M000354
nodes = nil
@@ -110,6 +127,6 @@
end
end
require 'happymapper/item'
require 'happymapper/attribute'
-require 'happymapper/element'
\ No newline at end of file
+require 'happymapper/element'