zeng 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGE +3 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +89 -0
- data/Rakefile +37 -0
- data/TODOLIST +5 -0
- data/init.rb +4 -0
- data/lib/cute_kv/adapters/light_cloud.rb +22 -0
- data/lib/cute_kv/adapters/tokyo_cabinet.rb +33 -0
- data/lib/cute_kv/adapters/tokyo_tyrant.rb +22 -0
- data/lib/cute_kv/associations.rb +285 -0
- data/lib/cute_kv/connector.rb +27 -0
- data/lib/cute_kv/document.rb +328 -0
- data/lib/cute_kv/ext/string.rb +34 -0
- data/lib/cute_kv/ext/symbol.rb +9 -0
- data/lib/cute_kv/indexer.rb +102 -0
- data/lib/cute_kv/serialization.rb +95 -0
- data/lib/cute_kv/serializers/json_serializer.rb +75 -0
- data/lib/cute_kv/serializers/xml_serializer.rb +325 -0
- data/lib/cute_kv/timestamp.rb +56 -0
- data/lib/cute_kv/validations.rb +68 -0
- data/lib/cutekv.rb +17 -0
- data/spec/asso.yml +23 -0
- data/spec/asso_sin_plural.yml +36 -0
- data/spec/case/associations_test.rb +313 -0
- data/spec/case/document_docking_test.rb +103 -0
- data/spec/case/document_test.rb +184 -0
- data/spec/case/indexer_test.rb +40 -0
- data/spec/case/serialization_test.rb +78 -0
- data/spec/case/sin_plu_dic_test.rb +29 -0
- data/spec/case/symmetry_test.rb +80 -0
- data/spec/case/timestamp_test.rb +65 -0
- data/spec/case/validations_test.rb +74 -0
- data/spec/helper.rb +29 -0
- data/spec/light_cloud.yml +9 -0
- data/spec/model/Account.rb +5 -0
- data/spec/model/Book.rb +6 -0
- data/spec/model/Friend.rb +4 -0
- data/spec/model/Icon.rb +5 -0
- data/spec/model/Project.rb +5 -0
- data/spec/model/Topic.rb +26 -0
- data/spec/model/User.rb +6 -0
- data/tags +322 -0
- metadata +124 -0
| @@ -0,0 +1,78 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__),'..','helper')
         | 
| 2 | 
            +
            ModelDivider.divide "User"
         | 
| 3 | 
            +
            User.assign(:name, :email, :gender=>"male", :age=>25)
         | 
| 4 | 
            +
            User.add_timestamps
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            CuteKV::Associations::map(User=>:friends)
         | 
| 7 | 
            +
            CuteKV::Associations::map(User=>[:wife,:husband])
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            class SerializationTest < Test::Unit::TestCase
         | 
| 10 | 
            +
            	def setup
         | 
| 11 | 
            +
            		User.clear
         | 
| 12 | 
            +
            		@jim = User.create(:name=>"jim")
         | 
| 13 | 
            +
            		@jack = User.create(:name=>"jack")
         | 
| 14 | 
            +
            		@kame = User.create(:name=>"kame")
         | 
| 15 | 
            +
            		@nacy = User.create(:name=>"nancy")
         | 
| 16 | 
            +
            		@aaron = User.create(:name=>"aaron")
         | 
| 17 | 
            +
            		@rita = User.create(:name=>"rita")
         | 
| 18 | 
            +
            	end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            	def test_to_json
         | 
| 21 | 
            +
            		jim = User.new(:name=>"jim")
         | 
| 22 | 
            +
            		assert jim.to_json =~ /"name":"jim"/
         | 
| 23 | 
            +
            	end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
             | 
| 26 | 
            +
            	def test_to_json_include_has_many
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            		@jim.friends << @jack
         | 
| 29 | 
            +
            		@jim.friends << @kame
         | 
| 30 | 
            +
            		@jim.friends << @nancy
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            		assert_equal @jim.to_json(:include=>:friends).grep(/kame/).empty?,false
         | 
| 33 | 
            +
            		assert_equal @kame.to_json(:include=>:friends).grep(/jim/).empty?,false
         | 
| 34 | 
            +
            		assert_equal @jack.to_json(:include=>:friends).grep(/jim/).empty?,false
         | 
| 35 | 
            +
            		assert_equal @jim.to_json(:only=>:name),{"name"=>@jim.name}.to_json
         | 
| 36 | 
            +
            		assert_equal @jim.to_json(:except=>[:name,:email] ),{"gender"=>@jim.gender, "age"=>@jim.age, "id"=>@jim.id, "created_at"=>@jim.created_at, "updated_at"=>@jim.updated_at}.to_json
         | 
