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
@@ -0,0 +1,163 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Eager::HasOne do
4
+
5
+ describe ".grouped_doc" do
6
+
7
+ let(:person) do
8
+ Person.create!
9
+ end
10
+
11
+ let(:docs) do
12
+ Person.all.to_a
13
+ end
14
+
15
+ let(:metadata) do
16
+ Person.reflect_on_association(:cat)
17
+ end
18
+
19
+ let(:eager) do
20
+ described_class.new([metadata], docs).tap do |b|
21
+ b.shift_metadata
22
+ end
23
+ end
24
+
25
+ before do
26
+ Cat.create!(person: person)
27
+ end
28
+
29
+ it "aggregates by the relation primary key" do
30
+ expect(eager.grouped_docs.keys).to eq([person.username])
31
+ end
32
+ end
33
+
34
+ describe ".set_on_parent" do
35
+
36
+ let(:person) do
37
+ Person.create!
38
+ end
39
+
40
+ let(:docs) do
41
+ Person.all.to_a
42
+ end
43
+
44
+ let(:metadata) do
45
+ Person.reflect_on_association(:cat)
46
+ end
47
+
48
+ let(:eager) do
49
+ described_class.new([metadata], docs).tap do |b|
50
+ b.shift_metadata
51
+ end
52
+ end
53
+
54
+ before do
55
+ Cat.create!(person: person)
56
+ eager
57
+ end
58
+
59
+ it "sets the relation into the parent" do
60
+ docs.each do |doc|
61
+ expect(doc).to receive(:set_relation).once.with(:cat, :foo)
62
+ end
63
+ eager.set_on_parent(person.username, :foo)
64
+ end
65
+
66
+ it "doesnt call an extra query" do
67
+ expect_query(0) do
68
+ eager.set_on_parent(person.username, :foo)
69
+ end
70
+ end
71
+ end
72
+
73
+ describe ".includes" do
74
+
75
+ let(:person) do
76
+ Person.create!
77
+ end
78
+
79
+ before do
80
+ 3.times { Cat.create!(person: person) }
81
+ Cat.create!(person: Person.create!)
82
+ end
83
+
84
+ context "when including the has_one relation" do
85
+
86
+ it "queries twice" do
87
+
88
+ expect_query(2) do
89
+
90
+ Person.all.includes(:cat).each do |person|
91
+ expect(person.cat).to_not be_nil
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ context "when including more than one has_one relation" do
98
+
99
+ it "queries 3 times" do
100
+
101
+ expect_query(3) do
102
+
103
+ Person.all.includes(:cat, :account).each do |person|
104
+ expect(person.cat).to_not be_nil
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ context "when the relation is not polymorphic" do
111
+
112
+ let!(:game) do
113
+ person.create_game(name: "Tron")
114
+ end
115
+
116
+ let!(:eager) do
117
+ Person.where(_id: person.id).includes(:game).first
118
+ end
119
+
120
+ it "puts the documents in the parent document" do
121
+ expect(eager.ivar(:game)).to eq(game)
122
+ end
123
+
124
+ it "does not query when touching the association" do
125
+ expect_query(0) do
126
+ expect(eager.game).to eq(game)
127
+ end
128
+ end
129
+
130
+ it "does not query when updating the association" do
131
+ expect_query(0) do
132
+ eager.game.name = "Revenge of Racing of Magic"
133
+ expect(eager.game.name).to eq("Revenge of Racing of Magic")
134
+ end
135
+ end
136
+ end
137
+
138
+ context "when the relation is polymorphic" do
139
+
140
+ let!(:book) do
141
+ Book.create(name: "Game of Thrones")
142
+ end
143
+
144
+ let!(:rating) do
145
+ book.create_rating(value: 10)
146
+ end
147
+
148
+ let!(:eager) do
149
+ Book.all.includes(:rating).first
150
+ end
151
+
152
+ it "puts the found documents in the parent document" do
153
+ expect(eager.ivar(:rating)).to eq(rating)
154
+ end
155
+
156
+ it "does not query when touching the association" do
157
+ expect_query(0) do
158
+ expect(eager.rating).to eq(rating)
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,228 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Eager do
4
+
5
+ describe ".preload" do
6
+
7
+ let(:criteria) do
8
+ Account.where(name: 'savings')
9
+ end
10
+
11
+ let(:context) do
12
+ Mongoid::Contextual::Mongo.new(criteria)
13
+ end
14
+
15
+ let(:inclusions) do
16
+ includes.map do |key|
17
+ Account.reflect_on_association(key)
18
+ end
19
+ end
20
+
21
+ let(:doc) { criteria.first }
22
+
23
+ context "when belongs_to" do
24
+
25
+ let!(:account) do
26
+ Account.create!(person: person, name: 'savings')
27
+ end
28
+
29
+ let(:person) do
30
+ Person.create!
31
+ end
32
+
33
+ let(:includes) { [:person] }
34
+
35
+ it "groups by foreign_key" do
36
+ expect(doc).to receive(:person_id).once
37
+ context.preload(inclusions, [doc])
38
+ end
39
+
40
+ it "preloads the parent" do
41
+ expect(doc.ivar(:person)).to be false
42
+ context.preload(inclusions, [doc])
43
+ expect(doc.ivar(:person)).to eq(doc.person)
44
+ end
45
+ end
46
+
47
+ context "when has_one" do
48
+
49
+ let(:account) do
50
+ Account.create!(name: 'savings')
51
+ end
52
+
53
+ let!(:comment) do
54
+ Comment.create!(title: 'my account comment', account: account)
55
+ end
56
+
57
+ let(:includes) { [:comment] }
58
+
59
+ it "preloads the child" do
60
+ expect(doc.ivar(:comment)).to be false
61
+ context.preload(inclusions, [doc])
62
+ expect(doc.ivar(:comment)).to eq(doc.comment)
63
+ end
64
+ end
65
+
66
+ context "when has_many" do
67
+
68
+ let(:account) do
69
+ Account.create!(name: 'savings')
70
+ end
71
+
72
+ let!(:alert) do
73
+ Alert.create!(account: account)
74
+ end
75
+
76
+ let(:includes) { [:alerts] }
77
+
78
+ it "preloads the child" do
79
+ expect(doc.ivar(:alerts)).to be false
80
+ context.preload(inclusions, [doc])
81
+ expect(doc.ivar(:alerts)).to eq(doc.alerts)
82
+ end
83
+ end
84
+
85
+ context "when has_and_belongs_to_many" do
86
+
87
+ let(:account) do
88
+ Account.create!(name: 'savings')
89
+ end
90
+
91
+ let!(:agent) do
92
+ Agent.create!(accounts: [account])
93
+ end
94
+
95
+ let(:includes) { [:agents] }
96
+
97
+ it "preloads the child" do
98
+ expect(doc.ivar(:agents)).to be false
99
+ context.preload(inclusions, [doc])
100
+ expect(doc.ivar(:agents)).to eq(doc.agents)
101
+ end
102
+ end
103
+ end
104
+
105
+ describe ".eager_load" do
106
+
107
+ before do
108
+ Person.create!
109
+ end
110
+
111
+ let(:context) do
112
+ Mongoid::Contextual::Mongo.new(criteria)
113
+ end
114
+
115
+ context "when including one has_many relation" do
116
+
117
+ let(:criteria) do
118
+ Person.includes(:posts)
119
+ end
120
+
121
+ let(:docs) do
122
+ Person.all.to_a
123
+ end
124
+
125
+ let(:posts_metadata) do
126
+ Person.reflect_on_association(:posts)
127
+ end
128
+
129
+ it "runs the has_many preload" do
130
+ expect(Mongoid::Relations::Eager::HasMany).to receive(:new).with([posts_metadata], docs).once.and_call_original
131
+
132
+ context.eager_load(docs)
133
+ end
134
+ end
135
+
136
+ context "when including multiple relations" do
137
+
138
+ let(:criteria) do
139
+ Person.includes(:posts, :houses, :cat)
140
+ end
141
+
142
+ let(:docs) do
143
+ Person.all.to_a
144
+ end
145
+
146
+ let(:posts_metadata) do
147
+ Person.reflect_on_association(:posts)
148
+ end
149
+
150
+ let(:houses_metadata) do
151
+ Person.reflect_on_association(:houses)
152
+ end
153
+
154
+ let(:cat_metadata) do
155
+ Person.reflect_on_association(:cat)
156
+ end
157
+
158
+ it "runs the has_many preload" do
159
+ expect(Mongoid::Relations::Eager::HasMany).to receive(:new).with([posts_metadata], docs).once.and_call_original
160
+
161
+ context.eager_load(docs)
162
+ end
163
+
164
+ it "runs the has_one preload" do
165
+ expect(Mongoid::Relations::Eager::HasOne).to receive(:new).with([cat_metadata], docs).once.and_call_original
166
+ context.eager_load(docs)
167
+ end
168
+
169
+ it "runs the has_and_belongs_to_many preload" do
170
+ expect(Mongoid::Relations::Eager::HasAndBelongsToMany).to receive(:new).with([houses_metadata], docs).once.and_call_original
171
+ context.eager_load(docs)
172
+ end
173
+ end
174
+
175
+ context "when including two of the same relation type" do
176
+
177
+ let(:criteria) do
178
+ Person.includes(:book, :cat)
179
+ end
180
+
181
+ let(:docs) do
182
+ Person.all.to_a
183
+ end
184
+
185
+ let(:book_metadata) do
186
+ Person.reflect_on_association(:book)
187
+ end
188
+
189
+ let(:cat_metadata) do
190
+ Person.reflect_on_association(:cat)
191
+ end
192
+
193
+ it "runs the has_one preload" do
194
+ expect(Mongoid::Relations::Eager::HasOne).to receive(:new).with([book_metadata, cat_metadata], docs).once.and_call_original
195
+ context.eager_load(docs)
196
+ end
197
+ end
198
+ end
199
+
200
+ describe ".eager_loadable?" do
201
+
202
+ let(:context) do
203
+ Mongoid::Contextual::Mongo.new(criteria)
204
+ end
205
+
206
+ context "when criteria has multiple includes" do
207
+
208
+ let(:criteria) do
209
+ Post.includes(:person, :roles)
210
+ end
211
+
212
+ it "is eager_loadable" do
213
+ expect(context.eager_loadable?).to be true
214
+ end
215
+ end
216
+
217
+ context "when criteria has no includes" do
218
+
219
+ let(:criteria) do
220
+ Post.all
221
+ end
222
+
223
+ it "is not eager_loadable" do
224
+ expect(context.eager_loadable?).to be false
225
+ end
226
+ end
227
+ end
228
+ end
@@ -7,11 +7,11 @@ describe "when initialize a model with an embedded model" do
7
7
  end
