mongoid 3.1.6 → 4.0.0

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 (562) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +432 -8
  3. data/README.md +5 -6
  4. data/lib/config/locales/en.yml +32 -18
  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 +1 -12
  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 -101
  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/mongo.rb +7 -9
  19. data/lib/mongoid/contextual/atomic.rb +53 -53
  20. data/lib/mongoid/contextual/geo_near.rb +1 -1
  21. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  22. data/lib/mongoid/contextual/memory.rb +18 -6
  23. data/lib/mongoid/contextual/mongo.rb +64 -56
  24. data/lib/mongoid/contextual/none.rb +90 -0
  25. data/lib/mongoid/contextual/text_search.rb +178 -0
  26. data/lib/mongoid/contextual.rb +2 -0
  27. data/lib/mongoid/copyable.rb +2 -3
  28. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  29. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  30. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  31. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  32. data/lib/mongoid/criteria/permission.rb +70 -0
  33. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  34. data/lib/mongoid/criteria.rb +39 -34
  35. data/lib/mongoid/document.rb +32 -17
  36. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  37. data/lib/mongoid/errors/document_not_found.rb +2 -1
  38. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  39. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  40. data/lib/mongoid/errors/invalid_value.rb +16 -0
  41. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  42. data/lib/mongoid/errors/readonly_document.rb +24 -0
  43. data/lib/mongoid/errors.rb +4 -1
  44. data/lib/mongoid/extensions/array.rb +3 -3
  45. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  46. data/lib/mongoid/extensions/boolean.rb +15 -17
  47. data/lib/mongoid/extensions/date.rb +1 -1
  48. data/lib/mongoid/extensions/date_time.rb +3 -3
  49. data/lib/mongoid/extensions/float.rb +2 -1
  50. data/lib/mongoid/extensions/hash.rb +3 -3
  51. data/lib/mongoid/extensions/integer.rb +1 -1
  52. data/lib/mongoid/extensions/object.rb +7 -7
  53. data/lib/mongoid/extensions/object_id.rb +5 -5
  54. data/lib/mongoid/extensions/range.rb +9 -3
  55. data/lib/mongoid/extensions/regexp.rb +1 -1
  56. data/lib/mongoid/extensions/set.rb +1 -1
  57. data/lib/mongoid/extensions/string.rb +6 -18
  58. data/lib/mongoid/extensions/symbol.rb +1 -1
  59. data/lib/mongoid/extensions/time.rb +3 -3
  60. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  61. data/lib/mongoid/extensions.rb +2 -7
  62. data/lib/mongoid/factory.rb +8 -6
  63. data/lib/mongoid/fields/foreign_key.rb +3 -3
  64. data/lib/mongoid/fields/localized.rb +1 -1
  65. data/lib/mongoid/fields/standard.rb +5 -17
  66. data/lib/mongoid/fields/validators/macro.rb +15 -5
  67. data/lib/mongoid/fields.rb +41 -8
  68. data/lib/mongoid/{finders.rb → findable.rb} +8 -2
  69. data/lib/mongoid/indexable/specification.rb +104 -0
  70. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  71. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  72. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  73. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  74. data/lib/mongoid/log_subscriber.rb +55 -0
  75. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  76. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  77. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  78. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  79. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  81. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  82. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
  85. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  86. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  87. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  88. data/lib/mongoid/matchable.rb +152 -0
  89. data/lib/mongoid/persistable/creatable.rb +188 -0
  90. data/lib/mongoid/persistable/deletable.rb +149 -0
  91. data/lib/mongoid/persistable/destroyable.rb +60 -0
  92. data/lib/mongoid/persistable/incrementable.rb +36 -0
  93. data/lib/mongoid/persistable/logical.rb +38 -0
  94. data/lib/mongoid/persistable/poppable.rb +39 -0
  95. data/lib/mongoid/persistable/pullable.rb +55 -0
  96. data/lib/mongoid/persistable/pushable.rb +62 -0
  97. data/lib/mongoid/persistable/renamable.rb +35 -0
  98. data/lib/mongoid/persistable/savable.rb +52 -0
  99. data/lib/mongoid/persistable/settable.rb +33 -0
  100. data/lib/mongoid/persistable/unsettable.rb +36 -0
  101. data/lib/mongoid/persistable/updatable.rb +152 -0
  102. data/lib/mongoid/persistable/upsertable.rb +55 -0
  103. data/lib/mongoid/persistable.rb +216 -0
  104. data/lib/mongoid/positional.rb +71 -0
  105. data/lib/mongoid/query_cache.rb +247 -0
  106. data/lib/mongoid/railtie.rb +32 -45
  107. data/lib/mongoid/railties/database.rake +9 -25
  108. data/lib/mongoid/relations/accessors.rb +13 -49
  109. data/lib/mongoid/relations/auto_save.rb +15 -36
  110. data/lib/mongoid/relations/binding.rb +1 -24
  111. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  112. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  113. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
  115. data/lib/mongoid/relations/builder.rb +1 -1
  116. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  117. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
  118. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  119. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  120. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  121. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  122. data/lib/mongoid/relations/builders.rb +2 -2
  123. data/lib/mongoid/relations/cascading.rb +3 -5
  124. data/lib/mongoid/relations/constraint.rb +1 -1
  125. data/lib/mongoid/relations/conversions.rb +1 -1
  126. data/lib/mongoid/relations/counter_cache.rb +39 -15
  127. data/lib/mongoid/relations/eager/base.rb +149 -0
  128. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  129. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  130. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  131. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  134. data/lib/mongoid/relations/embedded/in.rb +4 -4
  135. data/lib/mongoid/relations/embedded/many.rb +14 -32
  136. data/lib/mongoid/relations/embedded/one.rb +1 -1
  137. data/lib/mongoid/relations/macros.rb +3 -4
  138. data/lib/mongoid/relations/many.rb +30 -31
  139. data/lib/mongoid/relations/marshalable.rb +3 -3
  140. data/lib/mongoid/relations/metadata.rb +14 -79
  141. data/lib/mongoid/relations/nested_builder.rb +2 -2
  142. data/lib/mongoid/relations/options.rb +1 -0
  143. data/lib/mongoid/relations/polymorphic.rb +0 -1
  144. data/lib/mongoid/relations/proxy.rb +21 -41
  145. data/lib/mongoid/relations/referenced/in.rb +4 -20
  146. data/lib/mongoid/relations/referenced/many.rb +19 -32
  147. data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
  148. data/lib/mongoid/relations/referenced/one.rb +6 -25
  149. data/lib/mongoid/relations/synchronization.rb +3 -3
  150. data/lib/mongoid/relations/touchable.rb +34 -1
  151. data/lib/mongoid/relations.rb +11 -25
  152. data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
  153. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  154. data/lib/mongoid/selectable.rb +59 -0
  155. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  156. data/lib/mongoid/sessions/factory.rb +2 -0
  157. data/lib/mongoid/sessions/options.rb +180 -0
  158. data/lib/mongoid/sessions/storage_options.rb +140 -0
  159. data/lib/mongoid/sessions/thread_options.rb +19 -0
  160. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  161. data/lib/mongoid/sessions.rb +37 -345
  162. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  163. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  164. data/lib/mongoid/support/query_counter.rb +23 -0
  165. data/lib/mongoid/tasks/database.rake +31 -0
  166. data/lib/mongoid/tasks/database.rb +107 -0
  167. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  168. data/lib/mongoid/threaded.rb +0 -157
  169. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  170. data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
  171. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  172. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  173. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  174. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  175. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  176. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  177. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  178. data/lib/mongoid/{validations → validatable}/uniqueness.rb +23 -19
  179. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  180. data/lib/mongoid/version.rb +1 -1
  181. data/lib/mongoid.rb +10 -76
  182. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
  183. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  184. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  185. data/lib/rails/generators/mongoid_generator.rb +3 -40
  186. data/lib/rails/mongoid.rb +0 -122
  187. data/lib/support/ruby_version.rb +1 -1
  188. data/spec/app/models/account.rb +2 -6
  189. data/spec/app/models/acolyte.rb +2 -1
  190. data/spec/app/models/actor.rb +0 -1
  191. data/spec/app/models/address.rb +8 -3
  192. data/spec/app/models/animal.rb +1 -1
  193. data/spec/app/models/appointment.rb +3 -3
  194. data/spec/app/models/article.rb +1 -4
  195. data/spec/app/models/audio.rb +5 -0
  196. data/spec/app/models/author.rb +0 -2
  197. data/spec/app/models/band.rb +3 -2
  198. data/spec/app/models/bar.rb +1 -0
  199. data/spec/app/models/book.rb +1 -0
  200. data/spec/app/models/building.rb +0 -2
  201. data/spec/app/models/building_address.rb +0 -2
  202. data/spec/app/models/bus.rb +1 -1
  203. data/spec/app/models/canvas.rb +1 -1
  204. data/spec/app/models/contractor.rb +0 -2
  205. data/spec/app/models/country_code.rb +1 -1
  206. data/spec/app/models/definition.rb +2 -2
  207. data/spec/app/models/dog.rb +1 -1
  208. data/spec/app/models/draft.rb +9 -0
  209. data/spec/app/models/dragon.rb +4 -0
  210. data/spec/app/models/drug.rb +1 -3
  211. data/spec/app/models/dungeon.rb +4 -0
  212. data/spec/app/models/edit.rb +5 -0
  213. data/spec/app/models/even.rb +7 -0
  214. data/spec/app/models/event.rb +1 -1
  215. data/spec/app/models/filesystem.rb +1 -0
  216. data/spec/app/models/fish.rb +0 -1
  217. data/spec/app/models/fruits.rb +6 -0
  218. data/spec/app/models/game.rb +0 -2
  219. data/spec/app/models/house.rb +1 -3
  220. data/spec/app/models/item.rb +1 -5
  221. data/spec/app/models/jar.rb +1 -1
  222. data/spec/app/models/label.rb +4 -4
  223. data/spec/app/models/line_item.rb +1 -1
  224. data/spec/app/models/login.rb +1 -1
  225. data/spec/app/models/message.rb +8 -0
  226. data/spec/app/models/movie.rb +1 -0
  227. data/spec/app/models/name.rb +3 -3
  228. data/spec/app/models/note.rb +3 -1
  229. data/spec/app/models/odd.rb +7 -0
  230. data/spec/app/models/oscar.rb +1 -1
  231. data/spec/app/models/parent_doc.rb +1 -1
  232. data/spec/app/models/person.rb +16 -10
  233. data/spec/app/models/phone.rb +1 -3
  234. data/spec/app/models/player.rb +3 -3
  235. data/spec/app/models/post.rb +5 -3
  236. data/spec/app/models/preference.rb +1 -1
  237. data/spec/app/models/quiz.rb +0 -3
  238. data/spec/app/models/record.rb +10 -5
  239. data/spec/app/models/registry.rb +1 -1
  240. data/spec/app/models/server.rb +1 -1
  241. data/spec/app/models/service.rb +3 -3
  242. data/spec/app/models/sound.rb +5 -0
  243. data/spec/app/models/symptom.rb +1 -1
  244. data/spec/app/models/template.rb +1 -1
  245. data/spec/app/models/title.rb +0 -1
  246. data/spec/app/models/track.rb +5 -5
  247. data/spec/app/models/tree.rb +3 -3
  248. data/spec/app/models/video.rb +1 -5
  249. data/spec/app/models/wiki_page.rb +2 -5
  250. data/spec/app/models/word.rb +3 -0
  251. data/spec/app/models/word_origin.rb +1 -1
  252. data/spec/config/mongoid.yml +7 -8
  253. data/spec/helpers.rb +18 -0
  254. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  255. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  256. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  257. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  258. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  259. data/spec/mongoid/atomic_spec.rb +19 -19
  260. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
  261. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  262. data/spec/mongoid/attributes_spec.rb +315 -436
  263. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  264. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  265. data/spec/mongoid/config/environment_spec.rb +3 -3
  266. data/spec/mongoid/config/options_spec.rb +6 -6
  267. data/spec/mongoid/config_spec.rb +24 -48
  268. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  269. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
  270. data/spec/mongoid/contextual/atomic_spec.rb +68 -58
  271. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  272. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  273. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  274. data/spec/mongoid/contextual/memory_spec.rb +151 -94
  275. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  276. data/spec/mongoid/contextual/none_spec.rb +127 -0
  277. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  278. data/spec/mongoid/copyable_spec.rb +56 -68
  279. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  280. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  281. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  282. data/spec/mongoid/criteria/modifiable_spec.rb +1255 -0
  283. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  284. data/spec/mongoid/criteria_spec.rb +578 -2295
  285. data/spec/mongoid/document_spec.rb +166 -120
  286. data/spec/mongoid/equality_spec.rb +22 -22
  287. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  288. data/spec/mongoid/errors/callback_spec.rb +3 -3
  289. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  290. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  291. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  292. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  293. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  294. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  295. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  296. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  297. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  298. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  299. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  300. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  303. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  306. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  307. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  308. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  309. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  310. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  311. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  312. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  313. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  314. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  315. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  316. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  317. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  318. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  319. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  320. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  321. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  323. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  324. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  325. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  326. data/spec/mongoid/errors/validations_spec.rb +7 -7
  327. data/spec/mongoid/extensions/array_spec.rb +61 -61
  328. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  329. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  330. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  331. data/spec/mongoid/extensions/date_spec.rb +13 -13
  332. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  333. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  334. data/spec/mongoid/extensions/float_spec.rb +29 -15
  335. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  336. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  337. data/spec/mongoid/extensions/module_spec.rb +2 -2
  338. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  339. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  340. data/spec/mongoid/extensions/object_spec.rb +26 -26
  341. data/spec/mongoid/extensions/range_spec.rb +61 -12
  342. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  343. data/spec/mongoid/extensions/set_spec.rb +4 -4
  344. data/spec/mongoid/extensions/string_spec.rb +35 -46
  345. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  346. data/spec/mongoid/extensions/time_spec.rb +49 -49
  347. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  348. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  349. data/spec/mongoid/extensions_spec.rb +15 -0
  350. data/spec/mongoid/factory_spec.rb +15 -15
  351. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  352. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  353. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  354. data/spec/mongoid/fields/localized_spec.rb +38 -23
  355. data/spec/mongoid/fields/standard_spec.rb +12 -12
  356. data/spec/mongoid/fields_spec.rb +263 -217
  357. data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +127 -27
  358. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  359. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  360. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  361. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  362. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  363. data/spec/mongoid/loggable_spec.rb +1 -1
  364. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  365. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  366. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  367. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  368. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  369. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  370. data/spec/mongoid/matchable/in_spec.rb +49 -0
  371. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  372. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  373. data/spec/mongoid/matchable/ne_spec.rb +46 -0
  374. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  375. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  376. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  377. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  378. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  379. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  380. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  381. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  382. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  383. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  384. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  385. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  386. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  387. data/spec/mongoid/persistable/savable_spec.rb +461 -0
  388. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  389. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  390. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  391. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  392. data/spec/mongoid/persistable_spec.rb +206 -0
  393. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
  394. data/spec/mongoid/query_cache_spec.rb +231 -0
  395. data/spec/mongoid/railties/document_spec.rb +2 -2
  396. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  397. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  398. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  399. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  400. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  401. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  402. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  403. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  404. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  405. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  406. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  407. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  408. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  409. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  410. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  411. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  412. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  413. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  414. data/spec/mongoid/relations/builders_spec.rb +21 -21
  415. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  416. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  417. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  418. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  419. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  420. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  421. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  422. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  423. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  424. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  425. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  426. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  427. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  428. data/spec/mongoid/relations/eager_spec.rb +228 -0
  429. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  430. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  431. data/spec/mongoid/relations/embedded/many_spec.rb +393 -372
  432. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  433. data/spec/mongoid/relations/macros_spec.rb +108 -102
  434. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  435. data/spec/mongoid/relations/options_spec.rb +1 -1
  436. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  437. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  438. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  439. data/spec/mongoid/relations/referenced/many_spec.rb +434 -527
  440. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -424
  441. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  442. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  443. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  444. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  445. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  446. data/spec/mongoid/relations_spec.rb +16 -15
  447. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
  448. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  449. data/spec/mongoid/selectable_spec.rb +134 -0
  450. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  451. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  452. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  453. data/spec/mongoid/sessions/options_spec.rb +107 -0
  454. data/spec/mongoid/sessions_spec.rb +289 -178
  455. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  456. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  457. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  458. data/spec/mongoid/tasks/database_spec.rb +160 -0
  459. data/spec/mongoid/threaded_spec.rb +17 -70
  460. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  461. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  462. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  463. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  464. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  465. data/spec/mongoid/timestamps_spec.rb +9 -13
  466. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  467. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  468. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  469. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  470. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  471. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  472. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  473. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  474. data/spec/mongoid_spec.rb +8 -8
  475. data/spec/rails/mongoid_spec.rb +19 -335
  476. data/spec/spec_helper.rb +29 -13
  477. metadata +296 -283
  478. data/lib/mongoid/atomic/positionable.rb +0 -73
  479. data/lib/mongoid/components.rb +0 -92
  480. data/lib/mongoid/config/inflections.rb +0 -6
  481. data/lib/mongoid/contextual/eager.rb +0 -158
  482. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  483. data/lib/mongoid/identity_map.rb +0 -163
  484. data/lib/mongoid/json.rb +0 -16
  485. data/lib/mongoid/matchers/strategies.rb +0 -97
  486. data/lib/mongoid/matchers.rb +0 -32
  487. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  488. data/lib/mongoid/nested_attributes.rb +0 -78
  489. data/lib/mongoid/observer.rb +0 -192
  490. data/lib/mongoid/paranoia.rb +0 -136
  491. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  492. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  493. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  494. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  495. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  496. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  497. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  498. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  499. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  500. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  501. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  502. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  503. data/lib/mongoid/persistence/atomic.rb +0 -231
  504. data/lib/mongoid/persistence/deletion.rb +0 -31
  505. data/lib/mongoid/persistence/insertion.rb +0 -38
  506. data/lib/mongoid/persistence/modification.rb +0 -35
  507. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  508. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  509. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  510. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  511. data/lib/mongoid/persistence/operations/update.rb +0 -59
  512. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  513. data/lib/mongoid/persistence/operations.rb +0 -214
  514. data/lib/mongoid/persistence/upsertion.rb +0 -31
  515. data/lib/mongoid/persistence.rb +0 -357
  516. data/lib/mongoid/unit_of_work.rb +0 -61
  517. data/lib/mongoid/versioning.rb +0 -217
  518. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  519. data/lib/rack/mongoid.rb +0 -2
  520. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  521. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  522. data/spec/app/models/actor_observer.rb +0 -15
  523. data/spec/app/models/callback_recorder.rb +0 -25
  524. data/spec/app/models/paranoid_phone.rb +0 -25
  525. data/spec/app/models/paranoid_post.rb +0 -36
  526. data/spec/app/models/phone_observer.rb +0 -6
  527. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  528. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  529. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  530. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  531. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  532. data/spec/mongoid/identity_map_spec.rb +0 -564
  533. data/spec/mongoid/json_spec.rb +0 -33
  534. data/spec/mongoid/matchers/in_spec.rb +0 -25
  535. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  536. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  537. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  538. data/spec/mongoid/observer_spec.rb +0 -290
  539. data/spec/mongoid/paranoia_spec.rb +0 -759
  540. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  541. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  542. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  543. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  544. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  545. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  546. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  547. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  548. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  549. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  550. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  551. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  552. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  553. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  554. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  555. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  556. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  557. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  558. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  559. data/spec/mongoid/persistence_spec.rb +0 -2279
  560. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  561. data/spec/mongoid/versioning_spec.rb +0 -540
  562. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -126,21 +126,6 @@ module Mongoid
