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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d24616c46c93a31777a37b97c93cca0b10df2625
4
- data.tar.gz: 000fc93a80cfc7e296f305a1ddca2d77517578aa
3
+ metadata.gz: f25ce5318d49b1e171f4e6fa2d4067eb933ecf0d
4
+ data.tar.gz: 94846f4aff6c2ba1ccf34a63789b7503e536611b
5
5
  SHA512:
6
- metadata.gz: 71d177604ae5df43f63a5f45b1fa68ea2bedf263009ca58406e23ef6c3fdbe09f0b76bdf5e4c70a9612c515f3aa2fca8ae384d62ede1e86629f788905822e483
7
- data.tar.gz: f840e9a8796efaa27b3536c95270c9e5abcbe233718a546095cc09671fd1d6edb8c7d16b55505ad33e1737ab610fb422b04318d0486c37841a2b9c495959ca2f
6
+ metadata.gz: 96e54337599c2679fcb56acc7c817b1d119730f40d58eda3b0c8d2d4d66867c5c92ff6c475ce770ac52230fe8666ee29a1ecc81be1e8801a13359708bef76caf
7
+ data.tar.gz: 693af581fa3e7c64cf8014a9ca3a4eb1c90baddfcb26c5162d1bd842da149092ad8c1d7ec34d5d4c45f9b58c739431e8f0a3a7794346798cb1cb469e08aa16d5
data/CHANGELOG.md CHANGED
@@ -3,6 +3,432 @@
3
3
  For instructions on upgrading to newer versions, visit