8
8
 
9
9
  it "has changes in the embedded model" do
10
- person.pet.changes.should_not be_empty
10
+ expect(person.pet.changes).to_not be_empty
11
11
  end
12
12
 
13
13
  it "does not have previous_changes in the embedded model" do
14
- person.pet.previous_changes.should be_empty
14
+ expect(person.pet.previous_changes).to be_empty
15
15
  end
16
16
  end
17
17
 
@@ -22,11 +22,11 @@ describe "when creating a model with an embedded model" do
22
22
  end
23
23
 
24
24
  it "does not have changes in the embedded model" do
25
- person.pet.changes.should be_empty
25
+ expect(person.pet.changes).to be_empty
26
26
  end
27
27
 
28
28
  it "has previous_changes in the embedded model" do
29
- person.pet.previous_changes.should_not be_empty
29
+ expect(person.pet.previous_changes).to_not be_empty
30
30
  end
31
31
  end
32
32
 
@@ -41,11 +41,11 @@ describe "when embedding a model on an already saved model" do
41
41
  end
42
42
 
43
43
  it "has not changes on the embedded model" do
44
- person.pet.changes.should be_empty
44
+ expect(person.pet.changes).to be_empty
45
45
  end
46
46
 
47
47
  it "has previous changes on the embedded model" do
