djsun-mongomapper 0.3.3 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
data/History CHANGED
@@ -1,6 +1,12 @@
1
- 0.3.4 (master)
1
+ 0.3.5 8/29/2009
2
+ * updated to 0.14 of the ruby driver
3
+ * _type key gets set automatically at initialize time if defined and blank
4
+
5
+ 0.3.4 8/28/2009
2
6
  * BACKWORDS COMPATIBILITY BREAK: Timestamps are now optional. To use them add timestamps! to your model.
3
7
  * BACKWORDS COMPATIBILITY BREAK: Associations keys are no longer created automatically when you use belongs_to and many. Too much was hidden from the developer. You now have to declare them like key :creator_id, String and such.
8
+ * to_json now includes dynamic keys and embedded stuff by default
9
+ * added polymorphic many with :as option (dcu)
4
10
 
5
11
  0.3.3 8/16/2009
6
12
  * BACKWORDS COMPATIBILITY BREAK: _id is now once again a string rather than an object id and will stay that way.
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ begin
12
12
  gem.rubyforge_project = "mongomapper"
13
13
 
14
14
  gem.add_dependency('activesupport')
15
- gem.add_dependency('mongodb-mongo', '0.11.1')
15
+ gem.add_dependency('mongodb-mongo', '0.14')
16
16
  gem.add_dependency('jnunemaker-validatable', '1.7.2')
17
17
 
18
18
  gem.add_development_dependency('mocha', '0.9.4')
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.3.5
data/bin/mmconsole CHANGED
@@ -11,7 +11,6 @@ IRB.conf[:MAIN_CONTEXT] = irb.context
11
11
 
12
12
  irb.context.evaluate("require 'irb/completion'", 0)
