mongoid 3.1.7 → 4.0.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.
Files changed (567) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +470 -9
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  6. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/root.rb +0 -13
  9. data/lib/mongoid/atomic.rb +3 -14
  10. data/lib/mongoid/attributes/dynamic.rb +154 -0
  11. data/lib/mongoid/attributes/nested.rb +82 -0
  12. data/lib/mongoid/attributes/processing.rb +13 -66
  13. data/lib/mongoid/attributes.rb +63 -99
  14. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  15. data/lib/mongoid/composable.rb +105 -0
  16. data/lib/mongoid/config/options.rb +1 -1
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  19. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
  20. data/lib/mongoid/contextual/atomic.rb +53 -53
  21. data/lib/mongoid/contextual/geo_near.rb +1 -1
  22. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  23. data/lib/mongoid/contextual/memory.rb +23 -11
  24. data/lib/mongoid/contextual/mongo.rb +75 -57
  25. data/lib/mongoid/contextual/none.rb +90 -0
  26. data/lib/mongoid/contextual/text_search.rb +178 -0
  27. data/lib/mongoid/contextual.rb +2 -0
  28. data/lib/mongoid/copyable.rb +2 -3
  29. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  30. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  31. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  32. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  33. data/lib/mongoid/criteria/permission.rb +70 -0
  34. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  35. data/lib/mongoid/criteria.rb +39 -34
  36. data/lib/mongoid/document.rb +39 -24
  37. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  38. data/lib/mongoid/errors/document_not_found.rb +2 -1
  39. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  40. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  41. data/lib/mongoid/errors/invalid_value.rb +16 -0
  42. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  43. data/lib/mongoid/errors/readonly_document.rb +24 -0
  44. data/lib/mongoid/errors.rb +4 -1
  45. data/lib/mongoid/extensions/array.rb +3 -3
  46. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  47. data/lib/mongoid/extensions/boolean.rb +15 -17
  48. data/lib/mongoid/extensions/date.rb +1 -1
  49. data/lib/mongoid/extensions/date_time.rb +3 -3
  50. data/lib/mongoid/extensions/float.rb +2 -1
  51. data/lib/mongoid/extensions/hash.rb +3 -3
  52. data/lib/mongoid/extensions/integer.rb +1 -1
  53. data/lib/mongoid/extensions/object.rb +7 -7
  54. data/lib/mongoid/extensions/object_id.rb +5 -5
  55. data/lib/mongoid/extensions/range.rb +9 -3
  56. data/lib/mongoid/extensions/regexp.rb +1 -1
  57. data/lib/mongoid/extensions/set.rb +1 -1
  58. data/lib/mongoid/extensions/string.rb +6 -18
  59. data/lib/mongoid/extensions/symbol.rb +1 -1
  60. data/lib/mongoid/extensions/time.rb +3 -3
  61. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  62. data/lib/mongoid/extensions.rb +15 -7
  63. data/lib/mongoid/factory.rb +8 -6
  64. data/lib/mongoid/fields/foreign_key.rb +3 -3
  65. data/lib/mongoid/fields/localized.rb +1 -1
  66. data/lib/mongoid/fields/standard.rb +5 -17
  67. data/lib/mongoid/fields/validators/macro.rb +15 -5
  68. data/lib/mongoid/fields.rb +41 -8
  69. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  70. data/lib/mongoid/indexable/specification.rb +104 -0
  71. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  74. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  75. data/lib/mongoid/log_subscriber.rb +55 -0
  76. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  77. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  78. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  79. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  81. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  83. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
  86. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  87. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  88. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  89. data/lib/mongoid/matchable.rb +152 -0
  90. data/lib/mongoid/persistable/creatable.rb +189 -0
  91. data/lib/mongoid/persistable/deletable.rb +149 -0
  92. data/lib/mongoid/persistable/destroyable.rb +60 -0
  93. data/lib/mongoid/persistable/incrementable.rb +36 -0
  94. data/lib/mongoid/persistable/logical.rb +38 -0
  95. data/lib/mongoid/persistable/poppable.rb +39 -0
  96. data/lib/mongoid/persistable/pullable.rb +55 -0
  97. data/lib/mongoid/persistable/pushable.rb +62 -0
  98. data/lib/mongoid/persistable/renamable.rb +35 -0
  99. data/lib/mongoid/persistable/savable.rb +52 -0
  100. data/lib/mongoid/persistable/settable.rb +33 -0
  101. data/lib/mongoid/persistable/unsettable.rb +36 -0
  102. data/lib/mongoid/persistable/updatable.rb +153 -0
  103. data/lib/mongoid/persistable/upsertable.rb +55 -0
  104. data/lib/mongoid/persistable.rb +216 -0
  105. data/lib/mongoid/positional.rb +71 -0
  106. data/lib/mongoid/query_cache.rb +255 -0
  107. data/lib/mongoid/railtie.rb +34 -60
  108. data/lib/mongoid/railties/database.rake +9 -25
  109. data/lib/mongoid/relations/accessors.rb +15 -51
  110. data/lib/mongoid/relations/auto_save.rb +15 -36
  111. data/lib/mongoid/relations/binding.rb +2 -25
  112. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  113. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  114. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  115. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  116. data/lib/mongoid/relations/builder.rb +1 -1
  117. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  118. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  119. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  120. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  121. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  122. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  123. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  124. data/lib/mongoid/relations/builders.rb +2 -2
  125. data/lib/mongoid/relations/cascading.rb +3 -5
  126. data/lib/mongoid/relations/constraint.rb +1 -1
  127. data/lib/mongoid/relations/conversions.rb +1 -1
  128. data/lib/mongoid/relations/counter_cache.rb +39 -15
  129. data/lib/mongoid/relations/eager/base.rb +149 -0
  130. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  131. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  132. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  133. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  134. data/lib/mongoid/relations/eager.rb +46 -0
  135. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  136. data/lib/mongoid/relations/embedded/in.rb +4 -4
  137. data/lib/mongoid/relations/embedded/many.rb +14 -32
  138. data/lib/mongoid/relations/embedded/one.rb +1 -1
  139. data/lib/mongoid/relations/macros.rb +3 -4
  140. data/lib/mongoid/relations/many.rb +51 -31
  141. data/lib/mongoid/relations/marshalable.rb +3 -3
  142. data/lib/mongoid/relations/metadata.rb +14 -79
  143. data/lib/mongoid/relations/nested_builder.rb +2 -2
  144. data/lib/mongoid/relations/one.rb +1 -1
  145. data/lib/mongoid/relations/options.rb +1 -0
  146. data/lib/mongoid/relations/polymorphic.rb +0 -1
  147. data/lib/mongoid/relations/proxy.rb +21 -41
  148. data/lib/mongoid/relations/referenced/in.rb +4 -20
  149. data/lib/mongoid/relations/referenced/many.rb +22 -35
  150. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  151. data/lib/mongoid/relations/referenced/one.rb +6 -25
  152. data/lib/mongoid/relations/synchronization.rb +4 -4
  153. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  154. data/lib/mongoid/relations/touchable.rb +34 -1
  155. data/lib/mongoid/relations.rb +11 -25
  156. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  157. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  158. data/lib/mongoid/selectable.rb +59 -0
  159. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  160. data/lib/mongoid/sessions/factory.rb +2 -0
  161. data/lib/mongoid/sessions/options.rb +185 -0
  162. data/lib/mongoid/sessions/storage_options.rb +140 -0
  163. data/lib/mongoid/sessions/thread_options.rb +19 -0
  164. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  165. data/lib/mongoid/sessions.rb +37 -345
  166. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  167. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  168. data/lib/mongoid/support/query_counter.rb +23 -0
  169. data/lib/mongoid/tasks/database.rake +31 -0
  170. data/lib/mongoid/tasks/database.rb +107 -0
  171. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  172. data/lib/mongoid/threaded.rb +26 -172
  173. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  174. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  175. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  176. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  177. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  178. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  179. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  180. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  182. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  183. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  184. data/lib/mongoid/version.rb +1 -1
  185. data/lib/mongoid.rb +10 -76
  186. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  187. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  188. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  189. data/lib/rails/generators/mongoid_generator.rb +3 -40
  190. data/lib/rails/mongoid.rb +0 -122
  191. data/lib/support/ruby_version.rb +1 -1
  192. data/spec/app/models/account.rb +2 -6
  193. data/spec/app/models/acolyte.rb +2 -1
  194. data/spec/app/models/actor.rb +0 -1
  195. data/spec/app/models/address.rb +8 -3
  196. data/spec/app/models/animal.rb +1 -1
  197. data/spec/app/models/appointment.rb +3 -3
  198. data/spec/app/models/article.rb +1 -4
  199. data/spec/app/models/audio.rb +5 -0
  200. data/spec/app/models/author.rb +0 -2
  201. data/spec/app/models/band.rb +3 -2
  202. data/spec/app/models/bar.rb +1 -0
  203. data/spec/app/models/book.rb +1 -0
  204. data/spec/app/models/building.rb +0 -2
  205. data/spec/app/models/building_address.rb +0 -2
  206. data/spec/app/models/bus.rb +1 -1
  207. data/spec/app/models/canvas.rb +1 -1
  208. data/spec/app/models/contextable_item.rb +5 -0
  209. data/spec/app/models/contractor.rb +0 -2
  210. data/spec/app/models/country_code.rb +1 -1
  211. data/spec/app/models/definition.rb +2 -2
  212. data/spec/app/models/dog.rb +1 -1
  213. data/spec/app/models/dragon.rb +4 -0
  214. data/spec/app/models/drug.rb +1 -3
  215. data/spec/app/models/dungeon.rb +4 -0
  216. data/spec/app/models/edit.rb +5 -0
  217. data/spec/app/models/even.rb +7 -0
  218. data/spec/app/models/event.rb +1 -1
  219. data/spec/app/models/filesystem.rb +1 -0
  220. data/spec/app/models/fish.rb +0 -1
  221. data/spec/app/models/fruits.rb +6 -0
  222. data/spec/app/models/game.rb +0 -2
  223. data/spec/app/models/house.rb +1 -3
  224. data/spec/app/models/id_key.rb +6 -0
  225. data/spec/app/models/item.rb +1 -5
  226. data/spec/app/models/jar.rb +1 -1
  227. data/spec/app/models/label.rb +4 -4
  228. data/spec/app/models/line_item.rb +1 -1
  229. data/spec/app/models/login.rb +1 -1
  230. data/spec/app/models/message.rb +8 -0
  231. data/spec/app/models/movie.rb +1 -0
  232. data/spec/app/models/name.rb +3 -3
  233. data/spec/app/models/note.rb +3 -1
  234. data/spec/app/models/odd.rb +7 -0
  235. data/spec/app/models/oscar.rb +1 -1
  236. data/spec/app/models/parent_doc.rb +1 -1
  237. data/spec/app/models/person.rb +16 -10
  238. data/spec/app/models/phone.rb +1 -3
  239. data/spec/app/models/player.rb +3 -3
  240. data/spec/app/models/post.rb +5 -3
  241. data/spec/app/models/preference.rb +1 -1
  242. data/spec/app/models/quiz.rb +0 -3
  243. data/spec/app/models/record.rb +10 -5
  244. data/spec/app/models/registry.rb +1 -1
  245. data/spec/app/models/server.rb +1 -1
  246. data/spec/app/models/service.rb +3 -3
  247. data/spec/app/models/sound.rb +5 -0
  248. data/spec/app/models/symptom.rb +1 -1
  249. data/spec/app/models/template.rb +1 -1
  250. data/spec/app/models/title.rb +0 -1
  251. data/spec/app/models/track.rb +5 -5
  252. data/spec/app/models/tree.rb +3 -3
  253. data/spec/app/models/video.rb +1 -5
  254. data/spec/app/models/wiki_page.rb +2 -5
  255. data/spec/app/models/word.rb +3 -0
  256. data/spec/app/models/word_origin.rb +1 -1
  257. data/spec/config/mongoid.yml +7 -8
  258. data/spec/helpers.rb +18 -0
  259. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  260. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  261. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  262. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  263. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  264. data/spec/mongoid/atomic_spec.rb +19 -19
  265. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  266. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  267. data/spec/mongoid/attributes_spec.rb +334 -434
  268. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  269. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  270. data/spec/mongoid/config/environment_spec.rb +3 -3
  271. data/spec/mongoid/config/options_spec.rb +6 -6
  272. data/spec/mongoid/config_spec.rb +24 -48
  273. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  274. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
  275. data/spec/mongoid/contextual/atomic_spec.rb +59 -55
  276. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  277. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  278. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  279. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  280. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  281. data/spec/mongoid/contextual/none_spec.rb +127 -0
  282. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  283. data/spec/mongoid/copyable_spec.rb +56 -68
  284. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  285. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  286. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  287. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  288. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  289. data/spec/mongoid/criteria_spec.rb +713 -2419
  290. data/spec/mongoid/document_spec.rb +171 -121
  291. data/spec/mongoid/equality_spec.rb +22 -22
  292. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  293. data/spec/mongoid/errors/callback_spec.rb +3 -3
  294. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  295. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  296. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  297. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  298. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  299. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  300. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  308. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  311. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  312. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  313. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  314. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  315. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  316. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  317. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  318. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  325. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  326. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  327. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  328. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  329. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  330. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  331. data/spec/mongoid/errors/validations_spec.rb +7 -7
  332. data/spec/mongoid/extensions/array_spec.rb +61 -61
  333. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  334. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  335. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  336. data/spec/mongoid/extensions/date_spec.rb +13 -13
  337. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  338. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  339. data/spec/mongoid/extensions/float_spec.rb +29 -15
  340. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  341. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  342. data/spec/mongoid/extensions/module_spec.rb +2 -2
  343. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  344. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  345. data/spec/mongoid/extensions/object_spec.rb +26 -26
  346. data/spec/mongoid/extensions/range_spec.rb +61 -12
  347. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  348. data/spec/mongoid/extensions/set_spec.rb +4 -4
  349. data/spec/mongoid/extensions/string_spec.rb +35 -46
  350. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  351. data/spec/mongoid/extensions/time_spec.rb +49 -49
  352. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  353. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  354. data/spec/mongoid/extensions_spec.rb +29 -0
  355. data/spec/mongoid/factory_spec.rb +15 -15
  356. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  357. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  358. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  359. data/spec/mongoid/fields/localized_spec.rb +38 -23
  360. data/spec/mongoid/fields/standard_spec.rb +12 -12
  361. data/spec/mongoid/fields_spec.rb +263 -217
  362. data/spec/mongoid/findable_spec.rb +509 -0
  363. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  364. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  365. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  366. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  367. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  368. data/spec/mongoid/loggable_spec.rb +1 -1
  369. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  370. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  371. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  372. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  373. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  374. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  375. data/spec/mongoid/matchable/in_spec.rb +49 -0
  376. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  377. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  378. data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
  379. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  380. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  381. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  382. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  383. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  384. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  385. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  386. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  387. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  388. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  389. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  390. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  391. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  392. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  393. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  394. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  395. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  396. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  397. data/spec/mongoid/persistable_spec.rb +206 -0
  398. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
  399. data/spec/mongoid/query_cache_spec.rb +263 -0
  400. data/spec/mongoid/railties/document_spec.rb +2 -2
  401. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  402. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  403. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  404. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  405. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  406. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  407. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  408. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  409. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  410. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  411. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  412. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  413. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  414. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  415. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  416. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  417. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  418. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  419. data/spec/mongoid/relations/builders_spec.rb +21 -21
  420. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  421. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  422. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  423. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  424. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  425. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  426. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  427. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  428. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  429. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  430. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  431. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  432. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  433. data/spec/mongoid/relations/eager_spec.rb +228 -0
  434. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  435. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  436. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  437. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  438. data/spec/mongoid/relations/macros_spec.rb +108 -102
  439. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  440. data/spec/mongoid/relations/options_spec.rb +1 -1
  441. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  442. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  443. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  444. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  445. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  446. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  447. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  448. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  449. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  450. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  451. data/spec/mongoid/relations_spec.rb +16 -15
  452. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  453. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  454. data/spec/mongoid/selectable_spec.rb +134 -0
  455. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  456. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  457. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  458. data/spec/mongoid/sessions/options_spec.rb +108 -0
  459. data/spec/mongoid/sessions_spec.rb +319 -178
  460. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  461. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  462. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  463. data/spec/mongoid/tasks/database_spec.rb +160 -0
  464. data/spec/mongoid/threaded_spec.rb +17 -70
  465. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  466. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  467. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  468. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  469. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  470. data/spec/mongoid/timestamps_spec.rb +9 -13
  471. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  472. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  473. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  474. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  475. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  476. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  477. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  478. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  479. data/spec/mongoid_spec.rb +8 -8
  480. data/spec/rails/mongoid_spec.rb +19 -350
  481. data/spec/spec_helper.rb +26 -15
  482. metadata +262 -247
  483. data/lib/mongoid/atomic/positionable.rb +0 -73
  484. data/lib/mongoid/components.rb +0 -92
  485. data/lib/mongoid/config/inflections.rb +0 -6
  486. data/lib/mongoid/contextual/eager.rb +0 -158
  487. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  488. data/lib/mongoid/identity_map.rb +0 -163
  489. data/lib/mongoid/json.rb +0 -16
  490. data/lib/mongoid/matchers/strategies.rb +0 -97
  491. data/lib/mongoid/matchers.rb +0 -32
  492. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  493. data/lib/mongoid/nested_attributes.rb +0 -78
  494. data/lib/mongoid/observer.rb +0 -192
  495. data/lib/mongoid/paranoia.rb +0 -136
  496. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  497. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  498. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  499. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  500. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  501. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  502. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  503. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  504. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  505. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  506. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  507. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  508. data/lib/mongoid/persistence/atomic.rb +0 -231
  509. data/lib/mongoid/persistence/deletion.rb +0 -31
  510. data/lib/mongoid/persistence/insertion.rb +0 -38
  511. data/lib/mongoid/persistence/modification.rb +0 -35
  512. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  513. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  514. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  515. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  516. data/lib/mongoid/persistence/operations/update.rb +0 -59
  517. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  518. data/lib/mongoid/persistence/operations.rb +0 -214
  519. data/lib/mongoid/persistence/upsertion.rb +0 -31
  520. data/lib/mongoid/persistence.rb +0 -357
  521. data/lib/mongoid/unit_of_work.rb +0 -61
  522. data/lib/mongoid/versioning.rb +0 -217
  523. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  524. data/lib/rack/mongoid.rb +0 -2
  525. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  526. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  527. data/spec/app/models/actor_observer.rb +0 -15
  528. data/spec/app/models/callback_recorder.rb +0 -25
  529. data/spec/app/models/paranoid_phone.rb +0 -25
  530. data/spec/app/models/paranoid_post.rb +0 -36
  531. data/spec/app/models/phone_observer.rb +0 -6
  532. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  533. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  534. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  535. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  536. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  537. data/spec/mongoid/finders_spec.rb +0 -321
  538. data/spec/mongoid/identity_map_spec.rb +0 -564
  539. data/spec/mongoid/json_spec.rb +0 -33
  540. data/spec/mongoid/matchers/in_spec.rb +0 -25
  541. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  542. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  543. data/spec/mongoid/observer_spec.rb +0 -290
  544. data/spec/mongoid/paranoia_spec.rb +0 -759
  545. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  546. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  547. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  548. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  549. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  550. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  551. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  552. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  553. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  554. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  555. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  556. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  557. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  558. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  559. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  560. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  561. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  562. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  563. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  564. data/spec/mongoid/persistence_spec.rb +0 -2279
  565. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  566. data/spec/mongoid/versioning_spec.rb +0 -540
  567. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -1,105 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