48
- person.pet.previous_changes.should_not be_empty
48
+ expect(person.pet.previous_changes).to_not be_empty
49
49
  end
50
50
 
51
51
  describe "and saving the model" do
@@ -55,11 +55,11 @@ describe "when embedding a model on an already saved model" do
55
55
  end
56
56
 
57
57
  it "does not have changes on the embedded model" do
58
- person.pet.changes.should be_empty
58
+ expect(person.pet.changes).to be_empty
59
59
  end
60
60
 
61
61
  it "does not have previous changes on the embedded model" do
62
- person.pet.previous_changes.should be_empty
62
+ expect(person.pet.previous_changes).to be_empty
63
63
  end
64
64
  end
65
65
  end
@@ -25,14 +25,14 @@ describe Mongoid::Relations::Embedded::In do
25
25
  context "when the document is a different instance" do
26
26
 
27
27
  it "returns false" do
28
- (relation === Person.new).should be_false
28
+ expect((relation === Person.new)).to be false
29
29
  end
30
30
  end
31
31
 
32
32
  context "when the document is the same instance" do
33
33
 
34
34
  it "returns true" do
35
- (relation === target).should be_true
35
+ expect((relation === target)).to be true
36
36
  end
37
37
  end
38
38
  end
@@ -57,19 +57,19 @@ describe Mongoid::Relations::Embedded::In do
57
57
  end