13
13
  irb.context.evaluate(%@
14
- include XGen::Mongo::Driver
15
14
  include MongoMapper
16
15
 
17
16
  MongoMapper.database = "mmtest"
data/lib/mongomapper.rb CHANGED
@@ -2,10 +2,10 @@ require 'pathname'
2
2
  require 'rubygems'
3
3
 
4
4
  gem 'activesupport'
5
- gem 'mongodb-mongo', '0.11.1'
5
+ gem 'mongodb-mongo', '0.14'
6
6
  gem 'jnunemaker-validatable', '1.7.2'
7
7
 
8
- require 'activesupport'
8
+ # require 'activesupport'
9
9
  require 'mongo'
10
10
  require 'validatable'
11
11
 
@@ -25,6 +25,7 @@ require dir + 'associations/many_proxy'
25
25
  require dir + 'associations/many_polymorphic_proxy'
26
26
  require dir + 'associations/many_embedded_proxy'
27
27
  require dir + 'associations/many_embedded_polymorphic_proxy'
28
+ require dir + 'associations/many_documents_as_proxy'
28
29
 
29
30
  require dir + 'callbacks'
30
31
  require dir + 'finder_options'
@@ -53,7 +54,7 @@ module MongoMapper
53
54
  end
54
55
 
55
56
  def self.connection
56
- @@connection ||= XGen::Mongo::Driver::Mongo.new
57
+ @@connection ||= Mongo::Connection.new
57
58
  end
58
59
 
59
60
  def self.connection=(new_connection)
@@ -6,7 +6,7 @@ module MongoMapper
6
6
  def initialize(type, name, options = {})
7
7
  @type, @name, @options = type, name, options
8
8
  end
9
-
9
+
10
10
  def class_name
11
11
  @class_name ||= begin
12
12
  if cn = options[:class_name]
@@ -18,35 +18,43 @@ module MongoMapper
18
18
  end
19
19
  end
20
20
  end
21
-
21
+
22
22
  def klass
23
23
  @klass ||= class_name.constantize
24
24
  end
25
-
25
+
26
26
  def many?
27
27
  @many_type ||= @type == :many
28
28
  end
29
-
29
+
30
30
  def belongs_to?
31
31
  @belongs_to_type ||= @type == :belongs_to
32
32
  end
33
-
33
+
34
34
  def polymorphic?
35
35
  !!@options[:polymorphic]
36
36
  end
37
-
37
+
38
+ def as?
39
+ !!@options[:as]
40
+ end
41
+
38
42
  def type_key_name
39
- @type_key_name ||= many? ? '_type' : "#{name}_type"
43
+ @type_key_name ||= many? ? '_type' : "#{as}_type"
44
+ end
45
+
46
+ def as
47
+ @options[:as] || self.name
40
48
  end
41
-
49
+
42
50
  def foreign_key
43
51
  @options[:foreign_key] || "#{name}_id"
44
52
  end
45
-
53
+
46
54
  def ivar
47
55
  @ivar ||= "@_#{name}"
48
56
  end
49
-
57
+
50
58
  def embeddable?
51
59
  many? && klass.embeddable?
52
60
  end
@@ -57,7 +65,13 @@ module MongoMapper
57
65
  if self.klass.embeddable?
58
66
  polymorphic? ? ManyEmbeddedPolymorphicProxy : ManyEmbeddedProxy
59
67
  else
60
- polymorphic? ? ManyPolymorphicProxy : ManyProxy
68
+ if polymorphic?
69
+ ManyPolymorphicProxy
70
+ elsif as?
71
+ ManyDocumentsAsProxy
72
+ else
73
+ ManyProxy
74
+ end
61
75
  end
62
76
  else
63
77
  polymorphic? ? BelongsToPolymorphicProxy : BelongsToProxy
@@ -6,12 +6,12 @@ module MongoMapper
6
6
  doc.save if doc.new?
7
7
  id = doc.id
8
8
  end
9
-
9
+
10
10
  @owner.send("#{@association.foreign_key}=", id)
11
11
  reset
12
12
  end
13
13
 
14
- protected
14
+ protected
15
15
  def find_target
16
16
  if association_id = @owner.send(@association.foreign_key)
17
17
  @association.klass.find_by_id(association_id)
@@ -0,0 +1,27 @@
1
+ module MongoMapper
2
+ module Associations
3
+ class ManyDocumentsAsProxy < ManyDocumentsProxy
4
+ protected
5
+ def scoped_conditions
6
+ {as_type_name => @owner.class.name, as_id_name => @owner.id}
7
+ end
8
+
9
+ def apply_scope(doc)
10
+ ensure_owner_saved
11
+
12
+ doc.send("#{as_type_name}=", @owner.class.name)
13
+ doc.send("#{as_id_name}=", @owner.id)
14
+
15
+ doc
16
+ end
17
+
18
+ def as_type_name
19
+ @as_type_name ||= @association.options[:as].to_s + "_type"
20
+ end
21
+
22
+ def as_id_name
23
+ @as_id_name ||= @association.options[:as].to_s + "_id"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -59,13 +59,13 @@ module MongoMapper
59
59
 
60
60
  def find_by_id(id)
61
61
  criteria = FinderOptions.to_mongo_criteria(:_id => id)
62
- if doc = collection.find_first(criteria)
62
+ if doc = collection.find_one(criteria)
63
63
  new(doc)
64
64
  end
65
65
  end
66
66
 
67
67
  def count(conditions={})
68
- collection.count(FinderOptions.to_mongo_criteria(conditions))
68
+ collection.find(FinderOptions.to_mongo_criteria(conditions)).count
69
69
  end
70
70
 
71
71
  def create(*docs)
@@ -320,7 +320,7 @@ module MongoMapper
320
320
 
321
321
  def assign_id
322
322
  if read_attribute(:_id).blank?
323
- write_attribute(:_id, XGen::Mongo::Driver::ObjectID.new.to_s)
323
+ write_attribute(:_id, Mongo::ObjectID.new.to_s)
324
324
  end
325
325
  end
326
326
 
@@ -84,7 +84,7 @@ module MongoMapper
84
84
 
85
85
  private
86
86
  def accessors_module
87
- if const_defined?('MongoMapperKeys') && constants.include?( 'MongoMapperKeys' )
87
+ if const_defined?('MongoMapperKeys')
88
88
  const_get 'MongoMapperKeys'
89
89
  else
90
90
  const_set 'MongoMapperKeys', Module.new
@@ -94,7 +94,7 @@ module MongoMapper
94
94
  def create_accessors_for(key)
95
95
  accessors_module.module_eval <<-end_eval
96
96
  def #{key.name}
97
- read_attribute( :'#{key.name}' )
97
+ read_attribute(:'#{key.name}')
98
98
  end
99
99
 
100
100
  def #{key.name}_before_typecast
@@ -160,10 +160,14 @@ module MongoMapper
160
160
  end
161
161
 
162
162
  self.attributes = attrs
163
+
164
+ if respond_to?(:_type=) && self['_type'].blank?
165
+ self._type = self.class.name
166
+ end
163
167
  end
164
168
 
165
169
  if self.class.embeddable? && read_attribute(:_id).blank?
166
- write_attribute :_id, XGen::Mongo::Driver::ObjectID.new.to_s
170
+ write_attribute :_id, Mongo::ObjectID.new.to_s
167
171
  end
168
172
  end
169
173
 
@@ -10,7 +10,7 @@ module MongoMapper #:nodoc:
10
10
  end
11
11
 
12
12
  def serializable_key_names
13
- key_names = @record.class.keys.keys
13
+ key_names = @record.attributes.keys
14
14
 
15
15
  if options[:only]
16
16
  options.delete(:except)
data/mongomapper.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongomapper}
8
- s.version = "0.3.3"
8
+ s.version = "0.3.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["John Nunemaker"]
12
- s.date = %q{2009-08-16}
12
+ s.date = %q{2009-08-29}
13
13
  s.default_executable = %q{mmconsole}
