mongoid 3.1.6 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +479 -8
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid.rb +10 -76
  6. data/lib/mongoid/atomic.rb +3 -14
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  9. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  10. data/lib/mongoid/atomic/paths/root.rb +0 -13
  11. data/lib/mongoid/attributes.rb +65 -101
  12. data/lib/mongoid/attributes/dynamic.rb +154 -0
  13. data/lib/mongoid/attributes/nested.rb +82 -0
  14. data/lib/mongoid/attributes/processing.rb +13 -66
  15. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  16. data/lib/mongoid/composable.rb +105 -0
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/config/options.rb +1 -1
  19. data/lib/mongoid/contextual.rb +2 -0
  20. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  21. data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
  22. data/lib/mongoid/contextual/atomic.rb +53 -53
  23. data/lib/mongoid/contextual/geo_near.rb +1 -1
  24. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  25. data/lib/mongoid/contextual/memory.rb +23 -11
  26. data/lib/mongoid/contextual/mongo.rb +75 -57
  27. data/lib/mongoid/contextual/none.rb +90 -0
  28. data/lib/mongoid/contextual/text_search.rb +178 -0
  29. data/lib/mongoid/copyable.rb +2 -3
  30. data/lib/mongoid/criteria.rb +39 -34
  31. data/lib/mongoid/criteria/#findable.rb# +141 -0
  32. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  33. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  34. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  35. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  36. data/lib/mongoid/criteria/permission.rb +70 -0
  37. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  38. data/lib/mongoid/document.rb +39 -24
  39. data/lib/mongoid/errors.rb +4 -1
  40. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  41. data/lib/mongoid/errors/document_not_found.rb +2 -1
  42. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  43. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  44. data/lib/mongoid/errors/invalid_value.rb +16 -0
  45. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  46. data/lib/mongoid/errors/readonly_document.rb +24 -0
  47. data/lib/mongoid/extensions.rb +15 -7
  48. data/lib/mongoid/extensions/array.rb +3 -3
  49. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  50. data/lib/mongoid/extensions/boolean.rb +15 -17
  51. data/lib/mongoid/extensions/date.rb +1 -1
  52. data/lib/mongoid/extensions/date_time.rb +3 -3
  53. data/lib/mongoid/extensions/float.rb +2 -1
  54. data/lib/mongoid/extensions/hash.rb +3 -3
  55. data/lib/mongoid/extensions/integer.rb +1 -1
  56. data/lib/mongoid/extensions/object.rb +7 -7
  57. data/lib/mongoid/extensions/object_id.rb +5 -5
  58. data/lib/mongoid/extensions/range.rb +9 -3
  59. data/lib/mongoid/extensions/regexp.rb +1 -1
  60. data/lib/mongoid/extensions/set.rb +1 -1
  61. data/lib/mongoid/extensions/string.rb +6 -18
  62. data/lib/mongoid/extensions/symbol.rb +1 -1
  63. data/lib/mongoid/extensions/time.rb +3 -3
  64. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  65. data/lib/mongoid/factory.rb +8 -6
  66. data/lib/mongoid/fields.rb +41 -8
  67. data/lib/mongoid/fields/foreign_key.rb +3 -3
  68. data/lib/mongoid/fields/localized.rb +1 -1
  69. data/lib/mongoid/fields/standard.rb +5 -17
  70. data/lib/mongoid/fields/validators/macro.rb +15 -5
  71. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/indexable/specification.rb +104 -0
  74. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  75. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  76. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  77. data/lib/mongoid/log_subscriber.rb +55 -0
  78. data/lib/mongoid/matchable.rb +152 -0
  79. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  81. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  86. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  87. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  88. data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
  89. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  90. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  91. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  92. data/lib/mongoid/persistable.rb +216 -0
  93. data/lib/mongoid/persistable/creatable.rb +189 -0
  94. data/lib/mongoid/persistable/deletable.rb +149 -0
  95. data/lib/mongoid/persistable/destroyable.rb +60 -0
  96. data/lib/mongoid/persistable/incrementable.rb +36 -0
  97. data/lib/mongoid/persistable/logical.rb +38 -0
  98. data/lib/mongoid/persistable/poppable.rb +39 -0
  99. data/lib/mongoid/persistable/pullable.rb +55 -0
  100. data/lib/mongoid/persistable/pushable.rb +62 -0
  101. data/lib/mongoid/persistable/renamable.rb +35 -0
  102. data/lib/mongoid/persistable/savable.rb +52 -0
  103. data/lib/mongoid/persistable/settable.rb +33 -0
  104. data/lib/mongoid/persistable/unsettable.rb +36 -0
  105. data/lib/mongoid/persistable/updatable.rb +153 -0
  106. data/lib/mongoid/persistable/upsertable.rb +55 -0
  107. data/lib/mongoid/positional.rb +71 -0
  108. data/lib/mongoid/query_cache.rb +255 -0
  109. data/lib/mongoid/railtie.rb +34 -60
  110. data/lib/mongoid/railties/database.rake +9 -25
  111. data/lib/mongoid/relations.rb +11 -25
  112. data/lib/mongoid/relations/accessors.rb +15 -51
  113. data/lib/mongoid/relations/auto_save.rb +15 -36
  114. data/lib/mongoid/relations/binding.rb +2 -25
  115. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  116. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  117. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  118. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  119. data/lib/mongoid/relations/builder.rb +1 -1
  120. data/lib/mongoid/relations/builders.rb +2 -2
  121. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  122. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  123. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  124. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  125. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  126. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  127. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  128. data/lib/mongoid/relations/cascading.rb +3 -5
  129. data/lib/mongoid/relations/constraint.rb +1 -1
  130. data/lib/mongoid/relations/conversions.rb +1 -1
  131. data/lib/mongoid/relations/counter_cache.rb +39 -15
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/eager/base.rb +149 -0
  134. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  135. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  136. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  137. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  138. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  139. data/lib/mongoid/relations/embedded/in.rb +4 -4
  140. data/lib/mongoid/relations/embedded/many.rb +14 -32
  141. data/lib/mongoid/relations/embedded/one.rb +1 -1
  142. data/lib/mongoid/relations/macros.rb +3 -4
  143. data/lib/mongoid/relations/many.rb +51 -31
  144. data/lib/mongoid/relations/marshalable.rb +3 -3
  145. data/lib/mongoid/relations/metadata.rb +14 -79
  146. data/lib/mongoid/relations/nested_builder.rb +2 -2
  147. data/lib/mongoid/relations/one.rb +1 -1
  148. data/lib/mongoid/relations/options.rb +1 -0
  149. data/lib/mongoid/relations/polymorphic.rb +0 -1
  150. data/lib/mongoid/relations/proxy.rb +21 -41
  151. data/lib/mongoid/relations/referenced/in.rb +4 -20
  152. data/lib/mongoid/relations/referenced/many.rb +22 -35
  153. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  154. data/lib/mongoid/relations/referenced/one.rb +6 -25
  155. data/lib/mongoid/relations/synchronization.rb +4 -4
  156. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  157. data/lib/mongoid/relations/touchable.rb +34 -1
  158. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  159. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  160. data/lib/mongoid/selectable.rb +59 -0
  161. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  162. data/lib/mongoid/sessions.rb +37 -345
  163. data/lib/mongoid/sessions/factory.rb +2 -0
  164. data/lib/mongoid/sessions/options.rb +185 -0
  165. data/lib/mongoid/sessions/storage_options.rb +140 -0
  166. data/lib/mongoid/sessions/thread_options.rb +19 -0
  167. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  168. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  169. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  170. data/lib/mongoid/support/query_counter.rb +23 -0
  171. data/lib/mongoid/tasks/database.rake +31 -0
  172. data/lib/mongoid/tasks/database.rb +107 -0
  173. data/lib/mongoid/threaded.rb +26 -172
  174. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  175. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  176. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  177. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  178. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  179. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  180. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  182. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  183. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  184. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  185. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  186. data/lib/mongoid/version.rb +1 -1
  187. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  188. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  189. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  190. data/lib/rails/generators/mongoid_generator.rb +3 -40
  191. data/lib/rails/mongoid.rb +0 -122
  192. data/lib/support/ruby_version.rb +1 -1
  193. data/spec/app/models/account.rb +2 -6
  194. data/spec/app/models/acolyte.rb +2 -1
  195. data/spec/app/models/actor.rb +0 -1
  196. data/spec/app/models/address.rb +8 -3
  197. data/spec/app/models/animal.rb +1 -1
  198. data/spec/app/models/appointment.rb +3 -3
  199. data/spec/app/models/article.rb +1 -4
  200. data/spec/app/models/audio.rb +5 -0
  201. data/spec/app/models/author.rb +0 -2
  202. data/spec/app/models/band.rb +3 -2
  203. data/spec/app/models/bar.rb +1 -0
  204. data/spec/app/models/book.rb +1 -0
  205. data/spec/app/models/building.rb +0 -2
  206. data/spec/app/models/building_address.rb +0 -2
  207. data/spec/app/models/bus.rb +1 -1
  208. data/spec/app/models/canvas.rb +1 -1
  209. data/spec/app/models/contextable_item.rb +5 -0
  210. data/spec/app/models/contractor.rb +0 -2
  211. data/spec/app/models/country_code.rb +1 -1
  212. data/spec/app/models/definition.rb +2 -2
  213. data/spec/app/models/dog.rb +1 -1
  214. data/spec/app/models/draft.rb +9 -0
  215. data/spec/app/models/dragon.rb +4 -0
  216. data/spec/app/models/drug.rb +1 -3
  217. data/spec/app/models/dungeon.rb +4 -0
  218. data/spec/app/models/edit.rb +5 -0
  219. data/spec/app/models/even.rb +7 -0
  220. data/spec/app/models/event.rb +1 -1
  221. data/spec/app/models/filesystem.rb +1 -0
  222. data/spec/app/models/fish.rb +0 -1
  223. data/spec/app/models/fruits.rb +6 -0
  224. data/spec/app/models/game.rb +0 -2
  225. data/spec/app/models/house.rb +1 -3
  226. data/spec/app/models/id_key.rb +6 -0
  227. data/spec/app/models/item.rb +1 -5
  228. data/spec/app/models/jar.rb +1 -1
  229. data/spec/app/models/label.rb +4 -4
  230. data/spec/app/models/line_item.rb +1 -1
  231. data/spec/app/models/login.rb +1 -1
  232. data/spec/app/models/message.rb +8 -0
  233. data/spec/app/models/movie.rb +1 -0
  234. data/spec/app/models/name.rb +3 -3
  235. data/spec/app/models/note.rb +3 -1
  236. data/spec/app/models/odd.rb +7 -0
  237. data/spec/app/models/oscar.rb +1 -1
  238. data/spec/app/models/parent_doc.rb +1 -1
  239. data/spec/app/models/person.rb +16 -10
  240. data/spec/app/models/phone.rb +1 -3
  241. data/spec/app/models/player.rb +3 -3
  242. data/spec/app/models/post.rb +5 -3
  243. data/spec/app/models/preference.rb +1 -1
  244. data/spec/app/models/quiz.rb +0 -3
  245. data/spec/app/models/record.rb +10 -5
  246. data/spec/app/models/registry.rb +1 -1
  247. data/spec/app/models/server.rb +1 -1
  248. data/spec/app/models/service.rb +3 -3
  249. data/spec/app/models/sound.rb +5 -0
  250. data/spec/app/models/symptom.rb +1 -1
  251. data/spec/app/models/template.rb +1 -1
  252. data/spec/app/models/title.rb +0 -1
  253. data/spec/app/models/track.rb +5 -5
  254. data/spec/app/models/tree.rb +3 -3
  255. data/spec/app/models/video.rb +1 -5
  256. data/spec/app/models/wiki_page.rb +2 -5
  257. data/spec/app/models/word.rb +3 -0
  258. data/spec/app/models/word_origin.rb +1 -1
  259. data/spec/config/mongoid.yml +7 -8
  260. data/spec/helpers.rb +18 -0
  261. data/spec/mongoid/#atomic_spec.rb# +365 -0
  262. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  263. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  264. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  265. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  266. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  267. data/spec/mongoid/atomic_spec.rb +19 -19
  268. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  269. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  270. data/spec/mongoid/attributes_spec.rb +349 -434
  271. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  272. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  273. data/spec/mongoid/config/environment_spec.rb +3 -3
  274. data/spec/mongoid/config/options_spec.rb +6 -6
  275. data/spec/mongoid/config_spec.rb +24 -48
  276. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  277. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
  278. data/spec/mongoid/contextual/atomic_spec.rb +60 -56
  279. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  280. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  281. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  282. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  283. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  284. data/spec/mongoid/contextual/none_spec.rb +127 -0
  285. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  286. data/spec/mongoid/copyable_spec.rb +56 -68
  287. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  288. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  289. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  290. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  291. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  292. data/spec/mongoid/criteria_spec.rb +715 -2421
  293. data/spec/mongoid/document_spec.rb +171 -121
  294. data/spec/mongoid/equality_spec.rb +22 -22
  295. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  296. data/spec/mongoid/errors/callback_spec.rb +3 -3
  297. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  298. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  299. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  300. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  308. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  311. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  312. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  313. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  314. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  315. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  316. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  317. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  318. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  325. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  326. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  327. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  328. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  329. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  330. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  331. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  332. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  333. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  334. data/spec/mongoid/errors/validations_spec.rb +7 -7
  335. data/spec/mongoid/extensions/array_spec.rb +61 -61
  336. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  337. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  338. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  339. data/spec/mongoid/extensions/date_spec.rb +13 -13
  340. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  341. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  342. data/spec/mongoid/extensions/float_spec.rb +29 -15
  343. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  344. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  345. data/spec/mongoid/extensions/module_spec.rb +2 -2
  346. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  347. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  348. data/spec/mongoid/extensions/object_spec.rb +26 -26
  349. data/spec/mongoid/extensions/range_spec.rb +61 -12
  350. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  351. data/spec/mongoid/extensions/set_spec.rb +4 -4
  352. data/spec/mongoid/extensions/string_spec.rb +35 -46
  353. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  354. data/spec/mongoid/extensions/time_spec.rb +49 -49
  355. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  356. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  357. data/spec/mongoid/extensions_spec.rb +29 -0
  358. data/spec/mongoid/factory_spec.rb +15 -15
  359. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  360. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  361. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  362. data/spec/mongoid/fields/localized_spec.rb +38 -23
  363. data/spec/mongoid/fields/standard_spec.rb +12 -12
  364. data/spec/mongoid/fields_spec.rb +263 -217
  365. data/spec/mongoid/findable_spec.rb +509 -0
  366. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  367. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  368. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  369. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  370. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  371. data/spec/mongoid/loggable_spec.rb +1 -1
  372. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  373. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  374. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  375. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  376. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  377. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  378. data/spec/mongoid/matchable/in_spec.rb +49 -0
  379. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  380. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  381. data/spec/mongoid/matchable/ne_spec.rb +46 -0
  382. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  383. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  384. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  385. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  386. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  387. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  388. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  389. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  390. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  391. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  392. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  393. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  394. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  395. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  396. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  397. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  398. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  399. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  400. data/spec/mongoid/persistable_spec.rb +206 -0
  401. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
  402. data/spec/mongoid/query_cache_spec.rb +263 -0
  403. data/spec/mongoid/railties/document_spec.rb +2 -2
  404. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  405. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  406. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  407. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  408. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  409. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  410. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  411. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  412. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  413. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  414. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  415. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  416. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  417. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  418. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  419. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  420. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  421. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  422. data/spec/mongoid/relations/builders_spec.rb +21 -21
  423. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  424. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  425. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  426. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  427. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  428. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  429. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  430. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  431. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  432. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  433. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  434. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  435. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  436. data/spec/mongoid/relations/eager_spec.rb +228 -0
  437. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  438. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  439. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  440. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  441. data/spec/mongoid/relations/macros_spec.rb +108 -102
  442. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  443. data/spec/mongoid/relations/options_spec.rb +1 -1
  444. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  445. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  446. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  447. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  448. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  449. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  450. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  451. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  452. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  453. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  454. data/spec/mongoid/relations_spec.rb +16 -15
  455. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  456. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  457. data/spec/mongoid/selectable_spec.rb +134 -0
  458. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  459. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  460. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  461. data/spec/mongoid/sessions/options_spec.rb +108 -0
  462. data/spec/mongoid/sessions_spec.rb +319 -178
  463. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  464. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  465. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  466. data/spec/mongoid/tasks/database_spec.rb +160 -0
  467. data/spec/mongoid/threaded_spec.rb +17 -70
  468. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  469. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  470. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  471. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  472. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  473. data/spec/mongoid/timestamps_spec.rb +9 -13
  474. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  475. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  476. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  477. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  478. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  479. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  480. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  481. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  482. data/spec/mongoid_spec.rb +8 -8
  483. data/spec/rails/mongoid_spec.rb +19 -335
  484. data/spec/spec_helper.rb +31 -13
  485. metadata +303 -283
  486. data/lib/mongoid/atomic/positionable.rb +0 -73
  487. data/lib/mongoid/components.rb +0 -92
  488. data/lib/mongoid/config/inflections.rb +0 -6
  489. data/lib/mongoid/contextual/eager.rb +0 -158
  490. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  491. data/lib/mongoid/identity_map.rb +0 -163
  492. data/lib/mongoid/json.rb +0 -16
  493. data/lib/mongoid/matchers.rb +0 -32
  494. data/lib/mongoid/matchers/strategies.rb +0 -97
  495. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  496. data/lib/mongoid/nested_attributes.rb +0 -78
  497. data/lib/mongoid/observer.rb +0 -192
  498. data/lib/mongoid/paranoia.rb +0 -136
  499. data/lib/mongoid/persistence.rb +0 -357
  500. data/lib/mongoid/persistence/atomic.rb +0 -231
  501. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  502. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  503. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  504. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  505. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  506. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  507. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  508. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  509. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  510. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  511. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  512. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  513. data/lib/mongoid/persistence/deletion.rb +0 -31
  514. data/lib/mongoid/persistence/insertion.rb +0 -38
  515. data/lib/mongoid/persistence/modification.rb +0 -35
  516. data/lib/mongoid/persistence/operations.rb +0 -214
  517. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  518. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  519. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  520. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  521. data/lib/mongoid/persistence/operations/update.rb +0 -59
  522. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  523. data/lib/mongoid/persistence/upsertion.rb +0 -31
  524. data/lib/mongoid/unit_of_work.rb +0 -61
  525. data/lib/mongoid/versioning.rb +0 -217
  526. data/lib/rack/mongoid.rb +0 -2
  527. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  528. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  529. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  530. data/spec/app/models/actor_observer.rb +0 -15
  531. data/spec/app/models/callback_recorder.rb +0 -25
  532. data/spec/app/models/paranoid_phone.rb +0 -25
  533. data/spec/app/models/paranoid_post.rb +0 -36
  534. data/spec/app/models/phone_observer.rb +0 -6
  535. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  536. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  537. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  538. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  539. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  540. data/spec/mongoid/finders_spec.rb +0 -321
  541. data/spec/mongoid/identity_map_spec.rb +0 -564
  542. data/spec/mongoid/json_spec.rb +0 -33
  543. data/spec/mongoid/matchers/in_spec.rb +0 -25
  544. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  545. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  546. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  547. data/spec/mongoid/observer_spec.rb +0 -290
  548. data/spec/mongoid/paranoia_spec.rb +0 -759
  549. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  550. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  551. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  552. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  553. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  554. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  555. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  556. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  557. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  558. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  559. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  560. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  561. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  562. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  563. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  564. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  565. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  566. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  567. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  568. data/spec/mongoid/persistence_spec.rb +0 -2279
  569. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  570. data/spec/mongoid/versioning_spec.rb +0 -540
  571. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -4,6 +4,39 @@ module Mongoid
