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
@@ -1,6 +1,10 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Dirty
3
+
4
+ # Defines behaviour for dirty tracking.
5
+ #
6
+ # @since 4.0.0
7
+ module Changeable
4
8
  extend ActiveSupport::Concern
5
9
 
6
10
  # Get the changed attributes for the document.
@@ -80,7 +84,6 @@ module Mongoid
80
84
  #
81
85
  # @since 2.1.0
82
86
  def move_changes
83
- @_children = nil
84
87
  @previous_changes = changes
85
88
  Atomic::UPDATES.each do |update|
86
89
  send(update).clear
@@ -245,6 +248,15 @@ module Mongoid
245
248
  attributes[attr] = changed_attributes.delete(attr) if attribute_changed?(attr)
246
249
  end
247
250
 
251
+ def reset_attribute_to_default!(attr)
252
+ attr = database_field_name(attr)
253
+ if field = fields[attr]
254
+ __send__("#{attr}=", field.eval_default(self))
255
+ else
256
+ __send__("#{attr}=", nil)
257
+ end
258
+ end
259
+
248
260
  module ClassMethods
249
261
 
250
262
  private
@@ -267,6 +279,7 @@ module Mongoid
267
279
  create_dirty_default_change_check(name, meth)
268
280
  create_dirty_previous_value_accessor(name, meth)
269
281
  create_dirty_reset(name, meth)
282
+ create_dirty_reset_to_default(name, meth)
270
283
  end
271
284
 
272
285
  # Creates the dirty change accessor.
@@ -370,6 +383,23 @@ module Mongoid
370
383
  end
371
384
  end
372
385
  end
386
+
387
+ # Creates the dirty change reset to default.
388
+ #
389
+ # @example Create the reset.
390
+ # Model.create_dirty_reset_to_default("name", "alias")
391
+ #
392
+ # @param [ String ] name The attribute name.
393
+ # @param [ String ] meth The name of the accessor.
394
+ #
395
+ # @since 3.0.0
396
+ def create_dirty_reset_to_default(name, meth)
397
+ generated_methods.module_eval do
398
+ re_define_method("reset_#{meth}_to_default!") do
399
+ reset_attribute_to_default!(name)
400
+ end
401
+ end
402
+ end
373
403
  end
374
404
  end
375
405
  end
@@ -0,0 +1,105 @@
1
+ # encoding: utf-8
2
+ require "mongoid/changeable"
3
+ require "mongoid/findable"
4
+ require "mongoid/indexable"
5
+ require "mongoid/inspectable"
6
+ require "mongoid/interceptable"
7
+ require "mongoid/matchable"
8
+ require "mongoid/persistable"
9
+ require "mongoid/reloadable"
10
+ require "mongoid/selectable"
11
+ require "mongoid/scopable"
12
+ require "mongoid/serializable"
13
+ require "mongoid/shardable"
14
+ require "mongoid/stateful"
15
+ require "mongoid/traversable"
16
+ require "mongoid/validatable"
17
+
18
+ module Mongoid
19
+
20
+ # This module provides inclusions of all behaviour in a Mongoid document.
21
+ #
22
+ # @since 4.0.0
23
+ module Composable
24
+ extend ActiveSupport::Concern
25
+
26
+ # All modules that a +Document+ is composed of are defined in this
27
+ # module, to keep the document class from getting too cluttered.
28
+ included do
29
+ extend Findable
30
+ end
31
+
32
+ include ActiveModel::Model
33
+ include ActiveModel::ForbiddenAttributesProtection
34
+ include ActiveModel::Serializers::JSON
35
+ include ActiveModel::Serializers::Xml
36
+ include Atomic
37
+ include Changeable
38
+ include Attributes
39
+ include Evolvable
40
+ include Fields
41
+ include Indexable
42
+ include Inspectable
43
+ include Matchable
44
+ include Persistable
45
+ include Relations
46
+ include Reloadable
47
+ include Scopable
48
+ include Selectable
49
+ include Serializable
50
+ include Sessions
51
+ include Shardable
52
+ include Stateful
53
+ include Threaded::Lifecycle
54
+ include Traversable
55
+ include Validatable
56
+ include Interceptable
57
+ include Copyable
58
+ include Equality
59
+
60
+ MODULES = [
61
+ Atomic,
62
+ Attributes,
63
+ Copyable,
64
+ Changeable,
65
+ Evolvable,
66
+ Fields,
67
+ Indexable,
68
+ Inspectable,
69
+ Interceptable,
70
+ Matchable,
71
+ Persistable,
72
+ Relations,
73
+ Reloadable,
74
+ Scopable,
75
+ Serializable,
76
+ Sessions,
77
+ Shardable,
78
+ Stateful,
79
+ Threaded::Lifecycle,
80
+ Traversable,
81
+ Validatable,
82
+ Equality,
83
+ ActiveModel::Model,
84
+ ActiveModel::Validations
85
+ ]
86
+
87
+ class << self
88
+
89
+ # Get a list of methods that would be a bad idea to define as field names
90
+ # or override when including Mongoid::Document.
91
+ #
92
+ # @example Bad thing!
93
+ # Mongoid::Components.prohibited_methods
94
+ #
95
+ # @return [ Array<Symbol> ]
96
+ #
97
+ # @since 2.1.8
98
+ def prohibited_methods
99
+ @prohibited_methods ||= MODULES.flat_map do |mod|
100
+ mod.instance_methods.map{ |m| m.to_sym }
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -20,7 +20,7 @@ module Mongoid
20
20
  # Define a configuration option with a default.