14
14
  s.email = %q{nunemaker@gmail.com}
15
15
  s.executables = ["mmconsole"]
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  "lib/mongomapper/associations/base.rb",
31
31
  "lib/mongomapper/associations/belongs_to_polymorphic_proxy.rb",
32
32
  "lib/mongomapper/associations/belongs_to_proxy.rb",
33
+ "lib/mongomapper/associations/many_documents_as_proxy.rb",
33
34
  "lib/mongomapper/associations/many_documents_proxy.rb",
34
35
  "lib/mongomapper/associations/many_embedded_polymorphic_proxy.rb",
35
36
  "lib/mongomapper/associations/many_embedded_proxy.rb",
@@ -55,6 +56,7 @@ Gem::Specification.new do |s|
55
56
  "test/NOTE_ON_TESTING",
56
57
  "test/functional/associations/test_belongs_to_polymorphic_proxy.rb",
57
58
  "test/functional/associations/test_belongs_to_proxy.rb",
59
+ "test/functional/associations/test_many_documents_as_proxy.rb",
58
60
  "test/functional/associations/test_many_embedded_polymorphic_proxy.rb",
59
61
  "test/functional/associations/test_many_embedded_proxy.rb",
60
62
  "test/functional/associations/test_many_polymorphic_proxy.rb",
