lib/restfulx/datamapper_foo.rb in dima-restfulx-1.2.0 vs lib/restfulx/datamapper_foo.rb in dima-restfulx-1.2.1

- old
+ new

@@ -1,31 +1,81 @@ -require 'builder' -require RestfulX::LIB_DIR + 'configuration' - # Flex friendly DataMapper patches, more specifically we just add +to_xml+ on # ValidationErrors class +require 'dm-serializer/common' +require 'dm-serializer/xml_serializers' +require File.join(File.dirname(__FILE__), '..', 'lib', 'restfulx') if !defined?(RestfulX) + +# RestfulX datamapper patches module DataMapper + + # Monkey patches dm-serialization to_json method to add ruby_class: YourClass + # to all serialized objects + module Serialize + # Serialize a Resource to JavaScript Object Notation (JSON; RFC 4627) + # + # @return <String> a JSON representation of the Resource + def to_json(*args) + options = args.first || {} + result = '{ ' + fields = [] + + propset = properties_to_serialize(options) + + fields += propset.map do |property| + "#{property.name.to_json}: #{send(property.getter).to_json}" + end + + fields << "\"ruby_class\": #{self.class.to_json}" + + # add methods + (options[:methods] || []).each do |meth| + if self.respond_to?(meth) + fields << "#{meth.to_json}: #{send(meth).to_json}" + end + end + + # Note: if you want to include a whole other model via relation, use :methods + # comments.to_json(:relationships=>{:user=>{:include=>[:first_name],:methods=>[:age]}}) + # add relationships + # TODO: This needs tests and also needs to be ported to #to_xml and #to_yaml + (options[:relationships] || {}).each do |rel,opts| + if self.respond_to?(rel) + fields << "#{rel.to_json}: #{send(rel).to_json(opts)}" + end + end + + result << fields.join(', ') + result << ' }' + result + end + end + # see DataMapper docs for more details module Validate # By default DataMapper validation errors doesn't have +to_xml+ method. This is # actually very useful when dealing with remote stateful clients such as Flex/AIR. class ValidationErrors # Add Flex-friendly +to_xml+ implementation def to_xml - xml = Builder::XmlMarkup.new(:indent => 2) - xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" - xml.errors do |e| - @errors.each_key do |attribute| - @errors[attribute].each do |msg| - next if msg.nil? - if attribute == "base" - e.error("message" => msg) - else - e.error("field" => attribute.to_s.camelcase(:lower), "message" => msg) - end + xml = DataMapper::Serialize::XMLSerializers::SERIALIZER + doc ||= xml.new_document + root = xml.root_node(doc, "errors") + @errors.each_key do |attribute| + @errors[attribute].each do |msg| + next if msg.nil? + if attribute == "base" + xml.add_node(root, "error", nil, {"message" => msg}) + else + xml.add_node(root, "error", nil, {"field" => attribute.to_s.camel_case.dcfirst, "message" => msg}) end end end + xml.output(doc) + end + + # Add to_json support for datamapper errors too + def to_json + @errors.to_json end end end end \ No newline at end of file