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
@@ -7,20 +7,11 @@ require "rails/mongoid"
7
7
 
8
8
  module Rails
9
9
  module Mongoid
10
- class Railtie < Rails::Railtie
11
10
 
12
- # Determine which generator to use. app_generators was introduced after
13
- # 3.0.0.
14
- #
15
- # @example Get the generators method.
16
- # railtie.generators
17
- #
18
- # @return [ Symbol ] The method name to use.
19
- #
20
- # @since 2.0.0.rc.4
21
- def self.generator
22
- config.respond_to?(:app_generators) ? :app_generators : :generators
23
- end
11
+ # Hooks Mongoid into Rails 3 and higher.
12
+ #
13
+ # @since 2.0.0
14
+ class Railtie < Rails::Railtie
24
15
 
25
16
  # Mapping of rescued exceptions to HTTP responses
26
17
  #
@@ -37,7 +28,7 @@ module Rails
37
28
  }
38
29
  end
39
30
 
40
- config.send(generator).orm :mongoid, migration: false
31
+ config.app_generators.orm :mongoid, migration: false
41
32
 
42
33
  if config.action_dispatch.rescue_responses
43
34
  config.action_dispatch.rescue_responses.merge!(rescue_responses)
@@ -56,11 +47,15 @@ module Rails
56
47
  # config.mongoid.persist_in_safe_mode = true
57
48
  # end
58
49
  # end
50
+ #
51
+ # @since 2.0.0
59
52
  config.mongoid = ::Mongoid::Config
60
53
 
61
54
  # Initialize Mongoid. This will look for a mongoid.yml in the config
62
55
  # directory and configure mongoid appropriately.
63
- initializer "setup database" do
56
+ #
57
+ # @since 2.0.0
58
+ initializer "mongoid.load-config" do
64
59
  config_file = Rails.root.join("config", "mongoid.yml")
65
60
  if config_file.file?
66
61
  begin
@@ -79,64 +74,41 @@ module Rails
79
74
 
80
75
  # Set the proper error types for Rails. DocumentNotFound errors should be
81
76
  # 404s and not 500s, validation errors are 422s.
82
- initializer "load http errors" do |app|
83
- config.after_initialize do
84
- unless config.action_dispatch.rescue_responses
85
- ActionDispatch::ShowExceptions.rescue_responses.update(Railtie.rescue_responses)
86
- end
77
+ #
78
+ # @since 2.0.0
79
+ config.after_initialize do
80
+ unless config.action_dispatch.rescue_responses
81
+ ActionDispatch::ShowExceptions.rescue_responses.update(Railtie.rescue_responses)
87
82
  end
88
83
  end
89
84
 
90
85
  # Due to all models not getting loaded and messing up inheritance queries
91
86
  # and indexing, we need to preload the models in order to address this.
92
87
  #
93
- # This will happen every request in development, once in ther other
88
+ # This will happen for every request in development, once in other
94
89
  # environments.
95
- initializer "preload all application models" do |app|
90
+ #
91
+ # @since 2.0.0
92
+ initializer "mongoid.preload-models" do |app|
96
93
  config.to_prepare do
97
- if $rails_rake_task
98
- # We previously got rid of this, however in the case where
99
- # threadsafe! is enabled we must load all models so things like
100
- # creating indexes works properly.
101
- ::Rails::Mongoid.load_models(app)
102
- else
103
- ::Rails::Mongoid.preload_models(app)
104
- end
94
+ ::Rails::Mongoid.preload_models(app)
105
95
  end
106
96
  end
107
97
 
108
- # Need to include the Mongoid identity map middleware.
109
- initializer "include the identity map" do |app|
110
- app.config.middleware.use "Rack::Mongoid::Middleware::IdentityMap"
111
- end
112
-
113
- # Instantitate any registered observers after Rails initialization and
114
- # instantiate them after being reloaded in the development environment
115
- initializer "instantiate observers" do
116
- config.after_initialize do
117
- ::Mongoid::instantiate_observers
118
- ActionDispatch::Reloader.to_prepare do
119
- ::Mongoid.instantiate_observers
120
- end
98
+ config.after_initialize do
99
+ # Unicorn clears the START_CTX when a worker is forked, so if we have
100
+ # data in START_CTX then we know we're being preloaded. Unicorn does
101
+ # not provide application-level hooks for executing code after the
102
+ # process has forked, so we reconnect lazily.
103
+ if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
104
+ ::Mongoid.default_session.disconnect if ::Mongoid.configured?
121
105
  end
