mongo_mapper-unstable 2010.2.3 → 2010.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/mongo_mapper.rb +0 -18
- data/lib/mongo_mapper/document.rb +30 -36
- data/lib/mongo_mapper/embedded_document.rb +3 -15
- data/lib/mongo_mapper/plugins.rb +17 -1
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +3 -3
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +1 -1
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +1 -1
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -1
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -1
- data/lib/mongo_mapper/plugins/keys.rb +34 -10
- data/lib/mongo_mapper/plugins/protected.rb +4 -0
- data/lib/mongo_mapper/support.rb +4 -1
- data/lib/mongo_mapper/support/descendant_appends.rb +46 -0
- data/lib/mongo_mapper/support/find.rb +77 -0
- data/test/functional/test_document.rb +22 -3
- data/test/functional/test_protected.rb +16 -0
- data/test/unit/test_dynamic_finder.rb +27 -29
- metadata +4 -4
- data/lib/mongo_mapper/descendant_appends.rb +0 -44
- data/lib/mongo_mapper/dynamic_finder.rb +0 -74
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2010.02.
|
1
|
+
2010.02.04
|
data/lib/mongo_mapper.rb
CHANGED
@@ -102,25 +102,7 @@ end
|
|
102
102
|
|
103
103
|
require 'mongo_mapper/support'
|
104
104
|
require 'mongo_mapper/finder_options'
|
105
|
-
require 'mongo_mapper/dynamic_finder'
|
106
|
-
require 'mongo_mapper/descendant_appends'
|
107
|
-
|
108
105
|
require 'mongo_mapper/plugins'
|
109
|
-
require 'mongo_mapper/plugins/associations'
|
110
|
-
require 'mongo_mapper/plugins/callbacks'
|
111
|
-
require 'mongo_mapper/plugins/clone'
|
112
|
-
require 'mongo_mapper/plugins/descendants'
|
113
|
-
require 'mongo_mapper/plugins/dirty'
|
114
|
-
require 'mongo_mapper/plugins/equality'
|
115
|
-
require 'mongo_mapper/plugins/identity_map'
|
116
|
-
require 'mongo_mapper/plugins/inspect'
|
117
|
-
require 'mongo_mapper/plugins/keys'
|
118
|
-
require 'mongo_mapper/plugins/logger'
|
119
|
-
require 'mongo_mapper/plugins/pagination'
|
120
|
-
require 'mongo_mapper/plugins/protected'
|
121
|
-
require 'mongo_mapper/plugins/rails'
|
122
|
-
require 'mongo_mapper/plugins/serialization'
|
123
|
-
require 'mongo_mapper/plugins/validations'
|
124
106
|
|
125
107
|
require 'mongo_mapper/document'
|
126
108
|
require 'mongo_mapper/embedded_document'
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module MongoMapper
|
2
2
|
module Document
|
3
|
-
extend DescendantAppends
|
3
|
+
extend Support::DescendantAppends
|
4
4
|
|
5
5
|
def self.included(model)
|
6
6
|
model.class_eval do
|
7
7
|
include InstanceMethods
|
8
|
+
extend Support::Find
|
8
9
|
extend ClassMethods
|
9
|
-
extend
|
10
|
-
extend Plugins
|
10
|
+
extend Plugins
|
11
11
|
|
12
12
|
plugin Plugins::Associations
|
13
13
|
plugin Plugins::Clone
|
@@ -26,10 +26,10 @@ module MongoMapper
|
|
26
26
|
|
27
27
|
extend Plugins::Validations::DocumentMacros
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
super
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
module ClassMethods
|
34
34
|
def inherited(subclass)
|
35
35
|
subclass.set_collection_name(collection_name)
|
@@ -47,7 +47,7 @@ module MongoMapper
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def find(*args)
|
50
|
-
|
50
|
+
assert_no_first_last_or_all(args)
|
51
51
|
options = args.extract_options!
|
52
52
|
return nil if args.size == 0
|
53
53
|
|
@@ -59,7 +59,7 @@ module MongoMapper
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def find!(*args)
|
62
|
-
|
62
|
+
assert_no_first_last_or_all(args)
|
63
63
|
options = args.extract_options!
|
64
64
|
raise DocumentNotFound, "Couldn't find without an ID" if args.size == 0
|
65
65
|
|
@@ -70,10 +70,6 @@ module MongoMapper
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
def find_or_create(arg)
|
74
|
-
first(arg) || create(arg)
|
75
|
-
end
|
76
|
-
|
77
73
|
def find_each(options={})
|
78
74
|
criteria, options = to_finder_options(options)
|
79
75
|
collection.find(criteria, options).each do |doc|
|
@@ -85,6 +81,14 @@ module MongoMapper
|
|
85
81
|
find(id)
|
86
82
|
end
|
87
83
|
|
84
|
+
def first_or_create(arg)
|
85
|
+
first(arg) || create(arg)
|
86
|
+
end
|
87
|
+
|
88
|
+
def first_or_new(arg)
|
89
|
+
first(arg) || new(arg)
|
90
|
+
end
|
91
|
+
|
88
92
|
def first(options={})
|
89
93
|
find_one(options)
|
90
94
|
end
|
@@ -136,46 +140,46 @@ module MongoMapper
|
|
136
140
|
end
|
137
141
|
|
138
142
|
def destroy_all(options={})
|
139
|
-
|
143
|
+
find_each(options) { |document| document.destroy }
|
140
144
|
end
|
141
|
-
|
145
|
+
|
142
146
|
def increment(*args)
|
143
147
|
modifier_update('$inc', args)
|
144
148
|
end
|
145
|
-
|
149
|
+
|
146
150
|
def decrement(*args)
|
147
151
|
criteria, keys = criteria_and_keys_from_args(args)
|
148
152
|
values, to_decrement = keys.values, {}
|
149
153
|
keys.keys.each_with_index { |k, i| to_decrement[k] = -values[i].abs }
|
150
154
|
collection.update(criteria, {'$inc' => to_decrement}, :multi => true)
|
151
155
|
end
|
152
|
-
|
156
|
+
|
153
157
|
def set(*args)
|
154
158
|
modifier_update('$set', args)
|
155
159
|
end
|
156
|
-
|
160
|
+
|
157
161
|
def push(*args)
|
158
162
|
modifier_update('$push', args)
|
159
163
|
end
|
160
|
-
|
164
|
+
|
161
165
|
def push_all(*args)
|
162
166
|
modifier_update('$pushAll', args)
|
163
167
|
end
|
164
|
-
|
168
|
+
|
165
169
|
def push_uniq(*args)
|
166
170
|
criteria, keys = criteria_and_keys_from_args(args)
|
167
171
|
keys.each { |key, value | criteria[key] = {'$ne' => value} }
|
168
172
|
collection.update(criteria, {'$push' => keys}, :multi => true)
|
169
173
|
end
|
170
|
-
|
174
|
+
|
171
175
|
def pull(*args)
|
172
176
|
modifier_update('$pull', args)
|
173
177
|
end
|
174
|
-
|
178
|
+
|
175
179
|
def pull_all(*args)
|
176
180
|
modifier_update('$pullAll', args)
|
177
181
|
end
|
178
|
-
|
182
|
+
|
179
183
|
def pop(*args)
|
180
184
|
modifier_update('$pop', args)
|
181
185
|
end
|
@@ -266,7 +270,7 @@ module MongoMapper
|
|
266
270
|
[to_criteria(criteria), keys]
|
267
271
|
end
|
268
272
|
|
269
|
-
def
|
273
|
+
def assert_no_first_last_or_all(args)
|
270
274
|
if args[0] == :first || args[0] == :last || args[0] == :all
|
271
275
|
raise ArgumentError, "#{self}.find(:#{args}) is no longer supported, use #{self}.#{args} instead."
|
272
276
|
end
|
@@ -276,11 +280,11 @@ module MongoMapper
|
|
276
280
|
ids = ids.flatten.compact.uniq
|
277
281
|
find_many(options.merge(:_id => ids)).compact
|
278
282
|
end
|
279
|
-
|
283
|
+
|
280
284
|
def find_some!(ids, options={})
|
281
285
|
ids = ids.flatten.compact.uniq
|
282
286
|
documents = find_some(ids, options)
|
283
|
-
|
287
|
+
|
284
288
|
if ids.size == documents.size
|
285
289
|
documents
|
286
290
|
else
|
@@ -364,21 +368,11 @@ module MongoMapper
|
|
364
368
|
options.assert_valid_keys(:safe)
|
365
369
|
save(options) || raise(DocumentNotValid.new(self))
|
366
370
|
end
|
367
|
-
|
368
|
-
def update_attributes(attrs={})
|
369
|
-
self.attributes = attrs
|
370
|
-
save
|
371
|
-
end
|
372
|
-
|
373
|
-
def update_attributes!(attrs={})
|
374
|
-
self.attributes = attrs
|
375
|
-
save!
|
376
|
-
end
|
377
371
|
|
378
372
|
def destroy
|
379
373
|
delete
|
380
374
|
end
|
381
|
-
|
375
|
+
|
382
376
|
def delete
|
383
377
|
self.class.delete(id) unless new?
|
384
378
|
end
|
@@ -408,7 +402,7 @@ module MongoMapper
|
|
408
402
|
end
|
409
403
|
|
410
404
|
def save_to_collection(options={})
|
411
|
-
safe = options
|
405
|
+
safe = options[:safe] || false
|
412
406
|
@new = false
|
413
407
|
collection.save(to_mongo, :safe => safe)
|
414
408
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module MongoMapper
|
2
2
|
module EmbeddedDocument
|
3
|
-
extend DescendantAppends
|
3
|
+
extend Support::DescendantAppends
|
4
4
|
|
5
5
|
def self.included(model)
|
6
6
|
model.class_eval do
|
7
7
|
include InstanceMethods
|
8
8
|
extend ClassMethods
|
9
|
-
extend
|
9
|
+
extend Plugins
|
10
10
|
|
11
11
|
plugin Plugins::Associations
|
12
12
|
plugin Plugins::Clone
|
@@ -32,9 +32,7 @@ module MongoMapper
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def embedded_in(owner_name)
|
35
|
-
define_method(owner_name)
|
36
|
-
self._parent_document
|
37
|
-
end
|
35
|
+
define_method(owner_name) { _parent_document }
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -52,16 +50,6 @@ module MongoMapper
|
|
52
50
|
end
|
53
51
|
result
|
54
52
|
end
|
55
|
-
|
56
|
-
def update_attributes(attrs={})
|
57
|
-
self.attributes = attrs
|
58
|
-
self.save
|
59
|
-
end
|
60
|
-
|
61
|
-
def update_attributes!(attrs={})
|
62
|
-
self.attributes = attrs
|
63
|
-
self.save!
|
64
|
-
end
|
65
53
|
end # InstanceMethods
|
66
54
|
end # EmbeddedDocument
|
67
55
|
end # MongoMapper
|
data/lib/mongo_mapper/plugins.rb
CHANGED
@@ -11,4 +11,20 @@ module MongoMapper
|
|
11
11
|
plugins << mod
|
12
12
|
end
|
13
13
|
end
|
14
|
-
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'mongo_mapper/plugins/associations'
|
17
|
+
require 'mongo_mapper/plugins/callbacks'
|
18
|
+
require 'mongo_mapper/plugins/clone'
|
19
|
+
require 'mongo_mapper/plugins/descendants'
|
20
|
+
require 'mongo_mapper/plugins/dirty'
|
21
|
+
require 'mongo_mapper/plugins/equality'
|
22
|
+
require 'mongo_mapper/plugins/identity_map'
|
23
|
+
require 'mongo_mapper/plugins/inspect'
|
24
|
+
require 'mongo_mapper/plugins/keys'
|
25
|
+
require 'mongo_mapper/plugins/logger'
|
26
|
+
require 'mongo_mapper/plugins/pagination'
|
27
|
+
require 'mongo_mapper/plugins/protected'
|
28
|
+
require 'mongo_mapper/plugins/rails'
|
29
|
+
require 'mongo_mapper/plugins/serialization'
|
30
|
+
require 'mongo_mapper/plugins/validations'
|
@@ -4,7 +4,7 @@ module MongoMapper
|
|
4
4
|
class EmbeddedCollection < Collection
|
5
5
|
def build(attributes={})
|
6
6
|
doc = klass.new(attributes)
|
7
|
-
|
7
|
+
assign_references(doc)
|
8
8
|
self << doc
|
9
9
|
doc
|
10
10
|
end
|
@@ -22,7 +22,7 @@ module MongoMapper
|
|
22
22
|
def <<(*docs)
|
23
23
|
load_target
|
24
24
|
docs.each do |doc|
|
25
|
-
|
25
|
+
assign_references(doc)
|
26
26
|
target << doc
|
27
27
|
end
|
28
28
|
end
|
@@ -38,7 +38,7 @@ module MongoMapper
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
def
|
41
|
+
def assign_references(*docs)
|
42
42
|
docs.each do |doc|
|
43
43
|
doc._root_document = _root_document
|
44
44
|
doc._parent_document = owner
|
@@ -4,7 +4,7 @@ module MongoMapper
|
|
4
4
|
def self.configure(model)
|
5
5
|
model.key :_id, ObjectId
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
module ClassMethods
|
9
9
|
def inherited(descendant)
|
10
10
|
descendant.instance_variable_set(:@keys, keys.dup)
|
@@ -143,25 +143,31 @@ module MongoMapper
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
module InstanceMethods
|
148
|
-
def initialize(attrs={},
|
148
|
+
def initialize(attrs={}, from_database=false)
|
149
149
|
unless attrs.nil?
|
150
150
|
provided_keys = attrs.keys.map { |k| k.to_s }
|
151
151
|
unless provided_keys.include?('_id') || provided_keys.include?('id')
|
152
152
|
write_key :_id, Mongo::ObjectID.new
|
153
153
|
end
|
154
154
|
end
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
155
|
+
|
156
|
+
assign_type_if_present
|
157
|
+
|
158
|
+
if from_database
|
159
|
+
@new = false
|
160
|
+
self.attributes = attrs
|
161
|
+
else
|
162
|
+
@new = true
|
163
|
+
assign(attrs)
|
164
|
+
end
|
159
165
|
end
|
160
|
-
|
166
|
+
|
161
167
|
def new?
|
162
168
|
@new
|
163
169
|
end
|
164
|
-
|
170
|
+
|
165
171
|
def attributes=(attrs)
|
166
172
|
return if attrs.blank?
|
167
173
|
|
@@ -193,7 +199,21 @@ module MongoMapper
|
|
193
199
|
attrs
|
194
200
|
end
|
195
201
|
alias :to_mongo :attributes
|
196
|
-
|
202
|
+
|
203
|
+
def assign(attrs={})
|
204
|
+
self.attributes = attrs
|
205
|
+
end
|
206
|
+
|
207
|
+
def update_attributes(attrs={})
|
208
|
+
assign(attrs)
|
209
|
+
save
|
210
|
+
end
|
211
|
+
|
212
|
+
def update_attributes!(attrs={})
|
213
|
+
assign(attrs)
|
214
|
+
save!
|
215
|
+
end
|
216
|
+
|
197
217
|
def id
|
198
218
|
_id
|
199
219
|
end
|
@@ -236,6 +256,10 @@ module MongoMapper
|
|
236
256
|
end
|
237
257
|
|
238
258
|
private
|
259
|
+
def assign_type_if_present
|
260
|
+
self._type = self.class.name if respond_to?(:_type=)
|
261
|
+
end
|
262
|
+
|
239
263
|
def ensure_key_exists(name)
|
240
264
|
self.class.key(name) unless respond_to?("#{name}=")
|
241
265
|
end
|
data/lib/mongo_mapper/support.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
module MongoMapper
|
2
|
+
module Support
|
3
|
+
module DescendantAppends
|
4
|
+
def included(model)
|
5
|
+
extra_extensions.each { |extension| model.extend(extension) }
|
6
|
+
extra_inclusions.each { |inclusion| model.send(:include, inclusion) }
|
7
|
+
descendants << model
|
8
|
+
end
|
9
|
+
|
10
|
+
# @api public
|
11
|
+
def descendants
|
12
|
+
@descendants ||= Set.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# @api public
|
16
|
+
def append_extensions(*extensions)
|
17
|
+
extra_extensions.concat extensions
|
18
|
+
|
19
|
+
# Add the extension to existing descendants
|
20
|
+
descendants.each do |model|
|
21
|
+
extensions.each { |extension| model.extend(extension) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @api public
|
26
|
+
def append_inclusions(*inclusions)
|
27
|
+
extra_inclusions.concat inclusions
|
28
|
+
|
29
|
+
# Add the inclusion to existing descendants
|
30
|
+
descendants.each do |model|
|
31
|
+
inclusions.each { |inclusion| model.send(:include, inclusion) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# @api private
|
36
|
+
def extra_extensions
|
37
|
+
@extra_extensions ||= []
|
38
|
+
end
|
39
|
+
|
40
|
+
# @api private
|
41
|
+
def extra_inclusions
|
42
|
+
@extra_inclusions ||= []
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module MongoMapper
|
2
|
+
module Support
|
3
|
+
# @api private
|
4
|
+
module Find
|
5
|
+
def dynamic_find(finder, args)
|
6
|
+
attributes = {}
|
7
|
+
|
8
|
+
finder.attributes.each_with_index do |attr, index|
|
9
|
+
attributes[attr] = args[index]
|
10
|
+
end
|
11
|
+
|
12
|
+
options = args.extract_options!.merge(attributes)
|
13
|
+
|
14
|
+
if result = send(finder.finder, options)
|
15
|
+
result
|
16
|
+
else
|
17
|
+
if finder.raise?
|
18
|
+
raise DocumentNotFound, "Couldn't find Document with #{attributes.inspect} in collection named #{collection.name}"
|
19
|
+
end
|
20
|
+
|
21
|
+
if finder.instantiator
|
22
|
+
self.send(finder.instantiator, attributes)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class DynamicFinder
|
28
|
+
attr_reader :method, :attributes, :finder, :bang, :instantiator
|
29
|
+
|
30
|
+
def initialize(method)
|
31
|
+
@method = method
|
32
|
+
@finder = :first
|
33
|
+
@bang = false
|
34
|
+
match
|
35
|
+
end
|
36
|
+
|
37
|
+
def found?
|
38
|
+
@finder.present?
|
39
|
+
end
|
40
|
+
|
41
|
+
def raise?
|
42
|
+
bang == true
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
def match
|
47
|
+
case method.to_s
|
48
|
+
when /^find_(all_by|by)_([_a-zA-Z]\w*)$/
|
49
|
+
@finder = :all if $1 == 'all_by'
|
50
|
+
names = $2
|
51
|
+
when /^find_by_([_a-zA-Z]\w*)\!$/
|
52
|
+
@bang = true
|
53
|
+
names = $1
|
54
|
+
when /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/
|
55
|
+
@instantiator = $1 == 'initialize' ? :new : :create
|
56
|
+
names = $2
|
57
|
+
else
|
58
|
+
@finder = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
@attributes = names && names.split('_and_')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
protected
|
66
|
+
def method_missing(method, *args, &block)
|
67
|
+
finder = DynamicFinder.new(method)
|
68
|
+
|
69
|
+
if finder.found?
|
70
|
+
dynamic_find(finder, args)
|
71
|
+
else
|
72
|
+
super
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -407,24 +407,43 @@ class DocumentTest < Test::Unit::TestCase
|
|
407
407
|
end
|
408
408
|
end
|
409
409
|
|
410
|
-
context "
|
410
|
+
context "first_or_create" do
|
411
411
|
should "find if exists" do
|
412
412
|
created = @document.create(:first_name => 'John', :last_name => 'Nunemaker')
|
413
413
|
lambda {
|
414
|
-
found = @document.
|
414
|
+
found = @document.first_or_create(:first_name => 'John', :last_name => 'Nunemaker')
|
415
415
|
found.should == created
|
416
416
|
}.should_not change { @document.count }
|
417
417
|
end
|
418
418
|
|
419
419
|
should "create if not found" do
|
420
420
|
lambda {
|
421
|
-
created = @document.
|
421
|
+
created = @document.first_or_create(:first_name => 'John', :last_name => 'Nunemaker')
|
422
422
|
created.first_name.should == 'John'
|
423
423
|
created.last_name.should == 'Nunemaker'
|
424
424
|
}.should change { @document.count }.by(1)
|
425
425
|
end
|
426
426
|
end
|
427
427
|
|
428
|
+
context "first_or_new" do
|
429
|
+
should "find if exists" do
|
430
|
+
created = @document.create(:first_name => 'John', :last_name => 'Nunemaker')
|
431
|
+
lambda {
|
432
|
+
found = @document.first_or_new(:first_name => 'John', :last_name => 'Nunemaker')
|
433
|
+
found.should == created
|
434
|
+
}.should_not change { @document.count }
|
435
|
+
end
|
436
|
+
|
437
|
+
should "initialize if not found" do
|
438
|
+
lambda {
|
439
|
+
created = @document.first_or_new(:first_name => 'John', :last_name => 'Nunemaker')
|
440
|
+
created.first_name.should == 'John'
|
441
|
+
created.last_name.should == 'Nunemaker'
|
442
|
+
created.should be_new
|
443
|
+
}.should_not change { @document.count }
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
428
447
|
context "ClassMethods#delete (single document)" do
|
429
448
|
setup do
|
430
449
|
@doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
|
@@ -36,6 +36,22 @@ class ProtectedTest < Test::Unit::TestCase
|
|
36
36
|
@doc.admin.should be_true
|
37
37
|
end
|
38
38
|
|
39
|
+
should "ignore protected attribute on #initialize" do
|
40
|
+
doc = @doc_class.new(:name => 'John', :admin => true)
|
41
|
+
doc.admin.should be_false
|
42
|
+
doc.name.should == 'John'
|
43
|
+
end
|
44
|
+
|
45
|
+
should "not ignore protected attributes on #initialize from the database" do
|
46
|
+
doc = @doc_class.new(:name => 'John')
|
47
|
+
doc.admin = true
|
48
|
+
doc.save!
|
49
|
+
|
50
|
+
doc = @doc_class.first(:name => 'John')
|
51
|
+
doc.admin.should be_true
|
52
|
+
doc.name.should == 'John'
|
53
|
+
end
|
54
|
+
|
39
55
|
should 'ignore protected attribute on #update_attributes' do
|
40
56
|
@doc.update_attributes(:name => 'Ren Hoek', :admin => true)
|
41
57
|
@doc.name.should == 'Ren Hoek'
|
@@ -1,125 +1,123 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DynamicFinderTest < Test::Unit::TestCase
|
4
|
-
include MongoMapper
|
5
|
-
|
6
4
|
should "initialize with method" do
|
7
|
-
finder = DynamicFinder.new(:foobar)
|
5
|
+
finder = MongoMapper::Support::Find::DynamicFinder.new(:foobar)
|
8
6
|
finder.method.should == :foobar
|
9
7
|
end
|
10
8
|
|
11
9
|
context "found?" do
|
12
10
|
should "be true for find_by" do
|
13
|
-
DynamicFinder.new(:find_by_foo).found?.should be_true
|
11
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo).found?.should be_true
|
14
12
|
end
|
15
13
|
|
16
14
|
should "be true for find_by with !" do
|
17
|
-
DynamicFinder.new(:find_by_foo!).found?.should be_true
|
15
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo!).found?.should be_true
|
18
16
|
end
|
19
17
|
|
20
18
|
should "be true for find_all_by" do
|
21
|
-
DynamicFinder.new(:find_all_by_foo).found?.should be_true
|
19
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_all_by_foo).found?.should be_true
|
22
20
|
end
|
23
21
|
|
24
22
|
should "be true for find_or_initialize_by" do
|
25
|
-
DynamicFinder.new(:find_or_initialize_by_foo).found?.should be_true
|
23
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_initialize_by_foo).found?.should be_true
|
26
24
|
end
|
27
25
|
|
28
26
|
should "be true for find_or_create_by" do
|
29
|
-
DynamicFinder.new(:find_or_create_by_foo).found?.should be_true
|
27
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_create_by_foo).found?.should be_true
|
30
28
|
end
|
31
29
|
|
32
30
|
should "be false for anything else" do
|
33
31
|
[:foobar, :bazwick].each do |method|
|
34
|
-
DynamicFinder.new(method).found?.should be_false
|
32
|
+
MongoMapper::Support::Find::DynamicFinder.new(method).found?.should be_false
|
35
33
|
end
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
39
37
|
context "find_all_by" do
|
40
38
|
should "parse one attribute" do
|
41
|
-
DynamicFinder.new(:find_all_by_foo).attributes.should == %w(foo)
|
39
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_all_by_foo).attributes.should == %w(foo)
|
42
40
|
end
|
43
41
|
|
44
42
|
should "parse multiple attributes" do
|
45
|
-
DynamicFinder.new(:find_all_by_foo_and_bar).attributes.should == %w(foo bar)
|
46
|
-
DynamicFinder.new(:find_all_by_foo_and_bar_and_baz).attributes.should == %w(foo bar baz)
|
43
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_all_by_foo_and_bar).attributes.should == %w(foo bar)
|
44
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_all_by_foo_and_bar_and_baz).attributes.should == %w(foo bar baz)
|
47
45
|
end
|
48
46
|
|
49
47
|
should "set finder to :all" do
|
50
|
-
DynamicFinder.new(:find_all_by_foo_and_bar).finder.should == :all
|
48
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_all_by_foo_and_bar).finder.should == :all
|
51
49
|
end
|
52
50
|
end
|
53
51
|
|
54
52
|
context "find_by" do
|
55
53
|
should "parse one attribute" do
|
56
|
-
DynamicFinder.new(:find_by_foo).attributes.should == %w(foo)
|
54
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo).attributes.should == %w(foo)
|
57
55
|
end
|
58
56
|
|
59
57
|
should "parse multiple attributes" do
|
60
|
-
DynamicFinder.new(:find_by_foo_and_bar).attributes.should == %w(foo bar)
|
58
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo_and_bar).attributes.should == %w(foo bar)
|
61
59
|
end
|
62
60
|
|
63
61
|
should "set finder to :first" do
|
64
|
-
DynamicFinder.new(:find_by_foo).finder.should == :first
|
62
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo).finder.should == :first
|
65
63
|
end
|
66
64
|
|
67
65
|
should "set bang to false" do
|
68
|
-
DynamicFinder.new(:find_by_foo).bang.should be_false
|
66
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo).bang.should be_false
|
69
67
|
end
|
70
68
|
end
|
71
69
|
|
72
70
|
context "find_by with !" do
|
73
71
|
should "parse one attribute" do
|
74
|
-
DynamicFinder.new(:find_by_foo!).attributes.should == %w(foo)
|
72
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo!).attributes.should == %w(foo)
|
75
73
|
end
|
76
74
|
|
77
75
|
should "parse multiple attributes" do
|
78
|
-
DynamicFinder.new(:find_by_foo_and_bar!).attributes.should == %w(foo bar)
|
76
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo_and_bar!).attributes.should == %w(foo bar)
|
79
77
|
end
|
80
78
|
|
81
79
|
should "set finder to :first" do
|
82
|
-
DynamicFinder.new(:find_by_foo!).finder.should == :first
|
80
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo!).finder.should == :first
|
83
81
|
end
|
84
82
|
|
85
83
|
should "set bang to true" do
|
86
|
-
DynamicFinder.new(:find_by_foo!).bang.should be_true
|
84
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_by_foo!).bang.should be_true
|
87
85
|
end
|
88
86
|
end
|
89
87
|
|
90
88
|
context "find_or_initialize_by" do
|
91
89
|
should "parse one attribute" do
|
92
|
-
DynamicFinder.new(:find_or_initialize_by_foo).attributes.should == %w(foo)
|
90
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_initialize_by_foo).attributes.should == %w(foo)
|
93
91
|
end
|
94
92
|
|
95
93
|
should "parse multiple attributes" do
|
96
|
-
DynamicFinder.new(:find_or_initialize_by_foo_and_bar).attributes.should == %w(foo bar)
|
94
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_initialize_by_foo_and_bar).attributes.should == %w(foo bar)
|
97
95
|
end
|
98
96
|
|
99
97
|
should "set finder to :first" do
|
100
|
-
DynamicFinder.new(:find_or_initialize_by_foo).finder.should == :first
|
98
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_initialize_by_foo).finder.should == :first
|
101
99
|
end
|
102
100
|
|
103
101
|
should "set instantiator to new" do
|
104
|
-
DynamicFinder.new(:find_or_initialize_by_foo).instantiator.should == :new
|
102
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_initialize_by_foo).instantiator.should == :new
|
105
103
|
end
|
106
104
|
end
|
107
105
|
|
108
106
|
context "find_or_create_by" do
|
109
107
|
should "parse one attribute" do
|
110
|
-
DynamicFinder.new(:find_or_create_by_foo).attributes.should == %w(foo)
|
108
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_create_by_foo).attributes.should == %w(foo)
|
111
109
|
end
|
112
110
|
|
113
111
|
should "parse multiple attributes" do
|
114
|
-
DynamicFinder.new(:find_or_create_by_foo_and_bar).attributes.should == %w(foo bar)
|
112
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_create_by_foo_and_bar).attributes.should == %w(foo bar)
|
115
113
|
end
|
116
114
|
|
117
115
|
should "set finder to :first" do
|
118
|
-
DynamicFinder.new(:find_or_create_by_foo).finder.should == :first
|
116
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_create_by_foo).finder.should == :first
|
119
117
|
end
|
120
118
|
|
121
119
|
should "set instantiator to new" do
|
122
|
-
DynamicFinder.new(:find_or_create_by_foo).instantiator.should == :create
|
120
|
+
MongoMapper::Support::Find::DynamicFinder.new(:find_or_create_by_foo).instantiator.should == :create
|
123
121
|
end
|
124
122
|
end
|
125
123
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_mapper-unstable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2010.2.
|
4
|
+
version: 2010.2.4
|
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: 2010-02-
|
12
|
+
date: 2010-02-04 00:00:00 -05:00
|
13
13
|
default_executable: mmconsole
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -99,9 +99,7 @@ files:
|
|
99
99
|
- VERSION
|
100
100
|
- bin/mmconsole
|
101
101
|
- lib/mongo_mapper.rb
|
102
|
-
- lib/mongo_mapper/descendant_appends.rb
|
103
102
|
- lib/mongo_mapper/document.rb
|
104
|
-
- lib/mongo_mapper/dynamic_finder.rb
|
105
103
|
- lib/mongo_mapper/embedded_document.rb
|
106
104
|
- lib/mongo_mapper/finder_options.rb
|
107
105
|
- lib/mongo_mapper/plugins.rb
|
@@ -134,6 +132,8 @@ files:
|
|
134
132
|
- lib/mongo_mapper/plugins/serialization.rb
|
135
133
|
- lib/mongo_mapper/plugins/validations.rb
|
136
134
|
- lib/mongo_mapper/support.rb
|
135
|
+
- lib/mongo_mapper/support/descendant_appends.rb
|
136
|
+
- lib/mongo_mapper/support/find.rb
|
137
137
|
- mongo_mapper.gemspec
|
138
138
|
- performance/read_write.rb
|
139
139
|
- specs.watchr
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module MongoMapper
|
2
|
-
module DescendantAppends
|
3
|
-
def included(model)
|
4
|
-
extra_extensions.each { |extension| model.extend(extension) }
|
5
|
-
extra_inclusions.each { |inclusion| model.send(:include, inclusion) }
|
6
|
-
descendants << model
|
7
|
-
end
|
8
|
-
|
9
|
-
# @api public
|
10
|
-
def descendants
|
11
|
-
@descendants ||= Set.new
|
12
|
-
end
|
13
|
-
|
14
|
-
# @api public
|
15
|
-
def append_extensions(*extensions)
|
16
|
-
extra_extensions.concat extensions
|
17
|
-
|
18
|
-
# Add the extension to existing descendants
|
19
|
-
descendants.each do |model|
|
20
|
-
extensions.each { |extension| model.extend(extension) }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# @api public
|
25
|
-
def append_inclusions(*inclusions)
|
26
|
-
extra_inclusions.concat inclusions
|
27
|
-
|
28
|
-
# Add the inclusion to existing descendants
|
29
|
-
descendants.each do |model|
|
30
|
-
inclusions.each { |inclusion| model.send(:include, inclusion) }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
# @api private
|
35
|
-
def extra_extensions
|
36
|
-
@extra_extensions ||= []
|
37
|
-
end
|
38
|
-
|
39
|
-
# @api private
|
40
|
-
def extra_inclusions
|
41
|
-
@extra_inclusions ||= []
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,74 +0,0 @@
|
|
1
|
-
module MongoMapper
|
2
|
-
# @api private
|
3
|
-
module Finders
|
4
|
-
def dynamic_find(finder, args)
|
5
|
-
attributes = {}
|
6
|
-
finder.attributes.each_with_index do |attr, index|
|
7
|
-
attributes[attr] = args[index]
|
8
|
-
end
|
9
|
-
|
10
|
-
options = args.extract_options!.merge(attributes)
|
11
|
-
|
12
|
-
if result = send(finder.finder, options)
|
13
|
-
result
|
14
|
-
else
|
15
|
-
if finder.raise?
|
16
|
-
raise DocumentNotFound, "Couldn't find Document with #{attributes.inspect} in collection named #{collection.name}"
|
17
|
-
end
|
18
|
-
|
19
|
-
if finder.instantiator
|
20
|
-
self.send(finder.instantiator, attributes)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
def method_missing(method, *args, &block)
|
27
|
-
finder = DynamicFinder.new(method)
|
28
|
-
|
29
|
-
if finder.found?
|
30
|
-
dynamic_find(finder, args)
|
31
|
-
else
|
32
|
-
super
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class DynamicFinder
|
38
|
-
attr_reader :method, :attributes, :finder, :bang, :instantiator
|
39
|
-
|
40
|
-
def initialize(method)
|
41
|
-
@method = method
|
42
|
-
@finder = :first
|
43
|
-
@bang = false
|
44
|
-
match
|
45
|
-
end
|
46
|
-
|
47
|
-
def found?
|
48
|
-
@finder.present?
|
49
|
-
end
|
50
|
-
|
51
|
-
def raise?
|
52
|
-
bang == true
|
53
|
-
end
|
54
|
-
|
55
|
-
protected
|
56
|
-
def match
|
57
|
-
case method.to_s
|
58
|
-
when /^find_(all_by|by)_([_a-zA-Z]\w*)$/
|
59
|
-
@finder = :all if $1 == 'all_by'
|
60
|
-
names = $2
|
61
|
-
when /^find_by_([_a-zA-Z]\w*)\!$/
|
62
|
-
@bang = true
|
63
|
-
names = $1
|
64
|
-
when /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/
|
65
|
-
@instantiator = $1 == 'initialize' ? :new : :create
|
66
|
-
names = $2
|
67
|
-
else
|
68
|
-
@finder = nil
|
69
|
-
end
|
70
|
-
|
71
|
-
@attributes = names && names.split('_and_')
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|