diff --git a/lib/awesome_print.rb b/lib/awesome_print.rb index c75ab20..eae6763 100755 --- a/lib/awesome_print.rb +++ b/lib/awesome_print.rb @@ -30,4 +30,5 @@ unless defined?(AwesomePrint::Inspector) require File.dirname(__FILE__) + "/awesome_print/ext/mongoid" if defined?(Mongoid) require File.dirname(__FILE__) + "/awesome_print/ext/nokogiri" if defined?(Nokogiri) require File.dirname(__FILE__) + "/awesome_print/ext/no_brainer" if defined?(NoBrainer) + require File.dirname(__FILE__) + "/awesome_print/ext/ripple" if defined?(Ripple) end diff --git a/lib/awesome_print/ext/ripple.rb b/lib/awesome_print/ext/ripple.rb new file mode 100644 index 0000000..e1fc03c --- /dev/null +++ b/lib/awesome_print/ext/ripple.rb @@ -0,0 +1,72 @@ +# Copyright (c) 2010-2012 Michael Dvorkin +# +# Awesome Print is freely distributable under the terms of MIT license. +# See LICENSE file or http://www.opensource.org/licenses/mit-license.php +#------------------------------------------------------------------------------ +module AwesomePrint + module Ripple + + def self.included(base) + base.send :alias_method, :cast_without_ripple, :cast + base.send :alias_method, :cast, :cast_with_ripple + end + + # Add Ripple class names to the dispatcher pipeline. + #------------------------------------------------------------------------------ + def cast_with_ripple(object, type) + cast = cast_without_ripple(object, type) + return cast if !defined?(::Ripple) + + if object.is_a?(::Ripple::AttributeMethods) # Module used to access attributes across documents and embedded documents + cast = :ripple_document_instance + elsif object.is_a?(::Ripple::Properties) # Used to access property metadata on Ripple classes + cast = :ripple_document_class + end + cast + end + + private + + # Format Ripple instance object. + # + # NOTE: by default only instance attributes are shown. To format a Ripple document instance + # as a regular object showing its instance variables and accessors use :raw => true option: + # + # ap document, :raw => true + # + #------------------------------------------------------------------------------ + def awesome_ripple_document_instance(object) + return object.inspect if !defined?(::ActiveSupport::OrderedHash) + return awesome_object(object) if @options[:raw] + exclude_assoc = @options[:exclude_assoc] or @options[:exclude_associations] + + data = object.attributes.inject(::ActiveSupport::OrderedHash.new) do |hash, (name, value)| + hash[name.to_sym] = object.send(name) + hash + end + + unless exclude_assoc + data = object.class.embedded_associations.inject(data) do |hash, assoc| + hash[assoc.name] = object.get_proxy(assoc) # Should always be array or Ripple::EmbeddedDocument for embedded associations + hash + end + end + + "##{object} " << awesome_hash(data) + end + + # Format Ripple class object. + #------------------------------------------------------------------------------ + def awesome_ripple_document_class(object) + return object.inspect if !defined?(::ActiveSupport::OrderedHash) || !object.respond_to?(:properties) + + data = object.properties.inject(::ActiveSupport::OrderedHash.new) do |hash, (name, defn)| + hash[name.to_sym] = defn.type.to_s.downcase.to_sym + hash + end + "class #{object} < #{object.superclass} " << awesome_hash(data) + end + end +end + +AwesomePrint::Formatter.send(:include, AwesomePrint::Ripple) diff --git a/spec/ext/ripple_spec.rb b/spec/ext/ripple_spec.rb new file mode 100644 index 0000000..ec1c8cb --- /dev/null +++ b/spec/ext/ripple_spec.rb @@ -0,0 +1,55 @@ +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +begin + require 'ripple' + require 'awesome_print/ext/ripple' + + describe 'AwesomePrint/Ripple' do + before :all do + class RippleUser + include Ripple::Document + + key_on :_id + property :_id, String + property :first_name, String + property :last_name, String + end + end + + after :all do + Object.instance_eval { remove_const :RippleUser } + end + + before do + stub_dotfile! + @ap = AwesomePrint::Inspector.new :plain => true, :sort_keys => true + end + + it "should print class instance" do + user = RippleUser.new :_id => '12345' :first_name => "Al", :last_name => "Capone" + out = @ap.send :awesome, user + + out.should == <<-EOS.strip +# { + :_id => "12345", + :first_name => "Al", + :last_name => "Capone" +} +EOS + end + + it "should print the class" do + @ap.send(:awesome, RippleUser).should == <<-EOS.strip +class RippleUser < Object { + :_id => :string, + :_type => :string, + :first_name => :string, + :last_name => :string +} +EOS + end + end + +rescue LoadError => error + puts "Skipping Ripple specs: #{error}" +end