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
@@ -6,6 +6,17 @@ module Mongoid
6
6
  # This module contains logic for easy access to objects that have a lifecycle
7
7
  # on the current thread.
8
8
  module Threaded
9
+ DATABASE_OVERRIDE_KEY = "[mongoid]:db-override"
10
+ SESSIONS_KEY = "[mongoid]:sessions"
11
+ SESSION_OVERRIDE_KEY = "[mongoid]:session-override"
12
+ SCOPE_STACK_KEY = "[mongoid]:scope-stack"
13
+ AUTOSAVES_KEY = "[mongoid]:autosaves"
14
+ VALIDATIONS_KEY = "[mongoid]:validations"
15
+
16
+ STACK_KEYS = Hash.new do |hash, key|
17
+ hash[key] = "[mongoid]:#{key}-stack"
18
+ end
19
+
9
20
  extend self
10
21
 
11
22
  # Begin entry into a named thread local stack.
@@ -31,7 +42,7 @@ module Mongoid
31
42
  #
32
43
  # @since 3.0.0
33
44
  def database_override
34
- Thread.current["[mongoid]:db-override"]
45
+ Thread.current[DATABASE_OVERRIDE_KEY]
35
46
  end
36
47
 
37
48
  # Set the global database override.
@@ -45,7 +56,7 @@ module Mongoid
45
56
  #
46
57
  # @since 3.0.0
47
58
  def database_override=(name)
48
- Thread.current["[mongoid]:db-override"] = name
59
+ Thread.current[DATABASE_OVERRIDE_KEY] = name
49
60
  end
50
61
 
51
62
  # Get the database sessions from the current thread.
@@ -57,7 +68,7 @@ module Mongoid
57
68
  #
58
69
  # @since 3.0.0
59
70
  def sessions
60
- Thread.current["[mongoid]:sessions"] ||= {}
71
+ Thread.current[SESSIONS_KEY] ||= {}
61
72
  end
62
73
 
63
74
  # Are in the middle of executing the named stack
@@ -99,7 +110,7 @@ module Mongoid
99
110
  #
100
111
  # @since 2.4.0
101
112
  def stack(name)
102
- Thread.current["[mongoid]:#{name}-stack"] ||= []
113
+ Thread.current[STACK_KEYS[name]] ||= []
103
114
  end
104
115
 
105
116
  # Begin autosaving a document on the current thread.
@@ -111,7 +122,7 @@ module Mongoid
111
122
  #
112
123
  # @since 3.0.0
113
124
  def begin_autosave(document)
114
- autosaves_for(document.class).push(document.id)
125
+ autosaves_for(document.class).push(document._id)
115
126
  end
116
127
 
117
128
  # Begin validating a document on the current thread.
@@ -123,22 +134,7 @@ module Mongoid
123
134
  #
124
135
  # @since 2.1.9
125
136
  def begin_validate(document)
126
- validations_for(document.class).push(document.id)
127
- end
128
-
129
- # Clear out all the persistence options.
130
- #
131
- # @example Clear out the persistence options.
132
- # Threaded.clear_persistence_options(Band)
133
- #
134
- # @param [ Class ] klass The model class.
135
- #
136
- # @return [ true ] true.
137
- #
138
- # @since 2.0.0
139
- def clear_persistence_options(klass)
140
- Thread.current["[mongoid][#{klass}]:persistence-options"] = nil
141
- true
137
+ validations_for(document.class).push(document._id)
142
138
  end
143
139
 
144
140
  # Exit autosaving a document on the current thread.
@@ -150,7 +146,7 @@ module Mongoid
150
146
  #
151
147
  # @since 3.0.0
152
148
  def exit_autosave(document)
153
- autosaves_for(document.class).delete_one(document.id)
149
+ autosaves_for(document.class).delete_one(document._id)
154
150
  end
155
151
 
156
152
  # Exit validating a document on the current thread.
@@ -162,149 +158,7 @@ module Mongoid
162
158
  #