| 37 | 
            +
            	end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            	def test_array_to_json_include_has_many_this_test_has_some_problem
         | 
| 40 | 
            +
            		@jim.friends << @kame
         | 
| 41 | 
            +
            		@jim.friends << @jack
         | 
| 42 | 
            +
            		@jack.friends << @kame
         | 
| 43 | 
            +
            		assert_nothing_raised do
         | 
| 44 | 
            +
            			@jim.friends.to_json(:include=>:friends)
         | 
| 45 | 
            +
            		end
         | 
| 46 | 
            +
            	end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            	def test_to_json_include_has_one
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            		@aaron.wife = @rita
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            		assert_equal @aaron.to_json(:include=>:wife).grep(/rita/).empty?,false
         | 
| 53 | 
            +
            	end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
             | 
| 56 | 
            +
             | 
| 57 | 
            +
             | 
| 58 | 
            +
            	def test_to_xml
         | 
| 59 | 
            +
            		assert @aaron.to_xml
         | 
| 60 | 
            +
            	end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            	def test_to_xml_include_has_many
         | 
| 63 | 
            +
            		@jim.friends << @jack
         | 
| 64 | 
            +
            		@jim.friends << @kame
         | 
| 65 | 
            +
            		assert_equal @jim.to_xml(:include=>:friends).grep(/jack/).empty?,false
         | 
| 66 | 
            +
            		assert_equal @jim.to_xml(:include=>:friends).grep(/kame/).empty?,false
         | 
| 67 | 
            +
            		assert_equal @jack.to_xml(:include=>:friends).grep(/jim/).empty?,false
         | 
| 68 | 
            +
            		assert_equal @kame.to_xml(:include=>:friends).grep(/jim/).empty?,false
         | 
| 69 | 
            +
            	end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            	def test_to_xml_include_has_one
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            		@aaron.wife = @rita
         | 
| 74 | 
            +
            		assert_equal @aaron.to_xml(:include=>:wife).grep(/rita/).empty?,false
         | 
| 75 | 
            +
            		assert_equal @rita.to_xml(:include=>:husband).grep(/rita/).empty?,false
         | 
| 76 | 
            +
            	end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__),'..','helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class SinguPluralDic <  Test::Unit::TestCase
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            	def setup
         | 
| 6 | 
            +
            	end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            	def test_singu_plural
         | 
| 9 | 
            +
            		assert "books".plural?
         | 
| 10 | 
            +
            		assert !"books".singular?
         | 
| 11 | 
            +
            		assert "book".singular?
         | 
| 12 | 
            +
            		assert !"book".plural?
         | 
| 13 | 
            +
            		Dic::SIN_WORDS.add("books") 
         | 
| 14 | 
            +
            		assert "books".singular?
         | 
| 15 | 
            +
            		assert !"books".plural?
         | 
| 16 | 
            +
            		Dic::PLU_WORDS.add("books")
         | 
| 17 | 
            +
            		assert !"books".singular?
         | 
| 18 | 
            +
            		assert "books".plural?
         | 
| 19 | 
            +
            		Dic::PLU_WORDS.add("book")
         | 
| 20 | 
            +
            		assert !"book".singular?
         | 
| 21 | 
            +
            		assert "book".plural?
         | 
| 22 | 
            +
            		Dic::SIN_WORDS.add(["book", "dogs"])
         | 
| 23 | 
            +
            		assert !"book".plural?
         | 
| 24 | 
            +
            		assert "book".singular?
         | 
| 25 | 
            +
            		assert "dogs".singular?
         | 
| 26 | 
            +
            		assert !"dogs".plural?
         | 
| 27 | 
            +
            	end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,80 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__),'..','helper')
         | 
| 2 | 
            +
            ModelDivider.divide "User", "Icon", "Friend", "Project"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class Symmetry
         | 
| 5 | 
            +
            	attr_reader :assos
         | 
| 6 | 
            +
              
         | 
| 7 | 
            +
            	def initialize(asso={})
         | 
| 8 | 
            +
                @asso_string = parse(asso)
         | 
| 9 | 
            +
            		@assos = @asso_string.split("#")
         | 
| 10 | 
            +
            	end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            	def mirror(object)
         | 
| 13 | 
            +
            		m_o = @assos[@assos.size - 1 - @assos.index(object.to_s)]
         | 
| 14 | 
            +
                m_o = m_o.constantize if object.is_a? Class 
         | 
| 15 | 
            +
            		m_o = m_o.to_sym if object.is_a? Symbol
         | 
