mongoid 3.1.7 → 4.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (521) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +317 -11
  3. data/README.md +4 -5
  4. data/lib/config/locales/en.yml +9 -12
  5. data/lib/mongoid.rb +6 -75
  6. data/lib/mongoid/atomic.rb +0 -11
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/root.rb +0 -13
  9. data/lib/mongoid/attributes.rb +30 -108
  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/{dirty.rb → changeable.rb} +5 -2
  14. data/lib/mongoid/composable.rb +104 -0
  15. data/lib/mongoid/config.rb +3 -9
  16. data/lib/mongoid/config/options.rb +1 -1
  17. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
  18. data/lib/mongoid/contextual/atomic.rb +53 -53
  19. data/lib/mongoid/contextual/command.rb +26 -0
  20. data/lib/mongoid/contextual/map_reduce.rb +1 -1
  21. data/lib/mongoid/contextual/memory.rb +6 -5
  22. data/lib/mongoid/contextual/mongo.rb +59 -28
  23. data/lib/mongoid/contextual/text_search.rb +180 -0
  24. data/lib/mongoid/copyable.rb +2 -3
  25. data/lib/mongoid/criteria.rb +13 -33
  26. data/lib/mongoid/criteria/{#findable.rb# → findable.rb} +0 -2
  27. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  28. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  29. data/lib/mongoid/{criterion → criteria}/modifiable.rb +1 -1
  30. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  31. data/lib/mongoid/document.rb +28 -12
  32. data/lib/mongoid/errors.rb +1 -1
  33. data/lib/mongoid/errors/document_not_found.rb +2 -1
  34. data/lib/mongoid/errors/invalid_value.rb +16 -0
  35. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  36. data/lib/mongoid/extensions.rb +2 -7
  37. data/lib/mongoid/extensions/array.rb +2 -2
  38. data/lib/mongoid/extensions/boolean.rb +14 -17
  39. data/lib/mongoid/extensions/float.rb +1 -0
  40. data/lib/mongoid/extensions/hash.rb +1 -1
  41. data/lib/mongoid/extensions/object.rb +4 -4
  42. data/lib/mongoid/extensions/object_id.rb +5 -5
  43. data/lib/mongoid/extensions/range.rb +8 -2
  44. data/lib/mongoid/extensions/string.rb +5 -17
  45. data/lib/mongoid/extensions/time.rb +2 -2
  46. data/lib/mongoid/factory.rb +3 -3
  47. data/lib/mongoid/fields.rb +9 -8
  48. data/lib/mongoid/fields/foreign_key.rb +3 -3
  49. data/lib/mongoid/fields/standard.rb +4 -16
  50. data/lib/mongoid/fields/validators/macro.rb +11 -3
  51. data/lib/mongoid/{finders.rb → findable.rb} +6 -2
  52. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  53. data/lib/mongoid/indexable/specification.rb +104 -0
  54. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  55. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  56. data/lib/mongoid/{callbacks.rb → interceptable.rb} +3 -52
  57. data/lib/mongoid/log_subscriber.rb +22 -0
  58. data/lib/mongoid/matchable.rb +152 -0
  59. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  60. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  61. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  62. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  63. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  64. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  65. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  66. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  67. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  68. data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
  69. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  70. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  71. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  72. data/lib/mongoid/persistable.rb +212 -0
  73. data/lib/mongoid/persistable/creatable.rb +188 -0
  74. data/lib/mongoid/persistable/deletable.rb +148 -0
  75. data/lib/mongoid/persistable/destroyable.rb +55 -0
  76. data/lib/mongoid/persistable/incrementable.rb +36 -0
  77. data/lib/mongoid/persistable/logical.rb +38 -0
  78. data/lib/mongoid/persistable/poppable.rb +39 -0
  79. data/lib/mongoid/persistable/pullable.rb +55 -0
  80. data/lib/mongoid/persistable/pushable.rb +62 -0
  81. data/lib/mongoid/persistable/renamable.rb +35 -0
  82. data/lib/mongoid/persistable/savable.rb +52 -0
  83. data/lib/mongoid/persistable/settable.rb +33 -0
  84. data/lib/mongoid/persistable/unsettable.rb +36 -0
  85. data/lib/mongoid/persistable/updatable.rb +151 -0
  86. data/lib/mongoid/persistable/upsertable.rb +55 -0
  87. data/lib/mongoid/positional.rb +71 -0
  88. data/lib/mongoid/railtie.rb +32 -45
  89. data/lib/mongoid/railties/database.rake +12 -6
  90. data/lib/mongoid/relations.rb +3 -3
  91. data/lib/mongoid/relations/accessors.rb +13 -46
  92. data/lib/mongoid/relations/auto_save.rb +15 -36
  93. data/lib/mongoid/relations/binding.rb +0 -23
  94. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  95. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  96. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
  97. data/lib/mongoid/relations/builder.rb +1 -1
  98. data/lib/mongoid/relations/builders.rb +2 -2
  99. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  100. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
  101. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  102. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  103. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  104. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  105. data/lib/mongoid/relations/cascading.rb +3 -5
  106. data/lib/mongoid/relations/constraint.rb +1 -1
  107. data/lib/mongoid/relations/conversions.rb +1 -1
  108. data/lib/mongoid/relations/counter_cache.rb +39 -15
  109. data/lib/mongoid/relations/eager.rb +47 -0
  110. data/lib/mongoid/relations/eager/base.rb +57 -0
  111. data/lib/mongoid/relations/eager/belongs_to.rb +30 -0
  112. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +40 -0
  113. data/lib/mongoid/relations/eager/has_many.rb +37 -0
  114. data/lib/mongoid/relations/eager/has_one.rb +29 -0
  115. data/lib/mongoid/relations/embedded/batchable.rb +3 -4
  116. data/lib/mongoid/relations/embedded/many.rb +7 -27
  117. data/lib/mongoid/relations/macros.rb +2 -4
  118. data/lib/mongoid/relations/many.rb +30 -31
  119. data/lib/mongoid/relations/metadata.rb +6 -75
  120. data/lib/mongoid/relations/nested_builder.rb +2 -2
  121. data/lib/mongoid/relations/options.rb +1 -0
  122. data/lib/mongoid/relations/polymorphic.rb +0 -1
  123. data/lib/mongoid/relations/proxy.rb +10 -32
  124. data/lib/mongoid/relations/referenced/in.rb +2 -18
  125. data/lib/mongoid/relations/referenced/many.rb +9 -22
  126. data/lib/mongoid/relations/referenced/many_to_many.rb +10 -33
  127. data/lib/mongoid/relations/referenced/one.rb +2 -21
  128. data/lib/mongoid/relations/synchronization.rb +3 -3
  129. data/lib/mongoid/relations/touchable.rb +33 -0
  130. data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
  131. data/lib/mongoid/{scoping.rb → scopable.rb} +26 -3
  132. data/lib/mongoid/selectable.rb +59 -0
  133. data/lib/mongoid/{serialization.rb → serializable.rb} +10 -1
  134. data/lib/mongoid/sessions.rb +37 -345
  135. data/lib/mongoid/sessions/factory.rb +2 -0
  136. data/lib/mongoid/sessions/options.rb +176 -0
  137. data/lib/mongoid/sessions/storage_options.rb +140 -0
  138. data/lib/mongoid/sessions/thread_options.rb +19 -0
  139. data/lib/mongoid/sessions/validators/storage.rb +15 -1
  140. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  141. data/lib/mongoid/support/query_counter.rb +23 -0
  142. data/lib/mongoid/threaded.rb +0 -110
  143. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  144. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  145. data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
  146. data/lib/mongoid/{validations.rb → validatable.rb} +23 -9
  147. data/lib/mongoid/{validations → validatable}/associated.rb +3 -1
  148. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  149. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  150. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  151. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  152. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  153. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  154. data/lib/mongoid/{validations → validatable}/uniqueness.rb +3 -3
  155. data/lib/mongoid/version.rb +1 -1
  156. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +9 -13
  157. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  158. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  159. data/lib/rails/generators/mongoid_generator.rb +3 -40
  160. data/lib/rails/mongoid.rb +59 -57
  161. data/lib/support/ruby_version.rb +1 -1
  162. data/spec/app/models/account.rb +2 -6
  163. data/spec/app/models/acolyte.rb +1 -0
  164. data/spec/app/models/actor.rb +0 -1
  165. data/spec/app/models/address.rb +6 -1
  166. data/spec/app/models/animal.rb +1 -1
  167. data/spec/app/models/appointment.rb +2 -2
  168. data/spec/app/models/article.rb +1 -4
  169. data/spec/app/models/audio.rb +5 -0
  170. data/spec/app/models/author.rb +0 -2
  171. data/spec/app/models/band.rb +3 -2
  172. data/spec/app/models/bar.rb +1 -0
  173. data/spec/app/models/book.rb +1 -0
  174. data/spec/app/models/building.rb +0 -2
  175. data/spec/app/models/building_address.rb +0 -2
  176. data/spec/app/models/bus.rb +1 -1
  177. data/spec/app/models/canvas.rb +1 -1
  178. data/spec/app/models/contractor.rb +0 -2
  179. data/spec/app/models/country_code.rb +1 -1
  180. data/spec/app/models/definition.rb +2 -2
  181. data/spec/app/models/dragon.rb +4 -0
  182. data/spec/app/models/drug.rb +1 -3
  183. data/spec/app/models/dungeon.rb +4 -0
  184. data/spec/app/models/filesystem.rb +1 -0
  185. data/spec/app/models/fish.rb +0 -1
  186. data/spec/app/models/fruits.rb +6 -0
  187. data/spec/app/models/game.rb +0 -2
  188. data/spec/app/models/house.rb +0 -2
  189. data/spec/app/models/item.rb +1 -5
  190. data/spec/app/models/jar.rb +1 -1
  191. data/spec/app/models/label.rb +4 -4
  192. data/spec/app/models/login.rb +1 -1
  193. data/spec/app/models/movie.rb +1 -0
  194. data/spec/app/models/name.rb +3 -3
  195. data/spec/app/models/note.rb +1 -1
  196. data/spec/app/models/oscar.rb +1 -1
  197. data/spec/app/models/parent_doc.rb +1 -1
  198. data/spec/app/models/person.rb +13 -8
  199. data/spec/app/models/phone.rb +1 -3
  200. data/spec/app/models/player.rb +1 -1
  201. data/spec/app/models/post.rb +2 -1
  202. data/spec/app/models/quiz.rb +0 -3
  203. data/spec/app/models/record.rb +5 -5
  204. data/spec/app/models/registry.rb +1 -1
  205. data/spec/app/models/server.rb +1 -1
  206. data/spec/app/models/service.rb +3 -3
  207. data/spec/app/models/sound.rb +5 -0
  208. data/spec/app/models/template.rb +1 -1
  209. data/spec/app/models/title.rb +0 -1
  210. data/spec/app/models/track.rb +5 -5
  211. data/spec/app/models/tree.rb +1 -1
  212. data/spec/app/models/video.rb +0 -4
  213. data/spec/app/models/wiki_page.rb +1 -4
  214. data/spec/app/models/word.rb +3 -0
  215. data/spec/app/models/word_origin.rb +1 -1
  216. data/spec/config/mongoid.yml +7 -8
  217. data/spec/helpers.rb +18 -0
  218. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  219. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  220. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  221. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  222. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  223. data/spec/mongoid/atomic_spec.rb +19 -19
  224. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
  225. data/spec/mongoid/attributes/readonly_spec.rb +16 -16
  226. data/spec/mongoid/attributes_spec.rb +188 -434
  227. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +117 -148
  228. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  229. data/spec/mongoid/config/environment_spec.rb +3 -3
  230. data/spec/mongoid/config/options_spec.rb +6 -6
  231. data/spec/mongoid/config_spec.rb +24 -48
  232. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  233. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
  234. data/spec/mongoid/contextual/atomic_spec.rb +60 -56
  235. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  236. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  237. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  238. data/spec/mongoid/contextual/memory_spec.rb +94 -94
  239. data/spec/mongoid/contextual/mongo_spec.rb +225 -139
  240. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  241. data/spec/mongoid/copyable_spec.rb +56 -68
  242. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  243. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  244. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  245. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  246. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +31 -31
  247. data/spec/mongoid/criteria_spec.rb +530 -2207
  248. data/spec/mongoid/document_spec.rb +166 -120
  249. data/spec/mongoid/equality_spec.rb +22 -22
  250. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  251. data/spec/mongoid/errors/callback_spec.rb +3 -3
  252. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  253. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  254. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  255. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  256. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  257. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  258. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  259. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  260. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  261. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  262. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  263. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  264. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -3
  265. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  266. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  267. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  268. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  269. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  270. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  271. data/spec/mongoid/errors/mongoid_error_spec.rb +7 -7
  272. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  273. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  274. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  275. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  276. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  277. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  278. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  279. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  280. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  281. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  282. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  283. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  284. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  285. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  286. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  287. data/spec/mongoid/errors/validations_spec.rb +7 -7
  288. data/spec/mongoid/extensions/array_spec.rb +61 -61
  289. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  290. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  291. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  292. data/spec/mongoid/extensions/date_spec.rb +13 -13
  293. data/spec/mongoid/extensions/date_time_spec.rb +9 -9
  294. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  295. data/spec/mongoid/extensions/float_spec.rb +29 -15
  296. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  297. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  298. data/spec/mongoid/extensions/module_spec.rb +2 -2
  299. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  300. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  301. data/spec/mongoid/extensions/object_spec.rb +26 -26
  302. data/spec/mongoid/extensions/range_spec.rb +61 -12
  303. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  304. data/spec/mongoid/extensions/set_spec.rb +4 -4
  305. data/spec/mongoid/extensions/string_spec.rb +35 -46
  306. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  307. data/spec/mongoid/extensions/time_spec.rb +49 -49
  308. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  309. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  310. data/spec/mongoid/extensions_spec.rb +15 -0
  311. data/spec/mongoid/factory_spec.rb +15 -15
  312. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  313. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  314. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  315. data/spec/mongoid/fields/localized_spec.rb +23 -23
  316. data/spec/mongoid/fields/standard_spec.rb +12 -12
  317. data/spec/mongoid/fields_spec.rb +168 -209
  318. data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +62 -27
  319. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  320. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  321. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  322. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +105 -105
  323. data/spec/mongoid/log_subscriber_spec.rb +74 -0
  324. data/spec/mongoid/loggable_spec.rb +1 -1
  325. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  326. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  327. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  328. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  329. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  330. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  331. data/spec/mongoid/matchable/in_spec.rb +49 -0
  332. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  333. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  334. data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
  335. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  336. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  337. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  338. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  339. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  340. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  341. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  342. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  343. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  344. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  345. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  346. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  347. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  348. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  349. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  350. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  351. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  352. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  353. data/spec/mongoid/persistable_spec.rb +206 -0
  354. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +19 -14
  355. data/spec/mongoid/railties/document_spec.rb +2 -2
  356. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  357. data/spec/mongoid/relations/auto_save_spec.rb +36 -16
  358. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +6 -6
  359. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +2 -2
  360. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +3 -3
  361. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +12 -12
  362. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +6 -6
  363. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +9 -9
  364. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +6 -6
  365. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  366. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  367. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  368. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  369. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  370. data/spec/mongoid/relations/builders/referenced/in_spec.rb +22 -33
  371. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  372. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  373. data/spec/mongoid/relations/builders/referenced/one_spec.rb +11 -24
  374. data/spec/mongoid/relations/builders_spec.rb +21 -21
  375. data/spec/mongoid/relations/cascading/delete_spec.rb +7 -7
  376. data/spec/mongoid/relations/cascading/destroy_spec.rb +2 -2
  377. data/spec/mongoid/relations/cascading/nullify_spec.rb +2 -2
  378. data/spec/mongoid/relations/cascading/restrict_spec.rb +3 -3
  379. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  380. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  381. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  382. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  383. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  384. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  385. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +143 -0
  386. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  387. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  388. data/spec/mongoid/relations/eager_spec.rb +228 -0
  389. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  390. data/spec/mongoid/relations/embedded/in_spec.rb +55 -56
  391. data/spec/mongoid/relations/embedded/many_spec.rb +357 -367
  392. data/spec/mongoid/relations/embedded/one_spec.rb +98 -139
  393. data/spec/mongoid/relations/macros_spec.rb +108 -102
  394. data/spec/mongoid/relations/metadata_spec.rb +147 -241
  395. data/spec/mongoid/relations/options_spec.rb +1 -1
  396. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  397. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  398. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  399. data/spec/mongoid/relations/referenced/many_spec.rb +379 -522
  400. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +345 -417
  401. data/spec/mongoid/relations/referenced/one_spec.rb +148 -263
  402. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  403. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  404. data/spec/mongoid/relations/targets/enumerable_spec.rb +116 -116
  405. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  406. data/spec/mongoid/relations_spec.rb +16 -15
  407. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
  408. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +74 -126
  409. data/spec/mongoid/selectable_spec.rb +134 -0
  410. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +111 -82
  411. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  412. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  413. data/spec/mongoid/sessions/options_spec.rb +92 -0
  414. data/spec/mongoid/sessions_spec.rb +288 -177
  415. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  416. data/spec/mongoid/state_spec.rb +10 -10
  417. data/spec/mongoid/threaded_spec.rb +17 -70
  418. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  419. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  420. data/spec/mongoid/timestamps/updated/short_spec.rb +10 -10
  421. data/spec/mongoid/timestamps/updated_spec.rb +8 -12
  422. data/spec/mongoid/timestamps_spec.rb +7 -11
  423. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  424. data/spec/mongoid/{validations → validatable}/associated_spec.rb +18 -18
  425. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  426. data/spec/mongoid/{validations → validatable}/length_spec.rb +7 -7
  427. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  428. data/spec/mongoid/{validations → validatable}/presence_spec.rb +31 -38
  429. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +126 -183
  430. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  431. data/spec/mongoid_spec.rb +8 -8
  432. data/spec/rails/mongoid_spec.rb +72 -87
  433. data/spec/spec_helper.rb +19 -17
  434. metadata +261 -283
  435. data/lib/mongoid/atomic/positionable.rb +0 -73
  436. data/lib/mongoid/components.rb +0 -92
  437. data/lib/mongoid/config/inflections.rb +0 -6
  438. data/lib/mongoid/contextual/eager.rb +0 -158
  439. data/lib/mongoid/criterion/findable.rb +0 -179
  440. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  441. data/lib/mongoid/identity_map.rb +0 -163
  442. data/lib/mongoid/json.rb +0 -16
  443. data/lib/mongoid/matchers.rb +0 -32
  444. data/lib/mongoid/matchers/strategies.rb +0 -97
  445. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  446. data/lib/mongoid/nested_attributes.rb +0 -78
  447. data/lib/mongoid/observer.rb +0 -192
  448. data/lib/mongoid/paranoia.rb +0 -136
  449. data/lib/mongoid/persistence.rb +0 -357
  450. data/lib/mongoid/persistence/atomic.rb +0 -231
  451. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  452. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  453. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  454. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  455. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  456. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  457. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  458. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  459. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  460. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  461. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  462. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  463. data/lib/mongoid/persistence/deletion.rb +0 -31
  464. data/lib/mongoid/persistence/insertion.rb +0 -38
  465. data/lib/mongoid/persistence/modification.rb +0 -35
  466. data/lib/mongoid/persistence/operations.rb +0 -214
  467. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  468. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  469. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  470. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  471. data/lib/mongoid/persistence/operations/update.rb +0 -59
  472. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  473. data/lib/mongoid/persistence/upsertion.rb +0 -31
  474. data/lib/mongoid/unit_of_work.rb +0 -61
  475. data/lib/mongoid/versioning.rb +0 -217
  476. data/lib/rack/mongoid.rb +0 -2
  477. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  478. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  479. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  480. data/spec/app/models/actor_observer.rb +0 -15
  481. data/spec/app/models/callback_recorder.rb +0 -25
  482. data/spec/app/models/draft.rb +0 -9
  483. data/spec/app/models/paranoid_phone.rb +0 -25
  484. data/spec/app/models/paranoid_post.rb +0 -36
  485. data/spec/app/models/phone_observer.rb +0 -6
  486. data/spec/mongoid/#atomic_spec.rb# +0 -365
  487. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  488. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  489. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  490. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  491. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  492. data/spec/mongoid/identity_map_spec.rb +0 -564
  493. data/spec/mongoid/json_spec.rb +0 -33
  494. data/spec/mongoid/matchers/in_spec.rb +0 -25
  495. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  496. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  497. data/spec/mongoid/observer_spec.rb +0 -290
  498. data/spec/mongoid/paranoia_spec.rb +0 -759
  499. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  500. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  501. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  502. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  503. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  504. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  505. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  506. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  507. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  508. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  509. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  510. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  511. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  512. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  513. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  514. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  515. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  516. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  517. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  518. data/spec/mongoid/persistence_spec.rb +0 -2279
  519. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  520. data/spec/mongoid/versioning_spec.rb +0 -540
  521. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -14,49 +14,23 @@ module Mongoid
14
14
  # person.process_attributes(:title => "sir", :age => 40)
15
15
  #
16
16
  # @param [ Hash ] attrs The attributes to set.
17
- # @param [ Symbol ] role A role for scoped mass assignment.
18
- # @param [ Boolean ] guard_protected_attributes False to skip mass assignment protection.
19
17
  #
20
18
  # @since 2.0.0.rc.7
21
- def process_attributes(attrs = nil, role = :default, guard_protected_attributes = true)
22
- with_mass_assignment(role, guard_protected_attributes) do
23
- attrs ||= {}
24
- if !attrs.empty?
25
- attrs = sanitize_for_mass_assignment(attrs, role) if guard_protected_attributes
26
- attrs.each_pair do |key, value|
27
- next if pending_attribute?(key, value)
28
- process_attribute(key, value)
29
- end
19
+ def process_attributes(attrs = nil)
20
+ attrs ||= {}
21
+ if !attrs.empty?
22
+ attrs = sanitize_for_mass_assignment(attrs)
23
+ attrs.each_pair do |key, value|
24
+ next if pending_attribute?(key, value)
25
+ process_attribute(key, value)
30
26
  end
31
- yield self if block_given?
32
- process_pending
33
27
  end
28
+ yield self if block_given?
29
+ process_pending
34
30
  end
35
31
 
36
32
  private
37
33
 
38
- # Get the current mass assignment options for this model.
39
- #
40
- # @api private
41
- #
42
- # @return [ Hash ] The mass assignment options.
43
- #
44
- # @since 3.0.7
45
- def mass_assignment_options
46
- @mass_assignment_options ||= {}
47
- end
48
-
49
- # Set the mass assignment options for the current model.
50
- #
51
- # @api private
52
- #
53
- # @return [ Hash ] The mass assignment options.
54
- #
55
- # @since 3.0.7
56
- def mass_assignment_options=(options)
57
- @mass_assignment_options = options
58
- end
59
-
60
34
  # If the key provided is the name of a relation or a nested attribute, we
61
35
  # need to wait until all other attributes are set before processing
62
36
  # these.
@@ -118,14 +92,9 @@ module Mongoid
118
92
  #
119
93
  # @since 2.0.0.rc.7
120
94
  def process_attribute(name, value)
121
- writer_method = "#{name}="
122
- responds = respond_to?(writer_method)
123
- if Mongoid.allow_dynamic_fields && !responds
124
- write_attribute(name, value)
125
- else
126
- raise Errors::UnknownAttribute.new(self.class, name) unless responds
127
- send(writer_method, value)
128
- end
95
+ responds = respond_to?("#{name}=")
96
+ raise Errors::UnknownAttribute.new(self.class, name) unless responds
97
+ send("#{name}=", value)
129
98
  end
130
99
 
131
100
  # Process all the pending nested attributes that needed to wait until
@@ -167,34 +136,12 @@ module Mongoid
167
136
  pending_relations.each_pair do |name, value|
168
137
  metadata = relations[name]
169
138
  if value.is_a?(Hash)
170
- metadata.nested_builder(value, {}).build(self, mass_assignment_options)
139
+ metadata.nested_builder(value, {}).build(self)
171
140
  else
172
141
  send("#{name}=", value)
173
142
  end
174
143
  end
175
144
  end
176
-
177
- # Execute the block with the provided mass assignment options set.
178
- #
179
- # @api private
180
- #
181
- # @example Execute with mass assignment.
182
- # model.with_mass_assignment(:default, true)
183
- #
184
- # @param [ Symbol ] role The role.
185
- # @param [ true, false ] guard_protected_attributes To enable mass
186
- # assignment.
187
- #
188
- # @since 3.0.7
189
- def with_mass_assignment(role, guard_protected_attributes)
190
- begin
191
- self.mass_assignment_options =
192
- { as: role, without_protection: !guard_protected_attributes }
193
- yield
194
- ensure
195
- self.mass_assignment_options = nil
196
- end
197
- end
198
145
  end
199
146
  end
200
147
  end
@@ -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
@@ -0,0 +1,104 @@
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/traversable"
15
+ require "mongoid/validatable"
16
+
17
+ module Mongoid
18
+
19
+ # This module provides inclusions of all behaviour in a Mongoid document.
20
+ #
21
+ # @since 4.0.0
22
+ module Composable
23
+ extend ActiveSupport::Concern
24
+
25
+ # All modules that a +Document+ is composed of are defined in this
26
+ # module, to keep the document class from getting too cluttered.
27
+ included do
28
+ extend ActiveModel::Translation
29
+ extend Findable
30
+ end
31
+
32
+ include ActiveModel::Conversion
33
+ include ActiveModel::ForbiddenAttributesProtection
34
+ include ActiveModel::Naming
35
+ include ActiveModel::Serializers::JSON
36
+ include ActiveModel::Serializers::Xml
37
+ include Atomic
38
+ include Changeable
39
+ include Attributes
40
+ include Evolvable
41
+ include Fields
42
+ include Indexable
43
+ include Inspectable
44
+ include Matchable
45
+ include Persistable
46
+ include Relations
47
+ include Reloadable
48
+ include Scopable
49
+ include Selectable
50
+ include Serializable
51
+ include Sessions
52
+ include Shardable
53
+ include State
54
+ include Threaded::Lifecycle
55
+ include Traversable
56
+ include Validatable
57
+ include Interceptable
58
+ include Copyable
59
+ include Equality
60
+
61
+ MODULES = [
62
+ Atomic,
63
+ Attributes,
64
+ Copyable,
65
+ Changeable,
66
+ Evolvable,
67
+ Fields,
68
+ Indexable,
69
+ Inspectable,
70
+ Interceptable,
71
+ Matchable,
72
+ Persistable,
73
+ Relations,
74
+ Reloadable,
75
+ Scopable,
76
+ Serializable,
77
+ Sessions,
78
+ Shardable,
79
+ State,
80
+ Threaded::Lifecycle,
81
+ Traversable,
82
+ Validatable,
83
+ Equality
84
+ ]
85
+
86
+ class << self
87
+
88
+ # Get a list of methods that would be a bad idea to define as field names
89
+ # or override when including Mongoid::Document.
90
+ #
91
+ # @example Bad thing!
92
+ # Mongoid::Components.prohibited_methods
93
+ #
94
+ # @return [ Array<Symbol> ]
95
+ #
96
+ # @since 2.1.8
97
+ def prohibited_methods
98
+ @prohibited_methods ||= MODULES.flat_map do |mod|
99
+ mod.instance_methods.map{ |m| m.to_sym }
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -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
@@ -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.
@@ -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
 
@@ -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