58
58
 
59
59
  it "sets the target of the relation" do
60
- name.namable.should eq(person)
60
+ expect(name.namable).to eq(person)
61
61
  end
62
62
 
63
63
  it "sets the base on the inverse relation" do
64
- person.name.should eq(name)
64
+ expect(person.name).to eq(name)
65
65
  end
66
66
 
67
67
  it "sets the same instance on the inverse relation" do
68
- person.name.should eql(name)
68
+ expect(person.name).to eql(name)
69
69
  end
70
70
 
71
71
  it "does not save the target" do
72
- person.should_not be_persisted
72
+ expect(person).to_not be_persisted
73
73
  end
74
74
  end
75
75
 
@@ -88,19 +88,19 @@ describe Mongoid::Relations::Embedded::In do
88
88
  end
89
89
 
90
90
  it "sets the target of the relation" do
91
- name.namable.should eq(person)
91
+ expect(name.namable).to eq(person)
92
92
  end
93
93
 
94
94
  it "sets the base on the inverse relation" do
95
- person.name.should eq(name)
95
+ expect(person.name).to eq(name)
96
96
  end
97
97
 
98
98
  it "sets the same instance on the inverse relation" do
99
- person.name.should eql(name)
99
+ expect(person.name).to eql(name)
100
100
  end
101
101
 
102
102
  it "does not save the base" do
103
- name.should_not be_persisted
103
+ expect(name).to_not be_persisted
104
104
  end
105
105
  end
106
106
  end
@@ -122,19 +122,19 @@ describe Mongoid::Relations::Embedded::In do
122
122
  end
123
123
 
124
124
  it "sets the target of the relation" do
125
- address.addressable.should eq(person)
125
+ expect(address.addressable).to eq(person)
126
126
  end
127
127
 
128
128
  it "appends the base on the inverse relation" do
129
- person.addresses.should eq([ address ])
129
+ expect(person.addresses).to eq([ address ])
130
130
  end
131
131
 
132
132
  it "sets the same instance in the inverse relation" do
133
- person.addresses.first.should eql(address)
133
+ expect(person.addresses.first).to eql(address)
134
134
  end
135
135
 
136
136
  it "does not save the target" do
137
- person.should_not be_persisted
137
+ expect(person).to_not be_persisted
138
138
  end
139
139
  end
140
140
 
@@ -153,15 +153,15 @@ describe Mongoid::Relations::Embedded::In do
153
153
  end
154
154
 
155
155
  it "sets the target of the relation" do
156
- address.addressable.should eq(person)
156
+ expect(address.addressable).to eq(person)
157
157
  end
158
158
 
159
159
  it "sets the same instance in the inverse relation" do
160
- person.addresses.first.should eql(address)
160
+ expect(person.addresses.first).to eql(address)
161
161
  end
162
162
 
163
163
  it "appends the base on the inverse relation" do
164
- person.addresses.should eq([ address ])
164
+ expect(person.addresses).to eq([ address ])
165
165
  end
166
166
  end
167
167
  end
@@ -187,11 +187,11 @@ describe Mongoid::Relations::Embedded::In do
187
187
  end
188
188
 
189
189
  it "sets the relation to nil" do
190
- name.namable.should be_nil
190
+ expect(name.namable).to be_nil
191
191
  end
192
192
 
193
193
  it "removes the inverse relation" do
194
- person.name.should be_nil
194
+ expect(person.name).to be_nil
195
195
  end
196
196
  end
197
197
 
@@ -210,11 +210,11 @@ describe Mongoid::Relations::Embedded::In do
210
210
  end
211
211
 
212
212
  it "sets the relation to nil" do