| 16 | 
            +
            		m_o
         | 
| 17 | 
            +
            	end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            	def each
         | 
| 20 | 
            +
            		asso =  [[@assos[0].constantize, @assos[1].to_sym ],[@assos[-1].constantize, @assos[-2].to_sym]].uniq
         | 
| 21 | 
            +
            		asso.each {|a| yield a[0], a[-1]}
         | 
| 22 | 
            +
            	end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            	private
         | 
| 25 | 
            +
            	  def parse(asso={})
         | 
| 26 | 
            +
            			keys = asso.keys
         | 
| 27 | 
            +
            			values = asso.values.flatten
         | 
| 28 | 
            +
            			"#{keys[0]}##{values[0]}##{values[-1]}##{keys[-1]}"
         | 
| 29 | 
            +
            		end
         | 
| 30 | 
            +
            end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            class SymmetryTest < Test::Unit::TestCase
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            	def setup
         | 
| 35 | 
            +
            	end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            	def test_a_new_symmetry
         | 
| 38 | 
            +
            		assert wh = Symmetry.new(User=>[:wife, :husband])
         | 
| 39 | 
            +
            		assert f = Symmetry.new(User=>:friends)
         | 
| 40 | 
            +
            		assert ui = Symmetry.new(User=>:icon, Icon=>:user)
         | 
| 41 | 
            +
            		assert up = Symmetry.new(User=>:projects, Project=>:members)
         | 
| 42 | 
            +
            		assert_equal wh.mirror(User), User
         | 
| 43 | 
            +
            		assert_equal wh.mirror(:wife), :husband
         | 
| 44 | 
            +
            		assert_equal wh.mirror(:husband), :wife
         | 
| 45 | 
            +
            		assert_equal f.mirror(User), User
         | 
| 46 | 
            +
            		assert_equal f.mirror(:friends), :friends
         | 
| 47 | 
            +
            		assert_equal ui.mirror(User), Icon
         | 
| 48 | 
            +
            		assert_equal ui.mirror(Icon), User
         | 
| 49 | 
            +
            		assert_equal ui.mirror(:icon), :user
         | 
| 50 | 
            +
            		assert_equal ui.mirror(:user), :icon
         | 
| 51 | 
            +
            		assert_equal up.mirror(User), Project
         | 
| 52 | 
            +
            		assert_equal up.mirror(Project), User
         | 
| 53 | 
            +
            		assert_equal up.mirror(:projects), :members
         | 
| 54 | 
            +
            		assert_equal up.mirror(:members), :projects
         | 
| 55 | 
            +
            	end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            	def test_symmetry_each
         | 
| 58 | 
            +
            		assert wh = Symmetry.new(User=>[:wife, :husband])
         | 
| 59 | 
            +
            		wh.each {|c, m|
         | 
| 60 | 
            +
            			assert_equal c, User
         | 
| 61 | 
            +
            			assert [:wife, :husband].include?(m)
         | 
| 62 | 
            +
            	 	}
         | 
| 63 | 
            +
            		assert f = Symmetry.new(User=>:friends)
         | 
| 64 | 
            +
            		f.each {|c, m|
         | 
| 65 | 
            +
            			assert_equal c, User
         | 
| 66 | 
            +
            			assert_equal m, :friends
         | 
| 67 | 
            +
            		}
         | 
| 68 | 
            +
            		assert ui = Symmetry.new(User=>:icon, Icon=>:user)
         | 
| 69 | 
            +
            		ui.each {|c, m|
         | 
| 70 | 
            +
            		}
         | 
| 71 | 
            +
            		assert up = Symmetry.new(User=>:projects, Project=>:members)
         | 
| 72 | 
            +
            		up.each {|c, m|
         | 
| 73 | 
            +
            		}
         | 
| 74 | 
            +
            	end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
             | 
| 79 | 
            +
             | 
| 80 | 
            +
             | 
| @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__),'..','helper')
         | 
| 2 | 
            +
            ModelDivider.divide "User", "Icon", "Project", "Book"
         | 
| 3 | 
            +
            User.add_timestamps
         | 
| 4 | 
            +
            Icon.add_timestamps
         | 
| 5 | 
            +
            Project.add_timestamps
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            class TimestampTest < Test::Unit::TestCase
         | 
| 8 | 
            +
            	def setup
         | 
| 9 | 
            +
            		User.clear
         | 
| 10 | 
            +
            		Icon.clear
         | 
| 11 | 
            +
            		Project.clear
         | 
| 12 | 
            +
            		Book.clear
         | 
