mongoid 0.10.6 → 0.11.0
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/Rakefile +3 -3
- data/VERSION +1 -1
- data/lib/mongoid.rb +2 -2
- data/lib/mongoid/associations.rb +1 -1
- data/lib/mongoid/associations/belongs_to.rb +1 -1
- data/lib/mongoid/associations/has_many.rb +8 -6
- data/lib/mongoid/associations/has_one.rb +6 -5
- data/lib/mongoid/commands.rb +94 -41
- data/lib/mongoid/commands/delete_all.rb +2 -3
- data/lib/mongoid/commands/deletion.rb +1 -1
- data/lib/mongoid/commands/destroy_all.rb +2 -0
- data/lib/mongoid/commands/save.rb +1 -1
- data/lib/mongoid/criteria.rb +1 -1
- data/lib/mongoid/document.rb +43 -32
- data/lib/mongoid/extensions.rb +3 -3
- data/lib/mongoid/extensions/hash/assimilation.rb +2 -3
- data/lib/mongoid/extensions/string/inflections.rb +1 -0
- data/mongoid.gemspec +13 -9
- data/perf/benchmark.rb +8 -4
- data/spec/integration/mongoid/commands_spec.rb +103 -0
- data/spec/integration/mongoid/document_spec.rb +13 -1
- data/spec/integration/mongoid/inheritance_spec.rb +105 -0
- data/spec/spec_helper.rb +24 -2
- data/spec/unit/mongoid/associations/belongs_to_spec.rb +3 -3
- data/spec/unit/mongoid/associations/has_many_spec.rb +92 -31
- data/spec/unit/mongoid/associations/has_one_spec.rb +57 -4
- data/spec/unit/mongoid/associations_spec.rb +4 -4
- data/spec/unit/mongoid/attributes_spec.rb +2 -2
- data/spec/unit/mongoid/commands/delete_all_spec.rb +4 -3
- data/spec/unit/mongoid/commands/delete_spec.rb +1 -1
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +3 -2
- data/spec/unit/mongoid/commands/destroy_spec.rb +1 -1
- data/spec/unit/mongoid/commands/save_spec.rb +3 -3
- data/spec/unit/mongoid/commands_spec.rb +6 -6
- data/spec/unit/mongoid/criteria_spec.rb +45 -36
- data/spec/unit/mongoid/document_spec.rb +198 -29
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +2 -2
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +33 -8
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +2 -2
- data/spec/unit/mongoid/finders_spec.rb +1 -1
- data/spec/unit/mongoid/timestamps_spec.rb +1 -1
- metadata +9 -5
data/lib/mongoid/extensions.rb
CHANGED
@@ -18,7 +18,7 @@ require "mongoid/extensions/string/inflections"
|
|
18
18
|
require "mongoid/extensions/symbol/inflections"
|
19
19
|
require "mongoid/extensions/time/conversions"
|
20
20
|
|
21
|
-
class Array #:nodoc
|
21
|
+
class Array #:nodoc
|
22
22
|
include Mongoid::Extensions::Array::Accessors
|
23
23
|
include Mongoid::Extensions::Array::Assimilation
|
24
24
|
include Mongoid::Extensions::Array::Conversions
|
@@ -44,8 +44,8 @@ end
|
|
44
44
|
class Hash #:nodoc
|
45
45
|
include Mongoid::Extensions::Hash::Accessors
|
46
46
|
include Mongoid::Extensions::Hash::Assimilation
|
47
|
-
extend Mongoid::Extensions::Hash::Conversions
|
48
47
|
include Mongoid::Extensions::Hash::CriteriaHelpers
|
48
|
+
extend Mongoid::Extensions::Hash::Conversions
|
49
49
|
end
|
50
50
|
|
51
51
|
class Integer #:nodoc
|
@@ -57,8 +57,8 @@ class Object #:nodoc:
|
|
57
57
|
end
|
58
58
|
|
59
59
|
class String #:nodoc
|
60
|
-
extend Mongoid::Extensions::String::Conversions
|
61
60
|
include Mongoid::Extensions::String::Inflections
|
61
|
+
extend Mongoid::Extensions::String::Conversions
|
62
62
|
end
|
63
63
|
|
64
64
|
class Symbol #:nodoc
|
@@ -17,9 +17,8 @@ module Mongoid #:nodoc:
|
|
17
17
|
# <tt>{:first_name => "Hank", :last_name => "Moody"}.assimilate(name, options)</tt>
|
18
18
|
#
|
19
19
|
# Returns: The child +Document+.
|
20
|
-
def assimilate(parent, options)
|
21
|
-
|
22
|
-
child = klass.instantiate(self)
|
20
|
+
def assimilate(parent, options, type = nil)
|
21
|
+
child = type ? type.instantiate(self.merge(:_type => type.name)) : options.klass.instantiate(self)
|
23
22
|
child.assimilate(parent, options)
|
24
23
|
end
|
25
24
|
end
|
data/mongoid.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongoid}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.11.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Durran Jordan"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-01-02}
|
13
13
|
s.email = %q{durran@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"README.textile"
|
@@ -73,9 +73,11 @@ Gem::Specification.new do |s|
|
|
73
73
|
"mongoid.gemspec",
|
74
74
|
"perf/benchmark.rb",
|
75
75
|
"spec/integration/mongoid/associations_spec.rb",
|
76
|
+
"spec/integration/mongoid/commands_spec.rb",
|
76
77
|
"spec/integration/mongoid/criteria_spec.rb",
|
77
78
|
"spec/integration/mongoid/document_spec.rb",
|
78
79
|
"spec/integration/mongoid/finders_spec.rb",
|
80
|
+
"spec/integration/mongoid/inheritance_spec.rb",
|
79
81
|
"spec/spec.opts",
|
80
82
|
"spec/spec_helper.rb",
|
81
83
|
"spec/unit/mongoid/associations/belongs_to_related_spec.rb",
|
@@ -123,16 +125,18 @@ Gem::Specification.new do |s|
|
|
123
125
|
"spec/unit/mongoid/versioning_spec.rb",
|
124
126
|
"spec/unit/mongoid_spec.rb"
|
125
127
|
]
|
126
|
-
s.homepage = %q{http://
|
128
|
+
s.homepage = %q{http://mongoid.org}
|
127
129
|
s.rdoc_options = ["--charset=UTF-8"]
|
128
130
|
s.require_paths = ["lib"]
|
129
131
|
s.rubygems_version = %q{1.3.5}
|
130
132
|
s.summary = %q{ODM framework for MongoDB}
|
131
133
|
s.test_files = [
|
132
134
|
"spec/integration/mongoid/associations_spec.rb",
|
135
|
+
"spec/integration/mongoid/commands_spec.rb",
|
133
136
|
"spec/integration/mongoid/criteria_spec.rb",
|
134
137
|
"spec/integration/mongoid/document_spec.rb",
|
135
138
|
"spec/integration/mongoid/finders_spec.rb",
|
139
|
+
"spec/integration/mongoid/inheritance_spec.rb",
|
136
140
|
"spec/spec_helper.rb",
|
137
141
|
"spec/unit/mongoid/associations/belongs_to_related_spec.rb",
|
138
142
|
"spec/unit/mongoid/associations/belongs_to_spec.rb",
|
@@ -186,16 +190,16 @@ Gem::Specification.new do |s|
|
|
186
190
|
|
187
191
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
188
192
|
s.add_runtime_dependency(%q<activesupport>, [">= 2.2.2"])
|
189
|
-
s.add_runtime_dependency(%q<mongo>, [">= 0.18.
|
190
|
-
s.add_runtime_dependency(%q<mongo_ext>, [">= 0.18.
|
193
|
+
s.add_runtime_dependency(%q<mongo>, [">= 0.18.2"])
|
194
|
+
s.add_runtime_dependency(%q<mongo_ext>, [">= 0.18.2"])
|
191
195
|
s.add_runtime_dependency(%q<durran-validatable>, [">= 1.8.4"])
|
192
196
|
s.add_runtime_dependency(%q<leshill-will_paginate>, [">= 2.3.11"])
|
193
197
|
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
194
198
|
s.add_development_dependency(%q<mocha>, [">= 0.9.8"])
|
195
199
|
else
|
196
200
|
s.add_dependency(%q<activesupport>, [">= 2.2.2"])
|
197
|
-
s.add_dependency(%q<mongo>, [">= 0.18.
|
198
|
-
s.add_dependency(%q<mongo_ext>, [">= 0.18.
|
201
|
+
s.add_dependency(%q<mongo>, [">= 0.18.2"])
|
202
|
+
s.add_dependency(%q<mongo_ext>, [">= 0.18.2"])
|
199
203
|
s.add_dependency(%q<durran-validatable>, [">= 1.8.4"])
|
200
204
|
s.add_dependency(%q<leshill-will_paginate>, [">= 2.3.11"])
|
201
205
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
@@ -203,8 +207,8 @@ Gem::Specification.new do |s|
|
|
203
207
|
end
|
204
208
|
else
|
205
209
|
s.add_dependency(%q<activesupport>, [">= 2.2.2"])
|
206
|
-
s.add_dependency(%q<mongo>, [">= 0.18.
|
207
|
-
s.add_dependency(%q<mongo_ext>, [">= 0.18.
|
210
|
+
s.add_dependency(%q<mongo>, [">= 0.18.2"])
|
211
|
+
s.add_dependency(%q<mongo_ext>, [">= 0.18.2"])
|
208
212
|
s.add_dependency(%q<durran-validatable>, [">= 1.8.4"])
|
209
213
|
s.add_dependency(%q<leshill-will_paginate>, [">= 2.3.11"])
|
210
214
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
data/perf/benchmark.rb
CHANGED
@@ -2,7 +2,8 @@ require "rubygems"
|
|
2
2
|
require "ruby-prof"
|
3
3
|
require "mongoid"
|
4
4
|
|
5
|
-
class Person
|
5
|
+
class Person
|
6
|
+
include Mongoid::Document
|
6
7
|
include Mongoid::Timestamps
|
7
8
|
include Mongoid::Versioning
|
8
9
|
field :birth_date, :type => Date
|
@@ -11,7 +12,8 @@ class Person < Mongoid::Document
|
|
11
12
|
has_many :phones
|
12
13
|
end
|
13
14
|
|
14
|
-
class Name
|
15
|
+
class Name
|
16
|
+
include Mongoid::Document
|
15
17
|
include Mongoid::Timestamps
|
16
18
|
field :given
|
17
19
|
field :family
|
@@ -19,7 +21,8 @@ class Name < Mongoid::Document
|
|
19
21
|
belongs_to :person, :inverse_of => :name
|
20
22
|
end
|
21
23
|
|
22
|
-
class Address
|
24
|
+
class Address
|
25
|
+
include Mongoid::Document
|
23
26
|
include Mongoid::Timestamps
|
24
27
|
field :street
|
25
28
|
field :city
|
@@ -29,7 +32,8 @@ class Address < Mongoid::Document
|
|
29
32
|
belongs_to :person, :inverse_of => :address
|
30
33
|
end
|
31
34
|
|
32
|
-
class Phone
|
35
|
+
class Phone
|
36
|
+
include Mongoid::Document
|
33
37
|
include Mongoid::Timestamps
|
34
38
|
field :country_code, :type => Integer
|
35
39
|
field :number
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Commands do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@person = Person.new(:title => "Sir")
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
@person.delete
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#delete" do
|
14
|
+
|
15
|
+
before do
|
16
|
+
@person.save
|
17
|
+
end
|
18
|
+
|
19
|
+
it "deletes the document" do
|
20
|
+
@person.delete
|
21
|
+
lambda { Person.find(@person.id) }.should raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns true" do
|
25
|
+
@person.delete.should be_true
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#destroy" do
|
31
|
+
|
32
|
+
before do
|
33
|
+
@person.save
|
34
|
+
end
|
35
|
+
|
36
|
+
it "deletes the document" do
|
37
|
+
@person.destroy
|
38
|
+
lambda { Person.find(@person.id) }.should raise_error
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns true" do
|
42
|
+
@person.destroy.should be_true
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#save" do
|
48
|
+
|
49
|
+
context "when validation passes" do
|
50
|
+
|
51
|
+
it "returns true" do
|
52
|
+
@person.save.should be_true
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#update_attributes" do
|
60
|
+
|
61
|
+
context "when validation passes" do
|
62
|
+
|
63
|
+
it "returns true" do
|
64
|
+
@person.update_attributes(:title => "Blah").should be_true
|
65
|
+
end
|
66
|
+
|
67
|
+
it "saves the attributes" do
|
68
|
+
@person.update_attributes(:title => "Blah")
|
69
|
+
@from_db = Person.find(@person.id)
|
70
|
+
@from_db.title.should == "Blah"
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
describe ".create" do
|
78
|
+
|
79
|
+
it "saves and returns the document" do
|
80
|
+
person = Person.create(:title => "Sensei")
|
81
|
+
person.should be_a_kind_of(Person)
|
82
|
+
person.should_not be_a_new_record
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
describe ".delete_all" do
|
88
|
+
|
89
|
+
it "returns true" do
|
90
|
+
Person.delete_all.should be_true
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
describe ".destroy_all" do
|
96
|
+
|
97
|
+
it "returns true" do
|
98
|
+
Person.destroy_all.should be_true
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
@@ -6,6 +6,18 @@ describe Mongoid::Document do
|
|
6
6
|
Mongoid.database.collection(:people).drop
|
7
7
|
end
|
8
8
|
|
9
|
+
describe ".collection" do
|
10
|
+
|
11
|
+
context "on a subclass of a root document" do
|
12
|
+
|
13
|
+
it "returns the root document collection" do
|
14
|
+
Browser.collection.should == Canvas.collection
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
9
21
|
describe "#new" do
|
10
22
|
|
11
23
|
it "gets a new or current database connection" do
|
@@ -313,7 +325,7 @@ describe Mongoid::Document do
|
|
313
325
|
end
|
314
326
|
|
315
327
|
it "returns false" do
|
316
|
-
@comment.
|
328
|
+
@comment.should_not be_valid
|
317
329
|
end
|
318
330
|
|
319
331
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Document do
|
4
|
+
|
5
|
+
context "when document is a subclass of a root class" do
|
6
|
+
|
7
|
+
before do
|
8
|
+
Browser.delete_all
|
9
|
+
@browser = Browser.create(:version => 3, :name => "Test")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "saves in the same collection as the root" do
|
13
|
+
collection = Mongoid.database.collection("canvases")
|
14
|
+
attributes = collection.find({ :name => "Test"}, {}).first
|
15
|
+
attributes["version"].should == 3
|
16
|
+
attributes["name"].should == "Test"
|
17
|
+
attributes["_type"].should == "Browser"
|
18
|
+
attributes["_id"].should == @browser.id
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when document is a subclass of a subclass" do
|
24
|
+
|
25
|
+
before do
|
26
|
+
Firefox.delete_all
|
27
|
+
@firefox = Firefox.create(:version => 2, :name => "Testy")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "saves in the same collection as the root" do
|
31
|
+
collection = Mongoid.database.collection("canvases")
|
32
|
+
attributes = collection.find({ :name => "Testy"}, {}).first
|
33
|
+
attributes["version"].should == 2
|
34
|
+
attributes["name"].should == "Testy"
|
35
|
+
attributes["_type"].should == "Firefox"
|
36
|
+
attributes["_id"].should == @firefox.id
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when document has associations" do
|
42
|
+
|
43
|
+
before do
|
44
|
+
Firefox.delete_all
|
45
|
+
@firefox = Firefox.new(:name => "firefox")
|
46
|
+
@writer = HtmlWriter.new(:speed => 100)
|
47
|
+
@circle = Circle.new(:radius => 50)
|
48
|
+
@square = Square.new(:width => 300, :height => 150)
|
49
|
+
@firefox.writer = @writer
|
50
|
+
@firefox.shapes << [ @circle, @square ]
|
51
|
+
@firefox.save
|
52
|
+
end
|
53
|
+
|
54
|
+
after do
|
55
|
+
Firefox.delete_all
|
56
|
+
end
|
57
|
+
|
58
|
+
it "properly saves a has one subclass" do
|
59
|
+
from_db = Firefox.find(@firefox.id)
|
60
|
+
from_db.should be_a_kind_of(Firefox)
|
61
|
+
from_db.writer.should be_a_kind_of(HtmlWriter)
|
62
|
+
from_db.writer.should == @writer
|
63
|
+
end
|
64
|
+
|
65
|
+
it "properly saves a has many subclass" do
|
66
|
+
from_db = Firefox.find(@firefox.id)
|
67
|
+
from_db.shapes.first.should == @circle
|
68
|
+
from_db.shapes.first.should be_a_kind_of(Circle)
|
69
|
+
from_db.shapes.last.should == @square
|
70
|
+
from_db.shapes.last.should be_a_kind_of(Square)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "properly sets up the belongs to" do
|
74
|
+
from_db = Firefox.find(@firefox.id)
|
75
|
+
circle = from_db.shapes.first
|
76
|
+
circle.should == @circle
|
77
|
+
circle.canvas.should == @firefox
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
context "deleting subclasses" do
|
83
|
+
|
84
|
+
before do
|
85
|
+
@firefox = Firefox.create(:name => "firefox")
|
86
|
+
@browser = Browser.create(:name => "browser")
|
87
|
+
@canvas = Canvas.create(:name => "canvas")
|
88
|
+
end
|
89
|
+
|
90
|
+
after do
|
91
|
+
Firefox.delete_all
|
92
|
+
Browser.delete_all
|
93
|
+
Canvas.delete_all
|
94
|
+
end
|
95
|
+
|
96
|
+
it "deletes from the parent class collection" do
|
97
|
+
@firefox.delete
|
98
|
+
Firefox.count.should == 0
|
99
|
+
Browser.count.should == 1
|
100
|
+
Canvas.count.should == 1
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -181,7 +181,7 @@ end
|
|
181
181
|
|
182
182
|
class Patient
|
183
183
|
include Mongoid::Document
|
184
|
-
|
184
|
+
store_in :inpatient
|
185
185
|
end
|
186
186
|
|
187
187
|
if RUBY_VERSION == '1.8.6'
|
@@ -201,8 +201,9 @@ end
|
|
201
201
|
# Inhertiance test models:
|
202
202
|
class Canvas
|
203
203
|
include Mongoid::Document
|
204
|
-
field :
|
204
|
+
field :name
|
205
205
|
has_many :shapes
|
206
|
+
has_one :writer
|
206
207
|
|
207
208
|
def render
|
208
209
|
shapes.each { |shape| render }
|
@@ -210,18 +211,39 @@ class Canvas
|
|
210
211
|
end
|
211
212
|
|
212
213
|
class Browser < Canvas
|
214
|
+
field :version, :type => Integer
|
213
215
|
def render; end
|
214
216
|
end
|
215
217
|
|
216
218
|
class Firefox < Browser
|
219
|
+
field :user_agent
|
217
220
|
def render; end
|
218
221
|
end
|
219
222
|
|
223
|
+
class Writer
|
224
|
+
include Mongoid::Document
|
225
|
+
field :speed, :type => Integer, :default => 0
|
226
|
+
|
227
|
+
belongs_to :canvas, :inverse_of => :writer
|
228
|
+
|
229
|
+
def write; end
|
230
|
+
end
|
231
|
+
|
232
|
+
class HtmlWriter < Writer
|
233
|
+
def write; end
|
234
|
+
end
|
235
|
+
|
236
|
+
class PdfWriter < Writer
|
237
|
+
def write; end
|
238
|
+
end
|
239
|
+
|
220
240
|
class Shape
|
221
241
|
include Mongoid::Document
|
222
242
|
field :x, :type => Integer, :default => 0
|
223
243
|
field :y, :type => Integer, :default => 0
|
224
244
|
|
245
|
+
belongs_to :canvas, :inverse_of => :shapes
|
246
|
+
|
225
247
|
def render; end
|
226
248
|
end
|
227
249
|
|