126
126
  validations_for(document.class).push(document.id)
127
127
  end
128
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
142
- end
143
-
144
129
  # Exit autosaving a document on the current thread.
145
130
  #
146
131
  # @example Exit autosave.
@@ -165,148 +150,6 @@ module Mongoid
165
150
  validations_for(document.class).delete_one(document.id)
166
151
  end
167
152
 
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)
308
- end
309
-
310
153
  # Get the global session override.
311
154
  #
312
155
  # @example Get the global session override.
@@ -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,6 +1,10 @@
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
10
  included do
@@ -19,7 +23,7 @@ module Mongoid
19
23
  #
20
24
  # @return [ Array<Document> ] All child documents in the hierarchy.
21
25
  def _children
22
- @_children ||= collect_children
26
+ @__children ||= collect_children
23
27
  end
24
28
 
25
29
  # Collect all the children of this document.
@@ -37,7 +41,7 @@ module Mongoid
37
41
  child = send(name)
38
42
  Array.wrap(child).each do |doc|
39
43
  children.push(doc)
40
- children.concat(doc._children) unless metadata.versioned?
44
+ children.concat(doc._children)
41
45
  end if child
42
46
  end
43
47
  end
@@ -116,6 +120,7 @@ module Mongoid
116
120
  child.move_changes