21
21
  #
22
22
  # @example Define the option.
23
- # Options.option(:persist_in_safe_mode, :default => false)
23
+ # Options.option(:persist_in_safe_mode, :default => true)
24
24
  #
25
25
  # @param [ Symbol ] name The name of the configuration option.
26
26
  # @param [ Hash ] options Extras for the option.
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/config/environment"
3
- require "mongoid/config/inflections"
4
3
  require "mongoid/config/options"
5
4
  require "mongoid/config/validators"
6
5
 
@@ -11,23 +10,18 @@ module Mongoid
11
10
  module Config
12
11
  extend self
13
12
  extend Options
14
- include ActiveModel::Observing
15
13
 
16
14
  delegate :logger=, to: ::Mongoid
17
15
  delegate :logger, to: ::Mongoid
18
16
 
19
17
  LOCK = Mutex.new
20
18
 
21
- option :allow_dynamic_fields, default: true
22
- option :identity_map_enabled, default: false
23
19
  option :include_root_in_json, default: false
24
20
  option :include_type_for_serialization, default: false
25
21
  option :preload_models, default: false
26
- option :protect_sensitive_fields, default: true
27
22
  option :raise_not_found_error, default: true
28
23
  option :scope_overwrite_exception, default: false
29
- # @todo: Remove at 4.0
30
- option :skip_version_check, default: false
24
+ option :duplicate_fields_exception, default: false
31
25
  option :use_activesupport_time_zone, default: true
32
26
  option :use_utc, default: false
33
27
 
@@ -54,7 +48,7 @@ module Mongoid
54
48
  # @param [ String ] name The database name.
55
49
  #
56
50
  # @since 3.0.0