122
- end
123
-
124
- initializer "reconnect to master if application is preloaded" do
125
- config.after_initialize do
126
- # Unicorn clears the START_CTX when a worker is forked, so if we have
127
- # data in START_CTX then we know we're being preloaded. Unicorn does
128
- # not provide application-level hooks for executing code after the
129
- # process has forked, so we reconnect lazily.
130
- if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
131
- ::Mongoid.default_session.disconnect if ::Mongoid.configured?
132
- end
133
106
 
134
- # Passenger provides the :starting_worker_process event for executing
135
- # code after it has forked, so we use that and reconnect immediately.
136
- if ::Mongoid.running_with_passenger?
137
- PhusionPassenger.on_event(:starting_worker_process) do |forked|
138
- ::Mongoid.default_session.disconnect if forked
139
- end
107
+ # Passenger provides the :starting_worker_process event for executing
108
+ # code after it has forked, so we use that and reconnect immediately.
109
+ if ::Mongoid::Config.running_with_passenger?
110
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
111
+ ::Mongoid.default_session.disconnect if forked
140
112
  end
141
113
  end
142
114
  end
@@ -145,6 +117,8 @@ module Rails
145
117
  # code, so we have no way in the intitializer to know if we are
146
118
  # generating a mongoid.yml. So instead of failing, we catch all the
147
119
  # errors and print them out.
120
+ #
121
+ # @since 3.0.0
148
122
  def handle_configuration_error(e)
149
123
  puts "There is a configuration error with the current mongoid.yml."
150
124
  puts e.message
@@ -1,3 +1,5 @@
1
+ load 'mongoid/tasks/database.rake'
2
+
1
3
  namespace :db do
2
4
 
3
5
  unless Rake::Task.task_defined?("db:drop")
@@ -21,12 +23,12 @@ namespace :db do
21
23
 
22
24
  unless Rake::Task.task_defined?("db:setup")
23
25
  desc "Create the database, and initialize with the seed data"
24
- task :setup => [ "db:create", "db:mongoid:create_indexes", "db:seed" ]
26
+ task :setup => [ "db:create", "mongoid:create_indexes", "db:seed" ]
25
27
  end
26
28
 
27
- unless Rake::Task.task_defined?("db:reseed")
28
- desc "Delete data and seed"
29
- task :reseed => [ "db:drop", "db:seed" ]
29
+ unless Rake::Task.task_defined?("db:reset")
30
+ desc "Delete data and loads the seeds"
31
+ task :reset => [ "db:drop", "db:seed" ]
30
32
  end
31
33
 
32
34
  unless Rake::Task.task_defined?("db:create")
@@ -51,9 +53,7 @@ namespace :db do
51
53
 
52
54
  unless Rake::Task.task_defined?("db:test:prepare")
53
55
  namespace :test do
54
- task :prepare do
55
- # noop
56
- end
56
+ task :prepare => "mongoid:create_indexes"
57
57
  end
58
58
  end
59
59
 
@@ -66,24 +66,8 @@ namespace :db do
66
66
  end
67
67
 
68
68
  namespace :mongoid do
69
- desc "Create the indexes defined on your mongoid models"
70
- task :create_indexes => :environment do
71
- ::Rails::Mongoid.create_indexes
72
- end
73
-
74
- desc "Remove the indexes defined on your mongoid models without questions!"
75
- task :remove_indexes => :environment do
76
- ::Rails::Mongoid.remove_indexes
77
- end
78
-
79
- desc "Drops the database for the current Rails.env"
80
- task :drop => :environment do
81
- ::Mongoid::Sessions.default.drop
82
- end
83
-
84
- desc "Drop all collections except the system collections"
85
- task :purge => :environment do
86
- ::Mongoid.purge!
69
+ task :load_models do
70
+ ::Rails.application.eager_load! if defined?(Rails)
87
71
  end
88
72
  end
