mongoid 2.2.0 → 2.2.1

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.
Files changed (52) hide show
  1. data/CHANGELOG.md +57 -3
  2. data/Rakefile +1 -1
  3. data/lib/mongoid/atomic/modifiers.rb +2 -1
  4. data/lib/mongoid/config.rb +0 -1
  5. data/lib/mongoid/config/replset_database.rb +2 -2
  6. data/lib/mongoid/contexts/mongo.rb +14 -5
  7. data/lib/mongoid/criteria.rb +4 -4
  8. data/lib/mongoid/criterion/inclusion.rb +16 -1
  9. data/lib/mongoid/document.rb +2 -4
  10. data/lib/mongoid/extensions.rb +7 -0
  11. data/lib/mongoid/extensions/integer/checks.rb +23 -0
  12. data/lib/mongoid/extensions/object/yoda.rb +16 -0
  13. data/lib/mongoid/extensions/object_id/conversions.rb +1 -1
  14. data/lib/mongoid/extensions/string/checks.rb +24 -0
  15. data/lib/mongoid/extensions/string/inflections.rb +1 -1
  16. data/lib/mongoid/fields.rb +4 -2
  17. data/lib/mongoid/fields/serializable.rb +26 -18
  18. data/lib/mongoid/fields/serializable/array.rb +0 -1
  19. data/lib/mongoid/fields/serializable/boolean.rb +0 -1
  20. data/lib/mongoid/fields/serializable/float.rb +0 -1
  21. data/lib/mongoid/fields/serializable/integer.rb +1 -2
  22. data/lib/mongoid/fields/serializable/object_id.rb +0 -1
  23. data/lib/mongoid/fields/serializable/string.rb +0 -1
  24. data/lib/mongoid/fields/serializable/symbol.rb +0 -1
  25. data/lib/mongoid/matchers/strategies.rb +25 -2
  26. data/lib/mongoid/nested_attributes.rb +1 -1
  27. data/lib/mongoid/persistence/atomic.rb +2 -2
  28. data/lib/mongoid/persistence/atomic/{set.rb → sets.rb} +1 -1
  29. data/lib/mongoid/persistence/deletion.rb +1 -1
  30. data/lib/mongoid/relations/bindings/referenced/in.rb +5 -5
  31. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -4
  32. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +2 -2
  33. data/lib/mongoid/relations/bindings/referenced/one.rb +4 -4
  34. data/lib/mongoid/relations/builder.rb +1 -2
  35. data/lib/mongoid/relations/builders/nested_attributes/many.rb +5 -4
  36. data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
  37. data/lib/mongoid/relations/builders/referenced/many.rb +4 -2
  38. data/lib/mongoid/relations/cascading/destroy.rb +8 -1
  39. data/lib/mongoid/relations/embedded/in.rb +1 -1
  40. data/lib/mongoid/relations/embedded/many.rb +15 -2
  41. data/lib/mongoid/relations/embedded/one.rb +1 -1
  42. data/lib/mongoid/relations/nested_builder.rb +11 -4
  43. data/lib/mongoid/relations/referenced/many.rb +4 -2
  44. data/lib/mongoid/relations/referenced/many_to_many.rb +2 -1
  45. data/lib/mongoid/relations/synchronization.rb +39 -2
  46. data/lib/mongoid/relations/targets/enumerable.rb +2 -2
  47. data/lib/mongoid/serialization.rb +1 -1
  48. data/lib/mongoid/state.rb +1 -1
  49. data/lib/mongoid/version.rb +1 -1
  50. data/lib/mongoid/versioning.rb +15 -1
  51. metadata +26 -22
  52. data/lib/mongoid/criterion/unconvertable.rb +0 -20
@@ -50,6 +50,20 @@ module Mongoid # :nodoc:
50
50
  !!synced[foreign_key]
51
51
  end
52
52
 
