mongo_mapper 0.10.0 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/mongo_mapper.rb +1 -0
- data/lib/mongo_mapper/plugins/accessible.rb +2 -2
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +2 -37
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +2 -2
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +1 -1
- data/lib/mongo_mapper/plugins/associations/one_association.rb +4 -4
- data/lib/mongo_mapper/plugins/associations/single_association.rb +45 -0
- data/lib/mongo_mapper/plugins/document.rb +1 -1
- data/lib/mongo_mapper/plugins/identity_map.rb +2 -2
- data/lib/mongo_mapper/plugins/indexes.rb +2 -3
- data/lib/mongo_mapper/plugins/keys.rb +8 -4
- data/lib/mongo_mapper/plugins/protected.rb +1 -1
- data/lib/mongo_mapper/plugins/querying.rb +2 -2
- data/lib/mongo_mapper/railtie/database.rake +14 -9
- data/lib/mongo_mapper/version.rb +1 -1
- data/test/functional/associations/test_one_as_proxy.rb +6 -0
- data/test/functional/test_accessible.rb +25 -0
- data/test/functional/test_indexes.rb +9 -1
- data/test/functional/test_protected.rb +16 -0
- metadata +9 -8
data/lib/mongo_mapper.rb
CHANGED
@@ -62,6 +62,7 @@ module MongoMapper
|
|
62
62
|
autoload :Collection, 'mongo_mapper/plugins/associations/collection'
|
63
63
|
autoload :EmbeddedCollection, 'mongo_mapper/plugins/associations/embedded_collection'
|
64
64
|
autoload :ManyAssociation, 'mongo_mapper/plugins/associations/many_association'
|
65
|
+
autoload :SingleAssociation, 'mongo_mapper/plugins/associations/single_association'
|
65
66
|
autoload :BelongsToAssociation, 'mongo_mapper/plugins/associations/belongs_to_association'
|
66
67
|
autoload :OneAssociation, 'mongo_mapper/plugins/associations/one_association'
|
67
68
|
autoload :ManyDocumentsProxy, 'mongo_mapper/plugins/associations/many_documents_proxy'
|
@@ -15,7 +15,7 @@ module MongoMapper
|
|
15
15
|
end
|
16
16
|
|
17
17
|
module InstanceMethods
|
18
|
-
def
|
18
|
+
def attributes=(attrs={})
|
19
19
|
super(filter_inaccessible_attrs(attrs))
|
20
20
|
end
|
21
21
|
|
@@ -29,7 +29,7 @@ module MongoMapper
|
|
29
29
|
|
30
30
|
protected
|
31
31
|
def filter_inaccessible_attrs(attrs)
|
32
|
-
return attrs if accessible_attributes
|
32
|
+
return attrs if !accessible_attributes? || attrs.blank?
|
33
33
|
attrs.dup.delete_if { |key, val| !accessible_attributes.include?(key.to_sym) }
|
34
34
|
end
|
35
35
|
end
|
@@ -2,8 +2,7 @@
|
|
2
2
|
module MongoMapper
|
3
3
|
module Plugins
|
4
4
|
module Associations
|
5
|
-
class BelongsToAssociation <
|
6
|
-
|
5
|
+
class BelongsToAssociation < SingleAssociation
|
7
6
|
def embeddable?
|
8
7
|
false
|
9
8
|
end
|
@@ -14,41 +13,7 @@ module MongoMapper
|
|
14
13
|
|
15
14
|
def setup(model)
|
16
15
|
model.key foreign_key, ObjectId unless model.key?(foreign_key)
|
17
|
-
|
18
|
-
model.associations_module.module_eval <<-end_eval
|
19
|
-
def #{name}
|
20
|
-
proxy = get_proxy(associations[#{name.inspect}])
|
21
|
-
proxy.nil? ? nil : proxy
|
22
|
-
end
|
23
|
-
|
24
|
-
def #{name}=(value)
|
25
|
-
association = associations[#{name.inspect}]
|
26
|
-
proxy = get_proxy(association)
|
27
|
-
|
28
|
-
if proxy.nil? || proxy.target != value
|
29
|
-
proxy = build_proxy(association)
|
30
|
-
end
|
31
|
-
|
32
|
-
proxy.replace(value)
|
33
|
-
value
|
34
|
-
end
|
35
|
-
|
36
|
-
def #{name}?
|
37
|
-
get_proxy(associations[#{name.inspect}]).present?
|
38
|
-
end
|
39
|
-
|
40
|
-
def build_#{name}(attrs={})
|
41
|
-
get_proxy(associations[#{name.inspect}]).build(attrs)
|
42
|
-
end
|
43
|
-
|
44
|
-
def create_#{name}(attrs={})
|
45
|
-
get_proxy(associations[#{name.inspect}]).create(attrs)
|
46
|
-
end
|
47
|
-
|
48
|
-
def create_#{name}!(attrs={})
|
49
|
-
get_proxy(associations[#{name.inspect}]).create!(attrs)
|
50
|
-
end
|
51
|
-
end_eval
|
16
|
+
super
|
52
17
|
end
|
53
18
|
|
54
19
|
def autosave?
|
@@ -2,7 +2,7 @@
|
|
2
2
|
module MongoMapper
|
3
3
|
module Plugins
|
4
4
|
module Associations
|
5
|
-
class OneAssociation <
|
5
|
+
class OneAssociation < SingleAssociation
|
6
6
|
def embeddable?
|
7
7
|
klass.embeddable?
|
8
8
|
end
|
@@ -17,17 +17,17 @@ module MongoMapper
|
|
17
17
|
OneProxy
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def setup(model)
|
22
22
|
super
|
23
|
-
|
23
|
+
|
24
24
|
association = self
|
25
25
|
options = self.options
|
26
26
|
|
27
27
|
model.before_destroy do
|
28
28
|
if !association.embeddable?
|
29
29
|
proxy = self.get_proxy(association)
|
30
|
-
|
30
|
+
|
31
31
|
unless proxy.nil?
|
32
32
|
case options[:dependent]
|
33
33
|
when :destroy then proxy.destroy
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MongoMapper
|
3
|
+
module Plugins
|
4
|
+
module Associations
|
5
|
+
class SingleAssociation < Base
|
6
|
+
def setup(model)
|
7
|
+
model.associations_module.module_eval <<-end_eval
|
8
|
+
def #{name}
|
9
|
+
proxy = get_proxy(associations[#{name.inspect}])
|
10
|
+
proxy.nil? ? nil : proxy
|
11
|
+
end
|
12
|
+
|
13
|
+
def #{name}=(value)
|
14
|
+
association = associations[#{name.inspect}]
|
15
|
+
proxy = get_proxy(association)
|
16
|
+
|
17
|
+
if proxy.nil? || proxy.target != value
|
18
|
+
proxy = build_proxy(association)
|
19
|
+
end
|
20
|
+
|
21
|
+
proxy.replace(value)
|
22
|
+
value
|
23
|
+
end
|
24
|
+
|
25
|
+
def #{name}?
|
26
|
+
get_proxy(associations[#{name.inspect}]).present?
|
27
|
+
end
|
28
|
+
|
29
|
+
def build_#{name}(attrs={})
|
30
|
+
get_proxy(associations[#{name.inspect}]).build(attrs)
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_#{name}(attrs={})
|
34
|
+
get_proxy(associations[#{name.inspect}]).create(attrs)
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_#{name}!(attrs={})
|
38
|
+
get_proxy(associations[#{name.inspect}]).create!(attrs)
|
39
|
+
end
|
40
|
+
end_eval
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -25,7 +25,7 @@ module MongoMapper
|
|
25
25
|
get_proxy(association).reset
|
26
26
|
end
|
27
27
|
instance_variables.each { |ivar| instance_variable_set(ivar, nil) }
|
28
|
-
|
28
|
+
load_from_database(doc)
|
29
29
|
self
|
30
30
|
else
|
31
31
|
raise DocumentNotFound, "Document match #{_id.inspect} does not exist in #{collection.name} collection"
|
@@ -34,14 +34,14 @@ module MongoMapper
|
|
34
34
|
|
35
35
|
module IdentityMapQueryMethods
|
36
36
|
def all(opts={})
|
37
|
-
query = clone.
|
37
|
+
query = clone.amend(opts)
|
38
38
|
super.tap do |docs|
|
39
39
|
model.remove_documents_from_map(docs) if query.fields?
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
43
|
def find_one(opts={})
|
44
|
-
query = clone.
|
44
|
+
query = clone.amend(opts)
|
45
45
|
|
46
46
|
if model.identity_map_on? && query.simple? && model.identity_map[query[:_id]]
|
47
47
|
model.identity_map[query[:_id]]
|
@@ -5,9 +5,8 @@ module MongoMapper
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
module ClassMethods
|
8
|
-
|
9
|
-
|
10
|
-
end
|
8
|
+
extend Forwardable
|
9
|
+
def_delegators :collection, :ensure_index, :create_index, :drop_index, :drop_indexes
|
11
10
|
end
|
12
11
|
end
|
13
12
|
end
|
@@ -111,7 +111,10 @@ module MongoMapper
|
|
111
111
|
end
|
112
112
|
|
113
113
|
def create_indexes_for(key)
|
114
|
-
|
114
|
+
if key.options[:index] && !key.embeddable?
|
115
|
+
warn "[DEPRECATION] :index option when defining key #{key.name.inspect} is deprecated. Put indexes in `db/indexes.rb`"
|
116
|
+
ensure_index key.name
|
117
|
+
end
|
115
118
|
end
|
116
119
|
|
117
120
|
def create_validations_for(key)
|
@@ -159,7 +162,7 @@ module MongoMapper
|
|
159
162
|
module InstanceMethods
|
160
163
|
def initialize(attrs={})
|
161
164
|
@_new = true
|
162
|
-
|
165
|
+
self.attributes = attrs
|
163
166
|
end
|
164
167
|
|
165
168
|
def initialize_from_database(attrs={})
|
@@ -205,16 +208,17 @@ module MongoMapper
|
|
205
208
|
alias :to_mongo :attributes
|
206
209
|
|
207
210
|
def assign(attrs={})
|
211
|
+
warn "[DEPRECATION] #assign is deprecated, use #attributes="
|
208
212
|
self.attributes = attrs
|
209
213
|
end
|
210
214
|
|
211
215
|
def update_attributes(attrs={})
|
212
|
-
|
216
|
+
self.attributes = attrs
|
213
217
|
save
|
214
218
|
end
|
215
219
|
|
216
220
|
def update_attributes!(attrs={})
|
217
|
-
|
221
|
+
self.attributes = attrs
|
218
222
|
save!
|
219
223
|
end
|
220
224
|
|
@@ -64,7 +64,7 @@ module MongoMapper
|
|
64
64
|
query = Plucky::Query.new(collection, :transformer => transformer)
|
65
65
|
query.extend(Decorator)
|
66
66
|
query.object_ids(object_id_keys)
|
67
|
-
query.
|
67
|
+
query.amend(options)
|
68
68
|
query.model(self)
|
69
69
|
query
|
70
70
|
end
|
@@ -80,7 +80,7 @@ module MongoMapper
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def find_some(ids, options={})
|
83
|
-
query = query(options).
|
83
|
+
query = query(options).amend(:_id => ids.flatten.compact.uniq)
|
84
84
|
find_many(query.to_hash).compact
|
85
85
|
end
|
86
86
|
|
@@ -1,13 +1,12 @@
|
|
1
1
|
namespace :db do
|
2
|
-
|
3
|
-
if not Rake::Task.task_defined?("db:drop")
|
2
|
+
unless Rake::Task.task_defined?("db:drop")
|
4
3
|
desc 'Drops all the collections for the database for the current Rails.env'
|
5
4
|
task :drop => :environment do
|
6
5
|
MongoMapper.database.collections.select {|c| c.name !~ /system/ }.each(&:drop)
|
7
6
|
end
|
8
7
|
end
|
9
8
|
|
10
|
-
|
9
|
+
unless Rake::Task.task_defined?("db:seed")
|
11
10
|
# if another ORM has defined db:seed, don't run it twice.
|
12
11
|
desc 'Load the seed data from db/seeds.rb'
|
13
12
|
task :seed => :environment do
|
@@ -16,29 +15,29 @@ namespace :db do
|
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
|
-
|
18
|
+
unless Rake::Task.task_defined?("db:setup")
|
20
19
|
desc 'Create the database, and initialize with the seed data'
|
21
20
|
task :setup => [ 'db:create', 'db:seed' ]
|
22
21
|
end
|
23
22
|
|
24
|
-
|
23
|
+
unless Rake::Task.task_defined?("db:reseed")
|
25
24
|
desc 'Delete data and seed'
|
26
25
|
task :reseed => [ 'db:drop', 'db:seed' ]
|
27
26
|
end
|
28
27
|
|
29
|
-
|
28
|
+
unless Rake::Task.task_defined?("db:create")
|
30
29
|
task :create => :environment do
|
31
30
|
# noop
|
32
31
|
end
|
33
32
|
end
|
34
33
|
|
35
|
-
|
34
|
+
unless Rake::Task.task_defined?("db:migrate")
|
36
35
|
task :migrate => :environment do
|
37
36
|
# noop
|
38
37
|
end
|
39
38
|
end
|
40
39
|
|
41
|
-
|
40
|
+
unless Rake::Task.task_defined?("db:schema:load")
|
42
41
|
namespace :schema do
|
43
42
|
task :load do
|
44
43
|
# noop
|
@@ -46,7 +45,7 @@ namespace :db do
|
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
49
|
-
|
48
|
+
unless Rake::Task.task_defined?("db:test:prepare")
|
50
49
|
namespace :test do
|
51
50
|
task :prepare => :environment do
|
52
51
|
MongoMapper.connect('test')
|
@@ -55,6 +54,12 @@ namespace :db do
|
|
55
54
|
end
|
56
55
|
end
|
57
56
|
end
|
57
|
+
|
58
|
+
desc 'Load the seed data from db/seeds.rb'
|
59
|
+
task :index => :environment do
|
60
|
+
indexes = File.join(Rails.root, 'db', 'indexes.rb')
|
61
|
+
load(indexes) if File.exist?(indexes)
|
62
|
+
end
|
58
63
|
end
|
59
64
|
|
60
65
|
task 'test:prepare' => 'db:test:prepare'
|
data/lib/mongo_mapper/version.rb
CHANGED
@@ -17,6 +17,12 @@ class OneAsProxyTest < Test::Unit::TestCase
|
|
17
17
|
nil.should === @post_class.new.author
|
18
18
|
end
|
19
19
|
|
20
|
+
should "not define any keys" do
|
21
|
+
count = @post_class.keys.length
|
22
|
+
@post_class.one :author, :class => @author_class
|
23
|
+
@post_class.keys.length.should == count
|
24
|
+
end
|
25
|
+
|
20
26
|
should "allow assignment of associated document using a hash" do
|
21
27
|
@post_class.one :author, :as => :authorable, :class => @author_class
|
22
28
|
|
@@ -58,6 +58,16 @@ class AccessibleTest < Test::Unit::TestCase
|
|
58
58
|
doc.name.should == 'John'
|
59
59
|
end
|
60
60
|
|
61
|
+
should "not ignore inaccessible attributes on #reload" do
|
62
|
+
doc = @doc_class.new(:name => 'John')
|
63
|
+
doc.admin = true
|
64
|
+
doc.save!
|
65
|
+
|
66
|
+
doc.reload
|
67
|
+
doc.admin.should be_true
|
68
|
+
doc.name.should == 'John'
|
69
|
+
end
|
70
|
+
|
61
71
|
should "ignore inaccessible attribute on #update_attributes" do
|
62
72
|
@doc.update_attributes(:name => 'Ren Hoek', :admin => true)
|
63
73
|
@doc.name.should == 'Ren Hoek'
|
@@ -70,6 +80,12 @@ class AccessibleTest < Test::Unit::TestCase
|
|
70
80
|
@doc.admin.should be_false
|
71
81
|
end
|
72
82
|
|
83
|
+
should "ignore inaccessible attribute on #attributes=" do
|
84
|
+
@doc.attributes = {:name => 'Ren Hoek', :admin => true}
|
85
|
+
@doc.name.should == 'Ren Hoek'
|
86
|
+
@doc.admin.should be_false
|
87
|
+
end
|
88
|
+
|
73
89
|
should "be indifferent to whether the accessible keys are strings or symbols" do
|
74
90
|
@doc.update_attributes!("name" => 'Stimpson J. Cat', "admin" => true)
|
75
91
|
@doc.name.should == 'Stimpson J. Cat'
|
@@ -79,6 +95,15 @@ class AccessibleTest < Test::Unit::TestCase
|
|
79
95
|
should "accept nil as constructor's argument without raising exception" do
|
80
96
|
lambda { @doc_class.new(nil) }.should_not raise_error
|
81
97
|
end
|
98
|
+
|
99
|
+
should "ignore all attributes if called with no args" do
|
100
|
+
@doc_class = Doc do
|
101
|
+
key :name
|
102
|
+
attr_accessible
|
103
|
+
end
|
104
|
+
|
105
|
+
@doc_class.new(:name => 'Steve Sloan').name.should be_nil
|
106
|
+
end
|
82
107
|
end
|
83
108
|
|
84
109
|
context "Single collection inherited accessible attributes" do
|
@@ -12,6 +12,14 @@ class IndexingTest < Test::Unit::TestCase
|
|
12
12
|
end
|
13
13
|
teardown { drop_indexes(@document) }
|
14
14
|
|
15
|
+
[:create_index, :ensure_index, :drop_index, :drop_indexes].each do |method|
|
16
|
+
should "delegate #{method} to collection" do
|
17
|
+
@document.stubs(:collection).returns(mock(:name => :foo))
|
18
|
+
@document.collection.expects(method).with(:arg)
|
19
|
+
@document.send(method, :arg)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
15
23
|
should "allow creating index for a key" do
|
16
24
|
@document.ensure_index :first_name
|
17
25
|
@document.should have_index('first_name_1')
|
@@ -35,7 +43,7 @@ class IndexingTest < Test::Unit::TestCase
|
|
35
43
|
end
|
36
44
|
|
37
45
|
should "work with :index shortcut when defining key" do
|
38
|
-
@document.key :father, String, :index => true
|
46
|
+
silence_stderr { @document.key :father, String, :index => true }
|
39
47
|
@document.should have_index('father_1')
|
40
48
|
end
|
41
49
|
end
|
@@ -64,6 +64,16 @@ class ProtectedTest < Test::Unit::TestCase
|
|
64
64
|
doc.name.should == 'John'
|
65
65
|
end
|
66
66
|
|
67
|
+
should "not ignore protected attributes on #reload" do
|
68
|
+
doc = @doc_class.new(:name => 'John')
|
69
|
+
doc.admin = true
|
70
|
+
doc.save!
|
71
|
+
|
72
|
+
doc.reload
|
73
|
+
doc.admin.should be_true
|
74
|
+
doc.name.should == 'John'
|
75
|
+
end
|
76
|
+
|
67
77
|
should "ignore protected attribute on #update_attributes" do
|
68
78
|
@doc.update_attributes(:name => 'Ren Hoek', :admin => true)
|
69
79
|
@doc.name.should == 'Ren Hoek'
|
@@ -76,6 +86,12 @@ class ProtectedTest < Test::Unit::TestCase
|
|
76
86
|
@doc.admin.should be_false
|
77
87
|
end
|
78
88
|
|
89
|
+
should "ignore protecteds attribute on #attributes=" do
|
90
|
+
@doc.attributes = {:name => 'Stimpson J. Cat', :admin => true}
|
91
|
+
@doc.name.should == 'Stimpson J. Cat'
|
92
|
+
@doc.admin.should be_false
|
93
|
+
end
|
94
|
+
|
79
95
|
should "be indifferent to whether the protected keys are strings or symbols" do
|
80
96
|
@doc.update_attributes!("name" => 'Stimpson J. Cat', "admin" => true)
|
81
97
|
@doc.name.should == 'Stimpson J. Cat'
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 53
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 10
|
9
|
-
-
|
10
|
-
version: 0.10.
|
9
|
+
- 1
|
10
|
+
version: 0.10.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Nunemaker
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-11-
|
18
|
+
date: 2011-11-07 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -55,12 +55,12 @@ dependencies:
|
|
55
55
|
requirements:
|
56
56
|
- - ~>
|
57
57
|
- !ruby/object:Gem::Version
|
58
|
-
hash:
|
58
|
+
hash: 15
|
59
59
|
segments:
|
60
60
|
- 0
|
61
|
-
-
|
62
|
-
-
|
63
|
-
version: 0.
|
61
|
+
- 4
|
62
|
+
- 0
|
63
|
+
version: 0.4.0
|
64
64
|
prerelease: false
|
65
65
|
type: :runtime
|
66
66
|
requirement: *id003
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb
|
129
129
|
- lib/mongo_mapper/plugins/associations/one_proxy.rb
|
130
130
|
- lib/mongo_mapper/plugins/associations/proxy.rb
|
131
|
+
- lib/mongo_mapper/plugins/associations/single_association.rb
|
131
132
|
- lib/mongo_mapper/plugins/associations.rb
|
132
133
|
- lib/mongo_mapper/plugins/caching.rb
|
133
134
|
- lib/mongo_mapper/plugins/callbacks.rb
|