mongoid 1.9.5 → 2.0.0.alpha

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 (213) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +29 -0
  3. data/Rakefile +52 -0
  4. data/VERSION +1 -0
  5. data/caliper.yml +4 -0
  6. data/lib/mongoid.rb +20 -9
  7. data/lib/mongoid/associations.rb +100 -123
  8. data/lib/mongoid/associations/belongs_to_related.rb +3 -2
  9. data/lib/mongoid/associations/{embeds_many.rb → embed_many.rb} +29 -90
  10. data/lib/mongoid/associations/{embeds_one.rb → embed_one.rb} +7 -8
  11. data/lib/mongoid/associations/embedded_in.rb +4 -12
  12. data/lib/mongoid/associations/has_many_related.rb +4 -52
  13. data/lib/mongoid/associations/has_one_related.rb +4 -8
  14. data/lib/mongoid/associations/meta_data.rb +1 -2
  15. data/lib/mongoid/associations/options.rb +1 -6
  16. data/lib/mongoid/associations/proxy.rb +21 -14
  17. data/lib/mongoid/attributes.rb +13 -33
  18. data/lib/mongoid/callbacks.rb +11 -16
  19. data/lib/mongoid/collection.rb +3 -4
  20. data/lib/mongoid/collections/master.rb +2 -3
  21. data/lib/mongoid/collections/mimic.rb +46 -0
  22. data/lib/mongoid/collections/slaves.rb +2 -3
  23. data/lib/mongoid/commands.rb +161 -0
  24. data/lib/mongoid/commands/create.rb +19 -0
  25. data/lib/mongoid/commands/delete.rb +16 -0
  26. data/lib/mongoid/commands/delete_all.rb +23 -0
  27. data/lib/mongoid/commands/deletion.rb +18 -0
  28. data/lib/mongoid/commands/destroy.rb +17 -0
  29. data/lib/mongoid/commands/destroy_all.rb +23 -0
  30. data/lib/mongoid/commands/save.rb +29 -0
  31. data/lib/mongoid/components.rb +6 -4
  32. data/lib/mongoid/config.rb +15 -134
  33. data/lib/mongoid/contexts.rb +1 -1
  34. data/lib/mongoid/contexts/enumerable.rb +1 -1
  35. data/lib/mongoid/contexts/mongo.rb +1 -1
  36. data/lib/mongoid/contexts/paging.rb +2 -10
  37. data/lib/mongoid/criterion/inclusion.rb +0 -17
  38. data/lib/mongoid/criterion/optional.rb +1 -1
  39. data/lib/mongoid/cursor.rb +1 -0
  40. data/lib/mongoid/document.rb +45 -49
  41. data/lib/mongoid/errors.rb +1 -32
  42. data/lib/mongoid/extensions.rb +10 -12
  43. data/lib/mongoid/extensions/array/conversions.rb +6 -8
  44. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  45. data/lib/mongoid/extensions/boolean/conversions.rb +2 -8
  46. data/lib/mongoid/extensions/date/conversions.rb +4 -13
  47. data/lib/mongoid/extensions/datetime/conversions.rb +6 -1
  48. data/lib/mongoid/extensions/float/conversions.rb +1 -5
  49. data/lib/mongoid/extensions/hash/assimilation.rb +3 -12
  50. data/lib/mongoid/extensions/hash/conversions.rb +4 -34
  51. data/lib/mongoid/extensions/integer/conversions.rb +1 -5
  52. data/lib/mongoid/extensions/nil/assimilation.rb +0 -4
  53. data/lib/mongoid/extensions/object/conversions.rb +2 -8
  54. data/lib/mongoid/extensions/objectid/conversions.rb +1 -1
  55. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  56. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  57. data/lib/mongoid/extensions/time/conversions.rb +18 -0
  58. data/lib/mongoid/factory.rb +1 -2
  59. data/lib/mongoid/field.rb +2 -9
  60. data/lib/mongoid/fields.rb +7 -11
  61. data/lib/mongoid/finders.rb +2 -2
  62. data/lib/mongoid/identity.rb +4 -4
  63. data/lib/mongoid/indexes.rb +7 -10
  64. data/lib/mongoid/memoization.rb +2 -8
  65. data/lib/mongoid/named_scope.rb +5 -0
  66. data/lib/mongoid/observable.rb +1 -1
  67. data/lib/mongoid/paths.rb +22 -30
  68. data/lib/mongoid/state.rb +21 -28
  69. data/lib/mongoid/timestamps.rb +1 -1
  70. data/lib/mongoid/validations.rb +51 -0
  71. data/lib/mongoid/validations/associated.rb +32 -0
  72. data/lib/mongoid/validations/locale/en.yml +4 -0
  73. data/lib/mongoid/validations/uniqueness.rb +22 -0
  74. data/lib/mongoid/versioning.rb +1 -2
  75. data/mongoid.gemspec +408 -0
  76. data/perf/benchmark.rb +77 -0
  77. data/spec/integration/mongoid/associations_spec.rb +340 -0
  78. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  79. data/spec/integration/mongoid/commands_spec.rb +227 -0
  80. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  81. data/spec/integration/mongoid/criteria_spec.rb +272 -0
  82. data/spec/integration/mongoid/document_spec.rb +650 -0
  83. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  84. data/spec/integration/mongoid/finders_spec.rb +119 -0
  85. data/spec/integration/mongoid/inheritance_spec.rb +137 -0
  86. data/spec/integration/mongoid/named_scope_spec.rb +46 -0
  87. data/spec/models/address.rb +39 -0
  88. data/spec/models/animal.rb +6 -0
  89. data/spec/models/callbacks.rb +18 -0
  90. data/spec/models/comment.rb +8 -0
  91. data/spec/models/country_code.rb +6 -0
  92. data/spec/models/employer.rb +5 -0
  93. data/spec/models/game.rb +7 -0
  94. data/spec/models/inheritance.rb +56 -0
  95. data/spec/models/location.rb +5 -0
  96. data/spec/models/mixed_drink.rb +4 -0
  97. data/spec/models/name.rb +13 -0
  98. data/spec/models/namespacing.rb +11 -0
  99. data/spec/models/patient.rb +4 -0
  100. data/spec/models/person.rb +99 -0
  101. data/spec/models/pet.rb +7 -0
  102. data/spec/models/pet_owner.rb +6 -0
  103. data/spec/models/phone.rb +7 -0
  104. data/spec/models/post.rb +15 -0
  105. data/spec/models/translation.rb +5 -0
  106. data/spec/models/vet_visit.rb +5 -0
  107. data/spec/spec.opts +3 -0
  108. data/spec/spec_helper.rb +31 -0
  109. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
  110. data/spec/unit/mongoid/associations/embed_many_spec.rb +516 -0
  111. data/spec/unit/mongoid/associations/embed_one_spec.rb +282 -0
  112. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  113. data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
  114. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  115. data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
  116. data/spec/unit/mongoid/associations/options_spec.rb +192 -0
  117. data/spec/unit/mongoid/associations_spec.rb +595 -0
  118. data/spec/unit/mongoid/attributes_spec.rb +507 -0
  119. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  120. data/spec/unit/mongoid/collection_spec.rb +187 -0
  121. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  122. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  123. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  124. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  125. data/spec/unit/mongoid/commands/create_spec.rb +31 -0
  126. data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
  127. data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
  128. data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
  129. data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
  130. data/spec/unit/mongoid/commands/save_spec.rb +107 -0
  131. data/spec/unit/mongoid/commands_spec.rb +270 -0
  132. data/spec/unit/mongoid/config_spec.rb +172 -0
  133. data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
  134. data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
  135. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  136. data/spec/unit/mongoid/criteria_spec.rb +824 -0
  137. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  138. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  139. data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
  140. data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
  141. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  142. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  143. data/spec/unit/mongoid/document_spec.rb +818 -0
  144. data/spec/unit/mongoid/errors_spec.rb +103 -0
  145. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  146. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  147. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  148. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  149. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  150. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  151. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  152. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  153. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
  154. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  155. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  156. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  157. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  158. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  159. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  160. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  161. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  162. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
  163. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  164. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  165. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  166. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  167. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  168. data/spec/unit/mongoid/extras_spec.rb +102 -0
  169. data/spec/unit/mongoid/factory_spec.rb +31 -0
  170. data/spec/unit/mongoid/field_spec.rb +143 -0
  171. data/spec/unit/mongoid/fields_spec.rb +181 -0
  172. data/spec/unit/mongoid/finders_spec.rb +404 -0
  173. data/spec/unit/mongoid/identity_spec.rb +109 -0
  174. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  175. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  176. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  177. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  178. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  179. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  180. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  181. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  182. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  183. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  184. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  185. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  186. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  187. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  188. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  189. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  190. data/spec/unit/mongoid/observable_spec.rb +46 -0
  191. data/spec/unit/mongoid/paths_spec.rb +124 -0
  192. data/spec/unit/mongoid/scope_spec.rb +240 -0
  193. data/spec/unit/mongoid/state_spec.rb +83 -0
  194. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  195. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  196. data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
  197. data/spec/unit/mongoid/validations_spec.rb +190 -0
  198. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  199. data/spec/unit/mongoid_spec.rb +46 -0
  200. metadata +316 -110
  201. data/lib/mongoid/collections.rb +0 -41
  202. data/lib/mongoid/concern.rb +0 -31
  203. data/lib/mongoid/dirty.rb +0 -253
  204. data/lib/mongoid/extensions/time_conversions.rb +0 -35
  205. data/lib/mongoid/persistence.rb +0 -222
  206. data/lib/mongoid/persistence/command.rb +0 -39
  207. data/lib/mongoid/persistence/insert.rb +0 -50
  208. data/lib/mongoid/persistence/insert_embedded.rb +0 -38
  209. data/lib/mongoid/persistence/remove.rb +0 -39
  210. data/lib/mongoid/persistence/remove_all.rb +0 -37
  211. data/lib/mongoid/persistence/remove_embedded.rb +0 -50
  212. data/lib/mongoid/persistence/update.rb +0 -63
  213. data/lib/mongoid/version.rb +0 -4