-
4
- # Adds Rails' multi-parameter attribute support to Mongoid.
5
- #
6
- # @todo: Durran: This module needs an overhaul.
7
- module MultiParameterAttributes
8
-
9
- module Errors
10
-
11
- # Raised when an error occurred while doing a mass assignment to an
12
- # attribute through the <tt>attributes=</tt> method. The exception
13
- # has an +attribute+ property that is the name of the offending attribute.
14
- class AttributeAssignmentError < Mongoid::Errors::MongoidError
15
- attr_reader :exception, :attribute
16
-
17
- def initialize(message, exception, attribute)
18
- @exception = exception
19
- @attribute = attribute
20
- @message = message
21
- end
22
- end
23
-
24
- # Raised when there are multiple errors while doing a mass assignment
25
- # through the +attributes+ method. The exception has an +errors+
26
- # property that contains an array of AttributeAssignmentError
27
- # objects, each corresponding to the error while assigning to an
28
- # attribute.
29
- class MultiparameterAssignmentErrors < Mongoid::Errors::MongoidError
30
- attr_reader :errors
31
-
32
- def initialize(errors)
33
- @errors = errors
34
- end
35
- end
36
- end
37
-
38
- # Process the provided attributes casting them to their proper values if a
39
- # field exists for them on the document. This will be limited to only the
40
- # attributes provided in the suppied +Hash+ so that no extra nil values get
41
- # put into the document's attributes.
42
- #
43
- # @example Process the attributes.
44
- # person.process_attributes(:title => "sir", :age => 40)
45
- #
46
- # @param [ Hash ] attrs The attributes to set.
47
- # @param [ Symbol ] role A role for scoped mass assignment.
48
- # @param [ Boolean ] guard_protected_attributes False to skip mass assignment protection.
49
- #
50
- # @since 2.0.0.rc.7
51
- def process_attributes(attrs = nil, role = :default, guard_protected_attributes = true)
52
- if attrs
53
- errors = []
54
- attributes = attrs.class.new
55
- attributes.permitted = true if attrs.respond_to?(:permitted?) && attrs.permitted?
56
- multi_parameter_attributes = {}
57
-
58
- attrs.each_pair do |key, value|
59
- if key =~ /\A([^\(]+)\((\d+)([if])\)$/
60
- key, index = $1, $2.to_i
61
- (multi_parameter_attributes[key] ||= {})[index] = value.empty? ? nil : value.send("to_#{$3}")
62
- else
63
- attributes[key] = value
64
- end
65
- end
66
-
67
- multi_parameter_attributes.each_pair do |key, values|
68
- begin
69
- values = (values.keys.min..values.keys.max).map { |i| values[i] }
70
- field = self.class.fields[database_field_name(key)]
71
- attributes[key] = instantiate_object(field, values)
72
- rescue => e
73
- errors << Errors::AttributeAssignmentError.new(
74
- "error on assignment #{values.inspect} to #{key}", e, key
75
- )
76
- end
77
- end
78
-
79
- unless errors.empty?
80
- raise Errors::MultiparameterAssignmentErrors.new(errors),
81
- "#{errors.size} error(s) on assignment of multiparameter attributes"
82
- end
83
-
84
- super attributes, role, guard_protected_attributes
85
- else
86
- super
87
- end
88
- end
89
-
90
- protected
91
-
92
- def instantiate_object(field, values_with_empty_parameters)
93
- return nil if values_with_empty_parameters.all? { |v| v.nil? }
94
- values = values_with_empty_parameters.collect { |v| v.nil? ? 1 : v }
95
- klass = field.type
96
- if klass == DateTime || klass == Date || klass == Time
97
- field.mongoize(values)
98
- elsif klass
99
- klass.new(*values)
100
- else
101
- values
102
- end
103
- end
104
- end
105
- end
@@ -1,78 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
-
4
- # Mongoid's implementation of Rails' nested attributes.
5
- module NestedAttributes
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- class_attribute :nested_attributes
10
- self.nested_attributes = {}
11
- end
12
-
13
- module ClassMethods
14
-
15
- REJECT_ALL_BLANK_PROC = ->(attributes){
16
- attributes.all? { |key, value| key == '_destroy' || value.blank? }
17
- }
18
-
19
- # Used when needing to update related models from a parent relation. Can
20
- # be used on embedded or referenced relations.
21
- #
22
- # @example Defining nested attributes.
23
- #
24
- # class Person
25
- # include Mongoid::Document
26
- #
27
- # embeds_many :addresses
28
- # embeds_one :game
29
- # references_many :posts
30
- #
31
- # accepts_nested_attributes_for :addresses, :game, :posts
32
- # end
33
- #
34
- # @param [ Array<Symbol>, Hash ] *args A list of relation names, followed
35
- # by a hash of options.
36
- #
37
- # @option *args [ true, false ] :allow_destroy Can deletion occur?
38
- # @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing
39
- # to a class method to reject documents with.
40
- # @option *args [ Integer ] :limit The max number to create.
41
- # @option *args [ true, false ] :update_only Only update existing docs.
42
- def accepts_nested_attributes_for(*args)
43
- options = args.extract_options!
44
- options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
45
- args.each do |name|
46
- meth = "#{name}_attributes="
47
- self.nested_attributes["#{name}_attributes"] = meth
48
- metadata = relations[name.to_s]
49
- raise Errors::NestedAttributesMetadataNotFound.new(self, name) unless metadata
50
- autosave_nested_attributes(metadata)
51
- re_define_method(meth) do |attrs|
52
- _assigning do
53
- metadata.nested_builder(attrs, options).build(self, mass_assignment_options)
54
- end
55
- end
56
- end
57
- end
58
-
59
- private
60
-
61
- # Add the autosave information for the nested relation.
62
- #
63
- # @api private
64
- #
65
- # @example Add the autosave if appropriate.
66
- # Person.autosave_nested_attributes(metadata)
67
- #
68
- # @param [ Metadata ] metadata The existing relation metadata.
69
- #
70
- # @since 3.1.4
71
- def autosave_nested_attributes(metadata)
72
- unless metadata.autosave == false
73
- autosave(metadata.merge!(autosave: true))
74
- end
75
- end
76
- end
77
- end
78
- end
@@ -1,192 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
-
4
- # Observer classes respond to life cycle callbacks to implement trigger-like
5
- # behavior outside the original class. This is a great way to reduce the
6
- # clutter that normally comes when the model class is burdened with
7
- # functionality that doesn't pertain to the core responsibility of the
8
- # class. Mongoid's observers work similar to ActiveRecord's. Example:
9
- #
10
- # class CommentObserver < Mongoid::Observer
11
- # def after_save(comment)
12
- # Notifications.comment(
13
- # "admin@do.com", "New comment was posted", comment
14
- # ).deliver
15
- # end
16
- # end
17
- #
18
- # This Observer sends an email when a Comment#save is finished.
19
- #
20
- # class ContactObserver < Mongoid::Observer
21
- # def after_create(contact)
22
- # contact.logger.info('New contact added!')
23
- # end
24
- #
25
- # def after_destroy(contact)
26
- # contact.logger.warn("Contact with an id of #{contact.id} was destroyed!")
27
- # end
28
- # end
29
- #
30
- # This Observer uses logger to log when specific callbacks are triggered.
31
- #
32
- # == Observing a class that can't be inferred
33
- #
34
- # Observers will by default be mapped to the class with which they share a
35
- # name. So CommentObserver will be tied to observing Comment,
36
- # ProductManagerObserver to ProductManager, and so on. If you want to
37
- # name your observer differently than the class you're interested in
38
- # observing, you can use the Observer.observe class method which takes
39
- # either the concrete class (Product) or a symbol for that class (:product):
40
- #
41
- # class AuditObserver < Mongoid::Observer
42
- # observe :account
43
- #
44
- # def after_update(account)
45
- # AuditTrail.new(account, "UPDATED")
46
- # end
47
- # end
48
- #
49
- # If the audit observer needs to watch more than one kind of object,
50
- # this can be specified with multiple arguments:
51
- #
52
- # class AuditObserver < Mongoid::Observer
53
- # observe :account, :balance
54
- #
55
- # def after_update(record)
56
- # AuditTrail.new(record, "UPDATED")
57
- # end
58
- # end
59
- #
60
- # The AuditObserver will now act on both updates to Account and Balance
61
- # by treating them both as records.
62
- #
63
- # == Available callback methods
64
- #
65
- # * after_initialize
66
- # * before_validation
67
- # * after_validation
68
- # * before_create
69
- # * around_create
70
- # * after_create
71
- # * before_update
72
- # * around_update
73
- # * after_update
74
- # * before_upsert
75
- # * around_upsert
76
- # * after_upsert
77
- # * before_save
78
- # * around_save
79
- # * after_save
80
- # * before_destroy
81
- # * around_destroy
82
- # * after_destroy
83
- #
84
- # == Storing Observers in Rails
85
- #
86
- # If you're using Mongoid within Rails, observer classes are usually stored
87
- # in +app/models+ with the naming convention of +app/models/audit_observer.rb+.
88
- #
89
- # == Configuration
90
- #
91
- # In order to activate an observer, list it in the +config.mongoid.observers+
92
- # configuration setting in your +config/application.rb+ file.
93
- #
94
- # config.mongoid.observers = :comment_observer, :signup_observer
95
- #
96
- # Observers will not be invoked unless you define them in your
97
- # application configuration.
98
- #
99
- # == Loading
100
- #
101
- # Observers register themselves with the model class that they observe,
102
- # since it is the class that notifies them of events when they occur.
103
- # As a side-effect, when an observer is loaded, its corresponding model
104
- # class is loaded.
105
- #
106
- # Observers are loaded after the application initializers, so that
107
- # observed models can make use of extensions. If by any chance you are
108
- # using observed models in the initialization, you can
109
- # still load their observers by calling +ModelObserver.instance+ before.
110
- # Observers are singletons and that call instantiates and registers them.
111
- class Observer < ActiveModel::Observer
112
-
113
- private
114
-
115
- # Adds the specified observer to the class.
116
- #
117
- # @example Add the observer.
118
- # observer.add_observer!(Document)
119
- #
120
- # @param [ Class ] klass The child observer to add.
121
- #
122
- # @since 2.0.0.rc.8
123
- def add_observer!(klass)
124
- super and define_callbacks(klass)
125
- end
126
-
127
- # Defines all the callbacks for each observer of the model.
128
- #
129
- # @example Define all the callbacks.
130
- # observer.define_callbacks(Document)
131
- #
132
- # @param [ Class ] klass The model to define them on.
133
- #
134
- # @since 2.0.0.rc.8
135
- def define_callbacks(klass)
136
- observer = self
137
- observer_name = observer.class.name.underscore.gsub('/', '__')
138
- Mongoid::Callbacks.observables.each do |callback|
139
- next unless respond_to?(callback)
140
- callback_meth = :"_notify_#{observer_name}_for_#{callback}"
141
- unless klass.respond_to?(callback_meth)
142
- klass.send(:define_method, callback_meth) do |&block|
143
- if value = observer.update(callback, self, &block)
144
- value
145
- else
146
- block.call if block
147
- end
148
- end
149
- klass.send(callback, callback_meth)
150
- end
151
- end
152
- self
153
- end
154
-
155
- # Are the observers disabled for the object?
156
- #
157
- # @api private
158
- #
159
- # @example If the observer disabled?
160
- # Observer.disabled_for(band)
161
- #
162
- # @param [ Document ] object The model instance.
163
- #
164
- # @return [ true, false ] If the observer is disabled.
165
- def disabled_for?(object)
166
- klass = object.class
167
- return false unless klass.respond_to?(:observers)
168
- klass.observers.disabled_for?(self) || Mongoid.observers.disabled_for?(self)
169
- end
170
-
171
- class << self
172
-
173
- # Attaches the observer to the specified classes.
174
- #
175
- # @example Attach the BandObserver to the class Artist.
176
- # class BandObserver < Mongoid::Observer
177
- # observe :artist
178
- # end
179
- #
180
- # @param [ Array<Symbol> ] models The names of the models.
181
- #
182
- # @since 3.0.15
183
- def observe(*models)
184
- models.flatten!
185
- models.collect! do |model|
186
- model.respond_to?(:to_sym) ? model.to_s.camelize.constantize : model
187
- end
188
- singleton_class.redefine_method(:observed_classes) { models }
189
- end
190
- end
191
- end
192
- end
@@ -1,136 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
-
4
- # Include this module to get soft deletion of root level documents.
5
- # This will add a deleted_at field to the +Document+, managed automatically.
6
- # Potentially incompatible with unique indices. (if collisions with deleted items)
7
- #
8
- # @example Make a document paranoid.
9
- # class Person
10
- # include Mongoid::Document
11
- # include Mongoid::Paranoia
12
- # end
13
- module Paranoia
14
- extend ActiveSupport::Concern
15
-
16
- included do
17
- field :deleted_at, type: Time
18
- self.paranoid = true
19
-
20
- default_scope where(deleted_at: nil)
21
- scope :deleted, ne(deleted_at: nil)
22
- end
23
-
24
- # Delete the paranoid +Document+ from the database completely. This will
25
- # run the destroy callbacks.
26
- #
27
- # @example Hard destroy the document.
28
- # document.destroy!
29
- #
30
- # @return [ true, false ] If the operation succeeded.
31
- #
32
- # @since 1.0.0
33
- def destroy!
34
- run_callbacks(:destroy) { delete! }
35
- end
36
-
37
- # Delete the paranoid +Document+ from the database completely.
38
- #
39
- # @example Hard delete the document.
40
- # document.delete!
41
- #
42
- # @return [ true, false ] If the operation succeeded.
43
- #
44
- # @since 1.0.0
45
- def delete!
46
- Persistence::Operations.remove(self).persist
47
- end
48
-
49
- # Delete the +Document+, will set the deleted_at timestamp and not actually
50
- # delete it.
51
- #
52
- # @example Soft remove the document.
53
- # document.remove
54
- #
55
- # @param [ Hash ] options The database options.
56
- #
57
- # @return [ true ] True.
58
- #
59
- # @since 1.0.0
60
- def remove(options = {})
61
- cascade!
62
- time = self.deleted_at = Time.now
63
- paranoid_collection.find(atomic_selector).
64
- update({ "$set" => { paranoid_field => time }})
65
- @destroyed = true
66
- IdentityMap.remove(self)
67
- true
68
- end
69
- alias :delete :remove
70
-
71
- # Determines if this document is destroyed.
72
- #
73
- # @example Is the document destroyed?
74
- # person.destroyed?
75
- #
76
- # @return [ true, false ] If the document is destroyed.
77
- #
78
- # @since 1.0.0
79
- def destroyed?
80
- (@destroyed ||= false) || !!deleted_at
81
- end
82
- alias :deleted? :destroyed?
83
-
84
- def persisted?
85
- !new_record? && !(@destroyed ||= false)
86
- end
87
-
88
- # Restores a previously soft-deleted document. Handles this by removing the
89
- # deleted_at flag.
90
- #
91
- # @example Restore the document from deleted state.
92
- # document.restore
93
- #
94
- # @return [ Time ] The time the document had been deleted.
95
- #
96
- # @since 1.0.0
97
- def restore
98
- paranoid_collection.find(atomic_selector).
99
- update({ "$unset" => { paranoid_field => true }})
100
- attributes.delete("deleted_at")
101
- @destroyed = false
102
- true
103
- end
104
-
105
- # Returns a string representing the documents's key suitable for use in URLs.
106
- def to_param
107
- new_record? ? nil : to_key.join('-')
108
- end
109
-
110
- private
111
-
112
- # Get the collection to be used for paranoid operations.
113
- #
114
- # @example Get the paranoid collection.
115
- # document.paranoid_collection
116
- #
117
- # @return [ Collection ] The root collection.
118
- #
119
- # @since 2.3.1
120
- def paranoid_collection
121
- embedded? ? _root.collection : self.collection
122
- end
123
-
124
- # Get the field to be used for paranoid operations.
125
- #
126
- # @example Get the paranoid field.
127
- # document.paranoid_field
128
- #
129
- # @return [ String ] The deleted at field.
130
- #
131
- # @since 2.3.1
132
- def paranoid_field
133
- embedded? ? "#{atomic_position}.deleted_at" : "deleted_at"
134
- end
135
- end
136
- end
@@ -1,47 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Persistence
4
- module Atomic
5
-
6
- # This class provides the ability to perform an explicit $addToSet
7
- # modification on a specific field.
8
- class AddToSet
9
- include Operation
10
-
11
- # Sends the atomic $addToSet operation to the database.
12
- #
13
- # @example Persist the new values.
14
- # addToSet.persist
15
- #
16
- # @return [ Object ] The new array value.
17
- #
18
- # @since 2.0.0
19
- def persist
20
- prepare do
21
- document[field] = [] unless document[field]
22
- values = document.send(field)
23
- Array.wrap(value).each do |val|
24
- values.push(val) unless values.include?(val)
25
- end
26
- execute("$addToSet")
27
- values
28
- end
29
- end
30
-
31
- # Get the atomic operation to perform.
32
- #
33
- # @example Get the operation.
34
- # add_to_set.operation("$addToSet")
35
- #
36
- # @param [ String ] modifier The modifier to use.
37
- #
38
- # @return [ Hash ] The atomic operation for the field and addition.
39
- #
40
- # @since 2.0.0
41
- def operation(modifier)
42
- { modifier => { path => value.is_a?(Array) ? { "$each" => value } : value}}
43
- end
44
- end
45
- end
46
- end
47
- end
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Persistence
4
- module Atomic
5
-
6
- # This operation is for performing $bit atomic operations against the
7
- # database.
8
- class Bit
9
- include Operation
10
-
11
- # Execute the bitwise operation. This correlates to a $bit in MongoDB.
12
- #
13
- # @example Execute the op.
14
- # bit.persist
15
- #
16
- # @return [ Integer ] The new value.
17
- #
18
- # @since 2.1.0
19
- def persist
20
- prepare do
21
- current = document[field]
22
- return nil unless current
23
- document[field] = value.inject(current) do |result, (bit, val)|
24
- result = result & val if bit.to_s == "and"
25
- result = result | val if bit.to_s == "or"
26
- result
27
- end
28
- execute("$bit")
29
- document[field]
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Persistence
4
- module Atomic
5
-
6
- # This class provides atomic $inc behaviour.
7
- class Inc
8
- include Operation
9
-
10
- # Sends the atomic $inc operation to the database.
11
- #
12
- # @example Persist the new values.
13
- # inc.persist
14
- #
15
- # @return [ Object ] The new numeric value.
16
- #
17
- # @since 2.0.0
18
- def persist
19
- prepare do
20
- current = document[field] || 0
21
- document[field] = current + value
22
- execute("$inc")
23
- document[field]
24
- end
25
- end
26
-
27
- private
28
-
29
- # In case we need to cast going to the database.
30
- #
31
- # @api private
32
- #
33
- # @example Cast the value.
34
- # operation.cast_value
35
- #
36
- # @return [ Integer, Float ] The value casted.
37
- #
38
- # @since 3.0.3
39
- def cast_value
40
- value.__to_inc__
41
- end
42
- end
43
- end
44
- end
45
- end