163
159
  # @since 2.1.9
164
160
  def exit_validate(document)
165
- validations_for(document.class).delete_one(document.id)
166
- end
167
-
168
- # Get the identity map off the current thread.
169
- #
170
- # @example Get the identity map.
171
- # Threaded.identity_map
172
- #
173
- # @return [ IdentityMap ] The identity map.
174
- #
175
- # @since 2.1.0
176
- def identity_map
177
- Thread.current["[mongoid]:identity-map"] ||= IdentityMap.new
178
- end
179
-
180
- # Is the identity map enabled on the current thread?
181
- #
182
- # @example Is the identity map enabled?
183
- # Threaded.identity_map_enabled?
184
- #
185
- # @return [ true, false ] If the identity map is enabled.
186
- #
187
- # @since 3.0.0
188
- def identity_map_enabled?
189
- Thread.current["[mongoid]:identity-map-enabled"] != false
190
- end
191
-
192
- # Disable the identity map on either the current thread or all threads.
193
- #
194
- # @example Disable the identity map on all threads.
195
- # Threaded.disable_identity_map(:all)
196
- #
197
- # @example Disable the identity map on the current thread.
198
- # Threaded.disable_identity_map(:current)
199
- #
200
- # @param [ Symbol ] option The disabling option.
201
- #
202
- # @since 3.0.0
203
- def disable_identity_map(option)
204
- if option == :all
205
- Thread.list.each do |thread|
206
- thread["[mongoid]:identity-map-enabled"] = false
207
- end
208
- else
209
- Thread.current["[mongoid]:identity-map-enabled"] = false
210
- end
211
- end
212
-
213
- # Enable the identity map on either the current thread or all threads.
214
- #
215
- # @example Enable the identity map on all threads.
216
- # Threaded.enable_identity_map(:all)
217
- #
218
- # @example Enable the identity map on the current thread.
219
- # Threaded.enable_identity_map(:current)
220
- #
221
- # @param [ Symbol ] option The disabling option.
222
- #
223
- # @since 3.0.0
224
- def enable_identity_map(option)
225
- if option == :all
226
- Thread.list.each do |thread|
227
- thread["[mongoid]:identity-map-enabled"] = true
228
- end
229
- else
230
- Thread.current["[mongoid]:identity-map-enabled"] = true
231
- end
232
- end
233
-
234
- # Get the persistence options for the current thread.
235
- #
236
- # @example Get the persistence options.
237
- # Threaded.persistence_options(Band)
238
- #
239
- # @param [ Class ] klass The model class.
240
- #
241
- # @return [ Hash ] The current persistence options.
242
- #
243
- # @since 2.1.0
244
- def persistence_options(klass)
245
- Thread.current["[mongoid][#{klass}]:persistence-options"]
246
- end
247
-
248
- # Set the persistence options on the current thread.
249
- #
250
- # @example Set the persistence options.
251
- # Threaded.set_persistence_options(Band, { safe: { fsync: true }})
252
- #
253
- # @param [ Class ] klass The model class.
254
- # @param [ Hash ] options The persistence options.
255
- #
256
- # @return [ Hash ] The persistence options.
257
- #
258
- # @since 2.1.0
259
- def set_persistence_options(klass, options)
260
- Thread.current["[mongoid][#{klass}]:persistence-options"] = options
261
- end
262
-
263
- # Get the field selection options from the current thread.
264
- #
265
- # @example Get the field selection options.
266
- # Threaded.selection
267
- #
268
- # @param [ Integer ] criteria_instance_id The criteria instance id.
269
- #
270
- # @return [ Hash ] The field selection.
271
- #
272
- # @since 2.4.4
273
- def selection(criteria_instance_id)
274
- selections = Thread.current["[mongoid][selections]"]
275
- selections[criteria_instance_id] if selections
276
- end
277
-
278
- # Set the field selection on the current thread.
279
- #
280
- # @example Set the field selection.
281
- # Threaded.set_selection(Person, { field: 1 })
282
- #
283
- # @param [ Integer ] criteria_instance_id The criteria instance id.
284
- # @param [ Hash ] value The current field selection.
285
- #
286
- # @return [ Hash ] The field selection.
287
- #
288
- # @since 2.4.4
289
- def set_selection(criteria_instance_id, value)
290
- Thread.current["[mongoid][selections]"] ||= {}
291
- Thread.current["[mongoid][selections]"][criteria_instance_id] = value
292
- end
293
-
294
- # Delete the field selection on the current thread.
295
- #
296
- # @example Delete the field selection.
297
- # Threaded.delete_selection(Person)
298
- #
299
- # @param [ Integer ] criteria_instance_id The criteria instance id.
300
- #
301
- # @return [ Boolean ] Whether there was a field selection.
302
- #
303
- # @since 3.0.7
304
- def delete_selection(criteria_instance_id)
305
- selections = Thread.current["[mongoid][selections]"]
306
- return false unless selections
307
- !!selections.delete(criteria_instance_id)
161
+ validations_for(document.class).delete_one(document._id)
308
162
  end
