require 'rubygems' require 'hpricot' require 'date' module Relax class Response attr_accessor :xml def initialize(xml) @xml = Hpricot.XML(xml.to_s) if parameter = self.class.instance_variable_get('@parameters') parameter.each do |parameter, options| element = options[:element] ? options[:element] : parameter if attribute = options[:attribute] and attribute == true node = attribute(root, element) elsif attribute node = attribute(element(element), attribute) elsif options[:collection] node = elements(element) else node = element(element) end if options[:collection] value = node.collect do |element| options[:collection].new(element) end else case options[:type] when :float value = float_value(node) when :integer value = integer_value(node) when :text else value = text_value(node) end end instance_variable_set("@#{parameter}", value) end end end def root @xml.root end def is?(name) root.name.gsub(/.*:(.*)/, '\1') == node_name(name) end def element(name) root.at(root_path(name)) end def attribute(element, name) element[name] end def elements(name) root.search(root_path(name)) end def value(value) value.is_a?(Hpricot::Elem) ? value.inner_text : value.to_s end def text_value(value) value(value) end def integer_value(value) value(value).to_i end def float_value(value) value(value).to_f end def date_value(value) Date.parse(value(value)) end alias :has? :element class << self def parameter(name, options = {}) attr_accessor name @parameters ||= {} @parameters[name] = options end end private def node_name(name) name.to_s.downcase end def root_path(name) "/#{node_name(name)}" end end end