1
0
Fork 0
mirror of https://github.com/awesome-print/awesome_print synced 2023-03-27 23:22:34 -04:00

mongoid adapter

This commit is contained in:
Gudleik Rasch 2011-10-26 23:47:15 +02:00
parent 2e75a16387
commit e410508b2a
3 changed files with 128 additions and 1 deletions

View file

@ -17,9 +17,10 @@ unless defined?(AwesomePrint)
require File.dirname(__FILE__) + "/awesome_print/core_ext/logger" if defined?(Logger)
require File.dirname(__FILE__) + "/awesome_print/ext/action_view" if defined?(ActionView)
# Load the following under normal circumstatnces as well as in Rails
# Load the following under normal circumstances as well as in Rails
# console when required from ~/.irbrc.
require File.dirname(__FILE__) + "/awesome_print/ext/active_record" if defined?(ActiveRecord) || (defined?(IRB) && ENV['RAILS_ENV'])
require File.dirname(__FILE__) + "/awesome_print/ext/active_support" if defined?(ActiveSupport) || (defined?(IRB) && ENV['RAILS_ENV'])
require File.dirname(__FILE__) + "/awesome_print/ext/mongo_mapper" if defined?(MongoMapper)
require File.dirname(__FILE__) + "/awesome_print/ext/mongoid" if defined?(Mongoid)
end

View file

@ -0,0 +1,34 @@
module AwesomePrint
module Mongoid
def self.included(base)
base.send :alias_method, :cast_without_mongoid, :cast
base.send :alias_method, :cast, :cast_with_mongoid
end
# Add Mongoid class names to the dispatcher pipeline.
#------------------------------------------------------------------------------
def cast_with_mongoid(object, type)
cast = cast_without_mongoid(object, type)
if defined?(::Mongoid::Document) && object.is_a?(Class) && object.ancestors.include?(::Mongoid::Document)
cast = :mongoid_class
end
cast
end
# Format Mongoid class object.
#------------------------------------------------------------------------------
def awesome_mongoid_class(object)
return object.inspect if !defined?(::ActiveSupport::OrderedHash) || !object.respond_to?(:fields)
data = object.fields.inject(::ActiveSupport::OrderedHash.new) do |hash, c|
hash[c[1].name] = c[1].type
hash
end
"class #{object} < #{object.superclass} " << awesome_hash(data)
end
end
end
AwesomePrint::Formatter.send(:include, AwesomePrint::Mongoid)

92
spec/ext/mongoid_spec.rb Normal file
View file

@ -0,0 +1,92 @@
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
begin
require "mongoid"
require "awesome_print/ext/mongoid"
describe "AwesomePrint/Mongoid" do
before :all do
class MongoUser
include Mongoid::Document
field :first_name, :type => String
field :last_name, :type => String
end
end
before do
@ap = AwesomePrint::Inspector.new :plain => true, :sort_keys => true
end
it "should print class instance" do
user = MongoUser.new :first_name => "Al", :last_name => "Capone"
out = @ap.send :awesome, user
str = <<-EOS.strip
#<MongoUser:0x01234567
attr_accessor :attributes = {
"_id" => #<BSON::ObjectId:0x01234567
attr_accessor :data = [
[ 0] 42,
[ 1] 42,
[ 2] 42,
[ 3] 42,
[ 4] 42,
[ 5] 42,
[ 6] 42,
[ 7] 42,
[ 8] 42,
[ 9] 42,
[10] 42,
[11] 42
]
>,
"first_name" => "Al",
"last_name" => "Capone"
},
attr_accessor :new_record = true,
attr_reader :changed_attributes = {
"_id" => nil,
"first_name" => nil,
"last_name" => nil
},
attr_reader :pending_nested = {},
attr_reader :pending_relations = {}
>
EOS
out.gsub!(/0x([a-f\d]+)/, "0x01234567")
out.gsub!(/(\[\s?\d+\])\s\d+/, "\\1 42")
out.should eq str
end
it "should print the class" do
@ap.send(:awesome, MongoUser).should == <<-EOS.strip
class MongoUser < Object {
"_id" => BSON::ObjectId < Object,
"_type" => String < Object,
"first_name" => String < Object,
"last_name" => String < Object
}
EOS
end
it "should print the class when type is undefined" do
class Chamelion
include Mongoid::Document
field :last_attribute
end
@ap.send(:awesome, Chamelion).should == <<-EOS.strip
class Chamelion < Object {
"_id" => BSON::ObjectId < Object,
"_type" => String < Object,
"last_attribute" => Mongoid::Fields::Serializable::Object < Object
}
EOS
end
end
rescue LoadError => error
puts "Missing mongoid gem, skipping mongoid specs"
puts "Skipping mongoid specs: #{error}"
end