4
4
  module Touchable
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ # Touch the document, in effect updating its updated_at timestamp and
8
+ # optionally the provided field to the current time. If any belongs_to
9
+ # relations exist with a touch option, they will be updated as well.
10
+ #
11
+ # @example Update the updated_at timestamp.
12
+ # document.touch
13
+ #
14
+ # @example Update the updated_at and provided timestamps.
15
+ # document.touch(:audited)
16
+ #
17
+ # @note This will not autobuild relations if those options are set.
18
+ #
19
+ # @param [ Symbol ] field The name of an additional field to update.
20
+ #
21
+ # @return [ true/false ] false if record is new_record otherwise true.
22
+ #
23
+ # @since 3.0.0
24
+ def touch(field = nil)
25
+ return false if _root.new_record?
26
+ current = Time.now
27
+ field = database_field_name(field)
28
+ write_attribute(:updated_at, current) if respond_to?("updated_at=")
29
+ write_attribute(field, current) if field
30
+
31
+ touches = touch_atomic_updates(field)
32
+ unless touches.empty?
33
+ selector = atomic_selector
34
+ _root.collection.where(selector).update(positionally(selector, touches))
35
+ end
36
+ run_callbacks(:touch)
37
+ true
38
+ end
39
+
7
40
  module ClassMethods