| 13 | 
            +
            		@jim = User.create(:name=>"jim")
         | 
| 14 | 
            +
            		@icon = Icon.create(:name=>"flower")
         | 
| 15 | 
            +
            		@nonobo = Project.create(:name=>"nonobo")
         | 
| 16 | 
            +
            		@ruby = Book.create(:name=>"Ruby")
         | 
| 17 | 
            +
            	end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            	def test_time_zone
         | 
| 20 | 
            +
                assert_equal User.default_timezone, :utc
         | 
| 21 | 
            +
                assert_equal Icon.default_timezone, :utc
         | 
| 22 | 
            +
                assert_equal Project.default_timezone, :utc
         | 
| 23 | 
            +
            	end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            	def test_no_timestamp
         | 
| 26 | 
            +
            		assert_equal @ruby.respond_to?(:created_at), false
         | 
| 27 | 
            +
            		assert_equal @ruby.respond_to?(:updated_at), false
         | 
| 28 | 
            +
            		Book.add_timestamps
         | 
| 29 | 
            +
            		assert_equal @ruby.respond_to?(:created_at), true
         | 
| 30 | 
            +
            		assert_equal @ruby.respond_to?(:updated_at), true
         | 
| 31 | 
            +
            		@ruby.save
         | 
| 32 | 
            +
            		assert_equal @ruby.created_at.class, DateTime
         | 
| 33 | 
            +
            		assert_equal @ruby.updated_at.class, DateTime
         | 
| 34 | 
            +
            	end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            	def test_created_at
         | 
| 37 | 
            +
            		assert_equal @jim.created_at.class, DateTime
         | 
| 38 | 
            +
            		assert_equal @icon.created_at.class, DateTime
         | 
| 39 | 
            +
            		assert_equal @nonobo.created_at.class, DateTime
         | 
| 40 | 
            +
            		jim_created_at = @jim.created_at
         | 
| 41 | 
            +
            		jim_updated_at = @jim.updated_at
         | 
| 42 | 
            +
            		object_time_test(@jim)
         | 
| 43 | 
            +
            		object_time_test(@icon)
         | 
| 44 | 
            +
            		object_time_test(@nonobo)
         | 
| 45 | 
            +
            	end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
             | 
| 48 | 
            +
            	def object_time_test(object)
         | 
| 49 | 
            +
            		created_at = object.send :created_at
         | 
| 50 | 
            +
            		updated_at = object.send :updated_at
         | 
| 51 | 
            +
            		assert_equal created_at, updated_at
         | 
| 52 | 
            +
            		object.save
         | 
| 53 | 
            +
            		sleep 2
         | 
| 54 | 
            +
            		updated_at2 = object.send :updated_at
         | 
| 55 | 
            +
            		created_at2 = object.send :created_at
         | 
| 56 | 
            +
            		assert (updated_at2 > updated_at)
         | 
| 57 | 
            +
            		assert_equal created_at2,  updated_at
         | 
| 58 | 
            +
            		assert_equal created_at2,  created_at
         | 
| 59 | 
            +
            	end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            	def test_no_timestamps
         | 
| 62 | 
            +
            	end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            end
         | 
| 65 | 
            +
             | 
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__),'..','helper')
         | 
| 2 | 
            +
            ModelDivider.divide "User", "Account", "Project"
         | 
| 3 | 
            +
            CuteKV::Document::docking(CuteKV::Validations)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class ValidationsTest < Test::Unit::TestCase
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            	def setup
         | 
| 8 | 
            +
            		User.clear
         | 
| 9 | 
            +
            		Account.clear
         | 
| 10 | 
            +
            		Project.clear
         | 
| 11 | 
            +
            	end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            	def test_validates
         | 
| 14 | 
            +
            		assert User.respond_to?(:validate)
         | 
| 15 | 
            +
            		assert Account.respond_to?(:validate)
         | 
| 16 | 
            +
            		assert Project.respond_to?(:validate)
         | 
| 17 | 
            +
            	end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            	def test_validates_presences
         | 
| 20 | 
            +
            		User.class_eval {
         | 
| 21 | 
            +
            			validate :name_presences
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            			def name_presences
         | 
| 24 | 
            +
            				self.errors.add(:name, "name not blank") if self.name.blank?
         | 
| 25 | 
            +
            			end
         | 
| 26 | 
            +
            		}
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            		@wumin = User.create()
         | 
| 29 | 
            +
            		assert @wumin.save.nil?
         | 
| 30 | 
            +
            		assert User.find(@wumin.id).nil?
         | 