117
121
  child.new_record = false
118
122
  end
123
+ @__children = nil
119
124
  end
120
125
 
121
126
  # Return the root document in the object graph. If the current document
@@ -174,7 +179,6 @@ module Mongoid
174
179
  subclass.pre_processed_defaults = pre_processed_defaults.dup
175
180
  subclass.post_processed_defaults = post_processed_defaults.dup
176
181
  subclass._declared_scopes = Hash.new { |hash,key| self._declared_scopes[key] }
177
- subclass.autosaved_relations = autosaved_relations.dup
178
182
 
179
183
  # We only need the _type field if inheritance is in play, but need to
180
184
  # add to the root class as well for backwards compatibility.
@@ -182,7 +186,7 @@ module Mongoid
182
186
  field(:_type, default: self.name, type: String)
183
187
  end
184
188
  subclass_default = subclass.name || ->{ self.class.name }
185
- subclass.field(:_type, default: subclass_default, type: String)
189
+ subclass.field(:_type, default: subclass_default, type: String, overwrite: true)
186
190
  end
187
191
  end
188
192
  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.
@@ -173,7 +169,7 @@ module Mongoid
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.6"
3
+ VERSION = "4.0.0"
4
4
  end
data/lib/mongoid.rb CHANGED
@@ -1,34 +1,13 @@
1
1
  # encoding: utf-8