8
41
 
9
42
  # Add the metadata to the touchable relations if the touch option was
@@ -21,7 +54,7 @@ module Mongoid
21
54
  if metadata.touchable?
22
55
  name = metadata.name
23
56
  method_name = define_relation_touch_method(name)
24
- after_create method_name
57
+ after_save method_name
25
58
  after_destroy method_name
26
59
  after_touch method_name
27
60
  end
@@ -1,7 +1,10 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
+
3
4
  # This module handles reloading behaviour of documents.
4
- module Reloading
5
+ #
6
+ # @since 4.0.0
7
+ module Reloadable
5
8
 
6
9
  # Reloads the +Document+ attributes from the database. If the document has
7
10
  # not been saved then an error will get raised if the configuration option
@@ -18,14 +21,13 @@ module Mongoid
18
21
  def reload
19
22
  reloaded = _reload
20
23
  if Mongoid.raise_not_found_error && reloaded.empty?
21
- raise Errors::DocumentNotFound.new(self.class, id, id)
24
+ raise Errors::DocumentNotFound.new(self.class, _id, _id)
22
25
  end
23
26
  @attributes = reloaded
24
27
  @attributes_before_type_cast = {}
25
28
  changed_attributes.clear
26
29
  apply_defaults
27
30
  reload_relations