@@ -1,41 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc
3
- # The collections module is used for providing functionality around setting
4
- # up and updating collections.
5
- module Collections
6
- extend ActiveSupport::Concern
7
- included do
8
- cattr_accessor :_collection, :collection_name
9
- self.collection_name = self.name.collectionize
10
- delegate :collection, :to => "self.class"
11
- end
12
-
13
- module ClassMethods #:nodoc:
14
- # Returns the collection associated with this +Document+. If the
15
- # document is embedded, there will be no collection associated
16
- # with it.
17
- #
18
- # Returns: <tt>Mongo::Collection</tt>
19
- def collection
20
- raise Errors::InvalidCollection.new(self) if embedded?
21
- self._collection || set_collection
22
- add_indexes; self._collection
23
- end
24
-
25
- # Macro for setting the collection name to store in.
26
- #
27
- # Example:
28
- #
29
- # <tt>Person.store_in :populdation</tt>
30
- def store_in(name)
31
- self.collection_name = name.to_s
32
- set_collection
33
- end
34
-
35
- protected
36
- def set_collection
37
- self._collection = Mongoid::Collection.new(self, self.collection_name)
38
- end
39
- end
40
- end
41
- end
@@ -1,31 +0,0 @@
1
- unless defined?(ActiveSupport::Concern)
2
- module ActiveSupport
3
- module Concern
4
- def self.extended(base)
5
- base.instance_variable_set("@_dependencies", [])
6
- end
7
-
8
- def append_features(base)
9
- if base.instance_variable_defined?("@_dependencies")
10
- base.instance_variable_get("@_dependencies") << self
11
- return false
12
- else
13
- return false if base < self
14
- @_dependencies.each { |dep| base.send(:include, dep) }
15
- super
16
- base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
17
- base.send :include, const_get("InstanceMethods") if const_defined?("InstanceMethods")
18
- base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block")
19
- end
20
- end
21
-
22
- def included(base = nil, &block)
23
- if base.nil?
24
- @_included_block = block
25
- else
26
- super
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,253 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Dirty #:nodoc:
4
- extend ActiveSupport::Concern
5
- module InstanceMethods #:nodoc:
6
- # Gets the changes for a specific field.
7
- #
8
- # Example:
9
- #
10
- # person = Person.new(:title => "Sir")
11
- # person.title = "Madam"
12
- # person.attribute_change("title") # [ "Sir", "Madam" ]
13
- #
14
- # Returns:
15
- #
16
- # An +Array+ containing the old and new values.
17
- def attribute_change(name)
18
- modifications[name]
19
- end
20
-
21
- # Determines if a specific field has chaged.
22
- #
23
- # Example:
24
- #
25
- # person = Person.new(:title => "Sir")
26
- # person.title = "Madam"
27
- # person.attribute_changed?("title") # true
28
- #
29
- # Returns:
30
- #
31
- # +true+ if changed, +false+ if not.
32
- def attribute_changed?(name)
33
- modifications.include?(name)
34
- end
35
-
36
- # Gets the old value for a specific field.
37
- #
38
- # Example:
39
- #
40
- # person = Person.new(:title => "Sir")
41
- # person.title = "Madam"
42
- # person.attribute_was("title") # "Sir"
43
- #
44
- # Returns:
45
- #
46
- # The old field value.
47
- def attribute_was(name)
48
- change = modifications[name]
49
- change ? change[0] : nil
50
- end
51
-
52
- # Gets the names of all the fields that have changed in the document.
53
- #
54
- # Example:
55
- #
56
- # person = Person.new(:title => "Sir")
57
- # person.title = "Madam"
58
- # person.changed # returns [ "title" ]
59
- #
60
- # Returns:
61
- #
62
- # An +Array+ of changed field names.
63
- def changed
64
- modifications.keys
65
- end
66
-
67
- # Alerts to whether the document has been modified or not.
68
- #
69
- # Example:
70
- #
71
- # person = Person.new(:title => "Sir")
72
- # person.title = "Madam"
73
- # person.changed? # returns true
74
- #
75
- # Returns:
76
- #
77
- # +true+ if changed, +false+ if not.
78
- def changed?
79
- !modifications.empty?
80
- end
81
-
82
- # Gets all the modifications that have happened to the object as a +Hash+
83
- # with the keys being the names of the fields, and the values being an
84
- # +Array+ with the old value and new value.
85
- #
86
- # Example:
87
- #
88
- # person = Person.new(:title => "Sir")
89
- # person.title = "Madam"
90
- # person.changes # returns { "title" => [ "Sir", "Madam" ] }
91
- #
92
- # Returns:
93
- #
94
- # A +Hash+ of changes.
95
- def changes
96
- modifications
97
- end
98
-
99
- # Call this method after save, so the changes can be properly switched.
100
- #
101
- # Example:
102
- #
103
- # <tt>person.move_changes</tt>
104
- def move_changes
105
- @previous_modifications = modifications.dup
106
- @modifications = {}
107
- end
108
-
109
- # Gets all the new values for each of the changed fields, to be passed to
110
- # a MongoDB $set modifier.
111
- #
112
- # Example:
113
- #
114
- # person = Person.new(:title => "Sir")
115
- # person.title = "Madam"
116
- # person.setters # returns { "title" => "Madam" }
117
- #
118
- # Returns:
119
- #
120
- # A +Hash+ of new values.
121
- def setters
122
- modifications.inject({}) do |sets, (field, changes)|
123
- key = embedded? ? "#{_position}.#{field}" : field
124
- sets[key] = changes[1]; sets
125
- end
126
- end
127
-
128
- # Gets all the modifications that have happened to the object before the
129
- # object was saved.
130
- #
131
- # Example:
132
- #
133
- # person = Person.new(:title => "Sir")
134
- # person.title = "Madam"
135
- # person.save!
136
- # person.previous_changes # returns { "title" => [ "Sir", "Madam" ] }
137
- #
138
- # Returns:
139
- #
140
- # A +Hash+ of changes before save.
141
- def previous_changes
142
- @previous_modifications
143
- end
144
-
145
- # Resets a changed field back to its old value.
146
- #
147
- # Example:
148
- #
149
- # person = Person.new(:title => "Sir")
150
- # person.title = "Madam"
151
- # person.reset_attribute!("title")
152
- # person.title # "Sir"
153
- #
154
- # Returns:
155
- #
156
- # The old field value.
157
- def reset_attribute!(name)
158
- value = attribute_was(name)
159
- if value
160
- @attributes[name] = value
161
- modifications.delete(name)
162
- end
163
- end
164
-
165
- # Sets up the modifications hash. This occurs just after the document is
166
- # instantiated.
167
- #
168
- # Example:
169
- #
170
- # <tt>document.setup_notifications</tt>
171
- def setup_modifications
172
- @accessed ||= {}
173
- @modifications ||= {}
174
- @previous_modifications ||= {}
175
- end
176
-
177
- # Reset all modifications for the document. This will wipe all the marked
178
- # changes, but not reset the values.
179
- #
180
- # Example:
181
- #
182
- # <tt>document.reset_modifications</tt>
183
- def reset_modifications
184
- @accessed = {}
185
- @modifications = {}
186
- end
187
-
188
- protected
189
-
190
- # Audit the original value for a field that can be modified in place.
191
- #
192
- # Example:
193
- #
194
- # <tt>person.accessed("aliases", [ "007" ])</tt>
195
- def accessed(name, value)
196
- @accessed ||= {}
197
- @accessed[name] = value.dup if (value.is_a?(Array) || value.is_a?(Hash)) && !@accessed.has_key?(name)
198
- value
199
- end
200
-
201
- # Get all normal modifications plus in place potential changes.
202
- #
203
- # Example:
204
- #
205
- # <tt>person.modifications</tt>
206
- #
207
- # Returns:
208
- #
209
- # All changes to the document.
210
- def modifications
211
- @accessed.each_pair do |field, value|
212
- current = @attributes[field]
213
- @modifications[field] = [ value, current ] if current != value
214
- end
215
- @accessed.clear
216
- @modifications
217
- end
218
-
219
- # Audit the change of a field's value.
220
- #
221
- # Example:
222
- #
223
- # <tt>person.modify("name", "Jack", "John")</tt>
224
- def modify(name, old_value, new_value)
225
- @attributes[name] = new_value
226
- if @modifications && (old_value != new_value)
227
- original = @modifications[name].first if @modifications[name]
228
- @modifications[name] = [ (original || old_value), new_value ]
229
- end
230
- end
231
- end
232
-
233
- module ClassMethods #:nodoc:
234
- # Add the dynamic dirty methods. These are custom methods defined on a
235
- # field by field basis that wrap the dirty attribute methods.
236
- #
237
- # Example:
238
- #
239
- # person = Person.new(:title => "Sir")
240
- # person.title = "Madam"
241
- # person.title_change # [ "Sir", "Madam" ]
242
- # person.title_changed? # true
243
- # person.title_was # "Sir"
244
- # person.reset_title!
245
- def add_dirty_methods(name)
246
- define_method("#{name}_change") { attribute_change(name) }
247
- define_method("#{name}_changed?") { attribute_changed?(name) }
248
- define_method("#{name}_was") { attribute_was(name) }
249
- define_method("reset_#{name}!") { reset_attribute!(name) }
250
- end
251
- end
252
- end
253
- end
@@ -1,35 +0,0 @@
1
- module Mongoid #:nodoc:
2
- module Extensions #:nodoc:
3
- module TimeConversions #:nodoc:
4
- def set(value)
5
- return nil if value.blank?
6
- time = convert_to_time(value)
7
- strip_milliseconds(time).utc
8
- end
9
-
10
- def get(value)
11
- return nil if value.blank?
12
- if Mongoid::Config.instance.use_utc?
13
- value
14
- else
15
- value.getlocal
16
- end
17
- end
18
-
19
- protected
20
-
21
- def strip_milliseconds(time)
22
- ::Time.at(time.to_i)
23
- end
24
-
25
- def convert_to_time(value)
26
- case value
27
- when ::String then ::Time.parse(value)
28
- when ::DateTime then ::Time.utc(value.year, value.month, value.day, value.hour, value.min, value.sec)
29
- when ::Date then ::Time.utc(value.year, value.month, value.day)
30
- else value
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,222 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/persistence/command"
3
- require "mongoid/persistence/insert"
4
- require "mongoid/persistence/insert_embedded"
5
- require "mongoid/persistence/remove"
6
- require "mongoid/persistence/remove_all"
7
- require "mongoid/persistence/remove_embedded"
8
- require "mongoid/persistence/update"
9
-
10
- module Mongoid #:nodoc:
11
- # The persistence module is a mixin to provide database accessor methods for
12
- # the document. These correspond to the appropriate accessors on a
13
- # +Mongo::Collection+ and retain the same DSL.
14
- #
15
- # Examples:
16
- #
17
- # <tt>document.insert</tt>
18
- # <tt>document.update</tt>
19
- # <tt>document.upsert</tt>
20
- module Persistence
21
- extend ActiveSupport::Concern
22
- module InstanceMethods #:nodoc:
23
- # Remove the +Document+ from the datbase with callbacks.
24
- #
25
- # Example:
26
- #
27
- # <tt>document.destroy</tt>
28
- #
29
- # TODO: Will get rid of other #destroy once new persistence complete.
30
- def destroy
31
- run_callbacks(:before_destroy)
32
- if _remove
33
- self.destroyed = true
34
- run_callbacks(:after_destroy)
35
- end; true
36
- end
37
-
38
- # Insert a new +Document+ into the database. Will return the document
39
- # itself whether or not the save was successful.
40
- #
41
- # Example:
42
- #
43
- # <tt>document.insert</tt>
44
- def insert(validate = true)
45
- Insert.new(self, validate).persist
46
- end
47
-
48
- # Remove the +Document+ from the datbase.
49
- #
50
- # Example:
51
- #
52
- # <tt>document._remove</tt>
53
- #
54
- # TODO: Will get rid of other #remove once observable pattern killed.
55
- def _remove
56
- Remove.new(self).persist
57
- end
58
-
59
- alias :delete :_remove
60
-
61
- # Save the document - will perform an insert if the document is new, and
62
- # update if not. If a validation error occurs a
63
- # Mongoid::Errors::Validations error will get raised.
64
- #
65
- # Example:
66
- #
67
- # <tt>document.save!</tt>
68
- #
69
- # Returns:
70
- #
71
- # +true+ if validation passed, will raise error otherwise.
72
- def save!
73
- self.class.fail_validate!(self) unless upsert; true
74
- end
75
-
76
- # Update the +Document+ in the datbase.
77
- #
78
- # Example:
79
- #
80
- # <tt>document.update</tt>
81
- def update(validate = true)
82
- Update.new(self, validate).persist
83
- end
84
-
85
- # Update the +Document+ attributes in the datbase.
86
- #
87
- # Example:
88
- #
89
- # <tt>document.update_attributes(:title => "Sir")</tt>
90
- #
91
- # Returns:
92
- #
93
- # +true+ if validation passed, +false+ if not.
94
- def update_attributes(attributes = {})
95
- write_attributes(attributes); update
96
- end
97
-
98
- # Update the +Document+ attributes in the datbase.
99
- #
100
- # Example:
101
- #
102
- # <tt>document.update_attributes(:title => "Sir")</tt>
103
- #
104
- # Returns:
105
- #
106
- # +true+ if validation passed, raises an error if not
107
- def update_attributes!(attributes = {})
108
- write_attributes(attributes)
109
- result = update
110
- self.class.fail_validate!(self) unless result
111
- result
112
- end
113
-
114
- # Upsert the document - will perform an insert if the document is new, and
115
- # update if not.
116
- #
117
- # Example:
118
- #
119
- # <tt>document.upsert</tt>
120
- #
121
- # Returns:
122
- #
123
- # A +Boolean+ for updates.
124
- def upsert(validate = true)
125
- validate = parse_validate(validate)
126
- if new_record?
127
- insert(validate).errors.any? ? false : true
128
- else
129
- update(validate)
130
- end
131
- end
132
-
133
- # Save is aliased so that users familiar with active record can have some
134
- # semblance of a familiar API.
135
- #
136
- # Example:
137
- #
138
- # <tt>document.save</tt>
139
- alias :save :upsert
140
-
141
- protected
142
- # Alternative validation params.
143
- def parse_validate(validate)
144
- if validate.is_a?(Hash) && validate.has_key?(:validate)
145
- validate = validate[:validate]
146
- end
147
- validate
148
- end
149
- end
150
-
151
- module ClassMethods #:nodoc:
152
-
153
- # Create a new +Document+. This will instantiate a new document and
154
- # insert it in a single call. Will always return the document
155
- # whether save passed or not.
156
- #
157
- # Example:
158
- #
159
- # <tt>Person.create(:title => "Mr")</tt>
160
- #
161
- # Returns: the +Document+.
162
- def create(attributes = {})
163
- document = new(attributes); document.insert
164
- end
165
-
166
- # Create a new +Document+. This will instantiate a new document and
167
- # insert it in a single call. Will always return the document
168
- # whether save passed or not, and if validation fails an error will be
169
- # raise.
170
- #
171
- # Example:
172
- #
173
- # <tt>Person.create!(:title => "Mr")</tt>
174
- #
175
- # Returns: the +Document+.
176
- def create!(attributes = {})
177
- document = new(attributes)
178
- fail_validate!(document) if document.insert.errors.any?
179
- document
180
- end
181
-
182
- # Delete all documents given the supplied conditions. If no conditions
183
- # are passed, the entire collection will be dropped for performance
184
- # benefits. Does not fire any callbacks.
185
- #
186
- # Example:
187
- #
188
- # <tt>Person.delete_all(:conditions => { :title => "Sir" })</tt>
189
- # <tt>Person.delete_all</tt>
190
- #
191
- # Returns: true or raises an error.
192
- def delete_all(conditions = {})
193
- RemoveAll.new(
194
- self,
195
- false,
196
- conditions[:conditions] || {}
197
- ).persist
198
- end
199
-
200
- # Delete all documents given the supplied conditions. If no conditions
201
- # are passed, the entire collection will be dropped for performance
202
- # benefits. Fires the destroy callbacks if conditions were passed.
203
- #
204
- # Example:
205
- #
206
- # <tt>Person.destroy_all(:conditions => { :title => "Sir" })</tt>
207
- # <tt>Person.destroy_all</tt>
208
- #
209
- # Returns: true or raises an error.
210
- def destroy_all(conditions = {})
211
- documents = all(conditions)
212
- count = documents.count
213
- documents.each { |doc| doc.destroy }; count
214
- end
215
-
216
- # Raise an error if validation failed.
217
- def fail_validate!(document)
218
- raise Errors::Validations.new(document.errors)
219
- end
220
- end
221
- end
222
- end