2
-
3
- # Copyright (c) 2009 - 2011 Durran Jordan and friends.
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining
6
- # a copy of this software and associated documentation files (the
7
- # "Software"), to deal in the Software without restriction, including
8
- # without limitation the rights to use, copy, modify, merge, publish,
9
- # distribute, sublicense, and/or sell copies of the Software, and to
10
- # permit persons to whom the Software is furnished to do so, subject to
11
- # the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be
14
- # included in all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
-
24
- require 'support/ruby_version'
2
+ require "support/ruby_version"
25
3
 
26
4
  require "delegate"
27
5
  require "time"
28
6
  require "set"
29
7
 
8
+ require "active_support"
30
9
  require "active_support/core_ext"
31
- require 'active_support/json'
10
+ require "active_support/json"
32
11
  require "active_support/inflector"
33
12
  require "active_support/time_with_zone"
34
13
  require "active_model"
@@ -36,49 +15,14 @@ require "active_model"
36
15
  require "origin"
37
16
  require "moped"
38
17
 
39
- require "mongoid/atomic/positionable"
40
- require "mongoid/evolvable"
41
- require "mongoid/extensions"
42
- require "mongoid/errors"
43
- require "mongoid/threaded"
44
- require "mongoid/relations"
45
- require "mongoid/atomic"
46
- require "mongoid/attributes"
47
- require "mongoid/callbacks"
18
+ require "mongoid/version"
48
19
  require "mongoid/config"