28
- IdentityMap.set(self)
29
31
  run_callbacks(:find) unless _find_callbacks.empty?
30
32
  run_callbacks(:initialize) unless _initialize_callbacks.empty?
31
33
  self
@@ -55,7 +57,7 @@ module Mongoid
55
57
  #
56
58
  # @since 2.3.2
57
59
  def reload_root_document
58
- {}.merge(with(consistency: :strong).collection.find(_id: id).one || {})
60
+ {}.merge(with(read: :primary).collection.find(_id: _id).one || {})
59
61
  end
60
62
 
61
63
  # Reload the embedded document.
@@ -68,7 +70,7 @@ module Mongoid
68
70
  # @since 2.3.2
69
71
  def reload_embedded_document
70
72
  extract_embedded_attributes({}.merge(
71
- _root.with(consistency: :strong).collection.find(_id: _root.id).one
73
+ _root.with(read: :primary).collection.find(_id: _root._id).one
72
74
  ))
73
75
  end
74
76
 
@@ -1,9 +1,12 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Mongoid
3
4
 
4
5
  # This module contains behaviour for all Mongoid scoping - named scopes,
5
6
  # default scopes, and criteria accessors via scoped and unscoped.
6
- module Scoping
7
+ #
8
+ # @since 4.0.0
9
+ module Scopable
7
10
  extend ActiveSupport::Concern