| 31 | 
            +
            		assert_equal @wumin.errors.on(:name), "name not blank"
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            	end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            	def test_validates_uniq
         | 
| 36 | 
            +
            		CuteKV::Indexer::map(Account=>:email)
         | 
| 37 | 
            +
            		Account.class_eval {
         | 
| 38 | 
            +
            			validate :account_should_uniq
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            			def account_should_uniq
         | 
| 41 | 
            +
            			  a = Account.find_all_by_email(self.email).first
         | 
| 42 | 
            +
            				self.errors.add(:email, "this email has been registered") if a && a.id != self.id
         | 
| 43 | 
            +
            			end
         | 
| 44 | 
            +
            		}
         | 
| 45 | 
            +
            		@jim = Account.new(:name=>'jim', :email=>'jim@nonobo.com')
         | 
| 46 | 
            +
            		assert @jim.save
         | 
| 47 | 
            +
            		Account.indexes << @jim
         | 
| 48 | 
            +
            		assert @jim.save
         | 
| 49 | 
            +
            		@jack = Account.new(:name=>'jack', :email=>'jim@nonobo.com')
         | 
| 50 | 
            +
            		assert @jack.save.nil?
         | 
| 51 | 
            +
            		assert @jack.errors_message_on(:email) == "this email has been registered"
         | 
| 52 | 
            +
            		assert Account.find(@jack.id).nil?
         | 
| 53 | 
            +
            	end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            	def test_validates_length
         | 
| 56 | 
            +
                Project.class_eval {
         | 
| 57 | 
            +
            			validate :project_name_should_long_than_8
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            			def project_name_should_long_than_8
         | 
| 60 | 
            +
            				errors.add(:name, "project name is too short") if self.name.length < 8
         | 
| 61 | 
            +
            			end
         | 
| 62 | 
            +
            		}
         | 
| 63 | 
            +
            		nonobo_book = Project.create(:name=>"nonobo book")
         | 
| 64 | 
            +
            		assert nonobo_book.save
         | 
| 65 | 
            +
            		assert Project.find(nonobo_book.id)
         | 
| 66 | 
            +
            		nonobo = Project.create(:name=>"nonobo")
         | 
| 67 | 
            +
            		assert nonobo.save.nil?
         | 
| 68 | 
            +
            		assert Project.find(nonobo.id).nil?
         | 
| 69 | 
            +
            		assert_equal nonobo.errors_message_on(:name), "project name is too short"
         | 
| 70 | 
            +
            	end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
             | 
    
        data/spec/helper.rb
    ADDED
    
    | @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            require 'pathname'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require File.join(File.dirname(__FILE__), '..','lib','cutekv')
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'test/unit'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            def uses_mocha(description)
         | 
| 8 | 
            +
            	require 'rubygems'
         | 
| 9 | 
            +
            	require 'mocha'
         | 
| 10 | 
            +
            	yield
         | 
| 11 | 
            +
            rescue LoadError
         | 
| 12 | 
            +
            	$stderr.puts "Skipping #{description} tests. `gem install mocha` and try again."
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            module ModelDivider
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            	def self.divide(*models)
         | 
| 18 | 
            +
            		models.size > 1 ? models.each {|model| divide(model)} : require(locate(models))
         | 
| 19 | 
            +
            	end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            	protected
         | 
| 22 | 
            +
            	def self.locate(model)
         | 
| 23 | 
            +
            		File.join(File.dirname(__FILE__), "model", "#{model.to_s}")
         | 
| 24 | 
            +
            	end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
             | 
| 29 | 
            +
             | 
    
        data/spec/model/Book.rb
    ADDED
    
    
    
        data/spec/model/Icon.rb
    ADDED
    
    
    
        data/spec/model/Topic.rb
    ADDED
    
    | @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            class Topic < ActiveObject::Base
         | 
| 2 | 
            +
            	attribute :title,:content,:create_time,:user_key,:posts
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            	before_create	do |object|
         | 
| 5 | 
            +
            		object.create_time = Time.now
         | 
| 6 | 
            +
            	end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            	validates_presence_of :title,:content
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            	validate_on_create :title_is_wrong_create
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
              def validate_on_create
         | 
| 14 | 
            +
                if content == "Mismatch"
         | 
| 15 | 
            +
                  errors.add("title", "is Content Mismatch")
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              def title_is_wrong_create
         | 
| 20 | 
            +
                errors.add("title", "is Wrong Create") if  title == "Wrong Create"
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              def validate_on_update
         | 
| 24 | 
            +
                errors.add("title", "is Wrong Update") if  title == "Wrong Update"
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         |