49
- require "mongoid/contextual"
50
- require "mongoid/copyable"
51
- require "mongoid/equality"
52
- require "mongoid/criteria"
53
- require "mongoid/dirty"
54
- require "mongoid/factory"
55
- require "mongoid/fields"
56
- require "mongoid/finders"
57
- require "mongoid/hierarchy"
58
- require "mongoid/identity_map"
59
- require "mongoid/indexes"
60
- require "mongoid/inspection"
61
- require "mongoid/json"
62
20
  require "mongoid/loggable"
63
- require "mongoid/matchers"
64
- require "mongoid/multi_parameter_attributes"
65
- require "mongoid/nested_attributes"
66
- require "mongoid/observer"
67
- require "mongoid/persistence"
68
- require "mongoid/reloading"
69
- require "mongoid/scoping"
70
- require "mongoid/serialization"
71
21
  require "mongoid/sessions"
72
- require "mongoid/sharding"
73
- require "mongoid/state"
74
- require "mongoid/timestamps"
75
- require "mongoid/unit_of_work"
76
- require "mongoid/validations"
77
- require "mongoid/version"
78
- require "mongoid/versioning"
79
- require "mongoid/components"
80
- require "mongoid/paranoia"
81
22
  require "mongoid/document"
23
+ require "mongoid/log_subscriber"
24
+ require "mongoid/tasks/database"
25
+ require "mongoid/query_cache"
82
26
 