53
+ # Update the inverse keys on destroy.
54
+ #
55
+ # @example Update the inverse keys.
56
+ # document.remove_inverse_keys(metadata)
57
+ #
58
+ # @param [ Metadata ] meta The document metadata.
59
+ #
60
+ # @return [ Object ] The updated values.
61
+ #
62
+ # @since 2.2.1
63
+ def remove_inverse_keys(meta)
64
+ meta.criteria(send(meta.foreign_key)).pull(meta.inverse_foreign_key, id)
65
+ end
66
+
53
67
  # Update the inverse keys for the relation.
54
68
  #
55
69
  # @example Update the inverse keys
@@ -63,8 +77,9 @@ module Mongoid # :nodoc:
63
77
  def update_inverse_keys(meta)
64
78
  return unless changes.has_key?(meta.foreign_key)
65
79
  old, new = changes[meta.foreign_key]
66
- meta.criteria(new - old).add_to_set(meta.inverse_foreign_key, id)
67
- meta.criteria(old - new).pull(meta.inverse_foreign_key, id)
80
+ adds, subs = new - old, old - new
81
+ meta.criteria(adds).add_to_set(meta.inverse_foreign_key, id) unless adds.empty?
82
+ meta.criteria(subs).pull(meta.inverse_foreign_key, id) unless subs.empty?
68
83
  end
69
84
 
70
85
  module ClassMethods #:nodoc:
@@ -79,6 +94,7 @@ module Mongoid # :nodoc:
79
94
  # @since 2.1.0
80
95
  def synced(metadata)
81
96
  synced_save(metadata)
97
+ synced_destroy(metadata)
82
98
  end
83
99
 
84
100
  private
@@ -108,6 +124,27 @@ module Mongoid # :nodoc:
108
124
  end
109
125
  end
110
126
  end
127
+
128
+ # Set up the sync of inverse keys that needs to happen on a destroy.
129
+ #
130
+ # @example Set up the destroy syncing.
131
+ # Person.synced_destroy(metadata)
132
+ #
133
+ # @param [ Metadata ] metadata The relation metadata.
134
+ #
135
+ # @return [ Class ] The class getting set up.
136
+ #
137
+ # @since 2.2.1
138
+ def synced_destroy(metadata)
139
+ tap do
140
+ set_callback(
141
+ :destroy,
142
+ :after
143
+ ) do |doc|
144
+ doc.remove_inverse_keys(metadata)
145
+ end
146
+ end
147
+ end
111
148
  end
112
149
  end
113
150
  end
@@ -156,7 +156,7 @@ module Mongoid #:nodoc:
156
156
  end
157
157
  end
158
158
  added.each do |doc|
159
- next unless doc.new?
159
+ next if doc.persisted? && (!loaded? && !loaded.empty?)
160
160
  yield(doc)
161
161
  end
162
162
  @executed = true
@@ -316,7 +316,7 @@ module Mongoid #:nodoc:
316
316
  #
317
317
  # @since 2.1.0
318
318
  def size
319
- (loaded? ? loaded.count : unloaded.count) + added.count{ |d| d.new? }
319
+ (unloaded ? unloaded.count : loaded.count) + added.count{ |d| d.new? }
320
320
  end
321
321
  alias :length :size
322
322
 
@@ -50,7 +50,7 @@ module Mongoid # :nodoc:
50
50
  #
51
51
  # @since 2.1.0
52
52
  def mongoize(object, klass = Object)
53
- Fields::Mappings.for(klass).new(:mongoize).serialize(object)
53
+ Fields::Mappings.for(klass).instantiate(:mongoize).serialize(object)
54
54
  end
55
55
  end
56
56
 
@@ -83,7 +83,7 @@ module Mongoid #:nodoc:
83
83
  #
84
84
  # @since 2.1.0
85
85
  def settable?
86
- new? && embedded_one?
86
+ new? && embedded_one? && _parent.persisted?
87
87
  end
88
88
 
89
89
  # Is the document updateable?
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc
3
- VERSION = "2.2.0"
3
+ VERSION = "2.2.1"
4
4
  end