@@ -89,6 +91,7 @@ Gem::Specification.new do |s|
89
91
  s.test_files = [
90
92
  "test/functional/associations/test_belongs_to_polymorphic_proxy.rb",
91
93
  "test/functional/associations/test_belongs_to_proxy.rb",
94
+ "test/functional/associations/test_many_documents_as_proxy.rb",
92
95
  "test/functional/associations/test_many_embedded_polymorphic_proxy.rb",
93
96
  "test/functional/associations/test_many_embedded_proxy.rb",
94
97
  "test/functional/associations/test_many_polymorphic_proxy.rb",
@@ -121,20 +124,20 @@ Gem::Specification.new do |s|
121
124
 
122
125
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
123
126
  s.add_runtime_dependency(%q<activesupport>, [">= 0"])
124
- s.add_runtime_dependency(%q<mongodb-mongo>, ["= 0.11.1"])
127
+ s.add_runtime_dependency(%q<mongodb-mongo>, ["= 0.14"])
125
128
  s.add_runtime_dependency(%q<jnunemaker-validatable>, ["= 1.7.2"])
126
129
  s.add_development_dependency(%q<mocha>, ["= 0.9.4"])
127
130
  s.add_development_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
128
131
  else
129
132
  s.add_dependency(%q<activesupport>, [">= 0"])
130
- s.add_dependency(%q<mongodb-mongo>, ["= 0.11.1"])
133
+ s.add_dependency(%q<mongodb-mongo>, ["= 0.14"])
131
134
  s.add_dependency(%q<jnunemaker-validatable>, ["= 1.7.2"])
132
135
  s.add_dependency(%q<mocha>, ["= 0.9.4"])
133
136
  s.add_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
134
137
  end
135
138
  else
136
139
  s.add_dependency(%q<activesupport>, [">= 0"])
137
- s.add_dependency(%q<mongodb-mongo>, ["= 0.11.1"])
140
+ s.add_dependency(%q<mongodb-mongo>, ["= 0.14"])
138
141
  s.add_dependency(%q<jnunemaker-validatable>, ["= 1.7.2"])
139
142
  s.add_dependency(%q<mocha>, ["= 0.9.4"])
140
143
  s.add_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
@@ -0,0 +1,253 @@
1
+ require 'test_helper'
2
+ require 'models'
3
+
4
+ class ManyDocumentsAsProxyTest < Test::Unit::TestCase
5
+ def setup
6
+ clear_all_collections
7
+ end
8
+
9
+ should "default reader to empty array" do
10
+ Post.new.comments.should == []
11
+ end
12
+
13
+ should "add type and id key to polymorphic class base" do
14
+ PostComment.keys.keys.should include('commentable_type')
15
+ PostComment.keys.keys.should include('commentable_id')
16
+ end
17
+
18
+ should "allow adding to association like it was an array" do
19
+ post = Post.new
20
+ post.comments << PostComment.new(:body => 'foo bar')
21
+ post.comments << PostComment.new(:body => 'baz')
22
+ post.comments.concat PostComment.new(:body => 'baz')
23
+
24
+ post.comments.size.should == 3
25
+ end
26
+
27
+ should "be able to replace the association" do
28
+ post = Post.new
29
+
30
+ lambda {
31
+ post.comments = [
32
+ PostComment.new(:body => 'foo'),
33
+ PostComment.new(:body => 'bar'),
34
+ PostComment.new(:body => 'baz')
35
+ ]
36
+ }.should change { PostComment.count }.by(3)
37
+
38
+ from_db = Post.find(post.id)
39
+ from_db.comments.size.should == 3
40
+ from_db.comments[0].body.should == 'foo'
41
+ from_db.comments[1].body.should == 'bar'
42
+ from_db.comments[2].body.should == 'baz'
43
+ end
44
+
45
+ context "build" do
46
+ should "assign foreign key" do
47
+ post = Post.new
48
+ comment = post.comments.build
49
+ comment.commentable_id.should == post.id
50
+ end
51
+
52
+ should "assign _type" do
53
+ post = Post.new
54
+ comment = post.comments.build
55
+ comment.commentable_type.should == "Post"
56
+ end
57
+
58
+ should "allow assigning attributes" do
59
+ post = Post.new
60
+ comment = post.comments.build(:body => 'foo bar')
61
+ comment.body.should == 'foo bar'
62
+ end
63
+ end
64
+
65
+ context "create" do
66
+ should "assign foreign key" do
67
+ post = Post.new
68
+ comment = post.comments.create
69
+ comment.commentable_id.should == post.id
70
+ end
71
+
72
+ should "assign _type" do
73
+ post = Post.new
74
+ comment = post.comments.create
75
+ comment.commentable_type.should == "Post"
76
+ end
77
+
78
+ should "save record" do
79
+ post = Post.new
80
+ lambda {
81
+ post.comments.create(:body => 'baz')
82
+ }.should change { PostComment.count }
83
+ end
84
+
85
+ should "allow passing attributes" do
86
+ post = Post.create
87
+ comment = post.comments.create(:body => 'foo bar')
88
+ comment.body.should == 'foo bar'
89
+ end
90
+ end
91
+
92
+ context "count" do
93
+ should "work scoped to association" do
94
+ post = Post.create
95
+ 3.times { post.comments.create(:body => 'foo bar') }
96
+
97
+ other_post = Post.create
98
+ 2.times { other_post.comments.create(:body => 'baz') }
99
+
100
+ post.comments.count.should == 3
101
+ other_post.comments.count.should == 2
102
+ end
103
+
104
+ should "work with conditions" do
105
+ post = Post.create
106
+ post.comments.create(:body => 'foo bar')
107
+ post.comments.create(:body => 'baz')
108
+ post.comments.create(:body => 'foo bar')
109
+
110
+ post.comments.count(:body => 'foo bar').should == 2
111
+ end
112
+ end
113
+
114
+ context "Finding scoped to association" do
115
+ setup do
116
+ @post = Post.new
117
+
118
+ @comment1 = PostComment.create(:body => 'comment1')
119
+ @comment2 = PostComment.create(:body => 'comment2')
120
+ @comment3 = PostComment.create(:body => 'comment3')
121
+ @post.comments = [@comment1, @comment2]
122
+ @post.save
123
+
124
+ @post2 = Post.create(:body => "post #2")
125
+ @comment4 = PostComment.create(:body => 'comment4')
126
+ @comment5 = PostComment.create(:body => 'comment5')
127
+ @comment6 = PostComment.create(:body => 'comment6')
128
+ @post2.comments = [@comment4, @comment5, @comment6]
129
+ @post2.save
130
+ end
131
+
132
+ context "with :all" do
133
+ should "work" do
134
+ @post.comments.find(:all).should include(@comment1)
135
+ @post.comments.find(:all).should include(@comment2)
136
+ end
137
+
138
+ should "work with conditions" do
139
+ comments = @post.comments.find(:all, :conditions => {:body => 'comment1'})
140
+ comments.should == [@comment1]
141
+ end
142
+
143
+ should "work with order" do
144
+ comments = @post.comments.find(:all, :order => 'body desc')
145
+ comments.should == [@comment2, @comment1]
146
+ end
147
+ end
148
+
149
+ context "with #all" do
150
+ should "work" do
151
+ @post.comments.all.should == [@comment1, @comment2]
152
+ end
153
+
154
+ should "work with conditions" do
155
+ comments = @post.comments.all(:conditions => {:body => 'comment1'})
156
+ comments.should == [@comment1]
157
+ end
158
+
159
+ should "work with order" do
160
+ comments = @post.comments.all(:order => '$natural desc')
161
+ comments.should == [@comment2, @comment1]
162
+ end
163
+ end
164
+
165
+ context "with :first" do
166
+ should "work" do
167
+ lambda {@post.comments.find(:first)}.should_not raise_error
168
+ end
169
+
170
+ should "work with conditions" do
171
+ comment = @post.comments.find(:first, :conditions => {:body => 'comment2'})
172
+ comment.body.should == 'comment2'
173
+ end
174
+ end
175
+
176
+ context "with #first" do
177
+ should "work" do
178
+ @post.comments.first.should == @comment1
179
+ end
180
+
181
+ should "work with conditions" do
182
+ comment = @post.comments.first(:conditions => {:body => 'comment2'}, :order => 'body desc')
183
+ comment.should == @comment2
184
+ end
185
+ end
186
+
187
+ context "with :last" do
188
+ should "work" do
189
+ @post.comments.find(:last, :order => 'created_at asc').should == @comment2
190
+ end
191
+
192
+ should "work with conditions" do
193
+ post = @post.comments.find(:last, :conditions => {:body => 'comment1'})
194
+ post.body.should == 'comment1'
195
+ end
196
+ end
197
+
198
+ context "with #last" do
199
+ should "work" do
200
+ @post.comments.last.should == @comment2
201
+ end
202
+
203
+ should "work with conditions" do
204
+ comment = @post.comments.last(:conditions => {:body => 'comment1'})
205
+ comment.should == @comment1
206
+ end
207
+ end
208
+
209
+ context "with one id" do
210
+ should "work for id in association" do
211
+ @post.comments.find(@comment2.id).should == @comment2
212
+ end
213
+
214
+ should "not work for id not in association" do
215
+ lambda {
216
+ @post.comments.find(@comment5.id)
217
+ }.should raise_error(MongoMapper::DocumentNotFound)
218
+ end
219
+ end
220
+
221
+ context "with multiple ids" do
222
+ should "work for ids in association" do
223
+ posts = @post.comments.find(@comment1.id, @comment2.id)
224
+ posts.should == [@comment1, @comment2]
225
+ end
226
+
227
+ should "not work for ids not in association" do
228
+ lambda {
229
+ @post.comments.find(@comment1.id, @comment2.id, @comment4.id)
230
+ }.should raise_error(MongoMapper::DocumentNotFound)
231
+ end
232
+ end
233
+
234
+ context "with #paginate" do
235
+ setup do
236
+ @comments = @post2.comments.paginate(:per_page => 2, :page => 1, :order => 'created_at asc')
237
+ end
238
+
239
+ should "return total pages" do
240
+ @comments.total_pages.should == 2
241
+ end
242
+
243
+ should "return total entries" do
244
+ @comments.total_entries.should == 3
245
+ end
246
+
247
+ should "return the subject" do
248
+ @comments.should include(@comment4)
249
+ @comments.should include(@comment5)
250
+ end
251
+ end
252
+ end
253
+ end
@@ -26,7 +26,7 @@ class DocumentTest < Test::Unit::TestCase
26
26
 
27
27
  context "Loading a document from the database with keys that are not defined" do
28
28
  setup do
29
- @id = XGen::Mongo::Driver::ObjectID.new.to_s
29
+ @id = Mongo::ObjectID.new.to_s
30
30
  @document.collection.insert({
31
31
  :_id => @id,
32
32
  :first_name => 'John',
data/test/models.rb CHANGED
@@ -1,6 +1,30 @@
1
+ class Post
2
+ include MongoMapper::Document
3
+
4
+ key :title, String
5
+ key :body, String
6
+
7
+ has_many :comments, :as => :commentable, :class_name => 'PostComment'
8
+
9
+ timestamps!
10
+ end
11
+
12
+ class PostComment
13
+ include MongoMapper::Document
14
+
15
+ key :username, String, :default => 'Anonymous'
16
+ key :body, String
17
+
18
+ key :commentable_id, String
19
+ key :commentable_type, String
20
+ belongs_to :commentable, :polymorphic => true
21
+
22
+ timestamps!
23
+ end
24
+
1
25
  class Address
2
26
  include MongoMapper::EmbeddedDocument
3
-
27
+
4
28
  key :address, String
5
29
  key :city, String
6
30
  key :state, String
@@ -9,29 +33,35 @@ end
9
33
 
10
34
  class Message
11
35
  include MongoMapper::Document
12
-
36
+
13
37
  key :body, String
14
38
  key :position, Integer
15
39
  key :_type, String
16
40
  key :room_id, String
17
-
41
+
18
42
  belongs_to :room
19
43
  end
20
44
 
45
+ class Answer
46
+ include MongoMapper::Document
47
+
48
+ key :body, String
49
+ end
50
+
21
51
  class Enter < Message; end
22
52
  class Exit < Message; end
23
53
  class Chat < Message; end
24
54
 
25
55
  class Room
26
56
  include MongoMapper::Document
27
-
57
+
28
58
  key :name, String
29
59
  many :messages, :polymorphic => true
30
60
  end
31
61
 
32
62
  class Project
33
63
  include MongoMapper::Document
34
-
64
+
35
65
  key :name, String
36
66
  many :statuses
37
67
  many :addresses
@@ -39,13 +69,13 @@ end
39
69
 
40
70
  class Status
41
71
  include MongoMapper::Document
42
-
72
+
43
73
  key :project_id, String
44
74
  key :target_id, String
45
75
  key :target_type, String
46
76
  key :name, String
47
77
  key :position, Integer
48
-
78
+
49
79
  belongs_to :project
50
80
  belongs_to :target, :polymorphic => true
51
81
  end
@@ -63,23 +93,23 @@ end
63
93
 
64
94
  class Person
65
95
  include MongoMapper::EmbeddedDocument
66
-
96
+
67
97
  key :name, String
68
98
  key :child, Person
69
-
99
+
70
100
  many :pets
71
101
  end
72
102
 
73
103
  class Pet
74
104
  include MongoMapper::EmbeddedDocument
75
-
105
+
76
106
  key :name, String
77
107
  key :species, String
78
108
  end
79
109
 
80
110
  class Media
81
111
  include MongoMapper::EmbeddedDocument
82
-
112
+
83
113
  key :_type, String
84
114
  key :file, String
85
115
  end
@@ -99,40 +129,40 @@ end
99
129
 
100
130
  class Catalog
101
131
  include MongoMapper::Document
102
-
132
+
103
133
  many :medias, :polymorphic => true
104
134
  end
105
135
 
106
136
  module TrModels
107
137
  class Transport
108
138
  include MongoMapper::EmbeddedDocument
109
-
139
+
110
140
  key :_type, String
111
141
  key :license_plate, String
112
142
  end
113
143
 
114
144
  class Car < TrModels::Transport
115
145
  include MongoMapper::EmbeddedDocument
116
-
146
+
117
147
  key :model, String
118
148
  key :year, Integer
119
149
  end
120
150
 
121
151
  class Bus < TrModels::Transport
122
152
  include MongoMapper::EmbeddedDocument
123
-
153
+
124
154
  key :max_passengers, Integer
125
155
  end
126
156
 
127
157
  class Ambulance < TrModels::Transport
128
158
  include MongoMapper::EmbeddedDocument
129
-
159
+
130
160
  key :icu, Boolean
131
161
  end
132
162
 
133
163
  class Fleet
134
164
  include MongoMapper::Document
135
-
165
+
136
166
  many :transports, :polymorphic => true, :class_name => "TrModels::Transport"
137
167
  key :name, String
138
168
  end
@@ -1,6 +1,11 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class JsonSerializationTest < Test::Unit::TestCase
4
+ class Tag
5
+ include MongoMapper::EmbeddedDocument
6
+ key :name, String
7
+ end
8
+
4
9
  class Contact
5
10
  include MongoMapper::Document
6
11
  key :name, String
@@ -8,6 +13,8 @@ class JsonSerializationTest < Test::Unit::TestCase
8
13
  key :created_at, Time
9
14
  key :awesome, Boolean
10
15
  key :preferences, Hash
16
+
17
+ many :tags, :class_name => 'JsonSerializationTest::Tag'
11
18
  end
12
19
 
13
20
  def setup
@@ -136,12 +143,20 @@ class JsonSerializationTest < Test::Unit::TestCase
136
143
  end
137
144
 
138
145
  should "allow attribute filtering with only" do
139
- assert_equal %([{"name":"David"},{"name":"Mary"}]), @contacts.to_json(:only => :name)
146
+ json = @contacts.to_json(:only => :name)
147
+ assert_match %r{\{"name":"David"\}}, json
148
+ assert_match %r{\{"name":"Mary"\}}, json
140
149
  end
141
150
 
142
151
  should "allow attribute filtering with except" do
143
152
  json = @contacts.to_json(:except => [:name, :preferences, :awesome, :created_at, :updated_at])
144
- assert_equal %([{"id":null,"age":39},{"id":null,"age":14}]), json
153
+ assert_match %r{"age":39}, json
154
+ assert_match %r{"age":14}, json
155
+ assert_no_match %r{"name":}, json
156
+ assert_no_match %r{"preferences":}, json
157
+ assert_no_match %r{"awesome":}, json
158
+ assert_no_match %r{"created_at":}, json
159
+ assert_no_match %r{"updated_at":}, json
145
160
  end
146
161
  end
147
162
 
@@ -150,8 +165,25 @@ class JsonSerializationTest < Test::Unit::TestCase
150
165
  1 => Contact.new(:name => 'David', :age => 39),
151
166
  2 => Contact.new(:name => 'Mary', :age => 14)
152
167
  }
153
-
154
- assert_equal %({"1":{"name":"David"}}), contacts.to_json(:only => [1, :name])
168
+ json = contacts.to_json(:only => [1, :name])
169
+ assert_match %r{"1":}, json
170
+ assert_match %r{\{"name":"David"\}}, json
171
+ assert_no_match %r{"2":}, json
172
+ end
173
+
174
+ should "include embedded attributes" do
175
+ contact = Contact.new(:name => 'John', :age => 27)
176
+ contact.tags = [Tag.new(:name => 'awesome'), Tag.new(:name => 'ruby')]
177
+ json = contact.to_json
178
+ assert_match %r{"tags":}, json
179
+ assert_match %r{"name":"awesome"}, json
180
+ assert_match %r{"name":"ruby"}, json
155
181
  end
156
182
 
183
+ should "include dynamic attributes" do
184
+ contact = Contact.new(:name => 'John', :age => 27, :foo => 'bar')
185
+ contact['smell'] = 'stinky'
186
+ json = contact.to_json
187
+ assert_match %r{"smell":"stinky"}, json
188
+ end
157
189
  end
@@ -18,11 +18,11 @@ class DocumentTest < Test::Unit::TestCase
18
18
  end
19
19
 
20
20
  should "have a connection" do
21
- @document.connection.should be_instance_of(XGen::Mongo::Driver::Mongo)
21
+ @document.connection.should be_instance_of(Mongo::Connection)
22
22
  end
23
23
 
24
24
  should "allow setting different connection without affecting the default" do
25
- conn = XGen::Mongo::Driver::Mongo.new
25
+ conn = Mongo::Connection.new
26
26
  @document.connection conn
27
27
  @document.connection.should == conn
28
28
  @document.connection.should_not == MongoMapper.connection
@@ -43,13 +43,13 @@ class DocumentTest < Test::Unit::TestCase
43
43
  include MongoMapper::Document
44
44
  end
45
45
 
46
- Item.collection.should be_instance_of(XGen::Mongo::Driver::Collection)
46
+ Item.collection.should be_instance_of(Mongo::Collection)
47
47
  Item.collection.name.should == 'items'
48
48
  end
49
49
 
50
50
  should "allow setting the collection name" do
51
51
  @document.collection('foobar')
52
- @document.collection.should be_instance_of(XGen::Mongo::Driver::Collection)
52
+ @document.collection.should be_instance_of(Mongo::Collection)
53
53
  @document.collection.name.should == 'foobar'
54
54
  end
55
55
  end # Document class
@@ -282,6 +282,27 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
282
282
  }.should_not raise_error
283
283
  end
284
284
  end
285
+
286
+ context "initialized when _type key present" do
287
+ setup do
288
+ ::FooBar = Class.new do
289
+ include MongoMapper::EmbeddedDocument
290
+ key :_type, String
291
+ end
292
+ end
293
+
294
+ teardown do
295
+ Object.send(:remove_const, :FooBar)
296
+ end
297
+
298
+ should "set _type to class name" do
299
+ FooBar.new._type.should == 'FooBar'
300
+ end
301
+
302
+ should "not change _type if already set" do
303
+ FooBar.new(:_type => 'Foo')._type.should == 'Foo'
304
+ end
305
+ end
285
306
 
286
307
  context "mass assigning keys" do
287
308
  should "update values for keys provided" do
@@ -4,19 +4,19 @@ class Address; end
4
4
 
5
5
  class MongoMapperTest < Test::Unit::TestCase
6
6
  should "be able to write and read connection" do
7
- conn = XGen::Mongo::Driver::Mongo.new
7
+ conn = Mongo::Connection.new
8
8
  MongoMapper.connection = conn
9
9
  MongoMapper.connection.should == conn
10
10
  end
11
11
 
12
12
  should "default connection to new mongo ruby driver" do
13
13
  MongoMapper.connection = nil
14
- MongoMapper.connection.should be_instance_of(XGen::Mongo::Driver::Mongo)
14
+ MongoMapper.connection.should be_instance_of(Mongo::Connection)
15
15
  end
16
16
 
17
17
  should "be able to write and read default database" do
18
18
  MongoMapper.database = DefaultDatabase
19
- MongoMapper.database.should be_instance_of(XGen::Mongo::Driver::DB)
19
+ MongoMapper.database.should be_instance_of(Mongo::DB)
20
20
  MongoMapper.database.name.should == DefaultDatabase
21
21
  end
22
22
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: djsun-mongomapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-16 00:00:00 -07:00
12
+ date: 2009-08-29 00:00:00 -07:00
13
13
  default_executable: mmconsole
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - "="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.11.1
33
+ version: "0.14"
34
34
  version:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: jnunemaker-validatable
@@ -84,6 +84,7 @@ files:
84
84
  - lib/mongomapper/associations/base.rb
85
85
  - lib/mongomapper/associations/belongs_to_polymorphic_proxy.rb
86
86
  - lib/mongomapper/associations/belongs_to_proxy.rb
87
+ - lib/mongomapper/associations/many_documents_as_proxy.rb
87
88
  - lib/mongomapper/associations/many_documents_proxy.rb
88
89
  - lib/mongomapper/associations/many_embedded_polymorphic_proxy.rb
89
90
  - lib/mongomapper/associations/many_embedded_proxy.rb
@@ -109,6 +110,7 @@ files:
109
110
  - test/NOTE_ON_TESTING
110
111
  - test/functional/associations/test_belongs_to_polymorphic_proxy.rb
111
112
  - test/functional/associations/test_belongs_to_proxy.rb
113
+ - test/functional/associations/test_many_documents_as_proxy.rb
112
114
  - test/functional/associations/test_many_embedded_polymorphic_proxy.rb
113
115
  - test/functional/associations/test_many_embedded_proxy.rb
114
116
  - test/functional/associations/test_many_polymorphic_proxy.rb
@@ -135,7 +137,6 @@ files:
135
137
  - test/unit/test_validations.rb
136
138
  has_rdoc: false
137
139
  homepage: http://github.com/jnunemaker/mongomapper
138
- licenses:
139
140
  post_install_message:
140
141
  rdoc_options:
141
142
  - --charset=UTF-8
@@ -156,13 +157,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
157
  requirements: []
157
158
 
158
159
  rubyforge_project: mongomapper
159
- rubygems_version: 1.3.5
160
+ rubygems_version: 1.2.0
160
161
  signing_key:
161
162
  specification_version: 3
162
163
  summary: Awesome gem for modeling your domain and storing it in mongo
163
164
  test_files:
164
165
  - test/functional/associations/test_belongs_to_polymorphic_proxy.rb
165
166
  - test/functional/associations/test_belongs_to_proxy.rb
167
+ - test/functional/associations/test_many_documents_as_proxy.rb
166
168
  - test/functional/associations/test_many_embedded_polymorphic_proxy.rb
167
169
  - test/functional/associations/test_many_embedded_proxy.rb
168
170
  - test/functional/associations/test_many_polymorphic_proxy.rb