83
27
  # If we are using Rails then we will include the Mongoid railtie. This has all
84
28
  # the nifty initializers that Mongoid needs.
@@ -86,28 +30,20 @@ if defined?(Rails)
86
30
  require "mongoid/railtie"
87
31
  end
88
32
 
89
- # If we are using any Rack based application then we need the Mongoid rack
90
- # middleware to ensure our app is running properly.
91
- if defined?(Rack)
92
- require "rack/mongoid"
93
- end
94
-
95
33
  # add english load path by default
96
34
  I18n.load_path << File.join(File.dirname(__FILE__), "config", "locales", "en.yml")
97
35
 
98
36
  module Mongoid
99
37
  extend Loggable
100
- extend UnitOfWork
101
38
  extend self
102
39
 
103
- MONGODB_VERSION = "2.0.0"
40
+ MONGODB_VERSION = "2.2.0"
104
41
 
105
42
  # Sets the Mongoid configuration options. Best used by passing a block.
106
43
  #
107
44
  # @example Set up configuration options.
108
45
  # Mongoid.configure do |config|
109
- # config.allow_dynamic_fields = false
110
- # config.use(name: "mongoid_test", host: "localhost", port: 27017)
46
+ # config.connect_to("mongoid_test")
111
47
  # end
112
48
  #
