mongo_mapper 0.11.1 → 0.11.2
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/README.rdoc +2 -2
- data/lib/mongo_mapper/exceptions.rb +3 -0
- data/lib/mongo_mapper/plugins/accessible.rb +18 -2
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +2 -1
- data/lib/mongo_mapper/plugins/keys.rb +5 -1
- data/lib/mongo_mapper/plugins/modifiers.rb +8 -6
- data/lib/mongo_mapper/plugins/querying.rb +1 -7
- data/lib/mongo_mapper/plugins/querying/decorator.rb +2 -0
- data/lib/mongo_mapper/version.rb +2 -2
- data/test/functional/associations/test_many_documents_as_proxy.rb +3 -1
- data/test/functional/test_modifiers.rb +54 -0
- data/test/functional/test_validations.rb +9 -0
- data/test/test_helper.rb +1 -2
- data/test/unit/test_exceptions.rb +12 -0
- data/test/unit/test_railtie.rb +5 -0
- data/test/unit/test_validations.rb +13 -0
- metadata +49 -74
- data/lib/mongo_mapper/plugins/querying/plucky_methods.rb +0 -21
data/README.rdoc
CHANGED
@@ -6,7 +6,7 @@ A Ruby Object Mapper for Mongo.
|
|
6
6
|
|
7
7
|
$ gem install mongo_mapper
|
8
8
|
|
9
|
-
==
|
9
|
+
== Contributing
|
10
10
|
|
11
11
|
* Fork the project.
|
12
12
|
* Make your feature addition or bug fix.
|
@@ -30,4 +30,4 @@ irc://chat.freenode.net/#mongomapper
|
|
30
30
|
|
31
31
|
== Copyright
|
32
32
|
|
33
|
-
See LICENSE for details.
|
33
|
+
See LICENSE for details.
|
@@ -14,7 +14,10 @@ module MongoMapper
|
|
14
14
|
|
15
15
|
# raised when document not valid and using !
|
16
16
|
class DocumentNotValid < Error
|
17
|
+
attr_reader :document
|
18
|
+
|
17
19
|
def initialize(document)
|
20
|
+
@document = document
|
18
21
|
super("Validation failed: #{document.errors.full_messages.join(", ")}")
|
19
22
|
end
|
20
23
|
end
|
@@ -4,13 +4,21 @@ module MongoMapper
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
class_attribute :
|
7
|
+
class_attribute :_accessible_attributes
|
8
8
|
end
|
9
9
|
|
10
10
|
module ClassMethods
|
11
11
|
def attr_accessible(*attrs)
|
12
12
|
raise AccessibleOrProtected.new(name) if try(:protected_attributes?)
|
13
|
-
self.
|
13
|
+
self._accessible_attributes = Set.new(attrs) + (_accessible_attributes || [])
|
14
|
+
end
|
15
|
+
|
16
|
+
def accessible_attributes(*)
|
17
|
+
_accessible_attributes
|
18
|
+
end
|
19
|
+
|
20
|
+
def accessible_attributes?
|
21
|
+
_accessible_attributes?
|
14
22
|
end
|
15
23
|
end
|
16
24
|
|
@@ -26,6 +34,14 @@ module MongoMapper
|
|
26
34
|
super(filter_inaccessible_attrs(attrs))
|
27
35
|
end
|
28
36
|
|
37
|
+
def accessible_attributes(*args)
|
38
|
+
self.class.accessible_attributes(*args)
|
39
|
+
end
|
40
|
+
|
41
|
+
def accessible_attributes?
|
42
|
+
self.class.accessible_attributes?
|
43
|
+
end
|
44
|
+
|
29
45
|
protected
|
30
46
|
def filter_inaccessible_attrs(attrs)
|
31
47
|
return attrs if !accessible_attributes? || attrs.blank?
|
@@ -4,7 +4,8 @@ module MongoMapper
|
|
4
4
|
module Associations
|
5
5
|
class ManyDocumentsProxy < Collection
|
6
6
|
include DynamicQuerying::ClassMethods
|
7
|
-
|
7
|
+
|
8
|
+
def_delegators :query, *(Querying::Methods - [:to_a, :size, :empty?])
|
8
9
|
|
9
10
|
def replace(docs)
|
10
11
|
load_target
|
@@ -121,7 +121,11 @@ module MongoMapper
|
|
121
121
|
attribute = key.name.to_sym
|
122
122
|
|
123
123
|
if key.options[:required]
|
124
|
-
|
124
|
+
if key.type == Boolean
|
125
|
+
validates_inclusion_of attribute, :in => [true, false]
|
126
|
+
else
|
127
|
+
validates_presence_of(attribute)
|
128
|
+
end
|
125
129
|
end
|
126
130
|
|
127
131
|
if key.options[:unique]
|
@@ -21,20 +21,22 @@ module MongoMapper
|
|
21
21
|
updates.each do |key, value|
|
22
22
|
updates[key] = keys[key.to_s].set(value) if key?(key)
|
23
23
|
end
|
24
|
-
|
24
|
+
modifier_update('$set', [criteria, updates, options])
|
25
25
|
end
|
26
26
|
|
27
27
|
def unset(*args)
|
28
28
|
if args[0].is_a?(Hash)
|
29
29
|
criteria, keys = args.shift, args
|
30
|
+
options = keys.last.is_a?(Hash) ? keys.pop : {}
|
30
31
|
else
|
31
32
|
keys, ids = args.partition { |arg| arg.is_a?(Symbol) }
|
33
|
+
options = ids.last.is_a?(Hash) ? ids.pop : {}
|
32
34
|
criteria = {:id => ids}
|
33
35
|
end
|
34
36
|
|
35
|
-
criteria
|
36
|
-
|
37
|
-
|
37
|
+
criteria = criteria_hash(criteria).to_hash
|
38
|
+
updates = keys.inject({}) { |hash, key| hash[key] = 1; hash }
|
39
|
+
modifier_update('$unset', [criteria, updates, options])
|
38
40
|
end
|
39
41
|
|
40
42
|
def push(*args)
|
@@ -87,8 +89,8 @@ module MongoMapper
|
|
87
89
|
end
|
88
90
|
end
|
89
91
|
|
90
|
-
def unset(*
|
91
|
-
self.class.unset(id, *
|
92
|
+
def unset(*args)
|
93
|
+
self.class.unset(id, *args)
|
92
94
|
end
|
93
95
|
|
94
96
|
def increment(hash, options=nil)
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'mongo_mapper/plugins/querying/decorator'
|
3
|
-
require 'mongo_mapper/plugins/querying/plucky_methods'
|
4
3
|
|
5
4
|
module MongoMapper
|
6
5
|
module Plugins
|
@@ -9,13 +8,8 @@ module MongoMapper
|
|
9
8
|
|
10
9
|
module ClassMethods
|
11
10
|
extend Forwardable
|
12
|
-
include PluckyMethods
|
13
11
|
|
14
|
-
def_delegators :query,
|
15
|
-
|
16
|
-
def find_each(opts={})
|
17
|
-
super(opts).each { |doc| yield(doc) }
|
18
|
-
end
|
12
|
+
def_delegators :query, *Querying::Methods
|
19
13
|
|
20
14
|
def find_by_id(id)
|
21
15
|
find_one(:_id => id)
|
data/lib/mongo_mapper/version.rb
CHANGED
@@ -13,7 +13,9 @@ class ManyDocumentsAsProxyTest < Test::Unit::TestCase
|
|
13
13
|
|
14
14
|
should "add type and id key to polymorphic class base" do
|
15
15
|
PostComment.keys.keys.should include('commentable_type')
|
16
|
+
PostComment.keys['commentable_type'].type.should == String
|
16
17
|
PostComment.keys.keys.should include('commentable_id')
|
18
|
+
PostComment.keys['commentable_id'].type.should == ObjectId
|
17
19
|
end
|
18
20
|
|
19
21
|
should "allow adding to association like it was an array" do
|
@@ -226,4 +228,4 @@ class ManyDocumentsAsProxyTest < Test::Unit::TestCase
|
|
226
228
|
end
|
227
229
|
end
|
228
230
|
end
|
229
|
-
end
|
231
|
+
end
|
@@ -43,6 +43,33 @@ class ModifierTest < Test::Unit::TestCase
|
|
43
43
|
assert_keys_removed @page, :title, :tags
|
44
44
|
assert_keys_removed @page2, :title, :tags
|
45
45
|
end
|
46
|
+
|
47
|
+
context "additional options (upsert & safe)" do
|
48
|
+
should "be able to pass upsert option" do
|
49
|
+
new_key_value = DateTime.now.to_s
|
50
|
+
@page_class.unset({:title => new_key_value, :tags => %w(foo bar)}, :tags, {:upsert => true})
|
51
|
+
@page_class.count(:title => new_key_value).should == 1
|
52
|
+
@page_class.first(:title => new_key_value).tags.should == []
|
53
|
+
end
|
54
|
+
|
55
|
+
should "be able to pass safe option" do
|
56
|
+
@page_class.create(:title => "Better Be Safe than Sorry")
|
57
|
+
|
58
|
+
Mongo::Collection.any_instance.expects(:update).with(
|
59
|
+
{:title => "Better Be Safe than Sorry"},
|
60
|
+
{'$unset' => {:tags => 1}},
|
61
|
+
{:safe => true, :multi => true}
|
62
|
+
)
|
63
|
+
@page_class.unset({:title => "Better Be Safe than Sorry"}, :tags, {:safe => true})
|
64
|
+
end
|
65
|
+
|
66
|
+
should "be able to pass both safe and upsert options" do
|
67
|
+
new_key_value = DateTime.now.to_s
|
68
|
+
@page_class.unset({:title => new_key_value, :tags => %w(foo bar)}, :tags, {:upsert => true, :safe => true})
|
69
|
+
@page_class.count(:title => new_key_value).should == 1
|
70
|
+
@page_class.first(:title => new_key_value).tags.should == []
|
71
|
+
end
|
72
|
+
end
|
46
73
|
end
|
47
74
|
|
48
75
|
context "increment" do
|
@@ -141,6 +168,33 @@ class ModifierTest < Test::Unit::TestCase
|
|
141
168
|
@page.reload
|
142
169
|
@page[:colors].should == %w[red green]
|
143
170
|
end
|
171
|
+
|
172
|
+
context "additional options (upsert & safe)" do
|
173
|
+
should "be able to pass upsert option" do
|
174
|
+
new_key_value = DateTime.now.to_s
|
175
|
+
@page_class.set({:title => new_key_value}, {:day_count => 1}, {:upsert => true})
|
176
|
+
@page_class.count(:title => new_key_value).should == 1
|
177
|
+
@page_class.first(:title => new_key_value).day_count.should == 1
|
178
|
+
end
|
179
|
+
|
180
|
+
should "be able to pass safe option" do
|
181
|
+
@page_class.create(:title => "Better Be Safe than Sorry")
|
182
|
+
|
183
|
+
Mongo::Collection.any_instance.expects(:update).with(
|
184
|
+
{:title => "Better Be Safe than Sorry"},
|
185
|
+
{'$set' => {:title => "I like safety."}},
|
186
|
+
{:safe => true, :multi => true}
|
187
|
+
)
|
188
|
+
@page_class.set({:title => "Better Be Safe than Sorry"}, {:title => "I like safety."}, {:safe => true})
|
189
|
+
end
|
190
|
+
|
191
|
+
should "be able to pass both safe and upsert options" do
|
192
|
+
new_key_value = DateTime.now.to_s
|
193
|
+
@page_class.set({:title => new_key_value}, {:day_count => 1}, {:upsert => true, :safe => true})
|
194
|
+
@page_class.count(:title => new_key_value).should == 1
|
195
|
+
@page_class.first(:title => new_key_value).day_count.should == 1
|
196
|
+
end
|
197
|
+
end
|
144
198
|
end
|
145
199
|
|
146
200
|
context "push" do
|
@@ -33,6 +33,15 @@ class ValidationsTest < Test::Unit::TestCase
|
|
33
33
|
doc = @document.new
|
34
34
|
lambda { doc.save! }.should raise_error(MongoMapper::DocumentNotValid)
|
35
35
|
end
|
36
|
+
|
37
|
+
should "set document on exception" do
|
38
|
+
doc = @document.new
|
39
|
+
begin
|
40
|
+
doc.save!
|
41
|
+
rescue MongoMapper::DocumentNotValid => e
|
42
|
+
e.document.should == doc
|
43
|
+
end
|
44
|
+
end
|
36
45
|
end
|
37
46
|
|
38
47
|
context "Creating a document that is invalid (destructive)" do
|
data/test/test_helper.rb
CHANGED
@@ -6,7 +6,7 @@ require 'mongo_mapper'
|
|
6
6
|
require 'fileutils'
|
7
7
|
require 'ostruct'
|
8
8
|
|
9
|
-
Bundler.require(:
|
9
|
+
Bundler.require(:default, :test)
|
10
10
|
|
11
11
|
class Test::Unit::TestCase
|
12
12
|
def Doc(name='Class', &block)
|
@@ -88,7 +88,6 @@ log_dir = File.expand_path('../../log', __FILE__)
|
|
88
88
|
FileUtils.mkdir_p(log_dir) unless File.exist?(log_dir)
|
89
89
|
logger = Logger.new(log_dir + '/test.log')
|
90
90
|
|
91
|
-
LogBuddy.init(:logger => logger)
|
92
91
|
MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, :logger => logger)
|
93
92
|
MongoMapper.database = "test"
|
94
93
|
MongoMapper.database.collections.each { |c| c.drop_indexes }
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ExtensionsTest < Test::Unit::TestCase
|
4
|
+
context "DocumentNotValid" do
|
5
|
+
should "have document reader method" do
|
6
|
+
doc_class = Doc()
|
7
|
+
instance = doc_class.new
|
8
|
+
exception = MongoMapper::DocumentNotValid.new(instance)
|
9
|
+
exception.document.should == instance
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/test/unit/test_railtie.rb
CHANGED
@@ -13,6 +13,11 @@ class TestRailtie < Test::Unit::TestCase
|
|
13
13
|
initializer = mod.initializers.detect do |i|
|
14
14
|
i.name == name
|
15
15
|
end
|
16
|
+
|
17
|
+
if initializer.nil?
|
18
|
+
raise 'Initializer not found'
|
19
|
+
end
|
20
|
+
|
16
21
|
initializer.block.arity == -1 ? initializer.run : initializer.run(FakeRails)
|
17
22
|
# mongo_mapper.prepare_dispatcher takes a Rails app as its one arg,
|
18
23
|
# set_clear_dependencies_hook takes no args
|
@@ -245,6 +245,19 @@ class ValidationsTest < Test::Unit::TestCase
|
|
245
245
|
doc.should_not have_error_on(:action)
|
246
246
|
end
|
247
247
|
|
248
|
+
should "work with :required shortcut on Boolean type" do
|
249
|
+
@document.key :flag, Boolean, :required => true
|
250
|
+
|
251
|
+
doc = @document.new
|
252
|
+
doc.should have_error_on(:flag, 'is not included in the list')
|
253
|
+
|
254
|
+
doc.flag = true
|
255
|
+
doc.should_not have_error_on(:action)
|
256
|
+
|
257
|
+
doc.flag = false
|
258
|
+
doc.should_not have_error_on(:action)
|
259
|
+
end
|
260
|
+
|
248
261
|
should "not have error if allow nil is true and value is nil" do
|
249
262
|
@document.key :action, String
|
250
263
|
@document.validates_inclusion_of :action, :in => %w(kick run), :allow_nil => true
|
metadata
CHANGED
@@ -1,78 +1,57 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_mapper
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.11.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 11
|
9
|
-
- 1
|
10
|
-
version: 0.11.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- John Nunemaker
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
21
|
-
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
|
-
none: false
|
23
|
-
requirements:
|
24
|
-
- - ~>
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
hash: 7
|
27
|
-
segments:
|
28
|
-
- 3
|
29
|
-
- 0
|
30
|
-
version: "3.0"
|
31
|
-
prerelease: false
|
32
|
-
requirement: *id001
|
12
|
+
date: 2012-07-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
33
15
|
name: activemodel
|
34
|
-
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
version_requirements: &id002 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70319139905420 !ruby/object:Gem::Requirement
|
37
17
|
none: false
|
38
|
-
requirements:
|
18
|
+
requirements:
|
39
19
|
- - ~>
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
|
43
|
-
- 3
|
44
|
-
- 0
|
45
|
-
version: "3.0"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
22
|
+
type: :runtime
|
46
23
|
prerelease: false
|
47
|
-
|
24
|
+
version_requirements: *70319139905420
|
25
|
+
- !ruby/object:Gem::Dependency
|
48
26
|
name: activesupport
|
49
|
-
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
27
|
+
requirement: &70319139904940 !ruby/object:Gem::Requirement
|
52
28
|
none: false
|
53
|
-
requirements:
|
29
|
+
requirements:
|
54
30
|
- - ~>
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
|
58
|
-
- 0
|
59
|
-
- 4
|
60
|
-
- 0
|
61
|
-
version: 0.4.0
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.0'
|
33
|
+
type: :runtime
|
62
34
|
prerelease: false
|
63
|
-
|
35
|
+
version_requirements: *70319139904940
|
36
|
+
- !ruby/object:Gem::Dependency
|
64
37
|
name: plucky
|
38
|
+
requirement: &70319139904480 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.5.1
|
65
44
|
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70319139904480
|
66
47
|
description:
|
67
|
-
email:
|
48
|
+
email:
|
68
49
|
- nunemaker@gmail.com
|
69
|
-
executables:
|
50
|
+
executables:
|
70
51
|
- mmconsole
|
71
52
|
extensions: []
|
72
|
-
|
73
53
|
extra_rdoc_files: []
|
74
|
-
|
75
|
-
files:
|
54
|
+
files:
|
76
55
|
- bin/mmconsole
|
77
56
|
- examples/attr_accessible.rb
|
78
57
|
- examples/attr_protected.rb
|
@@ -151,7 +130,6 @@ files:
|
|
151
130
|
- lib/mongo_mapper/plugins/persistence.rb
|
152
131
|
- lib/mongo_mapper/plugins/protected.rb
|
153
132
|
- lib/mongo_mapper/plugins/querying/decorator.rb
|
154
|
-
- lib/mongo_mapper/plugins/querying/plucky_methods.rb
|
155
133
|
- lib/mongo_mapper/plugins/querying.rb
|
156
134
|
- lib/mongo_mapper/plugins/rails/active_record_association_adapter.rb
|
157
135
|
- lib/mongo_mapper/plugins/rails.rb
|
@@ -229,6 +207,7 @@ files:
|
|
229
207
|
- test/unit/test_dynamic_finder.rb
|
230
208
|
- test/unit/test_embedded_document.rb
|
231
209
|
- test/unit/test_equality.rb
|
210
|
+
- test/unit/test_exceptions.rb
|
232
211
|
- test/unit/test_extensions.rb
|
233
212
|
- test/unit/test_identity_map_middleware.rb
|
234
213
|
- test/unit/test_inspect.rb
|
@@ -250,36 +229,32 @@ files:
|
|
250
229
|
- README.rdoc
|
251
230
|
homepage: http://github.com/jnunemaker/mongomapper
|
252
231
|
licenses: []
|
253
|
-
|
254
232
|
post_install_message:
|
255
233
|
rdoc_options: []
|
256
|
-
|
257
|
-
require_paths:
|
234
|
+
require_paths:
|
258
235
|
- lib
|
259
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
236
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
260
237
|
none: false
|
261
|
-
requirements:
|
262
|
-
- -
|
263
|
-
- !ruby/object:Gem::Version
|
264
|
-
|
265
|
-
segments:
|
238
|
+
requirements:
|
239
|
+
- - ! '>='
|
240
|
+
- !ruby/object:Gem::Version
|
241
|
+
version: '0'
|
242
|
+
segments:
|
266
243
|
- 0
|
267
|
-
|
268
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
244
|
+
hash: -1944766579498551313
|
245
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
269
246
|
none: false
|
270
|
-
requirements:
|
271
|
-
- -
|
272
|
-
- !ruby/object:Gem::Version
|
273
|
-
|
274
|
-
segments:
|
247
|
+
requirements:
|
248
|
+
- - ! '>='
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
251
|
+
segments:
|
275
252
|
- 0
|
276
|
-
|
253
|
+
hash: -1944766579498551313
|
277
254
|
requirements: []
|
278
|
-
|
279
255
|
rubyforge_project:
|
280
|
-
rubygems_version: 1.8.
|
256
|
+
rubygems_version: 1.8.10
|
281
257
|
signing_key:
|
282
258
|
specification_version: 3
|
283
259
|
summary: A Ruby Object Mapper for Mongo
|
284
260
|
test_files: []
|
285
|
-
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
require 'forwardable'
|
3
|
-
|
4
|
-
module MongoMapper
|
5
|
-
module Plugins
|
6
|
-
module Querying
|
7
|
-
module PluckyMethods
|
8
|
-
extend Forwardable
|
9
|
-
def_delegators :query, :where, :filter,
|
10
|
-
:fields, :ignore, :only,
|
11
|
-
:limit, :paginate, :per_page, :skip, :offset,
|
12
|
-
:sort, :order, :reverse,
|
13
|
-
:count,
|
14
|
-
:distinct,
|
15
|
-
:last, :first, :find_one, :all, :find_each,
|
16
|
-
:find, :find!,
|
17
|
-
:exists?, :exist?
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|