89
73
  end
@@ -46,7 +46,8 @@ module Mongoid
46
46
  include Touchable
47
47
  include CounterCache
48
48
 
49
- attr_accessor :metadata
49
+ attr_accessor :__metadata
50
+ alias :relation_metadata :__metadata
50
51
 
51
52
  # Determine if the document itself is embedded in another document via the
52
53
  # proper channels. (If it has a parent document.)
@@ -70,7 +71,7 @@ module Mongoid
70
71
  #
71
72
  # @since 2.0.0.rc.1
72
73
  def embedded_many?
73
- metadata && metadata.macro == :embeds_many
74
+ __metadata && __metadata.macro == :embeds_many
74
75
  end
75
76
 
76
77
  # Determine if the document is part of an embeds_one relation.
@@ -82,7 +83,7 @@ module Mongoid
82
83
  #
83
84
  # @since 2.0.0.rc.1
84
85
  def embedded_one?
85
- metadata && metadata.macro == :embeds_one
86
+ __metadata && __metadata.macro == :embeds_one
86
87
  end
87
88
 
88
89
  # Get the metadata name for this document. If no metadata was defined
@@ -97,8 +98,8 @@ module Mongoid
97
98
  #
98
99
  # @since 3.0.0
99
100
  def metadata_name
100
- raise Errors::NoMetadata.new(self.class.name) unless metadata
101
- metadata.name
101
+ raise Errors::NoMetadata.new(self.class.name) unless __metadata
102
+ __metadata.name
102
103
  end
103
104
 
104
105
  # Determine if the document is part of an references_many relation.
@@ -110,7 +111,7 @@ module Mongoid
110
111
  #
111
112
  # @since 2.0.0.rc.1
112
113
  def referenced_many?
113
- metadata && metadata.macro == :has_many
114
+ __metadata && __metadata.macro == :has_many
114
115
  end
115
116
 
116
117
  # Determine if the document is part of an references_one relation.
@@ -122,7 +123,7 @@ module Mongoid
122
123
  #
123
124
  # @since 2.0.0.rc.1
124
125
  def referenced_one?
125
- metadata && metadata.macro == :has_one
126
+ __metadata && __metadata.macro == :has_one
126
127
  end
127
128
 
128
129
  # Convenience method for iterating through the loaded relations and
@@ -136,27 +137,12 @@ module Mongoid
136
137
  # @since 2.1.6
137
138
  def reload_relations
138
139
  relations.each_pair do |name, meta|
139
- if instance_variable_defined?("@#{name}")
140
- if _parent.nil? || instance_variable_get("@#{name}") != _parent
141
- remove_instance_variable("@#{name}")
140
+ if instance_variable_defined?("@_#{name}")
141
+ if _parent.nil? || instance_variable_get("@_#{name}") != _parent
142
+ remove_instance_variable("@_#{name}")
142
143
  end
143
144
  end
144
145
  end
145
146
  end
146
-
147
- module ClassMethods
148
-
149
- # This is convenience for librarys still on the old API.
150
- #
151
- # @example Get the associations.
152
- # Person.associations
153
- #
154
- # @return [ Hash ] The relations.
155
- #
156
- # @since 2.3.1
157
- def associations
158
- self.relations
159
- end
160
- end
161
147
  end
162
148
  end
@@ -12,10 +12,10 @@ module Mongoid
12
12
  # document is nil, then sets the relation on this document.
13
13
  #
14
14
  # @example Build the relation.
15
- # person.__build__(:addresses, { :id => 1 }, metadata)
15
+ # person.__build__(:addresses, { :_id => 1 }, metadata)
16
16
  #
17
17
  # @param [ String, Symbol ] name The name of the relation.
18
- # @param [ Hash, Moped::BSON::ObjectId ] object The id or attributes to use.
18
+ # @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
19
19
  # @param [ Metadata ] metadata The relation's metadata.
20
20
  # @param [ true, false ] building If we are in a build operation.
21
21
  #
@@ -44,20 +44,6 @@ module Mongoid
44
44
  target ? metadata.relation.new(self, target, metadata) : nil
45
45
  end
46
46
 