113
49
  # @return [ Config ] The configuration object.
@@ -160,7 +96,5 @@ module Mongoid
160
96
  # Mongoid.database = Mongo::Connection.new.db("test")
161
97
  #
162
98
  # @since 1.0.0
163
- delegate(*(Config.public_instance_methods(false) +
164
- ActiveModel::Observing::ClassMethods.public_instance_methods(false) - [:logger=, :logger] <<
165
- { to: Config }))
99
+ delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ] << { to: Config }))
166
100
  end
@@ -11,31 +11,24 @@ development:
11
11
  hosts:
12
12
  - localhost:27017
13
13
  options:
14
- # Change whether the session persists in safe mode by default.
15
- # (default: false)
16
- # safe: false
14
+ # Change the default write concern. (default = { w: 1 })
15
+ # write:
16
+ # w: 1
17
17
 
18
- # Change the default consistency model to :eventual or :strong.
19
- # :eventual will send reads to secondaries, :strong sends everything
20
- # to master. (default: :eventual)
21
- # consistency: :eventual
18
+ # Change the default consistency model to primary, secondary.
19
+ # 'secondary' will send reads to secondaries, 'primary' sends everything
20
+ # to master. (default: primary)
21
+ # read: secondary_preferred
22
22
 
23
23
  # How many times Moped should attempt to retry an operation after
24
- # failure. (default: 30)
25
- # max_retries: 30
24
+ # failure. (default: The number of nodes in the cluster)
25
+ # max_retries: 20
26
26
 
27
27
  # The time in seconds that Moped should wait before retrying an
28
- # operation on failure. (default: 1)
29
- # retry_interval: 1
28
+ # operation on failure. (default: 0.25)
29
+ # retry_interval: 0.25
30
30
  # Configure Mongoid specific options. (optional)
31
31
  options:
32
- # Configuration for whether or not to allow access to fields that do
33
- # not have a field definition on the model. (default: true)
34
- # allow_dynamic_fields: true
35
-
36
- # Enable the identity map, needed for eager loading. (default: false)
37
- # identity_map_enabled: false
38
-
39
32
  # Includes the root model name in json serialization. (default: false)
40
33
  # include_root_in_json: false
41
34
 
@@ -57,11 +50,7 @@ development:
57
50
  # existing method. (default: false)
58
51
  # scope_overwrite_exception: false
59
52
 
60
- # Skip the database version check, used when connecting to a db without
61
- # admin access. (default: false)
62
- # skip_version_check: false
63
-
64
- # User Active Support's time zone in conversions. (default: true)
53
+ # Use Active Support's time zone in conversions. (default: true)
65
54
  # use_activesupport_time_zone: true
66
55
 
67
56
  # Ensure all times are UTC in the app side. (default: false)
@@ -73,7 +62,7 @@ test:
73
62
  hosts:
74
63
  - localhost:27017
75
64
  options:
76
- consistency: :strong
65
+ read: primary
77
66
  # In the test environment we lower the retries and retry interval to
78
67
  # low amounts for fast failures.
79
68
  max_retries: 1