@@ -53,6 +53,20 @@ module Mongoid #:nodoc:
53
53
  end
54
54
  end
55
55
 
56
+ # Forces the creation of a new version of the +Document+, regardless of
57
+ # whether a change was actually made.
58
+ #
59
+ # @example Revise the document.
60
+ # person.revise!
61
+ #
62
+ # @since 2.2.1
63
+ def revise!
64
+ new_version = versions.build((previous_revision || self).versioned_attributes)
65
+ versions.shift if version_max.present? && versions.length > version_max
66
+ self.version = (version || 1 ) + 1
67
+ save
68
+ end
69
+
56
70
  # Filters the results of +changes+ by removing any fields that should
57
71
  # not be versioned.
58
72
  #
@@ -153,7 +167,7 @@ module Mongoid #:nodoc:
153
167
  # @since 2.1.0
154
168
  def only_versioned_attributes(hash)
155
169
  {}.tap do |versioned|
156
- hash.each_pair do |name, value|
170
+ hash.except("versions").each_pair do |name, value|
157
171
  field = fields[name]
158
172
  versioned[name] = value if !field || field.versioned?
159
173
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-28 00:00:00.000000000Z
12
+ date: 2011-09-21 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
16
- requirement: &70328311594300 !ruby/object:Gem::Requirement
16
+ requirement: &70136033446360 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70328311594300
24
+ version_requirements: *70136033446360
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: tzinfo
27
- requirement: &70328311593640 !ruby/object:Gem::Requirement
27
+ requirement: &70136033445580 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,21 +32,24 @@ dependencies:
32
32
  version: 0.3.22
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70328311593640
35
+ version_requirements: *70136033445580
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mongo
38
- requirement: &70328311593000 !ruby/object:Gem::Requirement
38
+ requirement: &70136033444420 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
- - - ~>
41
+ - - ! '>='
42
42
  - !ruby/object:Gem::Version
43
43
  version: '1.3'
44
+ - - <
45
+ - !ruby/object:Gem::Version
46
+ version: '1.4'
44
47
  type: :runtime
45
48
  prerelease: false
46
- version_requirements: *70328311593000
49
+ version_requirements: *70136033444420
47
50
  - !ruby/object:Gem::Dependency
48
51
  name: rdoc
49
- requirement: &70328311587860 !ruby/object:Gem::Requirement
52
+ requirement: &70136033443180 !ruby/object:Gem::Requirement
50
53
  none: false
51
54
  requirements:
52
55
  - - ~>
@@ -54,10 +57,10 @@ dependencies:
54
57
  version: 3.5.0
55
58
  type: :development
56
59
  prerelease: false
57
- version_requirements: *70328311587860
60
+ version_requirements: *70136033443180
58
61
  - !ruby/object:Gem::Dependency
59
62
  name: bson_ext
60
- requirement: &70328311586580 !ruby/object:Gem::Requirement
63
+ requirement: &70136033442040 !ruby/object:Gem::Requirement
61
64
  none: false
62
65
  requirements:
63
66
  - - ~>
@@ -65,10 +68,10 @@ dependencies:
65
68
  version: '1.3'
66
69
  type: :development
67
70
  prerelease: false
68
- version_requirements: *70328311586580
71
+ version_requirements: *70136033442040
69
72
  - !ruby/object:Gem::Dependency
70
73
  name: mocha
71
- requirement: &70328311585580 !ruby/object:Gem::Requirement
74
+ requirement: &70136033440960 !ruby/object:Gem::Requirement
72
75
  none: false
73
76
  requirements:
74
77
  - - ~>
@@ -76,10 +79,10 @@ dependencies:
76
79
  version: 0.9.12
77
80
  type: :development
78
81
  prerelease: false
79
- version_requirements: *70328311585580
82
+ version_requirements: *70136033440960
80
83
  - !ruby/object:Gem::Dependency
81
84
  name: rspec
82
- requirement: &70328311584820 !ruby/object:Gem::Requirement
85
+ requirement: &70136033439820 !ruby/object:Gem::Requirement
83
86
  none: false