57
- def connect_to(name, options = { consistency: :eventual })
51
+ def connect_to(name, options = { read: :primary })
58
52
  self.sessions = {
59
53
  default: {
60
54
  database: name,
@@ -72,7 +66,7 @@ module Mongoid
72
66
  #
73
67
  # @return [ Array<String> ] An array of bad field names.
74
68
  def destructive_fields
75
- Components.prohibited_methods
69
+ Composable.prohibited_methods
76
70
  end
77
71
 
78
72
  # Load the settings from a compliant mongoid.yml file. This can be used for
@@ -12,7 +12,7 @@ module Mongoid
12
12
  #
13
13
  # @param [ String, Symbol ] field The field name.
14
14
  #
15
- # @return [ Hash ] The aggregate values in the form:
15
+ # @return [ Hash ] count is a number of documents with the provided field. If there're none, then count is 0 and max, min, sum, avg are nil.
16
16
  # {
17
17
  # "count" => 2.0,
18
18
  # "max" => 1000.0,
@@ -23,15 +23,11 @@ module Mongoid
23
23
  #
24
24
  # @since 3.0.0
25
25
  def aggregates(field)
26
- if query.count > 0
27
- result = collection.aggregate(pipeline(field)).to_a
28
- if result.empty?
29
- { "count" => query.count, "avg" => 0, "sum" => 0 }
30
- else
31
- result.first
32
- end
26
+ result = collection.aggregate(pipeline(field)).to_a
27
+ if result.empty?
28
+ { "count" => 0, "sum" => nil, "avg" => nil, "min" => nil, "max" => nil }
33
29
  else
34
- { "count" => 0 }
30
+ result.first
35
31
  end
36
32
  end
37
33
 
@@ -129,6 +125,8 @@ module Mongoid
129
125
  db_field = "$#{database_field_name(field)}"
130
126
  pipeline = []
131
127
  pipeline << { "$match" => criteria.nin(field => nil).selector }
128
+ pipeline << { "$sort" => criteria.options[:sort] } if criteria.options[:sort]
129
+ pipeline << { "$skip" => criteria.options[:skip] } if criteria.options[:skip]
132
130
  pipeline << { "$limit" => criteria.options[:limit] } if criteria.options[:limit]
133
131
  pipeline << {
134
132
  "$group" => {
@@ -6,84 +6,76 @@ module Mongoid
6
6
  # Execute an atomic $addToSet on the matching documents.
7
7
  #
8
8
  # @example Add the value to the set.
9
- # context.add_to_set(:members, "Dave")
9
+ # context.add_to_set(members: "Dave", genres: "Electro")
10
10
  #
11
- # @param [ String, Symbol ] field The name of the field to add to.
12
- # @param [ Object ] value The single value to add.
11
+ # @param [ Hash ] adds The operations.
13
12
  #
14
13
  # @return [ nil ] Nil.
15
14
  #
16
15
  # @since 3.0.0
17
- def add_to_set(field, value)
18
- query.update_all("$addToSet" => { database_field_name(field) => value })
16
+ def add_to_set(adds)
17
+ query.update_all("$addToSet" => collect_operations(adds))
19
18
  end
20
19
 
21
20
  # Perform an atomic $bit operation on the matching documents.
22
21
  #
23
22
  # @example Perform the bitwise op.
24
- # context.bit(:likes, { and: 14, or: 4 })
23
+ # context.bit(likes: { and: 14, or: 4 })
25
24
  #
26
- # @param [ String, Symbol ] field The name of the field to operate on.
27
- # @param [ Hash ] value The bitwise operations to perform. Keys may be
28
- # "and" or "or" and must have numeric values.
25
+ # @param [ Hash ] bits The operations.
29
26
  #
30
27
  # @return [ nil ] Nil.
31
28
  #
32
29
  # @since 3.0.0
33
- def bit(field, value)
34
- query.update_all("$bit" => { database_field_name(field) => value })
30
+ def bit(bits)
31
+ query.update_all("$bit" => collect_operations(bits))
35
32
  end
36
33
 
37
34
  # Perform an atomic $inc operation on the matching documents.
38
35
  #
39
36
  # @example Perform the atomic increment.
40
- # context.inc(:likes, 10)
37
+ # context.inc(likes: 10)
41
38
  #
42
- # @param [ String, Symbol ] field The field to increment.
43
- # @param [ Integer ] value The amount to increment by.
39
+ # @param [ Hash ] incs The operations.
44
40
  #
45
41
  # @return [ nil ] Nil.
46
42
  #
47
43
  # @since 3.0.0
48
- def inc(field, value)
49
- query.update_all("$inc" => { database_field_name(field) => value })
44
+ def inc(incs)
45
+ query.update_all("$inc" => collect_operations(incs))
50
46
  end
51
47
 
52
48
  # Perform an atomic $pop operation on the matching documents.
53
49
  #
54
50
  # @example Pop the first value on the matches.
55
- # context.pop(:members, -1)
51
+ # context.pop(members: -1)
56
52
  #
57
53
  # @example Pop the last value on the matches.
58
- # context.pop(:members, 1)
54
+ # context.pop(members: 1)
59
55
  #
60
- # @param [ String, Symbol ] field The name of the array field to pop
61
- # from.
62
- # @param [ Integer ] value 1 to pop from the end, -1 to pop from the
63
- # front.
56
+ # @param [ Hash ] pops The operations.
64
57
  #
65
58
  # @return [ nil ] Nil.
66
59
  #
67
60
  # @since 3.0.0
68
- def pop(field, value)
69
- query.update_all("$pop" => { database_field_name(field) => value })
61
+ def pop(pops)
62
+ query.update_all("$pop" => collect_operations(pops))
70
63
  end
71
64
 
72
65
  # Perform an atomic $pull operation on the matching documents.
73
66
  #
74
67
  # @example Pull the value from the matches.
75
- # context.pull(:members, "Dave")
68
+ # context.pull(members: "Dave")
76
69
  #
77
70
  # @note Expression pulling is not yet supported.
78
71
  #
79
- # @param [ String, Symbol ] field The field to pull from.
80
- # @param [ Object ] value The single value to pull.
72
+ # @param [ Hash ] pulls The operations.
81
73
  #
82
74
  # @return [ nil ] Nil.
83
75
  #
84
76
  # @since 3.0.0
85
- def pull(field, value)
86
- query.update_all("$pull" => { database_field_name(field) => value })
77
+ def pull(pulls)
78
+ query.update_all("$pull" => collect_operations(pulls))
87
79
  end
88
80
 
89
81
  # Perform an atomic $pullAll operation on the matching documents.
@@ -91,74 +83,73 @@ module Mongoid
91
83
  # @example Pull all the matching values from the matches.
92
84
  # context.pull_all(:members, [ "Alan", "Vince" ])
93
85
  #
94
- # @param [ String, Symbol ] field The field to pull from.
95
- # @param [ Array<Object> ] values The values to pull.
86
+ # @param [ Hash ] pulls The operations.
96
87
  #
97
88
  # @return [ nil ] Nil.
98
89
  #
99
90
  # @since 3.0.0
100
- def pull_all(field, values)
101
- query.update_all("$pullAll" => { database_field_name(field) => values })
91
+ def pull_all(pulls)
92
+ query.update_all("$pullAll" => collect_operations(pulls))
102
93
  end
103
94
 
104
95
  # Perform an atomic $push operation on the matching documents.
105
96
  #
106
97
  # @example Push the value to the matching docs.
107
- # context.push(:members, "Alan")
98
+ # context.push(members: "Alan")
108
99
  #
109
- # @param [ String, Symbol ] field The field to push to.
110
- # @param [ Object ] value The value to push.
100
+ # @param [ Hash ] pushes The operations.
111
101
  #
112
102
  # @return [ nil ] Nil.
113
103
  #
114
104
  # @since 3.0.0
115
- def push(field, value)
116
- query.update_all("$push" => { database_field_name(field) => value })
105
+ def push(pushes)
106
+ query.update_all("$push" => collect_operations(pushes))
117
107
  end
118
108
 
119
109
  # Perform an atomic $pushAll operation on the matching documents.
120
110
  #
121
111
  # @example Push the values to the matching docs.
122
- # context.push(:members, [ "Alan", "Fletch" ])
112
+ # context.push(members: [ "Alan", "Fletch" ])
123
113
  #
124
- # @param [ String, Symbol ] field The field to push to.
125
- # @param [ Array<Object> ] values The values to push.
114
+ # @param [ Hash ] pushes The operations.
126
115
  #
127
116
  # @return [ nil ] Nil.
128
117
  #
129
118
  # @since 3.0.0
130
- def push_all(field, values)
131
- query.update_all("$pushAll" => { database_field_name(field) => values })
119
+ def push_all(pushes)
120
+ query.update_all("$pushAll" => collect_operations(pushes))
132
121
  end
133
122
 
134
123
  # Perform an atomic $rename of fields on the matching documents.
135
124
  #
136
125
  # @example Rename the fields on the matching documents.
137
- # context.rename(:members, :artists)
126
+ # context.rename(members: :artists)
138
127
  #
139
- # @param [ String, Symbol ] old_name The old field name.
140
- # @param [ String, Symbol ] new_name The new field name.
128
+ # @param [ Hash ] renames The operations.
141
129
  #
142
130
  # @return [ nil ] Nil.
143
131
  #
144
132
  # @since 3.0.0
145
- def rename(old_name, new_name)
146
- query.update_all("$rename" => { database_field_name(old_name) => new_name.to_s })
133
+ def rename(renames)
134
+ operations = renames.inject({}) do |ops, (old_name, new_name)|
135
+ ops[old_name] = new_name.to_s
136
+ ops
137
+ end
138
+ query.update_all("$rename" => collect_operations(operations))
147
139
  end
148
140
 
149
141
  # Perform an atomic $set of fields on the matching documents.
150
142
  #
151
143
  # @example Set the field value on the matches.
152
- # context.set(:name, "Depeche Mode")
144
+ # context.set(name: "Depeche Mode")
153
145
  #
154
- # @param [ String, Symbol ] field The name of the field.
155
- # @param [ Object ] value The value to set.
146
+ # @param [ Hash ] sets The operations.
156
147
  #
157
148
  # @return [ nil ] Nil.
158
149
  #
159
150
  # @since 3.0.0
160
- def set(field, value)
161
- query.update_all("$set" => { database_field_name(field) => value })
151
+ def set(sets)
152
+ query.update_all("$set" => collect_operations(sets))
162
153
  end
163
154
 
164
155
  # Perform an atomic $unset of a field on the matching documents.
@@ -175,6 +166,15 @@ module Mongoid
175
166
  fields = args.__find_args__.collect { |f| [database_field_name(f), true] }
176
167
  query.update_all("$unset" => Hash[fields])
177
168
  end
169
+
170
+ private
171
+
172
+ def collect_operations(ops)
173
+ ops.inject({}) do |operations, (field, value)|
174
+ operations[database_field_name(field)] = value.mongoize
175
+ operations
176
+ end
177
+ end
178
178
  end
179
179
  end
180
180
  end
@@ -213,7 +213,7 @@ module Mongoid
213
213
  # @since 3.0.0
214
214
  def documents
215
215
  results["results"].map do |attributes|
216
- doc = Factory.from_db(criteria.klass, attributes["obj"], criteria.object_id)
216
+ doc = Factory.from_db(criteria.klass, attributes["obj"], criteria.options[:fields])
217
217
  doc.attributes["geo_near_distance"] = attributes["dis"]
218
218
  doc
219
219
  end
@@ -268,7 +268,9 @@ module Mongoid
268
268
  # @since 3.0.0
269
269
  def documents
270
270
  return results["results"] if results.has_key?("results")
271
- session[output_collection].find
271
+ query = session[output_collection].find
272
+ query.no_timeout if criteria.options[:timeout] == false
273
+ query
272
274
  end
273
275
 
274
276
  # Get the collection that the map/reduce results were stored in.
@@ -314,7 +316,7 @@ module Mongoid
314
316
  # @since 3.0.15
315
317
  def __session__
316
318
  if command[:out][:inline] != 1
317
- session.with(consistency: :strong)
319
+ session.with(read: :primary)
318
320
  else
319
321
  session
320
322
  end
@@ -1,14 +1,15 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/contextual/aggregable/memory"
3
+ require "mongoid/relations/eager"
3
4
 
4
5
  module Mongoid
5
6
  module Contextual
6
7
  class Memory
7
8
  include Enumerable
8
9
  include Aggregable::Memory
9
- include Eager
10
+ include Relations::Eager
10
11
  include Queryable
11
- include Mongoid::Atomic::Positionable
12
+ include Positional
12
13
 
13
14
  # @attribute [r] root The root document.
14
15
  # @attribute [r] path The atomic path.
@@ -102,7 +103,7 @@ module Mongoid
102
103
  documents_for_iteration.each do |doc|
103
104
  yield(doc)
104
105
  end
105
- # eager_loadable? ? docs : self
106
+ self
106
107
  else
107
108
  to_enum
108
109
  end
@@ -130,7 +131,7 @@ module Mongoid
130
131
  # @since 3.0.0
131
132
  def first
132
133
  doc = documents.first
133
- eager_load_one(doc) if eager_loadable?(doc)
134
+ eager_load_one(doc)
134
135
  doc
135
136
  end
136
137
  alias :one :first
@@ -164,7 +165,7 @@ module Mongoid
164
165
  # @since 3.0.0
165
166
  def last
166
167
  doc = documents.last
167
- eager_load_one(doc) if eager_loadable?(doc)
168
+ eager_load_one(doc)
168
169
  doc
169
170
  end
170
171
 
@@ -196,6 +197,17 @@ module Mongoid
196
197
  self
197
198
  end
198
199
 
200
+ def pluck(*fields)
201
+ fields = Array.wrap(fields)
202
+ documents.map do |doc|
203
+ if fields.size == 1
204
+ doc[fields.first]
205
+ else
206
+ fields.map { |n| doc[n] }.compact
207
+ end
208
+ end.compact
209
+ end
210
+
199
211
  # Skips the provided number of documents.
200
212
  #
201
213
  # @example Skip the documents.
@@ -294,7 +306,7 @@ module Mongoid
294
306
  updates["$set"].merge!(doc.atomic_updates["$set"] || {})
295
307
  doc.move_changes
296
308
  end
297
- collection.find(selector).update(updates)
309
+ collection.find(selector).update(updates) unless updates["$set"].empty?
298
310
  end
299
311
 
300
312
  # Get the limiting value.