309
163
 
310
164
  # Get the global session override.
@@ -316,7 +170,7 @@ module Mongoid
316
170
  #
317
171
  # @since 3.0.0
318
172
  def session_override
319
- Thread.current["[mongoid]:session-override"]
173
+ Thread.current[SESSION_OVERRIDE_KEY]
320
174
  end
321
175
 
322
176
  # Set the global session override.
@@ -330,7 +184,7 @@ module Mongoid
330
184
  #
331
185
  # @since 3.0.0
332
186
  def session_override=(name)
333
- Thread.current["[mongoid]:session-override"] = name
187
+ Thread.current[SESSION_OVERRIDE_KEY] = name
334
188
  end
335
189
 
336
190
  # Get the mongoid scope stack for chained criteria.
@@ -342,7 +196,7 @@ module Mongoid
342
196
  #
343
197
  # @since 2.1.0
344
198
  def scope_stack
345
- Thread.current["[mongoid]:scope-stack"] ||= {}
199
+ Thread.current[SCOPE_STACK_KEY] ||= {}
346
200
  end
347
201
 
348
202
  # Is the document autosaved on the current thread?
@@ -356,7 +210,7 @@ module Mongoid
356
210
  #
357
211
  # @since 2.1.9
358
212
  def autosaved?(document)
359
- autosaves_for(document.class).include?(document.id)
213
+ autosaves_for(document.class).include?(document._id)
360
214
  end
361
215
 
362
216
  # Is the document validated on the current thread?
@@ -370,7 +224,7 @@ module Mongoid
370
224
  #
371
225
  # @since 2.1.9
372
226
  def validated?(document)
373
- validations_for(document.class).include?(document.id)
227
+ validations_for(document.class).include?(document._id)
374
228
  end
375
229
 
376
230
  # Get all autosaves on the current thread.
@@ -382,7 +236,7 @@ module Mongoid
382
236
  #
383
237
  # @since 3.0.0
384
238
  def autosaves
385
- Thread.current["[mongoid]:autosaves"] ||= {}
239
+ Thread.current[AUTOSAVES_KEY] ||= {}
386
240
  end
387
241
 
388
242
  # Get all validations on the current thread.
@@ -394,7 +248,7 @@ module Mongoid
394
248
  #
395
249
  # @since 2.1.9
396
250
  def validations
397
- Thread.current["[mongoid]:validations"] ||= {}
251
+ Thread.current[VALIDATIONS_KEY] ||= {}
398
252
  end
399
253
 
400
254
  # Get all autosaves on the current thread for the class.
@@ -3,8 +3,8 @@ module Mongoid
3
3
  module Timestamps
4
4
  module Updated
5
5
 