84
87
  requirements:
85
88
  - - ~>
@@ -87,10 +90,10 @@ dependencies:
87
90
  version: '2.6'
88
91
  type: :development
89
92
  prerelease: false
90
- version_requirements: *70328311584820
93
+ version_requirements: *70136033439820
91
94
  - !ruby/object:Gem::Dependency
92
95
  name: watchr
93
- requirement: &70328311583660 !ruby/object:Gem::Requirement
96
+ requirement: &70136033438380 !ruby/object:Gem::Requirement
94
97
  none: false
95
98
  requirements:
96
99
  - - ~>
@@ -98,7 +101,7 @@ dependencies:
98
101
  version: '0.6'
99
102
  type: :development
100
103
  prerelease: false
101
- version_requirements: *70328311583660
104
+ version_requirements: *70136033438380
102
105
  description: Mongoid is an ODM (Object Document Mapper) Framework for MongoDB, written
103
106
  in Ruby.
104
107
  email:
@@ -161,7 +164,6 @@ files:
161
164
  - lib/mongoid/criterion/inspection.rb
162
165
  - lib/mongoid/criterion/optional.rb
163
166
  - lib/mongoid/criterion/selector.rb
164
- - lib/mongoid/criterion/unconvertable.rb
165
167
  - lib/mongoid/cursor.rb
166
168
  - lib/mongoid/default_scope.rb
167
169
  - lib/mongoid/dirty.rb
@@ -186,6 +188,7 @@ files:
186
188
  - lib/mongoid/extensions/false_class/equality.rb
187
189
  - lib/mongoid/extensions/hash/criteria_helpers.rb
188
190
  - lib/mongoid/extensions/hash/scoping.rb
191
+ - lib/mongoid/extensions/integer/checks.rb
189
192
  - lib/mongoid/extensions/nil/collectionization.rb
190
193
  - lib/mongoid/extensions/object/checks.rb
191
194
  - lib/mongoid/extensions/object/reflections.rb
@@ -193,6 +196,7 @@ files:
193
196
  - lib/mongoid/extensions/object/yoda.rb
194
197
  - lib/mongoid/extensions/object_id/conversions.rb
195
198
  - lib/mongoid/extensions/proc/scoping.rb
199
+ - lib/mongoid/extensions/string/checks.rb
196
200
  - lib/mongoid/extensions/string/conversions.rb
197
201
  - lib/mongoid/extensions/string/inflections.rb
198
202
  - lib/mongoid/extensions/symbol/inflections.rb
@@ -267,7 +271,7 @@ files:
267
271
  - lib/mongoid/persistence/atomic/push.rb
268
272
  - lib/mongoid/persistence/atomic/push_all.rb
269
273
  - lib/mongoid/persistence/atomic/rename.rb
270
- - lib/mongoid/persistence/atomic/set.rb
274
+ - lib/mongoid/persistence/atomic/sets.rb
271
275
  - lib/mongoid/persistence/atomic/unset.rb
272
276
  - lib/mongoid/persistence/atomic.rb
273
277
  - lib/mongoid/persistence/deletion.rb
@@ -384,7 +388,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
384
388
  version: '0'
385
389
  segments:
386
390
  - 0
387
- hash: -3524092560403003003
391
+ hash: 3997568018995098764
388
392
  required_rubygems_version: !ruby/object:Gem::Requirement
389
393
  none: false
390
394
  requirements:
@@ -1,20 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Criterion #:nodoc:
4
-
5
- # Wrapper class for strings that should not be converted into
6
- # BSON::ObjectIds.
7
- class Unconvertable < String
8
-
9
- # Initialize just like a normal string, and quack like it to.
10
- #
11
- # @example Create the new Unconvertable.
12
- # Unconvertable.new("testing")
13
- #
14
- # @param [ String ] value The string.
15
- #
16
- # @since 2.0.2
17
- def initialize(value); super; end
18
- end
19
- end
20
- end