47
- # Determines if the relation exists or not.
48
- #
49
- # @example Does the relation exist?
50
- # person.relation_exists?(:people)
51
- #
52
- # @param [ String ] name The name of the relation to check.
53
- #
54
- # @return [ true, false ] True if set and not nil, false if not.
55
- #
56
- # @since 2.0.0.rc.1
57
- def relation_exists?(name)
58
- ivar(name)
59
- end
60
-
61
47
  # Resets the criteria inside the relation proxy. Used by many to many
62
48
  # relations to keep the underlying ids array in sync.
63
49
  #
@@ -68,7 +54,7 @@ module Mongoid
68
54
  #
69
55
  # @since 3.0.14
70
56
  def reset_relation_criteria(name)
71
- if instance_variable_defined?("@#{name}")
57
+ if instance_variable_defined?("@_#{name}")
72
58
  send(name).reset_unloaded
73
59
  end
74
60
  end
@@ -86,7 +72,7 @@ module Mongoid
86
72
  #
87
73
  # @since 2.0.0.rc.1
88
74
  def set_relation(name, relation)
89
- instance_variable_set("@#{name}", relation)
75
+ instance_variable_set("@_#{name}", relation)
90
76
  end
91
77
 
92
78
  private
@@ -106,34 +92,13 @@ module Mongoid
106
92
  # @return [ Proxy ] The relation.
107
93
  #
108
94
  # @since 3.0.16
109
- def get_relation(name, metadata, reload = false)
110
- variable = "@#{name}"
111
- value = if instance_variable_defined?(variable) && !reload
112
- instance_variable_get(variable)
113
- else
114
- _building do
115
- _loading do
116
- __build__(name, attributes[metadata.key], metadata)
117
- end
118
- end
119
- end
120
- if value.nil? && metadata.autobuilding? && !without_autobuild?
121
- send("build_#{name}")
122
- else
95
+ def get_relation(name, metadata, object, reload = false)
96
+ if !reload && (value = ivar(name)) != false
123
97
  value
124
- end
125
- end
126
-
127
- # @todo: Durran: Refactor before release, but this fixes the issue with
128
- # the extra queries.
129
- def get_relation_for_set(name, metadata, object)
130
- variable = "@#{name}"
131
- value = if instance_variable_defined?(variable)
132
- instance_variable_get(variable)
133
98
  else
134
99
  _building do
135
100
  _loading do
136
- if needs_no_database_query?(object, metadata)
101
+ if object && needs_no_database_query?(object, metadata)
137
102
  __build__(name, object, metadata)
138
103
  else
139
104
  __build__(name, attributes[metadata.key], metadata)
@@ -145,7 +110,7 @@ module Mongoid
145
110
 
146
111
  def needs_no_database_query?(object, metadata)
147
112
  object.is_a?(Document) && !object.embedded? &&
148
- object.id == attributes[metadata.key]
113
+ object._id == attributes[metadata.key]
149
114
  end
150
115
 
151
116
  # Is the current code executing without autobuild functionality?
@@ -190,12 +155,11 @@ module Mongoid
190
155
  # person.game?
191
156
  #
192
157
  # @param [ String, Symbol ] name The name of the relation.
193
- # @param [ Metadata ] The metadata.
194
158
  #
195
159
  # @return [ Class ] The model being set up.
196
160
  #
197
161
  # @since 3.0.0
198
- def existence_check(name, metadata)
162
+ def existence_check(name)
199
163
  module_eval <<-END
200
164
  def #{name}?