6
- # Adds a created_at timestamp to the document, but it is stored as c_at
7
- # with a created_at alias.
6
+ # Adds an updated_at timestamp to the document, but it is stored as u_at
7
+ # with an updated_at alias.
8
8
  module Short
9
9
  extend ActiveSupport::Concern
10
10
 
@@ -1,10 +1,18 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Hierarchy
3
+
4
+ # Provides behaviour around traversing the document graph.
5
+ #
6
+ # @since 4.0.0
7
+ module Traversable
4
8
  extend ActiveSupport::Concern
5
9
 
6
- included do
7
- attr_accessor :_parent
10
+ def _parent
11
+ @__parent
12
+ end
13
+
14
+ def _parent=(p)
15
+ @__parent = p
8
16
  end
9
17
 
10
18
  # Get all child +Documents+ to this +Document+, going n levels deep if
@@ -19,7 +27,7 @@ module Mongoid
19
27
  #
20
28
  # @return [ Array<Document> ] All child documents in the hierarchy.
21
29
  def _children
22
- @_children ||= collect_children
30
+ @__children ||= collect_children
23
31
  end
24
32
 
25
33
  # Collect all the children of this document.
@@ -37,7 +45,7 @@ module Mongoid
37
45
  child = send(name)
38
46
  Array.wrap(child).each do |doc|
39
47
  children.push(doc)
40
- children.concat(doc._children) unless metadata.versioned?
48
+ children.concat(doc._children)
41
49
  end if child
42
50
  end
43
51
  end
@@ -116,6 +124,7 @@ module Mongoid
116
124
  child.move_changes
117
125
  child.new_record = false
118
126
  end
127
+ @__children = nil
119
128
  end
120
129
 
121
130
  # Return the root document in the object graph. If the current document
@@ -174,7 +183,6 @@ module Mongoid
174
183
  subclass.pre_processed_defaults = pre_processed_defaults.dup
175
184
  subclass.post_processed_defaults = post_processed_defaults.dup
176
185
  subclass._declared_scopes = Hash.new { |hash,key| self._declared_scopes[key] }
177
- subclass.autosaved_relations = autosaved_relations.dup
178
186
 
179
187
  # We only need the _type field if inheritance is in play, but need to
180
188
  # add to the root class as well for backwards compatibility.
@@ -182,7 +190,7 @@ module Mongoid
182
190
  field(:_type, default: self.name, type: String)
183
191
  end
184
192
  subclass_default = subclass.name || ->{ self.class.name }
185
- subclass.field(:_type, default: subclass_default, type: String)
193
+ subclass.field(:_type, default: subclass_default, type: String, overwrite: true)
186
194
  end
187
195
  end
188
196
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Validations
3
+ module Validatable
4
4
 
5
5
  # Validates whether or not an association is valid or not. Will correctly
6
6
  # handle has one and has many associations.
@@ -26,11 +26,13 @@ module Mongoid
26
26
  # @param [ Document ] document The document to validate.
27
27
  # @param [ Symbol ] attribute The relation to validate.
28
28
  # @param [ Object ] value The value of the relation.
29
+ #
30
+ # @since 2.0.0
29
31
  def validate_each(document, attribute, value)
30
32
  begin
31
33
  document.begin_validate
32
34
  valid = Array.wrap(value).collect do |doc|
33
- if doc.nil?
35
+ if doc.nil? || doc.flagged_for_destroy?
34
36
  true
35
37
  else
36
38
  doc.validated? ? true : doc.valid?
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Validations
3
+ module Validatable
4
4
 
5
5
  # Validates that the specified attributes do or do not match a certain
6
6
  # regular expression.
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Validations
3
+ module Validatable
4
4
 
5
5
  # Validates that the specified attributes do or do not match a certain
6
6
  # length.
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Validations
3
+ module Validatable
4
4
 
5
5
  # Adds localization support to validations.
6
6
  module Localizable
@@ -1,5 +1,6 @@
1
+ # encoding: utf-8
1
2
  module Mongoid