213
- name.namable.should be_nil
213
+ expect(name.namable).to be_nil
214
214
  end
215
215
 
216
216
  it "removes the inverse relation" do
217
- person.name.should be_nil
217
+ expect(person.name).to be_nil
218
218
  end
219
219
  end
220
220
 
@@ -234,15 +234,15 @@ describe Mongoid::Relations::Embedded::In do
234
234
  end
235
235
 
236
236
  it "sets the relation to nil" do
237
- name.namable.should be_nil
237
+ expect(name.namable).to be_nil
238
238
  end
239
239
 
240
240
  it "removed the inverse relation" do
241
- person.name.should be_nil
241
+ expect(person.name).to be_nil
242
242
  end
243
243
 
244
244
  it "deletes the child document" do
245
- name.should be_destroyed
245
+ expect(name).to be_destroyed
246
246
  end
247
247
  end
248
248
  end
@@ -265,11 +265,11 @@ describe Mongoid::Relations::Embedded::In do
265
265
  end
266
266
 
267
267
  it "sets the relation to nil" do
268
- address.addressable.should be_nil
268
+ expect(address.addressable).to be_nil
269
269
  end
270
270
 
271
271
  it "removes the inverse relation" do
272
- person.addresses.should be_empty
272
+ expect(person.addresses).to be_empty
273
273
  end
274
274
  end
275
275
 
@@ -284,7 +284,7 @@ describe Mongoid::Relations::Embedded::In do
284
284
  end
285
285
 
286
286
  it "sets the relation to nil" do
287
- address.addressable.should be_nil
287
+ expect(address.addressable).to be_nil
288
288
  end
289
289
  end
290
290
 
@@ -304,15 +304,15 @@ describe Mongoid::Relations::Embedded::In do
304
304
  end
305
305
 
306
306
  it "sets the relation to nil" do
307
- address.addressable.should be_nil
307
+ expect(address.addressable).to be_nil
308
308
  end
309
309
 
310
310
  it "removed the inverse relation" do
311
- person.addresses.should be_empty
311
+ expect(person.addresses).to be_empty
312
312
  end
313
313
 
314
314
  it "deletes the child document" do
315
- address.should be_destroyed
315
+ expect(address).to be_destroyed
316
316
  end
317
317
  end
318
318
 
@@ -336,19 +336,19 @@ describe Mongoid::Relations::Embedded::In do
336
336
  end
337
337
 
338
338
  it "sets the relation to nil" do
339
- address_one.addressable.should be_nil
339
+ expect(address_one.addressable).to be_nil
340
340
  end
341
341
 
342
342
  it "removed the inverse relation" do
343
- person.addresses.should eq([ address_two ])
343
+ expect(person.addresses).to eq([ address_two ])
344
344
  end
345
345
 
346
346
  it "deletes the child document" do
347
- address_one.should be_destroyed
347
+ expect(address_one).to be_destroyed
348
348
  end
349
349
 
350
350
  it "reindexes the children" do
351
- address_two._index.should eq(0)
351
+ expect(address_two._index).to eq(0)
352
352
  end
353
353
  end
354
354
  end
@@ -373,28 +373,28 @@ describe Mongoid::Relations::Embedded::In do
373
373
  end
374
374
 
375
375
  it "returns the embedded one builder" do
376
- described_class.builder(base, metadata, target).should be_a(builder_klass)
376
+ expect(described_class.builder(base, metadata, target)).to be_a(builder_klass)
377
377
  end
378
378
  end
379
379
 
380
380
  describe ".embedded?" do
381
381
 
382
382
  it "returns true" do
383
- described_class.should be_embedded
383
+ expect(described_class).to be_embedded
384
384
  end
385
385
  end
386
386
 
387
387
  describe ".foreign_key_suffix" do
388
388
 
389
389
  it "returns nil" do
390
- described_class.foreign_key_suffix.should be_nil
390
+ expect(described_class.foreign_key_suffix).to be_nil
391
391
  end
392
392
  end
393
393
 
394
394
  describe ".macro" do
395
395
 
396
396
  it "returns embeds_one" do
397
- described_class.macro.should eq(:embedded_in)
397
+ expect(described_class.macro).to eq(:embedded_in)
398
398
  end
399
399
  end
400
400
 
