mongo_mapper-unstable 2009.12.14 → 2009.12.16
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/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/mongo_mapper.rb +10 -0
- data/lib/mongo_mapper/associations.rb +26 -139
- data/lib/mongo_mapper/dirty.rb +2 -2
- data/lib/mongo_mapper/document.rb +1 -1
- data/lib/mongo_mapper/embedded_document.rb +10 -17
- data/mongo_mapper.gemspec +5 -5
- data/test/functional/test_dirty.rb +4 -4
- data/test/functional/test_document.rb +9 -0
- metadata +3 -3
data/Rakefile
CHANGED
@@ -12,7 +12,7 @@ Jeweler::Tasks.new do |gem|
|
|
12
12
|
gem.authors = ["John Nunemaker"]
|
13
13
|
|
14
14
|
gem.add_dependency('activesupport', '>= 2.3')
|
15
|
-
gem.add_dependency('mongo', '0.18')
|
15
|
+
gem.add_dependency('mongo', '0.18.1')
|
16
16
|
gem.add_dependency('jnunemaker-validatable', '1.8.1')
|
17
17
|
|
18
18
|
gem.add_development_dependency('jnunemaker-matchy', '0.4.0')
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2009.12.
|
1
|
+
2009.12.16
|
data/lib/mongo_mapper.rb
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# if Gem is defined i'll assume you are using rubygems and lock specific versions
|
2
|
+
# call me crazy but a plain old require will just get the latest version you have installed
|
3
|
+
# so i want to make sure that if you are using gems you do in fact have the correct versions
|
4
|
+
# if there is a better way to do this, please enlighten me!
|
5
|
+
if self.class.const_defined?(:Gem)
|
6
|
+
gem 'activesupport', '>= 2.3'
|
7
|
+
gem 'mongo', '0.18.1'
|
8
|
+
gem 'jnunemaker-validatable', '1.8.1'
|
9
|
+
end
|
10
|
+
|
1
11
|
require 'active_support'
|
2
12
|
require 'mongo'
|
3
13
|
require 'validatable'
|
@@ -1,140 +1,34 @@
|
|
1
1
|
module MongoMapper
|
2
2
|
module Associations
|
3
3
|
module ClassMethods
|
4
|
-
##
|
5
|
-
# This macro allows you define a "belongs-to" relationship between one
|
6
|
-
# document and some other document.
|
7
|
-
#
|
8
|
-
# == Requirements
|
9
|
-
#
|
10
|
-
# Usage of this macro requires that your document define a key that can
|
11
|
-
# be used to store the ID of the target document that is the parent of
|
12
|
-
# this document.
|
13
|
-
#
|
14
|
-
# == Conventions
|
15
|
-
#
|
16
|
-
# The following is a list of the conventions used by MongoMapper in
|
17
|
-
# defining a belongs-to relationship. Each can likely be overridden via
|
18
|
-
# the +options+ parameter.
|
19
|
-
#
|
20
|
-
# * The name of your belongs-to association is the lowercase, singular
|
21
|
-
# name of the target class
|
22
|
-
# * A key with the name of your association exists with an "_id" suffix
|
23
|
-
# to store the ID of the target of this relationship
|
24
|
-
#
|
25
|
-
# @param [Symbol] association_id The name of this association
|
26
|
-
# @param [Hash] options Optional parameters that define the
|
27
|
-
# characteristics of this relationship. These are often used to
|
28
|
-
# override MongoMapper conventions.
|
29
|
-
# @option options [Boolean] :polymorphic (false) Set this option to
|
30
|
-
# <code>true</code> to define a relationship that can be between this
|
31
|
-
# document and any other type of document. Note that you *must* also
|
32
|
-
# have a key on your document to store the type of document in this
|
33
|
-
# relationship.
|
34
|
-
# @option options [String] :class_name If your relationship doesn't use
|
35
|
-
# the name of some class, you *must* use this option to indicate the
|
36
|
-
# target class for this relationship.
|
37
|
-
# @option options [Symbol] :foreign_key Use this option to specify a
|
38
|
-
# non-conventional key that stores the ID of the parent in this
|
39
|
-
# relationship
|
40
|
-
#
|
41
|
-
# @example Conventional, and simple, usage of <code>belongs_to</code>
|
42
|
-
# class Novel
|
43
|
-
# include MongoMapper::Document
|
44
|
-
#
|
45
|
-
# key :author_id, String # our "foreign key"
|
46
|
-
#
|
47
|
-
# belongs_to :author
|
48
|
-
# end
|
49
|
-
#
|
50
|
-
# @example Using :foreign_key and :class_name
|
51
|
-
# class Pet
|
52
|
-
# include MongoMapper::Document
|
53
|
-
#
|
54
|
-
# key :person_id, String
|
55
|
-
#
|
56
|
-
# belongs_to :owner,
|
57
|
-
# :foreign_key => :person_id,
|
58
|
-
# :class_name => "Person"
|
59
|
-
# end
|
60
|
-
#
|
61
|
-
# @example Defining a polymorphic belongs-to relationship
|
62
|
-
# class Vehicle
|
63
|
-
# include MongoMapper::Document
|
64
|
-
#
|
65
|
-
# key :owner_id, String
|
66
|
-
# key :owner_type, String
|
67
|
-
#
|
68
|
-
# belongs_to :owner,
|
69
|
-
# :polymorphic => true
|
70
|
-
# end
|
71
|
-
#
|
72
|
-
# @example Non-standard polymorphic belongs-to relationship
|
73
|
-
# class Vehicle
|
74
|
-
# include MongoMapper::Document
|
75
|
-
#
|
76
|
-
# key :person_id, String
|
77
|
-
# key :person_type, String
|
78
|
-
#
|
79
|
-
# belongs_to :owner,
|
80
|
-
# :polymorphic => true,
|
81
|
-
# :foreign_key => "person_id",
|
82
|
-
# :type_key_name => "person_type"
|
83
|
-
# end
|
84
4
|
def belongs_to(association_id, options={}, &extension)
|
85
5
|
create_association(:belongs_to, association_id, options, &extension)
|
86
6
|
self
|
87
7
|
end
|
88
8
|
|
89
|
-
##
|
90
|
-
# This macro allows you to define a "has-many" relationship between a
|
91
|
-
# document, and numerous child documents.
|
92
|
-
#
|
93
|
-
# == Conventions
|
94
|
-
#
|
95
|
-
# The following is a list of the conventions used by MongoMapper in
|
96
|
-
# defining this relationship. Each can likely be overridden via the
|
97
|
-
# +options+ parameter.
|
98
|
-
#
|
99
|
-
# * The name of your association is the lowercase, *plural* name of the
|
100
|
-
# target class
|
101
|
-
# * Your target class must have a "foreign key" bearing the name of this
|
102
|
-
# class suffixed by "_id"
|
103
|
-
#
|
104
|
-
# @param [Symbol] association_id The name of this association
|
105
|
-
# @param [Hash] options Optional parameters that define the
|
106
|
-
# characteristics of this relationship. These are often used to
|
107
|
-
# override MongoMapper conventions.
|
108
|
-
# @option options [String] :class_name If your relationship doesn't use
|
109
|
-
# the name of some class, you *must* use this option to indicate the
|
110
|
-
# target class for this relationship.
|
111
|
-
# @option options [Symbol] :foreign_key Use this option to specify a
|
112
|
-
# non-conventional key that stores the ID of the parent in this
|
113
|
-
# relationship
|
114
|
-
# @option options [#to_s] :as Used when the target relationship is
|
115
|
-
# polymorphic (i.e. the +belongs_to+ has set <tt>:polymorphic</tt> to
|
116
|
-
# +true+). See examples for usage.
|
117
9
|
def many(association_id, options={}, &extension)
|
118
10
|
create_association(:many, association_id, options, &extension)
|
119
11
|
self
|
120
12
|
end
|
121
|
-
|
13
|
+
|
122
14
|
def associations
|
123
|
-
@associations ||=
|
124
|
-
|
125
|
-
|
15
|
+
@associations ||= HashWithIndifferentAccess.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def associations=(hash)
|
19
|
+
@associations = hash
|
20
|
+
end
|
21
|
+
|
22
|
+
def inherited(subclass)
|
23
|
+
subclass.associations = associations.dup
|
24
|
+
super
|
126
25
|
end
|
127
26
|
|
128
27
|
private
|
129
28
|
def create_association(type, name, options, &extension)
|
130
29
|
association = Associations::Base.new(type, name, options, &extension)
|
131
30
|
associations[association.name] = association
|
132
|
-
|
133
|
-
define_dependent_callback(association)
|
134
|
-
association
|
135
|
-
end
|
136
|
-
|
137
|
-
def define_association_methods(association)
|
31
|
+
|
138
32
|
define_method(association.name) do
|
139
33
|
get_proxy(association)
|
140
34
|
end
|
@@ -143,39 +37,32 @@ module MongoMapper
|
|
143
37
|
get_proxy(association).replace(value)
|
144
38
|
value
|
145
39
|
end
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
if association.options[:dependent]
|
150
|
-
if association.many?
|
151
|
-
define_dependent_callback_for_many(association)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def define_dependent_callback_for_many(association)
|
157
|
-
after_destroy do |doc|
|
158
|
-
if !association.embeddable?
|
40
|
+
|
41
|
+
if association.options[:dependent] && association.many? && !association.embeddable?
|
42
|
+
after_destroy do |doc|
|
159
43
|
case association.options[:dependent]
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
44
|
+
when :destroy
|
45
|
+
doc.get_proxy(association).destroy_all
|
46
|
+
when :delete_all
|
47
|
+
doc.get_proxy(association).delete_all
|
48
|
+
when :nullify
|
49
|
+
doc.get_proxy(association).nullify
|
166
50
|
end
|
167
51
|
end
|
168
52
|
end
|
169
53
|
end
|
170
54
|
end
|
171
|
-
|
55
|
+
|
172
56
|
module InstanceMethods
|
57
|
+
def associations
|
58
|
+
self.class.associations
|
59
|
+
end
|
60
|
+
|
173
61
|
def get_proxy(association)
|
174
62
|
unless proxy = self.instance_variable_get(association.ivar)
|
175
63
|
proxy = association.proxy_class.new(self, association)
|
176
64
|
self.instance_variable_set(association.ivar, proxy) if !frozen?
|
177
65
|
end
|
178
|
-
|
179
66
|
proxy
|
180
67
|
end
|
181
68
|
end
|
data/lib/mongo_mapper/dirty.rb
CHANGED
@@ -67,8 +67,8 @@ module MongoMapper
|
|
67
67
|
end
|
68
68
|
|
69
69
|
# <tt>reload</tt> the record and clears changed keys.
|
70
|
-
# def
|
71
|
-
# record =
|
70
|
+
# def reload(*args) #:nodoc:
|
71
|
+
# record = super
|
72
72
|
# changed_keys.clear
|
73
73
|
# record
|
74
74
|
# end
|
@@ -427,7 +427,7 @@ module MongoMapper
|
|
427
427
|
|
428
428
|
def reload
|
429
429
|
doc = self.class.find(_id)
|
430
|
-
self.class.associations.each { |name, assoc| send(name).reset }
|
430
|
+
self.class.associations.each { |name, assoc| send(name).reset if respond_to?(name) }
|
431
431
|
self.attributes = doc.attributes
|
432
432
|
self
|
433
433
|
end
|
@@ -1,12 +1,10 @@
|
|
1
|
-
require 'observer'
|
2
|
-
|
3
1
|
module MongoMapper
|
4
2
|
module EmbeddedDocument
|
5
3
|
def self.included(model)
|
6
4
|
model.class_eval do
|
7
5
|
extend ClassMethods
|
8
6
|
include InstanceMethods
|
9
|
-
|
7
|
+
|
10
8
|
extend Associations::ClassMethods
|
11
9
|
include Associations::InstanceMethods
|
12
10
|
|
@@ -81,14 +79,9 @@ module MongoMapper
|
|
81
79
|
instance.to_mongo
|
82
80
|
end
|
83
81
|
|
84
|
-
def from_mongo(
|
85
|
-
return nil if
|
86
|
-
|
87
|
-
if instance_or_hash.is_a?(self)
|
88
|
-
instance_or_hash
|
89
|
-
else
|
90
|
-
initialize_doc(instance_or_hash)
|
91
|
-
end
|
82
|
+
def from_mongo(value)
|
83
|
+
return nil if value.nil?
|
84
|
+
value.is_a?(self) ? value : initialize_doc(value)
|
92
85
|
end
|
93
86
|
|
94
87
|
private
|
@@ -179,13 +172,9 @@ module MongoMapper
|
|
179
172
|
end
|
180
173
|
|
181
174
|
module InstanceMethods
|
182
|
-
def logger
|
183
|
-
self.class.logger
|
184
|
-
end
|
185
|
-
|
186
175
|
def initialize(attrs={})
|
187
176
|
unless attrs.nil?
|
188
|
-
|
177
|
+
associations.each do |name, association|
|
189
178
|
if collection = attrs.delete(name)
|
190
179
|
if association.many? && association.klass.embeddable?
|
191
180
|
root_document = attrs[:_root_document] || self
|
@@ -337,6 +326,10 @@ module MongoMapper
|
|
337
326
|
self.attributes = attrs
|
338
327
|
save!
|
339
328
|
end
|
329
|
+
|
330
|
+
def logger
|
331
|
+
self.class.logger
|
332
|
+
end
|
340
333
|
|
341
334
|
private
|
342
335
|
def _keys
|
@@ -380,7 +373,7 @@ module MongoMapper
|
|
380
373
|
end
|
381
374
|
|
382
375
|
def embedded_associations
|
383
|
-
|
376
|
+
associations.select do |name, association|
|
384
377
|
association.embeddable?
|
385
378
|
end.map do |name, association|
|
386
379
|
association
|
data/mongo_mapper.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongo_mapper}
|
8
|
-
s.version = "0.6.
|
8
|
+
s.version = "0.6.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John Nunemaker"]
|
12
|
-
s.date = %q{2009-12-
|
12
|
+
s.date = %q{2009-12-15}
|
13
13
|
s.default_executable = %q{mmconsole}
|
14
14
|
s.email = %q{nunemaker@gmail.com}
|
15
15
|
s.executables = ["mmconsole"]
|
@@ -145,7 +145,7 @@ Gem::Specification.new do |s|
|
|
145
145
|
|
146
146
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
147
147
|
s.add_runtime_dependency(%q<activesupport>, [">= 2.3"])
|
148
|
-
s.add_runtime_dependency(%q<mongo>, ["= 0.18"])
|
148
|
+
s.add_runtime_dependency(%q<mongo>, ["= 0.18.1"])
|
149
149
|
s.add_runtime_dependency(%q<jnunemaker-validatable>, ["= 1.8.1"])
|
150
150
|
s.add_development_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
|
151
151
|
s.add_development_dependency(%q<shoulda>, ["= 2.10.2"])
|
@@ -153,7 +153,7 @@ Gem::Specification.new do |s|
|
|
153
153
|
s.add_development_dependency(%q<mocha>, ["= 0.9.8"])
|
154
154
|
else
|
155
155
|
s.add_dependency(%q<activesupport>, [">= 2.3"])
|
156
|
-
s.add_dependency(%q<mongo>, ["= 0.18"])
|
156
|
+
s.add_dependency(%q<mongo>, ["= 0.18.1"])
|
157
157
|
s.add_dependency(%q<jnunemaker-validatable>, ["= 1.8.1"])
|
158
158
|
s.add_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
|
159
159
|
s.add_dependency(%q<shoulda>, ["= 2.10.2"])
|
@@ -162,7 +162,7 @@ Gem::Specification.new do |s|
|
|
162
162
|
end
|
163
163
|
else
|
164
164
|
s.add_dependency(%q<activesupport>, [">= 2.3"])
|
165
|
-
s.add_dependency(%q<mongo>, ["= 0.18"])
|
165
|
+
s.add_dependency(%q<mongo>, ["= 0.18.1"])
|
166
166
|
s.add_dependency(%q<jnunemaker-validatable>, ["= 1.8.1"])
|
167
167
|
s.add_dependency(%q<jnunemaker-matchy>, ["= 0.4.0"])
|
168
168
|
s.add_dependency(%q<shoulda>, ["= 2.10.2"])
|
@@ -54,15 +54,15 @@ class DirtyTest < Test::Unit::TestCase
|
|
54
54
|
|
55
55
|
should "not happen when loading from database" do
|
56
56
|
doc = @document.create(:phrase => 'Foo')
|
57
|
-
|
58
|
-
doc
|
57
|
+
doc.phrase = 'Fart'
|
58
|
+
doc.changed?.should be_true
|
59
|
+
doc.reload
|
59
60
|
doc.changed?.should be_false
|
60
61
|
end
|
61
62
|
|
62
63
|
should "happen if changed after loading from database" do
|
63
64
|
doc = @document.create(:phrase => 'Foo')
|
64
|
-
|
65
|
-
doc = doc.reload
|
65
|
+
doc.reload
|
66
66
|
doc.changed?.should be_false
|
67
67
|
doc.phrase = 'Bar'
|
68
68
|
doc.changed?.should be_true
|
@@ -962,6 +962,8 @@ class DocumentTest < Test::Unit::TestCase
|
|
962
962
|
class ::DocDaughter < ::DocParent; end
|
963
963
|
class ::DocSon < ::DocParent; end
|
964
964
|
class ::DocGrandSon < ::DocSon; end
|
965
|
+
|
966
|
+
DocSon.many :children, :class_name => 'DocGrandSon'
|
965
967
|
|
966
968
|
@parent = DocParent.new({:name => "Daddy Warbucks"})
|
967
969
|
@daughter = DocDaughter.new({:name => "Little Orphan Annie"})
|
@@ -1100,6 +1102,13 @@ class DocumentTest < Test::Unit::TestCase
|
|
1100
1102
|
DocParent.delete_all
|
1101
1103
|
}.should change { DocParent.count }.by(-2)
|
1102
1104
|
end
|
1105
|
+
|
1106
|
+
should "be able to reload parent inherited class" do
|
1107
|
+
brian = DocParent.create(:name => 'Brian')
|
1108
|
+
brian.name = 'B-Dawg'
|
1109
|
+
brian.reload
|
1110
|
+
brian.name.should == 'Brian'
|
1111
|
+
end
|
1103
1112
|
end
|
1104
1113
|
|
1105
1114
|
context "timestamping" do
|
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: 2009.12.
|
4
|
+
version: 2009.12.16
|
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: 2009-12-
|
12
|
+
date: 2009-12-16 00:00:00 -05:00
|
13
13
|
default_executable: mmconsole
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.18.1
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: jnunemaker-validatable
|