2
- module Validations
3
+ module Validatable
3
4
  module Macros
4
5
  extend ActiveSupport::Concern
5
6
 
@@ -52,7 +53,7 @@ module Mongoid
52
53
  #
53
54
  # @since 2.4.0
54
55
  def validates_format_of(*args)
55
- validates_with(Mongoid::Validations::FormatValidator, _merge_attributes(args))
56
+ validates_with(FormatValidator, _merge_attributes(args))
56
57
  end
57
58
 
58
59
  # Validates the length of a field.
@@ -69,7 +70,7 @@ module Mongoid
69
70
  #
70
71
  # @since 2.4.0
71
72
  def validates_length_of(*args)
72
- validates_with(Mongoid::Validations::LengthValidator, _merge_attributes(args))
73
+ validates_with(LengthValidator, _merge_attributes(args))
73
74
  end
74
75
 
75
76
  # Validates whether or not a field is present - meaning nil or empty.
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Validations
3
+ module Validatable
4
4
 
5
5
  # Validates that the specified attributes are not blank (as defined by
6
6
  # Object#blank?).
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Validations
3
+ module Validatable
4
4
  module Queryable
5
5
 
6
6
  # Wrap the validation inside the an execution block that alert's the
@@ -22,7 +22,6 @@ module Mongoid
22
22
  Threaded.begin_execution("#{klass.name}-validate-with-query")
23
23
  yield
24
24
  ensure
25
- klass.clear_persistence_options unless document.errors.empty?
26
25
  Threaded.exit_execution("#{klass.name}-validate-with-query")
27
26
  end
28
27
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Validations
3
+ module Validatable
4
4
 
5
5
  # Validates whether or not a field is unique against the documents in the
6
6
  # database.
@@ -13,23 +13,19 @@ module Mongoid
13
13
  #
14
14
  # validates_uniqueness_of :title
15
15
  # end
16
+ #
17
+ # It is also possible to limit the uniqueness constraint to a set of
18
+ # records matching certain conditions:
19
+ # class Person
20
+ # include Mongoid::Document
21
+ # field :title
22
+ # field :active, type: Boolean
23
+ #
24
+ # validates_uniqueness_of :title, conditions: -> {where(active: true)}
25
+ # end
16
26
  class UniquenessValidator < ActiveModel::EachValidator
17
27
  include Queryable
18
28
 
19
- attr_reader :klass
20
-
21
- # Unfortunately, we have to tie Uniqueness validators to a class.
22
- #
23
- # @example Setup the validator.
24
- # UniquenessValidator.new.setup(Person)
25
- #
26
- # @param [ Class ] klass The class getting validated.
27
- #
28
- # @since 1.0.0
29
- def setup(klass)
30
- @klass = klass
31
- end
32
-
33
29
  # Validate the document for uniqueness violations.
34
30
  #
35
31
  # @example Validate the document.
@@ -134,7 +130,7 @@ module Mongoid
134
130
  end
135
131
 
136
132
  if document.persisted? && !document.embedded?
137
- selector.merge!(_id: { "$ne" => document.id })
133
+ selector.merge!(_id: { "$ne" => document._id })
138
134
  end
139
135
  selector
140
136
  end
@@ -168,12 +164,12 @@ module Mongoid
168
164
  # @return [ Criteria ] The scoped criteria.
169
165
  #
170
166
  # @since 2.3.0
171
- def scope(criteria, document, attribute)
167
+ def scope(criteria, document, _attribute)
172
168
  Array.wrap(options[:scope]).each do |item|
173
169
  name = document.database_field_name(item)
174
170
  criteria = criteria.where(item => document.attributes[name])
175
171
  end
176
- criteria = criteria.where(deleted_at: nil) if document.paranoid?
172
+ criteria = criteria.with(document.persistence_options)
177
173
  criteria
178
174
  end
179
175
 
@@ -231,7 +227,7 @@ module Mongoid
231
227
  def to_validate(document, attribute, value)