@@ -413,8 +413,7 @@ describe Mongoid::Relations::Embedded::In do
413
413
  end
414
414
 
415
415
  it "returns the single nested builder" do
416
- described_class.nested_builder(metadata, attributes, {}).should
417
- be_a(nested_builder_klass)
416
+ expect(described_class.nested_builder(metadata, attributes, {})).to be_a(nested_builder_klass)
418
417
  end
419
418
  end
420
419
 
@@ -437,7 +436,7 @@ describe Mongoid::Relations::Embedded::In do
437
436
  context "when checking #{method}" do
438
437
 
439
438
  it "returns true" do
440
- document.respond_to?(method).should be_true
439
+ expect(document.respond_to?(method)).to be true
441
440
  end
442
441
  end
443
442
  end
@@ -446,8 +445,8 @@ describe Mongoid::Relations::Embedded::In do
446
445
  describe ".valid_options" do
447
446
 
448
447
  it "returns the valid options" do
449
- described_class.valid_options.should eq(
450
- [ :autobuild, :cyclic, :polymorphic ]
448
+ expect(described_class.valid_options).to eq(
449
+ [ :autobuild, :cyclic, :polymorphic, :touch ]
451
450
  )
452
451
  end
453
452
  end
@@ -455,7 +454,7 @@ describe Mongoid::Relations::Embedded::In do
455
454
  describe ".validation_default" do
456
455
 
457
456
  it "returns false" do
458
- described_class.validation_default.should be_false
457
+ expect(described_class.validation_default).to be false
459
458
  end
460
459
  end
461
460
 
@@ -478,23 +477,23 @@ describe Mongoid::Relations::Embedded::In do
478
477
  end
479
478
 
480
479
  it "saves the child" do
481
- Person.last.addresses.last.should eq(address)
480
+ expect(Person.last.addresses.last).to eq(address)
482
481
  end
483
482
 
484
483
  it "indexes the child" do
485
- address._index.should eq(0)
484
+ expect(address._index).to eq(0)
486
485
  end
487
486
 
488
487
  it "saves the first location with the correct index" do
489
- first_location._index.should eq(0)
488
+ expect(first_location._index).to eq(0)
490
489
  end
491
490
 
492
491
  it "saves the second location with the correct index" do
493
- second_location._index.should eq(1)
492
+ expect(second_location._index).to eq(1)
494
493
  end
495
494
 
496
495
  it "has the locations in the association array" do
497
- Person.last.addresses.last.locations.should eq(
496
+ expect(Person.last.addresses.last.locations).to eq(
498
497
  [first_location, second_location]
499
498
  )
500
499
  end
@@ -515,11 +514,11 @@ describe Mongoid::Relations::Embedded::In do
515
514
  end
516
515
 
517
516
  it "does not save the child" do
518
- address.should_not be_persisted
517
+ expect(address).to_not be_persisted
519
518
  end
520
519
 
521
520
  it "does not save the deeply embedded children" do
522
- address.locations.first.should_not be_persisted
521
+ expect(address.locations.first).to_not be_persisted
523
522
  end
524
523
  end
525
524
 
@@ -547,15 +546,15 @@ describe Mongoid::Relations::Embedded::In do
547
546
  end
548
547
 
549
548
  it "sets the new parent" do
550
- name.namable.should eq(person)
549
+ expect(name.namable).to eq(person)
551
550
  end
552
551
 
553
552
  it "removes the previous parent relation" do
554
- person_two.name.should be_nil
553
+ expect(person_two.name).to be_nil
555
554
  end
556
555
 
557
556
  it "sets the new child relation" do
558
- person.name.should eq(name)
557
+ expect(person.name).to eq(name)
559
558
  end
560
559
 
561
560
  context "when reloading" do
@@ -565,15 +564,15 @@ describe Mongoid::Relations::Embedded::In do
565
564
  end
566
565
 
567
566
  it "sets the new parent" do
568
- name.namable.should eq(person)
567
+ expect(name.namable).to eq(person)
569
568
  end
570
569
 
571
570
  it "removes the previous parent relation" do
572
- person_two.name.should be_nil
571
+ expect(person_two.name).to be_nil
573
572
  end
574
573
 
575
574
  it "sets the new child relation" do
576
- person.name.should eq(name)
575
+ expect(person.name).to eq(name)
577
576
  end
578
577
  end
579
578
  end