4
4
  [mongoid.org](http://mongoid.org/en/mongoid/docs/upgrading.html).
5
5
 
6
+ ## 4.0.0
7
+
8
+ ### Major Changes (Backwards Incompatible)
9
+
10
+ * \#3320 Remove Rails dependencies on database rake tasks. (Arthur Neves)
11
+
12
+ All db:* rake tasks should work as before when using Rails.
13
+ When not in a Rails, just load the database tasks using:
14
+
15
+ load 'mongoid/tasks/database.rake'
16
+
17
+ * Mongoid 4 now only supports MongoDB 2.4.0 and higher.
18
+
19
+ * `Document#metadata` has been renamed to `Document#relation_metadata` to
20
+ avoid common conflicts. Relation proxies also have this renamed to the
21
+ same as well.
22
+
23
+ * Scopes and default scopes must now all be defined within lambdas or procs.
24
+
25
+ * `skip_version_check` config option was removed.
26
+
27
+ * IdentityMap removed. (Arthur Neves)
28
+
29
+ * Eager load rework. Eager load now doesnt need the identity map to load
30
+ related documents. A set of preloaders can eager load the associations
31
+ passed to .includes method. (Arthur Neves)
32
+
33
+ * Mongoid now supports the new read preferences that the core drivers
34
+ provide. These include:
35
+
36
+ - `:primary`: Will always read from a primary node. (default)
37
+ - `:primary_preferred`: Attempt a primary first, then secondary if none available.
38
+ - `:secondary`: Will always read from a secondary node.
39
+ - `:secondary_preferred`: Attempt a secondary first, then primary if none available.
40
+ - `:nearest`: Attempt to read from the node with the lowest latency.
41
+
42
+ Sample syntax:
43
+
44
+ Person.with(read: :secondary).first
45
+
46
+ The `:consistency` option is no longer valid, use the `:read` option now.
47
+
48
+ * Mongoid now defaults all writes to propagate (formerly "safe mode") and now
49
+ has different propagate semantics:
50
+
51
+ - `{ w: -1 }`: Don't verify writes and raise no network errors.
52
+ - `{ w: 0 }`: Don't verify writes and raise network errors.
53
+ - `{ w: 1 }`: Verify writes on the primary node. (default)
54
+ - `{ w: n }`: Verify writes on n number of nodes.
55
+ - `{ w: "majority" }`: Verify writes on a majority of nodes.
56
+
57
+ Sample syntax:
58
+
59
+ Person.with(write: {w: :majority}).create!(name: "John")
60
+
61
+ The `:safe` option is no longer valid use the `:write` option now.
62
+
63
+ * \#3230 Array and Hash fields now validate that the correct types are
64
+ getting set, instead of allowing any value. (Rodrigo Saito)
65
+
66
+ * \#3043/\#2949 Rework on the internals of persistence options. (Arthur Neves)
67
+
68
+ * Mongoid now requires Active Model 4 or higher.
69
+
70
+ * `Document#set` now accepts multiple attributes in the form of a hash,
71
+ instead of the previous `(field, value)` args. Field aliases and typecasting
72
+ are also now supported in this operation.
73
+
74
+ document.set(name: "Photek", likes: 10000)
75
+
76
+ * `Document#rename` now accepts multiple attributes in the form of a hash,
77
+ instead of the previous `(field, value)` args. Field aliases are supported.
78
+
79
+ document.rename(first_name: "fn", last_name: "ln")
80
+
81
+ * `Document#inc` now accepts multiple attributes in the form of a hash, instead
82
+ of previously only being able to increment one value at a time. Aliases and
83
+ serialization is supported.
84
+
85
+ document.inc(score: 10, place: -1, lives: -10)
86
+
87
+ * `Document#pop` now accepts multiple attributes in the form of a hash, instead
88
+ of previously only being able to pop one value at a time. Aliases and
89
+ serialization is supported.
90
+
91
+ document.pop(names: 1, aliases: -1)
92
+
93
+ * `Document#bit` now accepts multiple attributes in the form of a hash, instead
94
+ of previously only being able to apply one set of operations at a time.
95
+ Aliases and serialization are supported.
96
+
97
+ document.bit(age: { and: 13 }, score: { or: 13 })
98
+
99
+ * `Document#pull` now accepts multiple attributes in the form of a hash, instead
100
+ of previously only being able to pull one value at a time. Aliases and
101
+ serialization is supported.
102
+
103
+ document.pull(names: "James", aliases: "007")
104
+
105
+ * `Document#pull_all` now accepts multiple attributes in the form of a hash,
106
+ instead of previously only being able to pull one value at a time. Aliases and
107
+ serialization is supported.
108
+
109
+ document.pull_all(names: ["James", "Bond"], aliases: ["007"])
110
+
111
+ * `Document#push_all` has been removed since it was deprecated in MongoDB 2.4.
112
+ Use `Document.push` instead.
113
+
114
+ * `Document#push` now accepts multiple attributes in the form of a hash, and
115
+ can handle the pushing of single values or multiple values to the field via
116
+ $push with $each. Aliases and serialization is supported.
117
+
118
+ document.push(names: "James", aliases: [ "007", "Jim" ])
119
+
120
+ * `Document#add_to_set` now accepts multiple attributes in the form of a hash,
121
+ and now aliases and serialization are supported.
122
+
123
+ document.add_to_set(names: "James", aliases: "007")
124
+
125
+ * Criteria atomic operations API is now changed to match the changes in the
126
+ single document atomic API, for example:
127
+
128
+ Band.where(name: "Depeche Mode").inc(likes: 10, followers: 20)
129
+
130
+ * \#3399 #create and #create! on relations can now take an array of attributes as
131
+ the first parameter to create multiple documents at once.
132
+
133
+ person.addresses.create([{ street: "Bond" }, { street: "Upper" }])
134
+ person.addresses.create!([{ street: "Bond" }, { street: "Upper" }])
135
+
136
+ * \#3141 `rake db:test:prepare` now sets up all defined indexes if Mongoid is the
137
+ only ODM/ORM in the environment.
138
+
139
+ * \#3138 `update_attributes` can now be accessed simply by calling `update`.
140
+
141
+ * \#3083 A new rake task: `rake mongoid:remove_undefined_indexes` has been added to
142
+ remove indexes from the database that are not explicitly defined in the models.
143
+ (Aidan Feldman)
144
+
145
+ * \#3029 The `relation_field` field that is added for a single use case with polymorphic
146
+ relations has been removed. So where the following would work before:
147
+
148
+ class Eye
149
+ include Mongoid::Document
150
+ belongs_to :eyeable, polymorphic: true
151
+ end
152
+
153
+ class Face
154
+ include Mongoid::Document
155
+ has_one :left_eye, class_name: "Eye", as: :eyeable
156
+ has_one :right_eye, class_name: "Eye", as: :eyeable
157
+ end
158
+
159
+ This would now need to be modeled as (with the appropriate migration):
160
+
161
+ class Eye
162
+ include Mongoid::Document
163
+ belongs_to :left_socket, class_name: "Face", inverse_of: :left_eye
164
+ belongs_to :right_socket, class_name: "Face", inverse_of: :right_eye
165
+ end
166
+
167
+ class Face
168
+ include Mongoid::Document
169
+ has_one :left_eye, class_name: "Eye", inverse_of: :left_socket
170
+ has_one :right_eye, class_name: "Eye", inverse_of: :right_socket
171
+ end
172
+
173
+ * \#3075 `update_attribute` now properly calls the setter method instead of
174
+ using `write_attribute`.
175
+
176
+ * \#3060 Allow atomically blocks to allow multiple calls of the same type.
177
+ (Brian Norton)
178
+
179
+ * \#3037 Model indexes are no longer stored in an `index_options` hash on the
180
+ model class. Instead, an array named `index_specifications` now exists on the
181
+ class which contains a list of `Indexable::Specification` objects. This is so
182
+ we could properly handle the case of indexes with the same keys but different
183
+ order.
184
+
185
+ * \#2956 Caching on queries now only happens when `cache` is specifically
186
+ called. (Arthur Neves)
187
+
188
+ * \#2659 `Mongoid::Railtie` now properly uses only one initializer and
189
+ the name has changed to `mongoid.load-config`.
190
+
191
+ * \#2656 `rake db:reseed` is now `rake db:reset` (Arthur Neves)
192
+
193
+ * \#2648 `Boolean` becomes `Mongoid::Boolean` to avoid polluting the global
194
+ namespace with a commonly used class by other libraries.
195
+
196
+ * \#2603 Return values from setters are now always the set value, regardless
197
+ of calling the setter or using send.
198
+
199
+ * \#2597 `Mongoid::Observer` was removed in line with Rails 4.
200
+
201
+ * \#2563 The `allow_dynamic_fields` configuration option has been removed as
202
+ dynamic fields are now allowed on a per-model level. In order to allow a
203
+ model to use dynamic fields, simply include the module in each.
204
+ (Josh Martin)
205
+
206
+ class Band
207
+ include Mongoid::Document
208
+ include Mongoid::Attributes::Dynamic
209
+ end
210
+
211
+ * \#2497 Calling `to_json` no longer tampers with the return value from the
212
+ driver, and proper returns `{ "$oid" : object_id.to_s }` instead of just
213
+ the string representation previously.
214
+
215
+ * \#2433 `Mongoid::Paranoia` has been removed.
216
+
217
+ * \#2432 `Mongoid::Versioning` has been removed.
218
+
219
+ * \#2218 Creating or instantiating documents that have default scopes will now
220
+ apply the default scope to the document, if the scope is not complex.
221
+
222
+ * \#2200 Mass assignment security now mirrors Rails 4's behavior.
223
+ `without_protection` option was also removed.
224
+ `attr_accessible` class method was removed.
225
+ Mongoid and Strong parameters should work fine for mass assignment protection.
226
+
227
+ * `delete_all` and `destroy_all` no longer take a `:conditions` hash but
228
+ just the raw attributes.
229
+
230
+ * \#1908 Documents now loaded from criteria using `#only` or `#without` will now
231
+ raise an error when attempting to save, update, or delete these records.
232
+ Additionally fields excluded from the fields retrieved from the database will
233
+ also raise an exception when trying to access them.
234
+
235
+ * \#1344 Atomic updates can now be executed in an `atomically` block, which will
236
+ delay any atomic updates on the document the block was called on until the
237
+ block is complete.
238
+
239
+ Update calls can be executed as normal in the block:
240
+
241
+ document.atomically do
242
+ document.inc(likes: 10)
243
+ document.bit(members: { and: 10 })
244
+ document.set(name: "Photek")
245
+ end
246
+
247
+ The document is also yielded to the block:
248
+
249
+ document.atomically do |doc|
250
+ doc.inc(likes: 10)
251
+ doc.bit(members: { and: 10 })
252
+ doc.set(name: "Photek")
253
+ end
254
+
255
+ The atomic commands are have a fluid interface:
256
+
257
+ document.atomically do |doc|
258
+ doc.inc(likes: 10).bit(members: { and: 10 }).set(name: "Photek")
259
+ end
260
+
261
+ If the fluid interface is leveraged without the `atomically` block, the
262
+ operations will persist in individual calls. For example, the following
263
+ would hit the database 3 times without the block provided:
264
+
265
+ doc.inc(likes: 10).bit(members: { and: 10 }).set(name: "Photek")
266
+
267
+ The block is only good for 1 document at a time, so embedded and root
268
+ document updates cannot be mixed at this time.
269
+
270
+ ### New Features
271
+
272
+ * Mongoid now uses ActiveSupport::LogSubscriber to subscribe logs, and
273
+ ActiveSupport::Notifications to send operation logs. (Arthur Neves)
274
+ Example of log subscription:
275
+
276
+ ActiveSupport::Notifications.subscribe('query.moped') do |event|
277
+ ..
278
+ end
279
+
280
+ * Field types can now use symbols as well as class names. See:
281
+ https://github.com/mongoid/mongoid/blob/master/lib/mongoid/fields.rb#L16
282
+ for the available mappings.
283
+
284
+ * \#3580 Fields can now be reset to their default values, with the methods:
285
+
286
+ document.reset_name_to_default!
287
+
288
+ * \#3513 Documents now have a `#destroy!` method that will raise a
289
+ `Mongoid::Errors::DocumentNotDestroyed` error if a destroy callback returns
290
+ a false value.
291
+
292
+ * \#3496 Added class level and criteria level `find_or_create_by!`.
293
+
294
+ * \#3479 Map/reduce now respects criteria no timeout options if output is not
295
+ inline.
296
+
297
+ * \#3478 Criteria objects now have a #none method that will cause the criteria to
298
+ never hit the database and always have zero documents.
299
+
300
+ Band.none
301
+ Band.none.where(name: "Tool") # Always has zero documents.
302
+
303
+ * \#3410 Mongoid now has a query cache that can be used as a middleware in
304
+ Rack applications. (Arthur Neves)
305
+
306
+ For Rails:
307
+
308
+ config.middleware.use(Mongoid::QueryCache::Middleware)
309
+
310
+ * \#3319 Counters can now be reset from a document instance:
311
+
312
+ document.reset_counters(:relation)
313
+
314
+ * \#3310 embedded_in relations now accept a `touch` option to update parents.
315
+
316
+ * \#3302 Aliasing using `alias_attribute` now properly handles aliases in criteria.
317
+
318
+ * \#3155 Range field will persist the exclude_end when provided.
319
+ (Daniel Libanori)
320
+
321
+ * \#3146 Adding :overwrite field option, when it`s true, it wont check duplicates.
322
+ (Daniel Libanori)
323
+
324
+ * \#3002 Reloading the Rails console will also now clear Mongoid's identity map.
325
+
326
+ * \#2938 A configuration option `duplicate_fields_exception` has been added that
327
+ when set to `true` will raise an exception when defining a field that will
328
+ override an existing method. (Arthur Neves)
329
+
330
+ * \#2924 MongoDB 2.4 beta text search now has a DSL provided by Mongoid. Like
331
+ other queries, text searches are lazy evaluated, and available off the class
332
+ or criteria level.
333
+
334
+ Note that any 3rd party gem that provides a `text_search` method will now no
335
+ longer work with Mongoid, and will need to change its syntax. Examples:
336
+
337
+ Band.text_search("mode").project(name: 1).each do |doc|
338
+ # ...
339
+ end
340
+
341
+ Band.limit(10).text_search("phase").language("latin")
342
+ Band.where(:likes.gt => 1000).text_search("lucy")
343
+
344
+ * \#2855 Multiple extensions can now be supplied to relations. (Daniel Libanori)
345
+
346
+ ### Resolved Issues
347
+
348
+ * \#3676 Make pluck work with embedded associations
349
+ (Arthur Neves)
350
+
351
+ * \#2898 Dirty attribute methods now properly handle field aliases.
352
+ (Niels Ganser)
353
+
354
+ * \#3620 Add ActiveModel module instance methods to prohibited_methods list.
355
+ (Arthur Neves)
356
+
357
+ * \#3610 Don't allow atomic operations on read-only attributes
358
+ (Frederico Araujo)
359
+
360
+ * \#3619 Don't validate documents that are flagged for destruction.
361
+ (Christopher J. Bottaro)
362
+
363
+ * \#3617 Don't skip index creation on cyclic documents. (shaiker)
364
+
365
+ * \#3568 Fixed missing attributes error on present localized fields.
366
+
367
+ * \#3514 Fixed query cache to work on first/last calls.
368
+
369
+ * \#3383/\#3495 Fix has_and_belongs_to_many eager load. (Arthur Neves)
370
+
371
+ * \#3492 $rename operations should not mongoize values. (Vladislav Melanitskiy)
372
+
373
+ * \#3490 Allow localized fields to work with boolean `false` values.
374
+
375
+ * \#3487 Map Boolean to Mongoid::Boolean in field definitions. (Arthur Neves)
376
+
377
+ * \#3449 Touch needs to work for create and update. (Greggory Rothmeier)
378
+
379
+ * \#3347 Creating documents off of scopes for embedded relations now properly
380
+ sets the parent document on the created children.
381
+
382
+ * \#3432 Fixed mongoization of DateTime losing precision.
383
+
384
+ * \#3397 Fixed $ne matcher for embedded documents to match server behaviour.
385
+
386
+ * \#3352 Allow named scopes named "open" to work through 1-n relations.
387
+
388
+ * \#3348 Fixing compounded indexes having the same keys with
389
+ different directions. (Arthur Neves)
390
+
391
+ * \#2701 Fixing extra query on belongs_to binding. (Arthur Neves)
392
+
393
+ * \#3089 Allow demongoization of strings to floats (Daniel Libanori)
394
+
395
+ * \#3278 Counter cache should update the document in memory too. (Arthur Neves)
396
+
397
+ * \#3242 Has_many relation must use the inverse foreign_key. (Arthur Neves)
398
+
399
+ * \#3233 Don't double call validation callbacks when cascading children and
400
+ relation validation is turned on.
401
+
402
+ * \#3197 Improvements in the calls to `aggregates` on root and embedded
403
+ collections. (Wojciech Piekutowski)
404
+
405
+ * \#3144/\#3219 Fixing name colission on @_children ivar. (Arthur Neves)
406
+
407
+ * \#3088 Range field can accept a hash, which could be the attribute from the db.
408
+ (Daniel Libanori)
409
+
410
+ * \#3116 Relations instance variables are now all prefixed with `_`.
411
+
412
+ * \#3093 Only flatten 1 level when atomically pushing arrays.
413
+
414
+ * \#3063 `Document#becomes` now properly sets base object on errors.
415
+ (Adam Ross Cohen)
416
+
417
+ * \#3019 Atomic operations will no longer attempt to persist if the document
418
+ is not persisted.
419
+
420
+ * \#2903 Removed unused string `to_a` extension.
421
+
422
+ ## 3.1.7
423
+
424
+ ### Resolved Issues
425
+
426
+ * \#3465 Fixed ambigous relation errors where inverse_of is set to nil.
427
+
428
+ * \#3414 Backkport skip and limit options on aggregation. (Wojciech Piekutowski)
429
+
430
+ * \#3469 Fix RegexpError: failed to allocate memory: /\./ on .hash_dot_syntax? (Dmitry Krasnoukhov)
431
+
6
432
  ## 3.1.6
7
433
 
8
434
  ### Resolved Issues
@@ -91,6 +517,7 @@ For instructions on upgrading to newer versions, visit
91
517
  ### Resolved Issues
92
518
 
93
519
  * Dont duplicate embedded documents when saving after calling becomes method.
520
+ (Arthur Neves)
94
521
 
95
522
  * \#2961 Reloading a mongoid.yml configuration now properly clears previously
96
523
  configured sessions.
@@ -101,11 +528,6 @@ For instructions on upgrading to newer versions, visit
101
528
  * \#2921 Don't use type in identity map selection if inheritance is not
102
529
  in play. (Arthur Neves)
103
530
 
104
- * \#2899 Dirty attribute methods now properly handle field aliases.
105
- (Niels Ganser)
106
-
107
- * \#2895 Allow scopes that return nil to still be chainable. (niedhui)
108
-
109
531
  * \#2893 Removed memoization of collection name and database name so lambdas
110
532
  with `store_in` work properly when changing.
111
533
 
@@ -283,12 +705,14 @@ For instructions on upgrading to newer versions, visit
283
705
  * \#2465 Documents now have an `attribute_before_type_cast` for proper
284
706
  handling of validations. (Gerad Suyderhoud)
285
707
 
286
- * \#2443 `expire_after_seconds` is now a valid index option.
708
+ * \#2443 `expire_after_seconds` is now a valid index option
709
+ (http://docs.mongodb.org/manual/core/indexes/#ttl-indexes,
710
+ http://docs.mongodb.org/manual/tutorial/expire-data/).
287
711
 
288
712
  class Event
289
713
  include Mongoid::Document
290
- field :status, type: Integer
291
- index({ status: 1 }, { expire_after_seconds: 3600 })
714
+ field :created_at, type: DateTime
715
+ index({ created_at: 1 }, { expire_after_seconds: 3600 })
292
716
  end
293
717
 
294
718
  * \#2373 Relations with the `touch: true` option will now be automatically
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Mongoid [![Build Status](https://secure.travis-ci.org/mongoid/mongoid.png?branch=master&.png)](http://travis-ci.org/mongoid/mongoid)
1
+ Mongoid [![Build Status](https://travis-ci.org/mongoid/mongoid.svg)](https://travis-ci.org/mongoid/mongoid) [![Code Climate](https://codeclimate.com/github/mongoid/mongoid.png)](https://codeclimate.com/github/mongoid/mongoid) [![Coverage Status](https://coveralls.io/repos/mongoid/mongoid/badge.png?branch=master)](https://coveralls.io/r/mongoid/mongoid?branch=master) [![Gem Version](https://badge.fury.io/rb/mongoid.png)](http://badge.fury.io/rb/mongoid) [![Dependency Status](https://www.versioneye.com/ruby/mongoid/3.1.6/badge.png)](https://www.versioneye.com/ruby/mongoid/3.1.6)
2
2
  ========
3
3
 
4
4
  Mongoid is an ODM (Object-Document-Mapper) framework for MongoDB in Ruby.
@@ -6,14 +6,15 @@ Mongoid is an ODM (Object-Document-Mapper) framework for MongoDB in Ruby.
6
6
  Project Tracking
7
7
  ----------------
8
8
 
9
- * [Mongoid Google Group](http://groups.google.com/group/mongoid)
10
9
  * [Mongoid Website and Documentation](http://mongoid.org)
11
- * [Mongoid Code Climate](https://codeclimate.com/github/mongoid/mongoid)
10
+ * [Mongoid Google Group](http://groups.google.com/group/mongoid)
11
+ * [Stackoverflow](http://stackoverflow.com/questions/tagged/mongoid)
12
+ * [#mongoid](http://webchat.freenode.net/?channels=mongoid) on freenode IRC
12
13
 
13
14
  Compatibility
14
15
  -------------
15
16
 
16
- Mongoid is tested against MRI 1.9.3, 2.0.0, and JRuby (1.9).
17
+ Mongoid is tested against MRI 1.9.3, 2.0.0, 2.1.0 and JRuby (1.9).
17
18
 
18
19
  Documentation
19
20
  -------------
@@ -24,8 +25,6 @@ Please see the new Mongoid website for up-to-date documentation:
24
25
  Donating
25
26
  --------
26
27
 
27
- [Support Mongoid at Wepay](https://www.wepay.com/donations/mongoid)
28
-
29
28
  [Support Mongoid at Pledgie](http://www.pledgie.com/campaigns/7757)
30
29
 
31
30
  <a href='http://www.pledgie.com/campaigns/7757'>
@@ -31,6 +31,13 @@ en:
31
31
  resolution: "Most likely this is caused by passing parameters directly
32
32
  through to the find, and the parameter either is not present or the
33
33
  key from which it is accessed is incorrect."
34
+ document_not_destroyed:
35
+ message: "%{klass} with id %{id} was not destroyed."
36
+ summary: "When calling %{klass}#destroy! and a callback halts the destroy
37
+ callback chain by returning a false value, the deletion will not
38
+ actually occur."
39
+ resolution: "Check the before/after destroy callbacks to ensure that the
40
+ return values are truthy for the chain to continue."
34
41
  document_not_found:
35
42
  message: "Document(s) not found for class %{klass} with id(s) %{missing}."
36
43
  summary: "When calling %{klass}.find with an id or array of ids, each
@@ -119,6 +126,7 @@ en:
119
126
  has the correct options.\n\n
120
127
  Valid options are:\n
121
128
  \_\_background: true|false\n
129
+ \_\_database: 'database_name'\n
122
130
  \_\_drop_dups: true|false\n
123
131
  \_\_name: 'index_name'\n
124
132
  \_\_sparse: true|false\n
@@ -128,6 +136,7 @@ en:
128
136
  \_\_bits: 26\n
129
137
  \_\_bucket_size : 1\n
130
138
  \_\_weights: { content: 1, title: 2 }\n
139
+ \_\_expire_after_seconds: number_of_seconds\n
131
140
  Valid types are: 1, -1, '2d', '2dsphere', 'geoHaystack', 'text', 'hashed'\n\n
132
141
  Example:\n
133
142
  \_\_class Band\n
@@ -156,15 +165,11 @@ en:
156
165
  invalid_scope:
157
166
  message: "Defining a scope of value %{value} on %{klass} is not
158
167
  allowed."
159
- summary: "Scopes in Mongoid must be either criteria objects or procs
160
- that wrap criteria objects."
161
- resolution: "Change the scope to be a criteria or proc wrapped
162
- critera.\n\n
168
+ summary: "Scopes in Mongoid must be procs that wrap criteria objects."
169
+ resolution: "Change the scope to be a proc wrapped critera.\n\n
163
170
  Example:\n
164
171
  \_\_class Band\n
165
172
  \_\_\_\_include Mongoid::Document\n
166
- \_\_\_\_field :active, type: Boolean, default: true\n
167
- \_\_\_\_scope :active, where(active: true)\n
168
173
  \_\_\_\_scope :inactive, ->{ where(active: false) }\n
169
174
  \_\_end\n\n"
170
175
  invalid_storage_options:
@@ -179,6 +184,12 @@ en:
179
184
  \_\_\_\_include Mongoid::Document\n
180
185
  \_\_\_\_store_in collection: 'artists', database: 'secondary'\n
181
186
  \_\_end\n\n"
187
+ invalid_storage_parent:
188
+ message: "Invalid store_in call on class %{klass}."
189
+ summary: "The :store_in macro can only be called on a base Mongoid Document"
190
+ resolution: "Remove the store_in call on class %{klass}, as it will use its
191
+ parent store configuration. Or remove the hierarchy extension for this
192
+ class."
182
193
  invalid_time:
183
194
  message: "'%{value}' is not a valid Time."
184
195
  summary: "Mongoid tries to serialize the values for Date, DateTime, and
@@ -222,6 +233,10 @@ en:
222
233
  from the child side which relation to go in."
223
234
  resolution: "Set the values from the parent, or redefine the relation
224
235
  with only a single definition in the parent."
236
+ invalid_value:
237
+ message: "Value of type %{value_class} cannot be written to a field of type %{field_class}"
238
+ summary: "Tried to set a value of type %{value_class} to a field of type %{field_class}"
239
+ resolution: "Verify if the value to be set correspond to field definition"
225
240
  mixed_relations:
226
241
  message: "Referencing a(n) %{embedded} document from the %{root}
227
242
  document via a relational association is not allowed since the
@@ -387,6 +402,12 @@ en:
387
402
  can only have values set when the document is a new record."
388
403
  resolution: "Don't define '%{name}' as readonly, or do not attempt
389
404
  to update its value after the document is persisted."
405
+ readonly_document:
406
+ message: "Attempted to persist the readonly document '%{klass}'."
407
+ summary: "Documents loaded from the database using #only
408
+ cannot be persisted."
409
+ resolution: "Don't attempt to persist documents that are flagged as
410
+ readonly."
390
411
  scope_overwrite:
391
412
  message: "Cannot create scope :%{scope_name}, because of existing
392
413
  method %{model_name}.%{scope_name}."
@@ -411,12 +432,12 @@ en:
411
432
  unknown_attribute:
412
433
  message: "Attempted to set a value for '%{name}' which is not
413
434
  allowed on the model %{klass}."
414
- summary: "When setting Mongoid.allow_dynamic_fields to false and the
415
- attribute does not already exist in the attributes hash, attempting
416
- to call %{klass}#%{name}= for it is not allowed. This is also
417
- triggered by passing the attribute to any method that accepts an
435
+ summary: "Without including Mongoid::Attributes::Dynamic in your model
436
+ and the attribute does not already exist in the attributes hash,
437
+ attempting to call %{klass}#%{name}= for it is not allowed. This is
438
+ also triggered by passing the attribute to any method that accepts an
418
439
  attributes hash, and is raised instead of getting a NoMethodError."
419
- resolution: "You can set Mongoid.allow_dynamic_fields to true if you
440
+ resolution: "You can include Mongoid::Attributes::Dynamic if you
420
441
  expect to be writing values for undefined fields often."
421
442
  unsaved_document:
422
443
  message: "Attempted to save %{document} before the parent %{base}."
@@ -439,13 +460,6 @@ en:
439
460
  summary: "The following errors were found: %{errors}"
440
461
  resolution: "Try persisting the document with valid data or remove
441
462
  the validations."
442
- versioning_not_on_root:
443
- message: "Versioning not allowed on embedded document: %{klass}."
444
- summary: "Mongoid::Versioning behaviour is only allowed on documents
445
- that are the root document in the hierarchy."
446
- resolution: "Remove the versioning from the embedded %{klass} or
447
- consider moving it to a root location in the hierarchy if
448
- versioning is needed."
449
463
  delete_restriction:
450
464
  message: "Cannot delete %{document} because of dependent '%{relation}'."
451
465
  summary: "When defining '%{relation}' with a :dependent => :restrict,
@@ -35,7 +35,7 @@ module Mongoid
35
35
  def position
36
36
  pos = parent.atomic_position
37
37
  locator = document.new_record? ? "" : ".#{document._index}"
38
- "#{pos}#{"." unless pos.blank?}#{document.metadata.store_as}#{locator}"
38
+ "#{pos}#{"." unless pos.blank?}#{document.__metadata.store_as}#{locator}"
39
39
  end
40
40
  end
41
41
  end
@@ -34,7 +34,7 @@ module Mongoid
34
34
  # @since 2.1.0
35
35
  def position
36
36
  pos = parent.atomic_position
37
- "#{pos}#{"." unless pos.blank?}#{document.metadata.store_as}"
37
+ "#{pos}#{"." unless pos.blank?}#{document.__metadata.store_as}"
38
38
  end
39
39
  end
40
40
  end
@@ -22,36 +22,6 @@ module Mongoid
22
22
  def path
23
23
  @path ||= position.sub(/\.\d+$/, "")
24
24
  end
25
-
26
- # Get the selector to use for the root document when performing atomic
27
- # updates. When sharding this will include the shard key.
28
- #
29
- # @example Get the selector.
30
- # many.selector
31
- #
32
- # @return [ Hash ] The selector to identify the document with.
33
- #
34
- # @since 2.1.0
35
- def selector
36
- @selector ||= generate_selector
37
- end
38
-
39
- private
40
-
41
- def generate_selector
42
- if only_root_selector?
43
- parent.atomic_selector
44
- else
45
- parent.
46
- atomic_selector.
47
- merge("#{path}._id" => document._id).
48
- merge(document.shard_key_selector)
49
- end
50
- end
51
-
52
- def only_root_selector?
53
- document.persisted? && document._id_changed?
54
- end
55
25
  end
56
26
  end
57
27
  end