mongo_mapper 0.14.0 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE +1 -1
- data/{README.rdoc → README.md} +28 -20
- data/examples/keys.rb +1 -1
- data/examples/modifiers/set.rb +1 -1
- data/examples/querying.rb +1 -1
- data/examples/safe.rb +2 -2
- data/examples/scopes.rb +1 -1
- data/lib/mongo_mapper.rb +1 -0
- data/lib/mongo_mapper/connection.rb +16 -38
- data/lib/mongo_mapper/extensions/object_id.rb +5 -1
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +1 -1
- data/lib/mongo_mapper/plugins/dirty.rb +29 -37
- data/lib/mongo_mapper/plugins/document.rb +1 -1
- data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +1 -1
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +1 -0
- data/lib/mongo_mapper/plugins/embedded_document.rb +1 -1
- data/lib/mongo_mapper/plugins/indexes.rb +13 -6
- data/lib/mongo_mapper/plugins/keys.rb +1 -2
- data/lib/mongo_mapper/plugins/modifiers.rb +27 -10
- data/lib/mongo_mapper/plugins/persistence.rb +6 -2
- data/lib/mongo_mapper/plugins/querying.rb +9 -3
- data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +3 -4
- data/lib/mongo_mapper/plugins/safe.rb +10 -4
- data/lib/mongo_mapper/plugins/stats.rb +1 -3
- data/lib/mongo_mapper/utils.rb +2 -2
- data/lib/mongo_mapper/version.rb +1 -1
- data/spec/examples.txt +1643 -0
- data/spec/functional/accessible_spec.rb +1 -1
- data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +2 -2
- data/spec/functional/associations/belongs_to_proxy_spec.rb +4 -4
- data/spec/functional/associations/in_array_proxy_spec.rb +14 -14
- data/spec/functional/associations/many_documents_as_proxy_spec.rb +6 -6
- data/spec/functional/associations/many_documents_proxy_spec.rb +22 -22
- data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +2 -2
- data/spec/functional/associations/many_polymorphic_proxy_spec.rb +4 -4
- data/spec/functional/associations/one_as_proxy_spec.rb +8 -8
- data/spec/functional/associations/one_proxy_spec.rb +8 -8
- data/spec/functional/associations_spec.rb +3 -3
- data/spec/functional/binary_spec.rb +2 -2
- data/spec/functional/caching_spec.rb +15 -22
- data/spec/functional/callbacks_spec.rb +2 -2
- data/spec/functional/counter_cache_spec.rb +10 -10
- data/spec/functional/dirty_spec.rb +27 -10
- data/spec/functional/document_spec.rb +5 -5
- data/spec/functional/dumpable_spec.rb +1 -1
- data/spec/functional/embedded_document_spec.rb +5 -5
- data/spec/functional/identity_map_spec.rb +6 -6
- data/spec/functional/indexes_spec.rb +19 -18
- data/spec/functional/keys_spec.rb +22 -22
- data/spec/functional/logger_spec.rb +2 -2
- data/spec/functional/modifiers_spec.rb +67 -19
- data/spec/functional/partial_updates_spec.rb +8 -8
- data/spec/functional/protected_spec.rb +1 -1
- data/spec/functional/querying_spec.rb +48 -22
- data/spec/functional/safe_spec.rb +23 -27
- data/spec/functional/sci_spec.rb +7 -7
- data/spec/functional/scopes_spec.rb +1 -1
- data/spec/functional/static_keys_spec.rb +2 -2
- data/spec/functional/stats_spec.rb +28 -12
- data/spec/functional/validations_spec.rb +8 -16
- data/spec/quality_spec.rb +1 -1
- data/spec/spec_helper.rb +32 -8
- data/spec/support/matchers.rb +1 -1
- data/spec/unit/associations/proxy_spec.rb +1 -1
- data/spec/unit/clone_spec.rb +1 -1
- data/spec/unit/document_spec.rb +3 -3
- data/spec/unit/embedded_document_spec.rb +4 -5
- data/spec/unit/extensions_spec.rb +3 -4
- data/spec/unit/identity_map_middleware_spec.rb +65 -96
- data/spec/unit/key_spec.rb +16 -17
- data/spec/unit/keys_spec.rb +7 -7
- data/spec/unit/mongo_mapper_spec.rb +41 -88
- data/spec/unit/rails_spec.rb +2 -2
- metadata +37 -24
- data/lib/mongo_mapper/extensions/ordered_hash.rb +0 -23
@@ -42,7 +42,7 @@ describe "Safe" do
|
|
42
42
|
|
43
43
|
it "should not raise an error on duplicate IDs" do
|
44
44
|
k = @klass.create
|
45
|
-
|
45
|
+
lambda { j = @klass.create(:_id => k.id) }.should_not raise_error
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -61,46 +61,44 @@ describe "Safe" do
|
|
61
61
|
|
62
62
|
it "should raise an error on duplicate IDs" do
|
63
63
|
k = @klass.create
|
64
|
-
|
64
|
+
lambda { j = @klass.create(:_id => k.id) }.should raise_error(Mongo::Error::OperationFailure)
|
65
65
|
end
|
66
66
|
|
67
67
|
context "using safe setting from class" do
|
68
|
-
it "should pass :w => 1 option to
|
69
|
-
|
70
|
-
expect_any_instance_of(Mongo::Collection).to receive(:insert).once.with({'_id' => instance.id, 'email' => 'john@doe.com'}, {:w => 1})
|
71
|
-
instance.save!
|
68
|
+
it "should pass :w => 1 option to the collection" do
|
69
|
+
@klass.collection.write_concern.options.should == { w: 1 }
|
72
70
|
end
|
73
71
|
|
74
72
|
it "should work fine when all is well" do
|
75
|
-
|
73
|
+
lambda {
|
76
74
|
@klass.new(:email => 'john@doe.com').save
|
77
|
-
}.
|
75
|
+
}.should_not raise_error
|
78
76
|
end
|
79
77
|
|
80
78
|
it "should raise error when operation fails" do
|
81
|
-
|
79
|
+
lambda {
|
82
80
|
2.times do
|
83
81
|
@klass.new(:email => 'john@doe.com').save
|
84
82
|
end
|
85
|
-
}.
|
83
|
+
}.should raise_error(Mongo::Error::OperationFailure)
|
86
84
|
end
|
87
85
|
end
|
88
86
|
|
89
87
|
context "overriding safe setting" do
|
90
88
|
it "should raise error if safe is true" do
|
91
|
-
|
89
|
+
lambda {
|
92
90
|
2.times do
|
93
91
|
@klass.new(:email => 'john@doe.com').save(:safe => true)
|
94
92
|
end
|
95
|
-
}.
|
93
|
+
}.should raise_error(Mongo::Error::OperationFailure)
|
96
94
|
end
|
97
95
|
|
98
96
|
it "should not raise error if safe is false" do
|
99
|
-
|
97
|
+
lambda {
|
100
98
|
2.times do
|
101
99
|
@klass.new(:email => 'john@doe.com').save(:safe => false)
|
102
100
|
end
|
103
|
-
}.
|
101
|
+
}.should_not raise_error
|
104
102
|
end
|
105
103
|
end
|
106
104
|
end
|
@@ -120,44 +118,42 @@ describe "Safe" do
|
|
120
118
|
end
|
121
119
|
|
122
120
|
context "using safe setting from class" do
|
123
|
-
it "should pass :safe => options_hash to
|
124
|
-
|
125
|
-
expect_any_instance_of(Mongo::Collection).to receive(:insert).once.with({'_id' => instance.id, 'email' => 'john@doe.com'}, {:j => true})
|
126
|
-
instance.save!
|
121
|
+
it "should pass :safe => options_hash to the collection" do
|
122
|
+
@klass.collection.write_concern.options.should == { j: true }
|
127
123
|
end
|
128
124
|
|
129
125
|
it "should work fine when all is well" do
|
130
|
-
|
126
|
+
lambda {
|
131
127
|
@klass.new(:email => 'john@doe.com').save
|
132
|
-
}.
|
128
|
+
}.should_not raise_error
|
133
129
|
end
|
134
130
|
|
135
131
|
it "should raise error when operation fails" do
|
136
|
-
|
132
|
+
lambda {
|
137
133
|
2.times do
|
138
134
|
@klass.new(:email => 'john@doe.com').save
|
139
135
|
end
|
140
|
-
}.
|
136
|
+
}.should raise_error(Mongo::Error::OperationFailure)
|
141
137
|
end
|
142
138
|
end
|
143
139
|
|
144
140
|
context "overriding safe setting" do
|
145
141
|
it "should raise error if safe is true" do
|
146
|
-
|
142
|
+
lambda {
|
147
143
|
2.times do
|
148
144
|
@klass.new(:email => 'john@doe.com').save(:safe => true)
|
149
145
|
end
|
150
|
-
}.
|
146
|
+
}.should raise_error(Mongo::Error::OperationFailure)
|
151
147
|
end
|
152
148
|
|
153
149
|
it "should not raise error if safe is false" do
|
154
|
-
|
150
|
+
lambda {
|
155
151
|
2.times do
|
156
152
|
@klass.new(:email => 'john@doe.com').save(:safe => false)
|
157
153
|
end
|
158
|
-
}.
|
154
|
+
}.should_not raise_error
|
159
155
|
end
|
160
156
|
end
|
161
157
|
end
|
162
158
|
end
|
163
|
-
end
|
159
|
+
end
|
data/spec/functional/sci_spec.rb
CHANGED
@@ -3,12 +3,12 @@ require 'spec_helper'
|
|
3
3
|
describe "Single collection inheritance (document)" do
|
4
4
|
context "without a connection", :without_connection => true do
|
5
5
|
it "should attempt to create a connection during inheritance" do
|
6
|
-
|
6
|
+
Mongo::Client.should_not_receive(:new)
|
7
7
|
doc = Class.new
|
8
8
|
doc.send(:include, MongoMapper::Document)
|
9
|
-
|
9
|
+
lambda {
|
10
10
|
Class.new(doc)
|
11
|
-
}.
|
11
|
+
}.should_not raise_error
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should pick up a connection if one wasn't set" do
|
@@ -17,7 +17,7 @@ describe "Single collection inheritance (document)" do
|
|
17
17
|
klass = Class.new(doc)
|
18
18
|
klass.connection.should be_nil
|
19
19
|
MongoMapper.connection
|
20
|
-
klass.connection.should be_a Mongo::
|
20
|
+
klass.connection.should be_a Mongo::Client
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -27,7 +27,7 @@ describe "Single collection inheritance (document)" do
|
|
27
27
|
include MongoMapper::Document
|
28
28
|
key :name, String
|
29
29
|
end
|
30
|
-
DocParent.collection.
|
30
|
+
DocParent.collection.drop
|
31
31
|
|
32
32
|
class ::DocDaughter < ::DocParent; end
|
33
33
|
class ::DocSon < ::DocParent; end
|
@@ -61,7 +61,7 @@ describe "Single collection inheritance (document)" do
|
|
61
61
|
it "should use the same connection in the subclass" do
|
62
62
|
parent_class = Class.new do
|
63
63
|
include MongoMapper::Document
|
64
|
-
connection Mongo::
|
64
|
+
connection Mongo::Client.new(['127.0.0.1:27017'])
|
65
65
|
end
|
66
66
|
|
67
67
|
child_class = Class.new(parent_class) do
|
@@ -377,4 +377,4 @@ describe "Single collection inheritance (document)" do
|
|
377
377
|
p.reload.article_parent.sci_polymorphic_posts.all.should include(p)
|
378
378
|
end
|
379
379
|
end
|
380
|
-
end
|
380
|
+
end
|
@@ -92,7 +92,7 @@ describe MongoMapper::Plugins::Keys::Static do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
it "should not blow up when loading if there is a key defined in the db that has not been defined (but it should not load it)" do
|
95
|
-
@klass.collection.
|
95
|
+
@klass.collection.insert_one({ :foo => "bar", :valid_key => "something" })
|
96
96
|
@obj = @klass.first
|
97
97
|
@obj.valid_key.should == "something"
|
98
98
|
|
@@ -147,7 +147,7 @@ describe MongoMapper::Plugins::Keys::Static do
|
|
147
147
|
|
148
148
|
lambda {
|
149
149
|
@static_key_object['foo'] = 'bar'
|
150
|
-
}.should raise_error
|
150
|
+
}.should raise_error(MongoMapper::Plugins::Keys::Static::MissingKeyError)
|
151
151
|
end
|
152
152
|
end
|
153
153
|
end
|
@@ -13,7 +13,11 @@ describe "Stats" do
|
|
13
13
|
|
14
14
|
context "with no documents present" do
|
15
15
|
it "should return nil" do
|
16
|
-
|
16
|
+
if Docs.stats == nil
|
17
|
+
Docs.stats.should == nil
|
18
|
+
else
|
19
|
+
Docs.stats['count'].should == 0
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
@@ -23,48 +27,60 @@ describe "Stats" do
|
|
23
27
|
Docs.create!
|
24
28
|
end
|
25
29
|
|
30
|
+
def get_stats
|
31
|
+
MongoMapper.database.command(:collstats => 'docs').documents[0]
|
32
|
+
end
|
33
|
+
|
26
34
|
it "should have the correct count" do
|
27
|
-
|
35
|
+
Docs.stats.count.should == get_stats['count']
|
28
36
|
end
|
29
37
|
|
30
38
|
it "should have the correct namespace" do
|
31
|
-
|
39
|
+
Docs.stats.ns.should == get_stats['ns']
|
32
40
|
end
|
33
41
|
|
34
42
|
it "should have the correct size" do
|
35
|
-
|
43
|
+
Docs.stats.size.should == get_stats['size']
|
36
44
|
end
|
37
45
|
|
38
46
|
it "should have the correct storage size" do
|
39
|
-
|
47
|
+
Docs.stats.storage_size.should == get_stats['storageSize']
|
40
48
|
end
|
41
49
|
|
42
50
|
it "should have the correct average object size" do
|
43
|
-
|
51
|
+
Docs.stats.avg_obj_size.should == get_stats['avgObjSize']
|
44
52
|
end
|
45
53
|
|
46
54
|
it "should have the correct number of extents" do
|
47
|
-
|
55
|
+
if get_stats['numExtents']
|
56
|
+
Docs.stats.num_extents.should == get_stats['numExtents']
|
57
|
+
end
|
48
58
|
end
|
49
59
|
|
50
60
|
it "should have the correct number of indexes" do
|
51
|
-
|
61
|
+
Docs.stats.nindexes.should == get_stats['nindexes']
|
52
62
|
end
|
53
63
|
|
54
64
|
it "should have the correct last extent size" do
|
55
|
-
|
65
|
+
if get_stats['lastExtentSize']
|
66
|
+
Docs.stats.last_extent_size.should == get_stats['lastExtentSize']
|
67
|
+
end
|
56
68
|
end
|
57
69
|
|
58
70
|
it "should have the correct padding factor" do
|
59
|
-
|
71
|
+
if get_stats['paddingFactor']
|
72
|
+
Docs.stats.padding_factor.should == get_stats['paddingFactor']
|
73
|
+
end
|
60
74
|
end
|
61
75
|
|
62
76
|
it "should have the correct user flags" do
|
63
|
-
|
77
|
+
if get_stats['userFlags']
|
78
|
+
Docs.stats.user_flags.should == get_stats['userFlags']
|
79
|
+
end
|
64
80
|
end
|
65
81
|
|
66
82
|
it "should have the correct total index size" do
|
67
|
-
|
83
|
+
Docs.stats.total_index_size.should == get_stats['totalIndexSize']
|
68
84
|
end
|
69
85
|
end
|
70
86
|
end
|
@@ -157,8 +157,7 @@ describe "Validations" do
|
|
157
157
|
doc = @document.new("name" => "joe")
|
158
158
|
doc.save.should be_truthy
|
159
159
|
|
160
|
-
|
161
|
-
receive(:first).
|
160
|
+
@document.stub(:first).
|
162
161
|
with(:name => 'joe').
|
163
162
|
and_return(doc)
|
164
163
|
|
@@ -171,8 +170,7 @@ describe "Validations" do
|
|
171
170
|
doc = @document.new("name" => "joe")
|
172
171
|
doc.save.should be_truthy
|
173
172
|
|
174
|
-
|
175
|
-
receive(:first).
|
173
|
+
@document.stub(:first).
|
176
174
|
with(:name => 'joe').
|
177
175
|
and_return(doc)
|
178
176
|
|
@@ -189,8 +187,7 @@ describe "Validations" do
|
|
189
187
|
doc = document.new("name" => "")
|
190
188
|
doc.save.should be_truthy
|
191
189
|
|
192
|
-
|
193
|
-
receive(:first).
|
190
|
+
@document.stub(:first).
|
194
191
|
with(:name => '').
|
195
192
|
and_return(doc)
|
196
193
|
|
@@ -272,8 +269,7 @@ describe "Validations" do
|
|
272
269
|
doc = @document.new("name" => "joe", "scope" => "one")
|
273
270
|
doc.save.should be_truthy
|
274
271
|
|
275
|
-
|
276
|
-
receive(:first).
|
272
|
+
@document.stub(:first).
|
277
273
|
with(:name => 'joe', :scope => "one").
|
278
274
|
and_return(doc)
|
279
275
|
|
@@ -285,8 +281,7 @@ describe "Validations" do
|
|
285
281
|
doc = @document.new("name" => "joe", "scope" => "one")
|
286
282
|
doc.save.should be_truthy
|
287
283
|
|
288
|
-
|
289
|
-
receive(:first).
|
284
|
+
@document.stub(:first).
|
290
285
|
with(:name => 'joe', :scope => 'two').
|
291
286
|
and_return(nil)
|
292
287
|
|
@@ -309,8 +304,7 @@ describe "Validations" do
|
|
309
304
|
doc = @document.new("name" => "joe", "first_scope" => "one", "second_scope" => "two")
|
310
305
|
doc.save.should be_truthy
|
311
306
|
|
312
|
-
|
313
|
-
receive(:first).
|
307
|
+
@document.stub(:first).
|
314
308
|
with(:name => 'joe', :first_scope => 'one', :second_scope => 'two').
|
315
309
|
and_return(doc)
|
316
310
|
|
@@ -322,8 +316,7 @@ describe "Validations" do
|
|
322
316
|
doc = @document.new("name" => "joe", "first_scope" => "one", "second_scope" => "two")
|
323
317
|
doc.save.should be_truthy
|
324
318
|
|
325
|
-
|
326
|
-
receive(:first).
|
319
|
+
@document.stub(:first).
|
327
320
|
with(:name => 'joe', :first_scope => 'one', :second_scope => 'one').
|
328
321
|
and_return(nil)
|
329
322
|
|
@@ -403,8 +396,7 @@ describe "Validations" do
|
|
403
396
|
# doc = @document.create(:name => 'John')
|
404
397
|
# doc.should_not have_error_on(:name)
|
405
398
|
#
|
406
|
-
#
|
407
|
-
# receive(:first).
|
399
|
+
# @document.stub(:first).
|
408
400
|
# with(:name => 'John').
|
409
401
|
# and_return(doc)
|
410
402
|
#
|
data/spec/quality_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -2,10 +2,14 @@ $:.unshift(File.expand_path('../../lib', __FILE__))
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'bundler/setup'
|
5
|
+
Bundler.require(:default)
|
5
6
|
require 'fileutils'
|
6
7
|
require 'timecop'
|
7
8
|
require "generator_spec/test_case"
|
8
|
-
|
9
|
+
|
10
|
+
if RUBY_ENGINE == "ruby" && RUBY_VERSION >= '2.3'
|
11
|
+
require 'byebug'
|
12
|
+
end
|
9
13
|
|
10
14
|
if RUBY_PLATFORM != "java"
|
11
15
|
if ENV['TRAVIS']
|
@@ -40,7 +44,7 @@ def Doc(name='Class', &block)
|
|
40
44
|
end
|
41
45
|
|
42
46
|
klass.class_eval(&block) if block_given?
|
43
|
-
klass.collection.
|
47
|
+
klass.collection.drop
|
44
48
|
klass
|
45
49
|
end
|
46
50
|
|
@@ -59,21 +63,28 @@ def EDoc(name='Class', &block)
|
|
59
63
|
end
|
60
64
|
|
61
65
|
def drop_indexes(klass)
|
62
|
-
klass.collection.
|
66
|
+
klass.collection.indexes.drop_all if klass.database.collection_names.include?(klass.collection.name)
|
63
67
|
end
|
64
68
|
|
65
69
|
log_dir = File.expand_path('../../log', __FILE__)
|
66
70
|
FileUtils.mkdir_p(log_dir) unless File.exist?(log_dir)
|
67
71
|
logger = Logger.new(log_dir + '/test.log')
|
68
72
|
|
69
|
-
|
70
|
-
|
71
|
-
MongoMapper.
|
73
|
+
Mongo::Logger.logger = logger
|
74
|
+
|
75
|
+
MongoMapper.connection = Mongo::Client.new(['127.0.0.1:27017'], :database => 'test')
|
76
|
+
MongoMapper.database.collections.each { |c| c.indexes.drop_all }
|
72
77
|
Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
|
73
78
|
|
74
79
|
RSpec.configure do |config|
|
80
|
+
config.example_status_persistence_file_path = "./spec/examples.txt"
|
81
|
+
|
75
82
|
config.expect_with :rspec do |c|
|
76
|
-
c.syntax =
|
83
|
+
c.syntax = :should
|
84
|
+
end
|
85
|
+
|
86
|
+
config.mock_with :rspec do |mocks|
|
87
|
+
mocks.syntax = :should
|
77
88
|
end
|
78
89
|
|
79
90
|
config.around(:each, :without_connection) do |example|
|
@@ -81,5 +92,18 @@ RSpec.configure do |config|
|
|
81
92
|
example.run
|
82
93
|
MongoMapper.connection = old
|
83
94
|
end
|
84
|
-
end
|
85
95
|
|
96
|
+
def suppress_stderr
|
97
|
+
begin
|
98
|
+
original_stderr = $stderr.clone
|
99
|
+
$stderr.reopen(File.new('/dev/null', 'w'))
|
100
|
+
retval = yield
|
101
|
+
rescue Exception => e
|
102
|
+
$stderr.reopen(original_stderr)
|
103
|
+
raise e
|
104
|
+
ensure
|
105
|
+
$stderr.reopen(original_stderr)
|
106
|
+
end
|
107
|
+
retval
|
108
|
+
end
|
109
|
+
end
|
data/spec/support/matchers.rb
CHANGED