201
165
  without_autobuild { !__send__(:#{name}).blank? }
@@ -220,7 +184,11 @@ module Mongoid
220
184
  # @since 2.0.0.rc.1
221
185
  def getter(name, metadata)
222
186
  re_define_method(name) do |reload = false|
223
- get_relation(name, metadata, reload)
187
+ value = get_relation(name, metadata, nil, reload)
188
+ if value.nil? && metadata.autobuilding? && !without_autobuild?
189
+ value = send("build_#{name}")
190
+ end
191
+ value
224
192
  end
225
193
  self
226
194
  end
@@ -232,7 +200,6 @@ module Mongoid
232
200
  # Person.ids_getter("addresses", metadata)
233
201
  #
234
202
  # @param [ String, Symbol ] name The name of the relation.
235
- # @param [ Metadata] metadata The metadata for the relation.
236
203
  #
237
204
  # @return [ Class ] The class being set up.
238
205
  def ids_getter(name, metadata)
@@ -243,7 +210,6 @@ module Mongoid
243
210
  self
244
211
  end
245
212
 
246
-
247
213
  # Defines the setter for the relation. This does a few things based on
248
214
  # some conditions. If there is an existing association, a target
249
215
  # substitution will take place, otherwise a new relation will be
@@ -261,9 +227,7 @@ module Mongoid
261
227
  def setter(name, metadata)
262
228
  re_define_method("#{name}=") do |object|
263
229
  without_autobuild do
264
- if metadata.many?
265
- set_relation(name, get_relation(name, metadata).substitute(object.substitutable))
266
- elsif value = get_relation_for_set(name, metadata, object)
230
+ if value = get_relation(name, metadata, object)
267
231
  set_relation(name, value.substitute(object.substitutable))
268
232
  else
269
233
  __build__(name, object.substitutable, metadata)
@@ -7,11 +7,6 @@ module Mongoid
7
7
  module AutoSave
8
8
  extend ActiveSupport::Concern
9
9
 
10
- included do
11
- class_attribute :autosaved_relations
12
- self.autosaved_relations = []
13
- end
14
-
15
10
  # Used to prevent infinite loops in associated autosaves.
16
11
  #
17
12
  # @example Is the document autosaved?
@@ -44,15 +39,8 @@ module Mongoid
44
39
  # document.changed_for_autosave?
45
40
  #
46
41
  # @since 3.1.3
47
- def changed_for_autosave?
48
- new_record? || changed? || marked_for_destruction?
49
- end
50
-
51
- # Returns the relation, if it exists
52
- #
53
- # @since 3.1.3
54
- def relation_changed_for_autosave(metadata)
55
- ivar(metadata.name) if self.class.autosaved_relations.include?(metadata.name)
42
+ def changed_for_autosave?(doc)
43
+ doc.new_record? || doc.changed? || doc.marked_for_destruction?
56
44
  end
57
45
 
58
46
  module ClassMethods
@@ -68,39 +56,30 @@ module Mongoid
68
56
  #
69
57
  # @since 2.0.0.rc.1
70
58
  def autosave(metadata)
71
- if metadata.autosave? && autosavable?(metadata)
72
- autosaved_relations.push(metadata.name)
73
- set_callback :save, :after, unless: :autosaved? do |document|
74
- # @todo: Durran: Remove with Rails 4 after callback termination.
59
+ if metadata.autosave? && !metadata.embedded?
60
+ save_method = :"autosave_documents_for_#{metadata.name}"
61
+ define_method(save_method) do
62
+
75
63
  if before_callback_halted?
76
64
  self.before_callback_halted = false
77
65
  else
78
66
  __autosaving__ do
79
- if document.changed_for_autosave? || relation = document.relation_changed_for_autosave(metadata)
80
- relation = document.__send__(metadata.name) unless relation
81
- (relation.do_or_do_not(:in_memory) || Array.wrap(relation)).each do |doc|
82
- doc.save
83
- end if relation
67
+ if relation = ivar(metadata.name)
68
+ options = persistence_options || {}
69
+ if :belongs_to == metadata.macro
70
+ relation.with(options).save if changed_for_autosave?(relation)
71
+ else
72
+ Array(relation).each { |d| d.with(options).save if changed_for_autosave?(d) }
73
+ end
84
74
  end
85
75
  end
86
76
  end
87
77
  end
78
+
79
+ after_save save_method, unless: :autosaved?
88
80
  end
89
81
  end
90
82
 
91
- # Can the autosave be added?
92
- #
93
- # @example Can the autosave be added?
94
- # Person.autosavable?(metadata)
95
- #
96
- # @param [ Metadata ] metadata The relation metadata.
97
- #
98
- # @return [ true, false ] If the autosave is able to be added.
99
- #
100
- # @since 3.0.0
101
- def autosavable?(metadata)
102
- !autosaved_relations.include?(metadata.name) && !metadata.embedded?
103
- end
104
83
  end
105
84
  end
106
85
  end