8
11
 
9
12
  included do
@@ -12,6 +15,27 @@ module Mongoid
12
15
  self._declared_scopes = {}
13
16
  end
14
17
 
18
+ private
19
+
20
+ # Apply the default scoping to the attributes of the document, as long as
21
+ # they are not complex queries.
22
+ #
23
+ # @api private
24
+ #
25
+ # @example Apply the default scoping.
26
+ # document.apply_default_scoping
27
+ #
28
+ # @return [ true, false ] If default scoping was applied.
29
+ #
30
+ # @since 4.0.0
31
+ def apply_default_scoping
32
+ if default_scoping
33
+ default_scoping.call.selector.each do |field, value|
34
+ attributes[field] = value unless value.respond_to?(:each_pair)
35
+ end
36
+ end
37
+ end
38
+
15
39
  module ClassMethods
16
40
 
17
41
  # Returns a hash of all the scopes defined for this class, including
@@ -22,7 +46,7 @@ module Mongoid
22
46
  # include Mongoid::Document
23
47
  # field :active, type: Boolean
24
48
  #
25
- # scope :active, where(active: true)
49
+ # scope :active, -> { where(active: true) }
26
50
  # end
27
51
  # Band.scopes
28
52
  #
@@ -104,14 +128,14 @@ module Mongoid
104
128
  # field :active, type: Boolean
105
129
  # field :count, type: Integer
106
130
  #
107
- # scope :active, where(active: true)
131
+ # scope :active, -> { where(active: true) }
108
132
  # scope :at_least, ->(count){ where(:count.gt => count) }
109
133
  # end
110
134
  #
111
135
  # @param [ Symbol ] name The name of the scope.
112
- # @param [ Proc, Criteria ] conditions The conditions of the scope.
136
+ # @param [ Proc ] conditions The conditions of the scope.
113
137
  #
114
- # @raise [ Errors::InvalidScope ] If the scope is not a proc or criteria.
138
+ # @raise [ Errors::InvalidScope ] If the scope is not a proc.
115
139
  # @raise [ Errors::ScopeOverwrite ] If the scope name already exists.
116
140
  #
117
141
  # @since 1.0.0
@@ -120,7 +144,7 @@ module Mongoid
120
144
  check_scope_validity(value)
121
145
  check_scope_name(normalized)
122
146
  _declared_scopes[normalized] = {
123
- scope: strip_default_scope(value),
147
+ scope: value,
124
148
  extension: Module.new(&block)
125
149
  }
126
150
  define_scope_method(normalized)
@@ -279,7 +303,7 @@ module Mongoid
279
303
  #
280
304
  # @since 3.0.0
281
305
  def check_scope_validity(value)
282
- unless value.respond_to?(:to_proc)
306
+ unless value.respond_to?(:call)
283
307
  raise Errors::InvalidScope.new(self, value)
284
308
  end
285
309
  end
@@ -298,15 +322,15 @@ module Mongoid
298
322
  #
299
323
  # @since 3.0.0
300
324
  def define_scope_method(name)