232
228
  metadata = document.relations[attribute.to_s]
233
229
  if metadata && metadata.stores_foreign_key?
234
- [ metadata.foreign_key, value.id ]
230
+ [ metadata.foreign_key, value && value._id ]
235
231
  else
236
232
  [ attribute, value ]
237
233
  end
@@ -253,6 +249,7 @@ module Mongoid
253
249
  return if skip_validation?(document)
254
250
  relation = document._parent.send(document.metadata_name)
255
251
  criteria = create_criteria(relation, document, attribute, value)
252
+ criteria = criteria.merge(options[:conditions].call) if options[:conditions]
256
253
  add_error(document, attribute, value) if criteria.count > 1
257
254
  end
258
255
 
@@ -269,7 +266,14 @@ module Mongoid
269
266
  #
270
267
  # @since 2.4.10
271
268
  def validate_root(document, attribute, value)
272
- criteria = create_criteria(klass || document.class, document, attribute, value)
269
+ klass = document.class
270
+
271
+ while klass.superclass.respond_to?(:validators) && klass.superclass.validators.include?(self)
272
+ klass = klass.superclass
273
+ end
274
+ criteria = create_criteria(klass, document, attribute, value)
275
+ criteria = criteria.merge(options[:conditions].call) if options[:conditions]
276
+
273
277
  if criteria.with(persistence_options(criteria)).exists?
274
278
  add_error(document, attribute, value)
275
279
  end
@@ -306,7 +310,7 @@ module Mongoid
306
310
  #
307
311
  # @since 3.0.23
308
312
  def persistence_options(criteria)
309
- (criteria.klass.persistence_options || {}).merge!(consistency: :strong)
313
+ (criteria.persistence_options || {}).merge!(read: :primary)
310
314
  end
311
315
 
312
316
  # Is the attribute localized?
@@ -1,20 +1,19 @@
1
1
  # encoding: utf-8
2
- require "mongoid/validations/macros"
3
- require "mongoid/validations/localizable"
4
- require "mongoid/validations/associated"
5
- require "mongoid/validations/format"
6
- require "mongoid/validations/length"
7
- require "mongoid/validations/queryable"
8
- require "mongoid/validations/presence"
9
- require "mongoid/validations/uniqueness"
2
+ require "mongoid/validatable/macros"
3
+ require "mongoid/validatable/localizable"
4
+ require "mongoid/validatable/associated"
5
+ require "mongoid/validatable/format"
6
+ require "mongoid/validatable/length"
7
+ require "mongoid/validatable/queryable"
8
+ require "mongoid/validatable/presence"
9
+ require "mongoid/validatable/uniqueness"
10
10
 
11
11
  module Mongoid
12
12
 
13
13
  # This module provides additional validations that ActiveModel does not
14
14
  # provide: validates_associated and validates_uniqueness_of.
15
- module Validations
15
+ module Validatable
16
16
  extend ActiveSupport::Concern
17
- include ActiveModel::Validations
18
17
 
19
18
  included do
20
19
  extend Macros
@@ -41,6 +40,20 @@ module Mongoid
41
40
  Threaded.exit_validate(self)
42
41
  end
43
42
 
43
+ # Given the provided options, are we performing validations?
44
+ #
45
+ # @example Are we performing validations?
46
+ # document.performing_validations?(validate: true)
47
+ #
48
+ # @param [ Hash ] options The options to check.
49
+ #
50
+ # @return [ true, false ] If we are validating.
51
+ #
52
+ # @since 4.0.0
53
+ def performing_validations?(options = {})
54
+ options[:validate].nil? ? true : options[:validate]
55
+ end
56
+
44
57
  # Overrides the default ActiveModel behaviour since we need to handle
45
58
  # validations of relations slightly different than just calling the
46
59
  # getter.
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- VERSION = "3.1.7"
3
+ VERSION = "4.0.2"
4
4
  end