mongodb 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/mongo/driver.rb +1 -1
- data/lib/mongo/driver/collection.rb +1 -1
- data/lib/mongo/driver/connection.rb +1 -1
- data/lib/mongo/driver/database.rb +2 -2
- data/lib/mongo/object.rb +1 -0
- data/lib/mongo/object/object.rb +23 -22
- data/lib/mongo/object/support.rb +0 -0
- data/lib/{mongo → mongodb}/gems.rb +0 -0
- data/spec/object/callbacks_spec.rb +86 -68
- metadata +16 -4
data/lib/mongo/driver.rb
CHANGED
@@ -2,14 +2,14 @@ module Mongo::DBExt
|
|
2
2
|
def drop
|
3
3
|
connection.drop_database name
|
4
4
|
end
|
5
|
-
|
5
|
+
|
6
6
|
def clear
|
7
7
|
collection_names.each do |name|
|
8
8
|
next if name =~ /^system\./
|
9
9
|
mongo.db.collection(name).drop
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
protected
|
14
14
|
def method_missing collection_name
|
15
15
|
self.collection collection_name
|
data/lib/mongo/object.rb
CHANGED
data/lib/mongo/object/object.rb
CHANGED
@@ -2,15 +2,19 @@ module Mongo::Object
|
|
2
2
|
attr_accessor :_id, :_parent
|
3
3
|
|
4
4
|
def valid? options = {}
|
5
|
-
options = ::Mongo::Object.parse_options options
|
6
5
|
errors.clear
|
6
|
+
run_validations options
|
7
|
+
end
|
8
|
+
|
9
|
+
def run_validations options = {}
|
10
|
+
options = ::Mongo::Object.parse_options options
|
7
11
|
begin
|
8
12
|
return false if options[:callbacks] and !::Mongo::Object.run_before_callbacks(self, :validate)
|
9
13
|
|
10
14
|
child_options = options.merge internal: true
|
11
15
|
result = [
|
16
|
+
(respond_to?(:run_model_validations) ? run_model_validations : true),
|
12
17
|
child_objects.all?{|group| group.all?{|obj| obj.valid?(child_options)}},
|
13
|
-
::Mongo::Object.run_validations(self),
|
14
18
|
errors.empty?
|
15
19
|
].all?
|
16
20
|
|
@@ -18,12 +22,12 @@ module Mongo::Object
|
|
18
22
|
|
19
23
|
result
|
20
24
|
ensure
|
21
|
-
|
25
|
+
clear_child_objects_cache unless options[:internal]
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
25
29
|
def errors
|
26
|
-
@_errors ||=
|
30
|
+
@_errors ||= Hash.new([])
|
27
31
|
end
|
28
32
|
|
29
33
|
def create_object collection, options
|
@@ -69,7 +73,7 @@ module Mongo::Object
|
|
69
73
|
return options
|
70
74
|
end
|
71
75
|
|
72
|
-
def
|
76
|
+
def parse_mongo_options options
|
73
77
|
options = options.clone
|
74
78
|
options.delete :validate
|
75
79
|
options.delete :callbacks
|
@@ -83,7 +87,7 @@ module Mongo::Object
|
|
83
87
|
end
|
84
88
|
|
85
89
|
def instance_variables obj
|
86
|
-
# skipping variables starting with
|
90
|
+
# skipping variables starting with @_, usually they
|
87
91
|
# have specific meaning and used for example for cache
|
88
92
|
obj.instance_variables.select{|n| n !~ SKIP_IV_REGEXP}
|
89
93
|
end
|
@@ -138,8 +142,10 @@ module Mongo::Object
|
|
138
142
|
|
139
143
|
def each_object obj, &block
|
140
144
|
if obj.is_a? Hash
|
145
|
+
block.call obj if obj.is_a? ::Mongo::Object
|
141
146
|
obj.each{|k, v| each_object v, &block}
|
142
147
|
elsif obj.is_a? Array
|
148
|
+
block.call obj if obj.is_a? ::Mongo::Object
|
143
149
|
obj.each{|v| each_object v, &block}
|
144
150
|
elsif obj.is_a? ::Mongo::Object
|
145
151
|
block.call obj
|
@@ -167,7 +173,7 @@ module Mongo::Object
|
|
167
173
|
end
|
168
174
|
|
169
175
|
def run_after_callbacks obj, method
|
170
|
-
if obj.respond_to?(:
|
176
|
+
if obj.respond_to?(:run_after_callbacks)
|
171
177
|
obj.run_after_callbacks(method, method: method)
|
172
178
|
obj.run_after_callbacks(:save, method: :save) if method == :update or method == :create
|
173
179
|
else
|
@@ -175,10 +181,6 @@ module Mongo::Object
|
|
175
181
|
end
|
176
182
|
end
|
177
183
|
|
178
|
-
def run_validations obj
|
179
|
-
obj.respond_to?(:run_validations) ? obj.run_validations : true
|
180
|
-
end
|
181
|
-
|
182
184
|
protected
|
183
185
|
def _build doc, parent = nil
|
184
186
|
if doc.is_a? Hash
|
@@ -199,6 +201,7 @@ module Mongo::Object
|
|
199
201
|
obj
|
200
202
|
end
|
201
203
|
obj._parent = parent if parent
|
204
|
+
run_after_callbacks obj, :build
|
202
205
|
obj
|
203
206
|
else
|
204
207
|
hash = {}
|
@@ -223,7 +226,6 @@ module Mongo::Object
|
|
223
226
|
end
|
224
227
|
|
225
228
|
protected
|
226
|
-
attr_writer :original_children
|
227
229
|
def original_children; @_original_children ||= [] end
|
228
230
|
|
229
231
|
def update_original_children!
|
@@ -235,17 +237,17 @@ module Mongo::Object
|
|
235
237
|
end
|
236
238
|
end
|
237
239
|
|
238
|
-
def
|
239
|
-
if instance_variable_get(:@
|
240
|
+
def clear_child_objects_cache
|
241
|
+
if instance_variable_get(:@_child_objects_cache)
|
240
242
|
child_objects.each do |group|
|
241
|
-
group.each{|obj| obj.
|
243
|
+
group.each{|obj| obj.clear_child_objects_cache}
|
242
244
|
end
|
243
|
-
remove_instance_variable :@
|
245
|
+
remove_instance_variable :@_child_objects_cache
|
244
246
|
end
|
245
247
|
end
|
246
248
|
|
247
249
|
def child_objects
|
248
|
-
unless @
|
250
|
+
unless @_child_objects_cache
|
249
251
|
created_children, updated_children, destroyed_children = [], [], []
|
250
252
|
|
251
253
|
original_children_ids = Set.new; original_children.each{|obj| original_children_ids << obj.object_id}
|
@@ -258,9 +260,9 @@ module Mongo::Object
|
|
258
260
|
end
|
259
261
|
destroyed_children = original_children.select{|obj| !children_ids.include?(obj.object_id)}
|
260
262
|
|
261
|
-
@
|
263
|
+
@_child_objects_cache = [created_children, updated_children, destroyed_children]
|
262
264
|
end
|
263
|
-
@
|
265
|
+
@_child_objects_cache
|
264
266
|
end
|
265
267
|
|
266
268
|
def with_object_callbacks method, options, &block
|
@@ -273,7 +275,7 @@ module Mongo::Object
|
|
273
275
|
return false if options[:callbacks] and !run_all_callbacks(:before, method)
|
274
276
|
|
275
277
|
# saving
|
276
|
-
block.call ::Mongo::Object.
|
278
|
+
block.call ::Mongo::Object.parse_mongo_options(options)
|
277
279
|
update_original_children!
|
278
280
|
|
279
281
|
# after callbacks
|
@@ -281,10 +283,9 @@ module Mongo::Object
|
|
281
283
|
|
282
284
|
true
|
283
285
|
ensure
|
284
|
-
|
286
|
+
clear_child_objects_cache
|
285
287
|
end
|
286
288
|
|
287
|
-
# TODO1 move to static method
|
288
289
|
def run_all_callbacks type, method
|
289
290
|
result = if type == :before
|
290
291
|
::Mongo::Object.run_before_callbacks self, method
|
File without changes
|
File without changes
|
@@ -3,95 +3,113 @@ require 'object/spec_helper'
|
|
3
3
|
describe 'Object callbacks' do
|
4
4
|
with_mongo
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
[Object, Array, Hash].each do |embedded_object_superclass|
|
7
|
+
embedded_object_class = nil
|
8
|
+
before :all do
|
9
|
+
class MainObject
|
10
|
+
include Mongo::Object, RSpec::CallbackHelper
|
11
|
+
|
12
|
+
attr_accessor :children
|
13
|
+
end
|
10
14
|
|
11
|
-
|
15
|
+
embedded_object_class = Class.new embedded_object_superclass do
|
12
16
|
include Mongo::Object, RSpec::CallbackHelper
|
13
17
|
end
|
14
18
|
end
|
15
|
-
|
16
|
-
after(:all){remove_constants :Player}
|
19
|
+
after(:all){remove_constants :MainObject}
|
17
20
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'create' do
|
25
|
-
%w(before_validate after_validate before_save before_create after_create after_save).each do |name|
|
26
|
-
@player.should_receive(name).once.ordered.and_return(true)
|
27
|
-
@mission.should_receive(name).once.ordered.and_return(true)
|
21
|
+
before do
|
22
|
+
@child = embedded_object_class.new
|
23
|
+
@object = MainObject.new
|
24
|
+
@object.children = [@child]
|
28
25
|
end
|
29
26
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
27
|
+
it 'create' do
|
28
|
+
%w(before_validate after_validate before_save before_create after_create after_save).each do |name|
|
29
|
+
@object.should_receive(name).once.ordered.and_return(true)
|
30
|
+
@child.should_receive(name).once.ordered.and_return(true)
|
31
|
+
end
|
35
32
|
|
36
|
-
|
37
|
-
@player.should_receive(name).once.ordered.and_return(true)
|
38
|
-
@mission.should_receive(name).once.ordered.and_return(true)
|
33
|
+
db.objects.save(@object).should be_true
|
39
34
|
end
|
40
|
-
db.players.save(@player).should be_true
|
41
|
-
end
|
42
35
|
|
43
|
-
|
44
|
-
|
36
|
+
it 'update' do
|
37
|
+
db.objects.save(@object).should be_true
|
45
38
|
|
46
|
-
|
47
|
-
|
48
|
-
|
39
|
+
%w(before_validate after_validate before_save before_update after_update after_save).each do |name|
|
40
|
+
@object.should_receive(name).once.ordered.and_return(true)
|
41
|
+
@child.should_receive(name).once.ordered.and_return(true)
|
42
|
+
end
|
43
|
+
db.objects.save(@object).should be_true
|
49
44
|
end
|
50
|
-
db.players.destroy(@player).should be_true
|
51
|
-
end
|
52
45
|
|
53
|
-
|
54
|
-
|
55
|
-
@mission.should_not_receive(:run_callbacks)
|
46
|
+
it 'destroy' do
|
47
|
+
db.objects.save(@object).should be_true
|
56
48
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
end
|
49
|
+
%w(before_validate after_validate before_destroy after_destroy).each do |name|
|
50
|
+
@object.should_receive(name).once.ordered.and_return(true)
|
51
|
+
@child.should_receive(name).once.ordered.and_return(true)
|
52
|
+
end
|
53
|
+
db.objects.destroy(@object).should be_true
|
54
|
+
end
|
64
55
|
|
65
|
-
|
66
|
-
|
67
|
-
|
56
|
+
it 'should be able skip callbacks' do
|
57
|
+
@object.should_not_receive(:run_callbacks)
|
58
|
+
@child.should_not_receive(:run_callbacks)
|
59
|
+
|
60
|
+
db.objects.save(@object, callbacks: false).should be_true
|
61
|
+
db.objects.count.should == 1
|
62
|
+
db.objects.save(@object, callbacks: false).should be_true
|
63
|
+
db.objects.count.should == 1
|
64
|
+
db.objects.destroy(@object, callbacks: false).should be_true
|
65
|
+
db.objects.count.should == 0
|
68
66
|
end
|
69
|
-
db.players.save(@player).should be_false
|
70
|
-
db.players.count.should == 0
|
71
|
-
end
|
72
67
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
db.
|
68
|
+
it 'should be able interrupt CRUD' do
|
69
|
+
@child.stub! :run_before_callbacks do |method_name|
|
70
|
+
false if method_name == :create
|
71
|
+
end
|
72
|
+
db.objects.save(@object).should be_false
|
73
|
+
db.objects.count.should == 0
|
79
74
|
end
|
80
75
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
76
|
+
describe "embedded" do
|
77
|
+
it 'should fire :destroy on detached objects' do
|
78
|
+
db.objects.save(@object).should be_true
|
79
|
+
@object.children.clear
|
80
|
+
@child.should_receive(:before_destroy).once.and_return(true)
|
81
|
+
db.objects.destroy(@object).should be_true
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should fire :destroy on deleted objects in update' do
|
85
|
+
db.objects.save(@object).should be_true
|
86
|
+
@object.children.clear
|
87
|
+
@child.should_receive(:before_destroy).once.and_return(true)
|
88
|
+
db.objects.save(@object).should be_true
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should fire :create on new objects in update' do
|
92
|
+
db.objects.save(@object).should be_true
|
93
|
+
child2 = embedded_object_class.new
|
94
|
+
@object.children << child2
|
95
|
+
child2.should_receive(:before_create).once.and_return(true)
|
96
|
+
child2.should_not_receive(:before_update)
|
97
|
+
db.objects.save(@object).should be_true
|
98
|
+
end
|
86
99
|
end
|
87
100
|
|
88
|
-
it
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
101
|
+
it "should fire :after_build callback after building the object" do
|
102
|
+
class SpecialMainObject < MainObject
|
103
|
+
def run_after_callbacks method, options
|
104
|
+
self.class.build_callback if method == :build
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
player = SpecialMainObject.new
|
109
|
+
db.objects.save! player
|
110
|
+
|
111
|
+
SpecialMainObject.should_receive :build_callback
|
112
|
+
db.objects.first
|
95
113
|
end
|
96
114
|
end
|
97
115
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongodb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,19 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-09-
|
13
|
-
dependencies:
|
12
|
+
date: 2011-09-19 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mongo
|
16
|
+
requirement: &2782360 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2782360
|
14
25
|
description:
|
15
26
|
email:
|
16
27
|
executables: []
|
@@ -25,7 +36,6 @@ files:
|
|
25
36
|
- lib/mongo/driver/dynamic_finders.rb
|
26
37
|
- lib/mongo/driver/spec.rb
|
27
38
|
- lib/mongo/driver.rb
|
28
|
-
- lib/mongo/gems.rb
|
29
39
|
- lib/mongo/migration/definition.rb
|
30
40
|
- lib/mongo/migration/dsl.rb
|
31
41
|
- lib/mongo/migration/migration.rb
|
@@ -35,7 +45,9 @@ files:
|
|
35
45
|
- lib/mongo/object/object_helper.rb
|
36
46
|
- lib/mongo/object/spec/crud_shared.rb
|
37
47
|
- lib/mongo/object/spec.rb
|
48
|
+
- lib/mongo/object/support.rb
|
38
49
|
- lib/mongo/object.rb
|
50
|
+
- lib/mongodb/gems.rb
|
39
51
|
- spec/driver/collection_spec.rb
|
40
52
|
- spec/driver/connection_spec.rb
|
41
53
|
- spec/driver/crud_spec.rb
|