301
- (class << self; self; end).class_eval <<-SCOPE, __FILE__, __LINE__ + 1
302
- def #{name}(*args)
303
- scoping = _declared_scopes[:#{name}]
325
+ singleton_class.class_eval do
326
+ define_method name do |*args|
327
+ scoping = _declared_scopes[name]
304
328
  scope, extension = scoping[:scope][*args], scoping[:extension]
305
- criteria = with_default_scope.merge(scope || all)
329
+ criteria = with_default_scope.merge(scope || queryable)
306
330
  criteria.extend(extension)
307
331
  criteria
308
332
  end
309
- SCOPE
333
+ end
310
334
  end
311
335
 
312
336
  # Process the default scope value. If one already exists, we merge the
@@ -327,30 +351,6 @@ module Mongoid
327
351
  value.to_proc
328
352
  end
329
353
  end
330
-
331
- # Strip the default scope from the provided value, if it is a criteria.
332
- # This is used by named scopes - they should not have the default scoping
333
- # applied to them.
334
- #
335
- # @api private
336
- #
337
- # @example Strip the default scope.
338
- # Model.strip_default_scope
339
- #
340
- # @param [ Proc, Criteria ] value The value to strip from.
341
- #
342
- # @return [ Proc ] The stripped criteria, as a proc.
343
- #
344
- # @since 3.0.0
345
- def strip_default_scope(value)
346
- if value.is_a?(Criteria)
347
- default = default_scoping.try(:call)
348
- value.remove_scoping(default)
349
- value.to_proc
350
- else
351
- value
352
- end
353
- end
354
354
  end
355
355
  end
356
356
  end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+
4
+ # Provides behaviour for generating the selector for a specific document.
5
+ #
6
+ # @since 4.0.0
7
+ module Selectable
8
+ extend ActiveSupport::Concern
9
+
10
+ # Get the atomic selector for the document. This is a hash in the simplest
11
+ # case { "_id" => id }, but can become more complex for embedded documents
12
+ # and documents that use a shard key.
13
+ #
14
+ # @example Get the document's atomic selector.
15
+ # document.atomic_selector
16
+ #
17
+ # @return [ Hash ] The document's selector.
18
+ #
19
+ # @since 1.0.0
20
+ def atomic_selector
21
+ @atomic_selector ||=
22
+ (embedded? ? embedded_atomic_selector : root_atomic_selector)
23
+ end
24
+
25
+ private
26
+
27
+ # Get the atomic selector for an embedded document.
28
+ #
29
+ # @api private
30
+ #
31
+ # @example Get the embedded atomic selector.
32
+ # document.embedded_atomic_selector
33
+ #
34
+ # @return [ Hash ] The embedded document selector.
35
+ #
36
+ # @since 4.0.0
37
+ def embedded_atomic_selector
38
+ if persisted? && _id_changed?
39
+ _parent.atomic_selector
40
+ else
41
+ _parent.atomic_selector.merge("#{atomic_path}._id" => _id)
42
+ end
43
+ end
44
+
45
+ # Get the atomic selector for a root document.
46
+ #
47
+ # @api private
48
+ #
49
+ # @example Get the root atomic selector.
50
+ # document.root_atomic_selector
51
+ #
52
+ # @return [ Hash ] The root document selector.
53
+ #
54
+ # @since 4.0.0
55
+ def root_atomic_selector
56
+ { "_id" => _id }.merge!(shard_key_selector)
57
+ end
58
+ end
59
+ end
@@ -3,9 +3,18 @@ module Mongoid
3
3
 
4
4
  # This module provides the extra behaviour for including relations in JSON
5
5
  # and XML serialization.
6
- module Serialization
6
+ #
7
+ # @since 4.0.0
8
+ module Serializable
7
9
  extend ActiveSupport::Concern
8
10
 
11
+ # We need to redefine where the JSON configuration is getting defined,
12
+ # similar to +ActiveRecord+.
13
+ included do
14
+ undef_method :include_root_in_json
15
+ delegate :include_root_in_json, to: ::Mongoid
16
+ end
17
+
9
18
  # Gets the document as a serializable hash, used by ActiveModel's JSON
10
19
  # serializer.
11
20
  #
@@ -93,7 +102,7 @@ module Mongoid
93
102
  attrs[name] = value ? value.serializable_hash(options) : nil
94
103
  elsif names.include?(name) && !fields.has_key?(name)
95
104
  attrs[name] = read_attribute(name)
96
- else
105
+ elsif !attribute_missing?(name)
97
106
  attrs[name] = send(name)
98
107
  end
99
108
  end
@@ -1,90 +1,18 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/sessions/factory"
3
3
  require "mongoid/sessions/validators"
4
+ require "mongoid/sessions/storage_options"
5
+ require "mongoid/sessions/thread_options"
6
+ require "mongoid/sessions/options"
4
7
 
5
8
  module Mongoid
6
9
  module Sessions
7
10
  extend ActiveSupport::Concern
8
-
9
- included do
10
- cattr_accessor :default_collection_name, :storage_options
11
- self.default_collection_name = self.name.collectionize.to_sym
12
- end
13
-
14
- # Get the collection for this model from the session. Will check for an
15
- # overridden collection name from the store_in macro or the collection
16
- # with a pluralized model name.
17
- #
18
- # @example Get the model's collection.
19
- # Model.collection
20
- #
21
- # @return [ Moped::Collection ] The collection.
22
- #
23
- # @since 3.0.0
24
- def collection
25
- self.class.collection
26
- end
27
-
28
- # Get the name of the collection this model persists to. This will be
29
- # either the pluralized class name or the option defined in the store_in
30
- # macro.
31
- #
32
- # @example Get the collection name.
33
- # Model.collection_name
34
- #
35
- # @return [ String ] The name of the collection.
36
- #
37
- # @since 3.0.0
38
- def collection_name
39
- self.class.collection_name
40
- end
41
-
42
- # Get the session for this model. This is determined in the following order:
43
- #
44
- # 1. Any custom configuration provided by the 'store_in' macro.
45
- # 2. The 'default' session as provided in the mongoid.yml
46
- #
47
- # @example Get the session.
48
- # model.mongo_session
49
- #
50
- # @return [ Moped::Session ] The default moped session.
51
- #
52
- # @since 3.0.0
53
- def mongo_session
54
- self.class.mongo_session
55
- end
56
-
57
- # Tell the next persistance operation to store in a specific collection,
58
- # database or session.
59
- #
60
- # @example Save the current document to a different collection.
61
- # model.with(collection: "secondary").save
62
- #
63
- # @example Save the current document to a different database.
64
- # model.with(database: "secondary").save
65
- #
66
- # @example Save the current document to a different session.
67
- # model.with(session: "replica_set").save
68
- #
69
- # @example Save with a combination of options.
70
- # model.with(session: "sharded", database: "secondary").save
71
- #
72
- # @param [ Hash ] options The storage options.
73
- #
74
- # @option options [ String, Symbol ] :collection The collection name.
75
- # @option options [ String, Symbol ] :database The database name.
76
- # @option options [ String, Symbol ] :session The session name.
77
- #
78
- # @return [ Document ] The current document.
79
- #
80
- # @since 3.0.0
81
- def with(options)
82
- Threaded.set_persistence_options(self.class, options)
83
- self
84
- end
11
+ include StorageOptions
12
+ include ThreadOptions
13
+ include Options
85
14
 
86
15
  class << self
87
-
88
16
  # Clear all sessions from the current thread.
89
17
  #
90
18
  # @example Clear all sessions.
@@ -138,79 +66,29 @@ module Mongoid
138
66
  end
139
67
  end
140
68
 
141
- module ClassMethods
142
-
143
- # Clear all persistence options from the current thread.
144
- #
145
- # @example Clear the persistence options.
146
- # Mongoid::Sessions.clear_persistence_options
147
- #
148
- # @return [ true ] True.
149
- #
150
- # @since 3.0.0
151
- def clear_persistence_options
152
- Threaded.clear_persistence_options(self)
153
- end
154
-
155
- # Get the collection for this model from the session. Will check for an
156
- # overridden collection name from the store_in macro or the collection
157
- # with a pluralized model name.
158
- #
159
- # @example Get the model's collection.
160
- # Model.collection
161
- #
162
- # @return [ Moped::Collection ] The collection.
163
- #
164
- # @since 3.0.0
165
- def collection
166
- if opts = persistence_options
167
- coll = mongo_session.with(opts)[opts[:collection] || collection_name]
168
- clear_persistence_options unless validating_with_query? || _loading_revision?
169
- coll
170
- else
171
- mongo_session[collection_name]
172
- end
173
- end
69
+ # Get the collection for this model from the session. Will check for an
70
+ # overridden collection name from the store_in macro or the collection
71
+ # with a pluralized model name.
72
+ #
73
+ # @example Get the model's collection.
74
+ # Model.collection
75
+ #
76
+ # @return [ Moped::Collection ] The collection.
77
+ #
78
+ # @since 3.0.0
79
+ def collection
80
+ mongo_session[collection_name]
81
+ end
174
82
 
175
- # Get the name of the collection this model persists to. This will be
176
- # either the pluralized class name or the option defined in the store_in
177
- # macro.
178
- #
179
- # @example Get the collection name.
180
- # Model.collection_name
181
- #
182
- # @return [ Symbol ] The name of the collection.
183
- #
184
- # @since 3.0.0
185
- def collection_name
186
- __collection_name__
187
- end
83
+ def mongo_session
84
+ super || self.class.mongo_session
85
+ end
188
86
 
189
- # Get the default database name for this model.
190
- #
191
- # @example Get the default database name.
192
- # Model.database_name
193
- #
194
- # @return [ Symbol ] The name of the database.
195
- #
196
- # @since 3.0.0
197
- def database_name
198
- __database_name__
199
- end
87
+ def collection_name
88
+ super || self.class.collection_name
89
+ end
200
90
 
201
- # Get the overridden database name. This either can be overridden by
202
- # using +Model.with+ or by overriding at the global level via
203
- # +Mongoid.override_database(:name)+.
204
- #
205
- # @example Get the overridden database name.
206
- # Model.database_override
207
- #
208
- # @return [ String, Symbol ] The overridden database name.
209
- #
210
- # @since 3.0.0
211
- def database_override
212
- persistence_options.try { |opts| opts[:database] } || Threaded.database_override
213
- end
91
+ module ClassMethods
214
92
 
215
93
  # Get the session for this model. This is determined in the following order:
216
94
  #
@@ -224,209 +102,23 @@ module Mongoid
224
102
  #
225
103
  # @since 3.0.0
226
104
  def mongo_session
227
- session = __session__
228
- session.use(database_override || current_database_name(session))
229
- session
105
+ session = Sessions.with_name(session_name)
106
+ session.use(database_name)
107
+ self.persistence_options ? session.with(self.persistence_options) : session
230
108
  end
231
109
 
232
- # Get the persistence options from the current thread.
233
- #
234
- # @example Get the persistence options.
235
- # Model.persistence_options
236
- #
237
- # @return [ Hash ] The persistence options.
238
- #
239
- # @since 3.0.0
240
- def persistence_options
241
- Threaded.persistence_options(self)
242
- end
243
-
244
- # Get the overridden session name. This either can be overridden by
245
- # using +Model.with+ or by overriding at the global level via
246
- # +Mongoid.override_session(:name)+.
247
- #
248
- # @example Get the overridden session name.
249
- # Model.session_override
250
- #
251
- # @return [ String, Symbol ] The overridden session name.
252
- #
253
- # @since 3.0.0
254
- def session_override
255
- persistence_options.try { |opts| opts[:session] } || Threaded.session_override
256
- end
257
-
258
- # Give this model specific custom default storage options.
259
- #
260
- # @example Store this model by default in "artists"
261
- # class Band
262
- # include Mongoid::Document
263
- # store_in collection: "artists"
264
- # end
265
- #
266
- # @example Store this model by default in the sharded db.
267
- # class Band
268
- # include Mongoid::Document
269
- # store_in database: "echo_shard"
270
- # end
271
- #
272
- # @example Store this model by default in a different session.
273
- # class Band
274
- # include Mongoid::Document
275
- # store_in session: "secondary"
276
- # end
277
- #
278
- # @example Store this model with a combination of options.
279
- # class Band
280
- # include Mongoid::Document
281
- # store_in collection: "artists", database: "secondary"
282
- # end
283
- #
284
- # @param [ Hash ] options The storage options.
285
- #
286
- # @option options [ String, Symbol ] :collection The collection name.
287
- # @option options [ String, Symbol ] :database The database name.
288
- # @option options [ String, Symbol ] :session The session name.
289
- #
290
- # @return [ Class ] The model class.
291
- #
292
- # @since 3.0.0
293
- def store_in(options)
294
- Validators::Storage.validate(self, options)
295
- self.storage_options ||= {}
296
- self.storage_options.merge!(options)
297
- end
298
-
299
- # Tell the next persistance operation to store in a specific collection,
300
- # database or session.
301
- #
302
- # @example Create a document in a different collection.
303
- # Model.with(collection: "secondary").create(name: "test")
304
- #
305
- # @example Create a document in a different database.
306
- # Model.with(database: "secondary").create(name: "test")
307
- #
308
- # @example Create a document in a different session.
309
- # Model.with(session: "secondary").create(name: "test")
310
- #
311
- # @example Create with a combination of options.
312
- # Model.with(session: "sharded", database: "secondary").create
313
- #
314
- # @param [ Hash ] options The storage options.
315
- #
316
- # @option options [ String, Symbol ] :collection The collection name.
317
- # @option options [ String, Symbol ] :database The database name.
318
- # @option options [ String, Symbol ] :session The session name.
319
- #
320
- # @return [ Class ] The model class.
321
- #
322
- # @since 3.0.0
323
- def with(options)
324
- Threaded.set_persistence_options(self, options)
325
- self
326
- end
327
-
328
- private
329
-
330
- # Get the name of the collection this model persists to.
331
- #
332
- # @example Get the collection name.
333
- # Model.__collection_name__
334
- #
335
- # @return [ Symbol ] The name of the collection.
336
- #
337
- # @since 3.0.0
338
- def __collection_name__
339
- if storage_options && name = storage_options[:collection]
340
- __evaluate__(name)
341
- else
342
- default_collection_name
343
- end
344
- end
345
-
346
- # Get the database name for the model.
347
- #
348
- # @example Get the database name.
349
- # Model.__database_name__
350
- #
351
- # @return [ Symbol ] The name of the database.
352
- #
353
- # @since 3.0.0
354
- def __database_name__
355
- if storage_options && name = storage_options[:database]
356
- __evaluate__(name)
357
- else
358
- Mongoid.sessions[__session_name__][:database]
359
- end
360
- end
361
-
362
- # Get the session name for the model.
363
- #
364
- # @example Get the session name.
365
- # Model.__session_name__
366
- #
367
- # @return [ Symbol ] The name of the session.
368
- #
369
- # @since 3.0.0
370
- def __session_name__
371
- if storage_options && name = storage_options[:session]
372
- __evaluate__(name)
373
- else
374
- :default
375
- end
376
- end
377
-
378
- # Get the session for this class.
110
+ # Get the collection for this model from the session. Will check for an
111
+ # overridden collection name from the store_in macro or the collection
112
+ # with a pluralized model name.
379
113
  #
380
- # @example Get the session.
381
- # Model.__session__
114
+ # @example Get the model's collection.
115
+ # Model.collection
382
116
  #
383
- # @return [ Moped::Session ] The moped session.
117
+ # @return [ Moped::Collection ] The collection.
384
118
  #
385
119
  # @since 3.0.0
386
- def __session__
387
- if !(name = session_override).nil?
388
- Sessions.with_name(name)
389
- else
390
- Sessions.with_name(__session_name__)
391
- end
392
- end
393
-
394
- # Eval the provided value, either byt calling it if it responds to call
395
- # or returning the value itself.
396
- #
397
- # @api private
398
- #
399
- # @example Evaluate the name.
400
- # Model.__evaluate__(:name)
401
- #
402
- # @param [ String, Symbol, Proc ] name The name.
403
- #
404
- # @return [ Symbol ] The value as a symbol.
405
- #
406
- # @since 3.1.0
407
- def __evaluate__(name)
408
- name.respond_to?(:call) ? name.call.to_sym : name.to_sym
409
- end
410
-
411
- # Get the name of the current database to use. Will check for a session
412
- # override with a database first, then database name.
413
- #
414
- # @api private
415
- #
416
- # @example Get the current database name.
417
- # Model.current_database_name
418
- #
419
- # @param [ Moped::Session ] session The current session.
420
- #
421
- # @return [ Symbol ] The current database name.
422
- #
423
- # @since 3.1.0
424
- def current_database_name(session)
425
- if session_override && name = session.options[:database]
426
- name
427
- else
428
- database_name
429
- end
120
+ def collection
121
+ mongo_session[collection_name]
430
122
  end
431
123
  end
432
124
  end