mongoid 3.1.7 → 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 (567) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +470 -9
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  6. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/root.rb +0 -13
  9. data/lib/mongoid/atomic.rb +3 -14
  10. data/lib/mongoid/attributes/dynamic.rb +154 -0
  11. data/lib/mongoid/attributes/nested.rb +82 -0
  12. data/lib/mongoid/attributes/processing.rb +13 -66
  13. data/lib/mongoid/attributes.rb +63 -99
  14. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  15. data/lib/mongoid/composable.rb +105 -0
  16. data/lib/mongoid/config/options.rb +1 -1
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  19. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
  20. data/lib/mongoid/contextual/atomic.rb +53 -53
  21. data/lib/mongoid/contextual/geo_near.rb +1 -1
  22. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  23. data/lib/mongoid/contextual/memory.rb +23 -11
  24. data/lib/mongoid/contextual/mongo.rb +75 -57
  25. data/lib/mongoid/contextual/none.rb +90 -0
  26. data/lib/mongoid/contextual/text_search.rb +178 -0
  27. data/lib/mongoid/contextual.rb +2 -0
  28. data/lib/mongoid/copyable.rb +2 -3
  29. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  30. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  31. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  32. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  33. data/lib/mongoid/criteria/permission.rb +70 -0
  34. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  35. data/lib/mongoid/criteria.rb +39 -34
  36. data/lib/mongoid/document.rb +39 -24
  37. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  38. data/lib/mongoid/errors/document_not_found.rb +2 -1
  39. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  40. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  41. data/lib/mongoid/errors/invalid_value.rb +16 -0
  42. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  43. data/lib/mongoid/errors/readonly_document.rb +24 -0
  44. data/lib/mongoid/errors.rb +4 -1
  45. data/lib/mongoid/extensions/array.rb +3 -3
  46. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  47. data/lib/mongoid/extensions/boolean.rb +15 -17
  48. data/lib/mongoid/extensions/date.rb +1 -1
  49. data/lib/mongoid/extensions/date_time.rb +3 -3
  50. data/lib/mongoid/extensions/float.rb +2 -1
  51. data/lib/mongoid/extensions/hash.rb +3 -3
  52. data/lib/mongoid/extensions/integer.rb +1 -1
  53. data/lib/mongoid/extensions/object.rb +7 -7
  54. data/lib/mongoid/extensions/object_id.rb +5 -5
  55. data/lib/mongoid/extensions/range.rb +9 -3
  56. data/lib/mongoid/extensions/regexp.rb +1 -1
  57. data/lib/mongoid/extensions/set.rb +1 -1
  58. data/lib/mongoid/extensions/string.rb +6 -18
  59. data/lib/mongoid/extensions/symbol.rb +1 -1
  60. data/lib/mongoid/extensions/time.rb +3 -3
  61. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  62. data/lib/mongoid/extensions.rb +15 -7
  63. data/lib/mongoid/factory.rb +8 -6
  64. data/lib/mongoid/fields/foreign_key.rb +3 -3
  65. data/lib/mongoid/fields/localized.rb +1 -1
  66. data/lib/mongoid/fields/standard.rb +5 -17
  67. data/lib/mongoid/fields/validators/macro.rb +15 -5
  68. data/lib/mongoid/fields.rb +41 -8
  69. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  70. data/lib/mongoid/indexable/specification.rb +104 -0
  71. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  74. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  75. data/lib/mongoid/log_subscriber.rb +55 -0
  76. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  77. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  78. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  79. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  81. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  83. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
  86. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  87. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  88. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  89. data/lib/mongoid/matchable.rb +152 -0
  90. data/lib/mongoid/persistable/creatable.rb +189 -0
  91. data/lib/mongoid/persistable/deletable.rb +149 -0
  92. data/lib/mongoid/persistable/destroyable.rb +60 -0
  93. data/lib/mongoid/persistable/incrementable.rb +36 -0
  94. data/lib/mongoid/persistable/logical.rb +38 -0
  95. data/lib/mongoid/persistable/poppable.rb +39 -0
  96. data/lib/mongoid/persistable/pullable.rb +55 -0
  97. data/lib/mongoid/persistable/pushable.rb +62 -0
  98. data/lib/mongoid/persistable/renamable.rb +35 -0
  99. data/lib/mongoid/persistable/savable.rb +52 -0
  100. data/lib/mongoid/persistable/settable.rb +33 -0
  101. data/lib/mongoid/persistable/unsettable.rb +36 -0
  102. data/lib/mongoid/persistable/updatable.rb +153 -0
  103. data/lib/mongoid/persistable/upsertable.rb +55 -0
  104. data/lib/mongoid/persistable.rb +216 -0
  105. data/lib/mongoid/positional.rb +71 -0
  106. data/lib/mongoid/query_cache.rb +255 -0
  107. data/lib/mongoid/railtie.rb +34 -60
  108. data/lib/mongoid/railties/database.rake +9 -25
  109. data/lib/mongoid/relations/accessors.rb +15 -51
  110. data/lib/mongoid/relations/auto_save.rb +15 -36
  111. data/lib/mongoid/relations/binding.rb +2 -25
  112. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  113. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  114. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  115. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  116. data/lib/mongoid/relations/builder.rb +1 -1
  117. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  118. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  119. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  120. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  121. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  122. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  123. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  124. data/lib/mongoid/relations/builders.rb +2 -2
  125. data/lib/mongoid/relations/cascading.rb +3 -5
  126. data/lib/mongoid/relations/constraint.rb +1 -1
  127. data/lib/mongoid/relations/conversions.rb +1 -1
  128. data/lib/mongoid/relations/counter_cache.rb +39 -15
  129. data/lib/mongoid/relations/eager/base.rb +149 -0
  130. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  131. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  132. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  133. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  134. data/lib/mongoid/relations/eager.rb +46 -0
  135. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  136. data/lib/mongoid/relations/embedded/in.rb +4 -4
  137. data/lib/mongoid/relations/embedded/many.rb +14 -32
  138. data/lib/mongoid/relations/embedded/one.rb +1 -1
  139. data/lib/mongoid/relations/macros.rb +3 -4
  140. data/lib/mongoid/relations/many.rb +51 -31
  141. data/lib/mongoid/relations/marshalable.rb +3 -3
  142. data/lib/mongoid/relations/metadata.rb +14 -79
  143. data/lib/mongoid/relations/nested_builder.rb +2 -2
  144. data/lib/mongoid/relations/one.rb +1 -1
  145. data/lib/mongoid/relations/options.rb +1 -0
  146. data/lib/mongoid/relations/polymorphic.rb +0 -1
  147. data/lib/mongoid/relations/proxy.rb +21 -41
  148. data/lib/mongoid/relations/referenced/in.rb +4 -20
  149. data/lib/mongoid/relations/referenced/many.rb +22 -35
  150. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  151. data/lib/mongoid/relations/referenced/one.rb +6 -25
  152. data/lib/mongoid/relations/synchronization.rb +4 -4
  153. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  154. data/lib/mongoid/relations/touchable.rb +34 -1
  155. data/lib/mongoid/relations.rb +11 -25
  156. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  157. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  158. data/lib/mongoid/selectable.rb +59 -0
  159. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  160. data/lib/mongoid/sessions/factory.rb +2 -0
  161. data/lib/mongoid/sessions/options.rb +185 -0
  162. data/lib/mongoid/sessions/storage_options.rb +140 -0
  163. data/lib/mongoid/sessions/thread_options.rb +19 -0
  164. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  165. data/lib/mongoid/sessions.rb +37 -345
  166. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  167. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  168. data/lib/mongoid/support/query_counter.rb +23 -0
  169. data/lib/mongoid/tasks/database.rake +31 -0
  170. data/lib/mongoid/tasks/database.rb +107 -0
  171. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  172. data/lib/mongoid/threaded.rb +26 -172
  173. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  174. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  175. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  176. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  177. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  178. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  179. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  180. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  182. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  183. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  184. data/lib/mongoid/version.rb +1 -1
  185. data/lib/mongoid.rb +10 -76
  186. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  187. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  188. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  189. data/lib/rails/generators/mongoid_generator.rb +3 -40
  190. data/lib/rails/mongoid.rb +0 -122
  191. data/lib/support/ruby_version.rb +1 -1
  192. data/spec/app/models/account.rb +2 -6
  193. data/spec/app/models/acolyte.rb +2 -1
  194. data/spec/app/models/actor.rb +0 -1
  195. data/spec/app/models/address.rb +8 -3
  196. data/spec/app/models/animal.rb +1 -1
  197. data/spec/app/models/appointment.rb +3 -3
  198. data/spec/app/models/article.rb +1 -4
  199. data/spec/app/models/audio.rb +5 -0
  200. data/spec/app/models/author.rb +0 -2
  201. data/spec/app/models/band.rb +3 -2
  202. data/spec/app/models/bar.rb +1 -0
  203. data/spec/app/models/book.rb +1 -0
  204. data/spec/app/models/building.rb +0 -2
  205. data/spec/app/models/building_address.rb +0 -2
  206. data/spec/app/models/bus.rb +1 -1
  207. data/spec/app/models/canvas.rb +1 -1
  208. data/spec/app/models/contextable_item.rb +5 -0
  209. data/spec/app/models/contractor.rb +0 -2
  210. data/spec/app/models/country_code.rb +1 -1
  211. data/spec/app/models/definition.rb +2 -2
  212. data/spec/app/models/dog.rb +1 -1
  213. data/spec/app/models/dragon.rb +4 -0
  214. data/spec/app/models/drug.rb +1 -3
  215. data/spec/app/models/dungeon.rb +4 -0
  216. data/spec/app/models/edit.rb +5 -0
  217. data/spec/app/models/even.rb +7 -0
  218. data/spec/app/models/event.rb +1 -1
  219. data/spec/app/models/filesystem.rb +1 -0
  220. data/spec/app/models/fish.rb +0 -1
  221. data/spec/app/models/fruits.rb +6 -0
  222. data/spec/app/models/game.rb +0 -2
  223. data/spec/app/models/house.rb +1 -3
  224. data/spec/app/models/id_key.rb +6 -0
  225. data/spec/app/models/item.rb +1 -5
  226. data/spec/app/models/jar.rb +1 -1
  227. data/spec/app/models/label.rb +4 -4
  228. data/spec/app/models/line_item.rb +1 -1
  229. data/spec/app/models/login.rb +1 -1
  230. data/spec/app/models/message.rb +8 -0
  231. data/spec/app/models/movie.rb +1 -0
  232. data/spec/app/models/name.rb +3 -3
  233. data/spec/app/models/note.rb +3 -1
  234. data/spec/app/models/odd.rb +7 -0
  235. data/spec/app/models/oscar.rb +1 -1
  236. data/spec/app/models/parent_doc.rb +1 -1
  237. data/spec/app/models/person.rb +16 -10
  238. data/spec/app/models/phone.rb +1 -3
  239. data/spec/app/models/player.rb +3 -3
  240. data/spec/app/models/post.rb +5 -3
  241. data/spec/app/models/preference.rb +1 -1
  242. data/spec/app/models/quiz.rb +0 -3
  243. data/spec/app/models/record.rb +10 -5
  244. data/spec/app/models/registry.rb +1 -1
  245. data/spec/app/models/server.rb +1 -1
  246. data/spec/app/models/service.rb +3 -3
  247. data/spec/app/models/sound.rb +5 -0
  248. data/spec/app/models/symptom.rb +1 -1
  249. data/spec/app/models/template.rb +1 -1
  250. data/spec/app/models/title.rb +0 -1
  251. data/spec/app/models/track.rb +5 -5
  252. data/spec/app/models/tree.rb +3 -3
  253. data/spec/app/models/video.rb +1 -5
  254. data/spec/app/models/wiki_page.rb +2 -5
  255. data/spec/app/models/word.rb +3 -0
  256. data/spec/app/models/word_origin.rb +1 -1
  257. data/spec/config/mongoid.yml +7 -8
  258. data/spec/helpers.rb +18 -0
  259. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  260. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  261. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  262. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  263. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  264. data/spec/mongoid/atomic_spec.rb +19 -19
  265. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  266. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  267. data/spec/mongoid/attributes_spec.rb +334 -434
  268. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  269. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  270. data/spec/mongoid/config/environment_spec.rb +3 -3
  271. data/spec/mongoid/config/options_spec.rb +6 -6
  272. data/spec/mongoid/config_spec.rb +24 -48
  273. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  274. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
  275. data/spec/mongoid/contextual/atomic_spec.rb +59 -55
  276. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  277. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  278. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  279. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  280. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  281. data/spec/mongoid/contextual/none_spec.rb +127 -0
  282. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  283. data/spec/mongoid/copyable_spec.rb +56 -68
  284. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  285. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  286. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  287. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  288. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  289. data/spec/mongoid/criteria_spec.rb +713 -2419
  290. data/spec/mongoid/document_spec.rb +171 -121
  291. data/spec/mongoid/equality_spec.rb +22 -22
  292. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  293. data/spec/mongoid/errors/callback_spec.rb +3 -3
  294. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  295. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  296. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  297. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  298. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  299. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  300. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  308. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  311. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  312. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  313. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  314. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  315. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  316. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  317. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  318. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  325. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  326. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  327. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  328. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  329. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  330. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  331. data/spec/mongoid/errors/validations_spec.rb +7 -7
  332. data/spec/mongoid/extensions/array_spec.rb +61 -61
  333. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  334. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  335. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  336. data/spec/mongoid/extensions/date_spec.rb +13 -13
  337. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  338. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  339. data/spec/mongoid/extensions/float_spec.rb +29 -15
  340. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  341. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  342. data/spec/mongoid/extensions/module_spec.rb +2 -2
  343. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  344. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  345. data/spec/mongoid/extensions/object_spec.rb +26 -26
  346. data/spec/mongoid/extensions/range_spec.rb +61 -12
  347. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  348. data/spec/mongoid/extensions/set_spec.rb +4 -4
  349. data/spec/mongoid/extensions/string_spec.rb +35 -46
  350. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  351. data/spec/mongoid/extensions/time_spec.rb +49 -49
  352. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  353. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  354. data/spec/mongoid/extensions_spec.rb +29 -0
  355. data/spec/mongoid/factory_spec.rb +15 -15
  356. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  357. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  358. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  359. data/spec/mongoid/fields/localized_spec.rb +38 -23
  360. data/spec/mongoid/fields/standard_spec.rb +12 -12
  361. data/spec/mongoid/fields_spec.rb +263 -217
  362. data/spec/mongoid/findable_spec.rb +509 -0
  363. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  364. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  365. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  366. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  367. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  368. data/spec/mongoid/loggable_spec.rb +1 -1
  369. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  370. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  371. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  372. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  373. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  374. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  375. data/spec/mongoid/matchable/in_spec.rb +49 -0
  376. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  377. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  378. data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
  379. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  380. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  381. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  382. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  383. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  384. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  385. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  386. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  387. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  388. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  389. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  390. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  391. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  392. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  393. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  394. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  395. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  396. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  397. data/spec/mongoid/persistable_spec.rb +206 -0
  398. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
  399. data/spec/mongoid/query_cache_spec.rb +263 -0
  400. data/spec/mongoid/railties/document_spec.rb +2 -2
  401. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  402. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  403. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  404. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  405. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  406. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  407. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  408. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  409. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  410. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  411. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  412. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  413. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  414. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  415. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  416. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  417. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  418. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  419. data/spec/mongoid/relations/builders_spec.rb +21 -21
  420. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  421. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  422. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  423. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  424. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  425. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  426. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  427. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  428. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  429. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  430. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  431. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  432. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  433. data/spec/mongoid/relations/eager_spec.rb +228 -0
  434. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  435. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  436. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  437. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  438. data/spec/mongoid/relations/macros_spec.rb +108 -102
  439. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  440. data/spec/mongoid/relations/options_spec.rb +1 -1
  441. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  442. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  443. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  444. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  445. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  446. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  447. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  448. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  449. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  450. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  451. data/spec/mongoid/relations_spec.rb +16 -15
  452. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  453. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  454. data/spec/mongoid/selectable_spec.rb +134 -0
  455. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  456. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  457. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  458. data/spec/mongoid/sessions/options_spec.rb +108 -0
  459. data/spec/mongoid/sessions_spec.rb +319 -178
  460. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  461. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  462. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  463. data/spec/mongoid/tasks/database_spec.rb +160 -0
  464. data/spec/mongoid/threaded_spec.rb +17 -70
  465. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  466. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  467. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  468. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  469. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  470. data/spec/mongoid/timestamps_spec.rb +9 -13
  471. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  472. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  473. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  474. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  475. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  476. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  477. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  478. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  479. data/spec/mongoid_spec.rb +8 -8
  480. data/spec/rails/mongoid_spec.rb +19 -350
  481. data/spec/spec_helper.rb +26 -15
  482. metadata +262 -247
  483. data/lib/mongoid/atomic/positionable.rb +0 -73
  484. data/lib/mongoid/components.rb +0 -92
  485. data/lib/mongoid/config/inflections.rb +0 -6
  486. data/lib/mongoid/contextual/eager.rb +0 -158
  487. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  488. data/lib/mongoid/identity_map.rb +0 -163
  489. data/lib/mongoid/json.rb +0 -16
  490. data/lib/mongoid/matchers/strategies.rb +0 -97
  491. data/lib/mongoid/matchers.rb +0 -32
  492. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  493. data/lib/mongoid/nested_attributes.rb +0 -78
  494. data/lib/mongoid/observer.rb +0 -192
  495. data/lib/mongoid/paranoia.rb +0 -136
  496. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  497. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  498. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  499. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  500. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  501. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  502. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  503. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  504. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  505. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  506. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  507. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  508. data/lib/mongoid/persistence/atomic.rb +0 -231
  509. data/lib/mongoid/persistence/deletion.rb +0 -31
  510. data/lib/mongoid/persistence/insertion.rb +0 -38
  511. data/lib/mongoid/persistence/modification.rb +0 -35
  512. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  513. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  514. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  515. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  516. data/lib/mongoid/persistence/operations/update.rb +0 -59
  517. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  518. data/lib/mongoid/persistence/operations.rb +0 -214
  519. data/lib/mongoid/persistence/upsertion.rb +0 -31
  520. data/lib/mongoid/persistence.rb +0 -357
  521. data/lib/mongoid/unit_of_work.rb +0 -61
  522. data/lib/mongoid/versioning.rb +0 -217
  523. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  524. data/lib/rack/mongoid.rb +0 -2
  525. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  526. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  527. data/spec/app/models/actor_observer.rb +0 -15
  528. data/spec/app/models/callback_recorder.rb +0 -25
  529. data/spec/app/models/paranoid_phone.rb +0 -25
  530. data/spec/app/models/paranoid_post.rb +0 -36
  531. data/spec/app/models/phone_observer.rb +0 -6
  532. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  533. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  534. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  535. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  536. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  537. data/spec/mongoid/finders_spec.rb +0 -321
  538. data/spec/mongoid/identity_map_spec.rb +0 -564
  539. data/spec/mongoid/json_spec.rb +0 -33
  540. data/spec/mongoid/matchers/in_spec.rb +0 -25
  541. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  542. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  543. data/spec/mongoid/observer_spec.rb +0 -290
  544. data/spec/mongoid/paranoia_spec.rb +0 -759
  545. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  546. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  547. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  548. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  549. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  550. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  551. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  552. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  553. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  554. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  555. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  556. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  557. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  558. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  559. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  560. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  561. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  562. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  563. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  564. data/spec/mongoid/persistence_spec.rb +0 -2279
  565. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  566. data/spec/mongoid/versioning_spec.rb +0 -540
  567. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -21,11 +21,11 @@ module Mongoid
21
21
  size == 0
22
22
  end
23
23
 
24
- # Creates a new document on the references many relation. This will
25
- # save the document if the parent has been persisted.
26
- #
27
- # @example Create and save the new document.
28
- # person.posts.create(:text => "Testing")
24
+ # Creates a new document on the references many relation. This will
25
+ # save the document if the parent has been persisted.
26
+ #
27
+ # @example Create and save the new document.
28
+ # person.posts.create(:text => "Testing")
29
29
  #
30
30
  # @overload create(attributes = nil, options = {}, type = nil)
31
31
  # @param [ Hash ] attributes The attributes to create with.
@@ -39,10 +39,14 @@ module Mongoid
39
39
  # @return [ Document ] The newly created document.
40
40
  #
41
41
  # @since 2.0.0.beta.1
42
- def create(attributes = nil, options = {}, type = nil, &block)
43
- doc = build(attributes, options, type, &block)
44
- base.persisted? ? doc.save : raise_unsaved(doc)
45
- doc
42
+ def create(attributes = nil, type = nil, &block)
43
+ if attributes.is_a?(::Array)
44
+ attributes.map { |attrs| create(attrs, type, &block) }
45
+ else
46
+ doc = build(attributes, type, &block)
47
+ base.persisted? ? doc.save : raise_unsaved(doc)
48
+ doc
49
+ end
46
50
  end
47
51
 
48
52
  # Creates a new document on the references many relation. This will
@@ -54,7 +58,6 @@ module Mongoid
54
58
  #
55
59
  # @overload create!(attributes = nil, options = {}, type = nil)
56
60
  # @param [ Hash ] attributes The attributes to create with.
57
- # @param [ Hash ] options The scoped assignment options.
58
61
  # @param [ Class ] type The optional type of document to create.
59
62
  #
60
63
  # @overload create!(attributes = nil, type = nil)
@@ -66,10 +69,14 @@ module Mongoid
66
69
  # @return [ Document ] The newly created document.
67
70
  #
68
71
  # @since 2.0.0.beta.1
69
- def create!(attributes = nil, options = {}, type = nil, &block)
70
- doc = build(attributes, options, type, &block)
71
- base.persisted? ? doc.save! : raise_unsaved(doc)
72
- doc
72
+ def create!(attributes = nil, type = nil, &block)
73
+ if attributes.is_a?(::Array)
74
+ attributes.map { |attrs| create!(attrs, type, &block) }
75
+ else
76
+ doc = build(attributes, type, &block)
77
+ base.persisted? ? doc.save! : raise_unsaved(doc)
78
+ doc
79
+ end
73
80
  end
74
81
 
75
82
  # Find the first document given the conditions, or creates a new document
@@ -78,9 +85,8 @@ module Mongoid
78
85
  # @example Find or create.
79
86
  # person.posts.find_or_create_by(:title => "Testing")
80
87
  #
81
- # @overload find_or_create_by(attributes = nil, options = {}, type = nil)
88
+ # @overload find_or_create_by(attributes = nil, type = nil)
82
89
  # @param [ Hash ] attributes The attributes to search or create with.
83
- # @param [ Hash ] options The scoped assignment options.
84
90
  # @param [ Class ] type The optional type of document to create.
85
91
  #
86
92
  # @overload find_or_create_by(attributes = nil, type = nil)
@@ -88,8 +94,29 @@ module Mongoid
88
94
  # @param [ Class ] type The optional type of document to create.
89
95
  #
90
96
  # @return [ Document ] An existing document or newly created one.
91
- def find_or_create_by(attrs = {}, options = {}, type = nil, &block)
92
- find_or(:create, attrs, options, type, &block)
97
+ def find_or_create_by(attrs = {}, type = nil, &block)
98
+ find_or(:create, attrs, type, &block)
99
+ end
100
+
101
+ # Find the first document given the conditions, or creates a new document
102
+ # with the conditions that were supplied. This will raise an error if validation fails.
103
+ #
104
+ # @example Find or create.
105
+ # person.posts.find_or_create_by!(:title => "Testing")
106
+ #
107
+ # @overload find_or_create_by!(attributes = nil, type = nil)
108
+ # @param [ Hash ] attributes The attributes to search or create with.
109
+ # @param [ Class ] type The optional type of document to create.
110
+ #
111
+ # @overload find_or_create_by!(attributes = nil, type = nil)
112
+ # @param [ Hash ] attributes The attributes to search or create with.
113
+ # @param [ Class ] type The optional type of document to create.
114
+ #
115
+ # @raise [ Errors::Validations ] If validation failed.
116
+ #
117
+ # @return [ Document ] An existing document or newly created one.
118
+ def find_or_create_by!(attrs = {}, type = nil, &block)
119
+ find_or(:create!, attrs, type, &block)
93
120
  end
94
121
 
95
122
  # Find the first +Document+ given the conditions, or instantiates a new document
@@ -98,9 +125,8 @@ module Mongoid
98
125
  # @example Find or initialize.
99
126
  # person.posts.find_or_initialize_by(:title => "Test")
100
127
  #
101
- # @overload find_or_initialize_by(attributes = {}, options = {}, type = nil)
128
+ # @overload find_or_initialize_by(attributes = {}, type = nil)
102
129
  # @param [ Hash ] attributes The attributes to search or initialize with.
103
- # @param [ Hash ] options The scoped assignment options.
104
130
  # @param [ Class ] type The optional subclass to build.
105
131
  #
106
132
  # @overload find_or_initialize_by(attributes = {}, type = nil)
@@ -108,8 +134,8 @@ module Mongoid
108
134
  # @param [ Class ] type The optional subclass to build.
109
135
  #
110
136
  # @return [ Document ] An existing document or newly instantiated one.
111
- def find_or_initialize_by(attrs = {}, options = {}, type = nil, &block)
112
- find_or(:build, attrs, options, type, &block)
137
+ def find_or_initialize_by(attrs = {}, type = nil, &block)
138
+ find_or(:build, attrs, type, &block)
113
139
  end
114
140
 
115
141
  # This proxy can never be nil.
@@ -191,10 +217,9 @@ module Mongoid
191
217
  # @example Find or create|initialize.
192
218
  # person.addresses.find_or(:create, :street => "Bond")
193
219
  #
194
- # @overload find_or(method, attributes = {}, options = {}, type = nil)
220
+ # @overload find_or(method, attributes = {}, type = nil)
195
221
  # @param [ Symbol ] method The method name, create or new.
196
222
  # @param [ Hash ] attributes The attributes to search or build with.
197
- # @param [ Hash ] options The scoped assignment options.
198
223
  # @param [ Class ] type The optional subclass to build.
199
224
  #
200
225
  # @overload find_or(attributes = {}, type = nil)
@@ -203,14 +228,9 @@ module Mongoid
203
228
  # @param [ Class ] type The optional subclass to build.
204
229
  #
205
230
  # @return [ Document ] A matching document or a new/created one.
206
- def find_or(method, attrs = {}, options = {}, type = nil, &block)
207
- if options.is_a? Class
208
- options, type = {}, options
209
- end
210
-
231
+ def find_or(method, attrs = {}, type = nil, &block)
211
232
  attrs["_type"] = type.to_s if type
212
-
213
- where(attrs).first || send(method, attrs, options, type, &block)
233
+ where(attrs).first || send(method, attrs, type, &block)
214
234
  end
215
235
  end
216
236
  end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  #
13
13
  # @since 3.0.15
14
14
  def marshal_dump
15
- [ base, target, metadata ]
15
+ [ base, target, __metadata ]
16
16
  end
17
17
 
18
18
  # Takes the provided data and sets it back on the proxy.
@@ -24,8 +24,8 @@ module Mongoid
24
24
  #
25
25
  # @since 3.0.15
26
26
  def marshal_load(data)
27
- @base, @target, @metadata = data
28
- extend_proxy(metadata.extension) if metadata.extension?
27
+ @base, @target, @__metadata = data
28
+ extend_proxy(__metadata.extension) if __metadata.extension?
29
29
  end
30
30
  end
31
31
  end
@@ -229,20 +229,6 @@ module Mongoid
229
229
  !!dependent
230
230
  end
231
231
 
232
- # Get the criteria needed to eager load this relation.
233
- #
234
- # @example Get the eager loading criteria.
235
- # metadata.eager_load(criteria)
236
- #
237
- # @param [ Array<Object> ] ids The ids of the returned parents.
238
- #
239
- # @return [ Criteria ] The eager loading criteria.
240
- #
241
- # @since 2.2.0
242
- def eager_load(ids)
243
- relation.eager_load(self, ids)
244
- end
245
-
246
232
  # Will determine if the relation is an embedded one or not. Currently
247
233
  # only checks against embeds one and many.
248
234
  #
@@ -398,8 +384,7 @@ module Mongoid
398
384
  order: #{order.inspect}
399
385
  polymorphic: #{polymorphic?}
400
386
  relation: #{relation}
401
- setter: #{setter}
402
- versioned: #{versioned?}>
387
+ setter: #{setter}>
403
388
  }
404
389
  end
405
390
 
@@ -460,21 +445,6 @@ module Mongoid
460
445
  !!inverse_class_name
461
446
  end
462
447
 
463
- # Is the inverse field bindable? Ie, do we have more than one definition
464
- # on the parent class with the same polymorphic name (as).
465
- #
466
- # @example Is the inverse of bindable?
467
- # metadata.inverse_of_bindable?
468
- #
469
- # @return [ true, false ] If the relation needs the inverse of field set.
470
- #
471
- # @since 3.0.6
472
- def inverse_field_bindable?
473
- @inverse_field_bindable ||= (inverse_klass.relations.values.count do |meta|
474
- meta.as == as
475
- end > 1)
476
- end
477
-
478
448
  # Used for relational many to many only. This determines the name of the
479
449
  # foreign key field on the inverse side of the relation, since in this
480
450
  # case there are keys on both sides.
@@ -579,31 +549,6 @@ module Mongoid
579
549
  @inverse_type_setter ||= inverse_type.__setter__
580
550
  end
581
551
 
582
- # Returns the name of the field in which to store the name of the inverse
583
- # field for the polymorphic relation.
584
- #
585
- # @example Get the name of the field.
586
- # metadata.inverse_of_field
587
- #
588
- # @return [ String ] The name of the field for storing the name of the
589
- # inverse field.
590
- #
591
- # @since 2.4.5
592
- def inverse_of_field
593
- @inverse_of_field ||= determine_inverse_for(:field)
594
- end
595
-
596
- # Gets the setter for the field that stores the name of the inverse field
597
- # on a polymorphic relation.
598
- #
599
- # @example Get the inverse type setter.
600
- # metadata.inverse_of_field_setter
601
- #
602
- # @return [ String ] The name of the setter.
603
- def inverse_of_field_setter
604
- @inverse_of_field_setter ||= inverse_of_field.__setter__
605
- end
606
-
607
552
  # This returns the key that is to be used to grab the attributes for the
608
553
  # relation or the foreign key or id that a referenced relation will use
609
554
  # to query for the object.
@@ -823,18 +768,6 @@ module Mongoid
823
768
  end
824
769
  end
825
770
 
826
- # Is this relation using Mongoid's internal versioning system?
827
- #
828
- # @example Is this relation versioned?
829
- # metadata.versioned?
830
- #
831
- # @return [ true, false ] If the relation uses Mongoid versioning.
832
- #
833
- # @since 2.1.0
834
- def versioned?
835
- !!self[:versioned]
836
- end
837
-
838
771
  # Returns the metadata itself. Here for compatibility with Rails
839
772
  # association metadata.
840
773
  #
@@ -977,9 +910,13 @@ module Mongoid
977
910
  # @since 3.0.0
978
911
  def find_from_parts(modules)
979
912
  modules.find do |mod|
980
- ActiveSupport::Inflector.constantize(mod).constants.include?(
981
- name.to_s.classify.to_sym
982
- )
913
+ if mod.blank?
914
+ false
915
+ else
916
+ ActiveSupport::Inflector.constantize(mod).constants.include?(
917
+ name.to_s.classify.to_sym
918
+ )
919
+ end
983
920
  end
984
921
  end
985
922
 
@@ -1033,15 +970,13 @@ module Mongoid
1033
970
  # @since 2.0.0.rc.1
1034
971
  def determine_foreign_key
1035
972
  return self[:foreign_key].to_s if self[:foreign_key]
1036
- suffix = relation.foreign_key_suffix
973
+ return nil if relation.embedded?
974
+
1037
975
  if relation.stores_foreign_key?
1038
976
  relation.foreign_key(name)
1039
977
  else
1040
- if polymorphic?
1041
- "#{self[:as]}#{suffix}"
1042
- else
1043
- inverse_of ? "#{inverse_of}#{suffix}" : inverse_class_name.foreign_key
1044
- end
978
+ suffix = relation.foreign_key_suffix
979
+ "#{inverse}#{suffix}"
1045
980
  end
1046
981
  end
1047
982
 
@@ -1112,8 +1047,8 @@ module Mongoid
1112
1047
  # @since 3.0.0
1113
1048
  def inverse_relation_candidates
1114
1049
  relations_metadata.select do |meta|
1115
- next if meta.versioned? || meta.name == name
1116
- meta.class_name == inverse_class_name
1050
+ next if meta.name == name
1051
+ (meta.class_name == inverse_class_name) && !meta.forced_nil_inverse?
1117
1052
  end
1118
1053
  end
1119
1054
 
@@ -63,11 +63,11 @@ module Mongoid
63
63
  # @param [ Class ] klass The class we're trying to convert for.
64
64
  # @param [ String ] id The id, usually coming from the form.
65
65
  #
66
- # @return [ Moped::BSON::ObjectId, String, Object ] The converted id.
66
+ # @return [ BSON::ObjectId, String, Object ] The converted id.
67
67
  #
68
68
  # @since 2.0.0.rc.6
69
69
  def convert_id(klass, id)
70
- klass.using_object_ids? ? Moped::BSON::ObjectId.mongoize(id) : id
70
+ klass.using_object_ids? ? BSON::ObjectId.mongoize(id) : id
71
71
  end
72
72
  end
73
73
  end
@@ -53,7 +53,7 @@ module Mongoid
53
53
  #
54
54
  # @since 4.0.0
55
55
  def __evolve_object_id__
56
- target.id
56
+ target._id
57
57
  end
58
58
  end
59
59
  end
@@ -42,6 +42,7 @@ module Mongoid
42
42
  )
43
43
  end
44
44
  end
45
+ true
45
46
  end
46
47
  end
47
48
  end
@@ -29,7 +29,6 @@ module Mongoid
29
29
  self.polymorphic = true
30
30
  if metadata.relation.stores_foreign_key?
31
31
  field(metadata.inverse_type, type: String)
32
- field(metadata.inverse_of_field, type: Symbol)
33
32
  end
34
33
  end
35
34
  self
@@ -12,16 +12,17 @@ module Mongoid
12
12
  # We undefine most methods to get them sent through to the target.
13
13
  instance_methods.each do |method|
14
14
  undef_method(method) unless
15
- method =~ /(^__|^send|^object_id|^respond_to|^tap|extend_proxy)/
15
+ method =~ /(^__|^send|^object_id|^respond_to|^tap|extend_proxy|extend_proxies)/
16
16
  end
17
17
 
18
18
  include Threaded::Lifecycle
19
19
  include Marshalable
20
20
 
21
- attr_accessor :base, :loaded, :metadata, :target
21
+ attr_accessor :base, :__metadata, :target
22
+ alias :relation_metadata :__metadata
22
23
 
23
24
  # Backwards compatibility with Mongoid beta releases.
24
- delegate :foreign_key, :inverse_foreign_key, to: :metadata
25
+ delegate :foreign_key, :inverse_foreign_key, to: :__metadata
25
26
  delegate :bind_one, :unbind_one, to: :binding
26
27
  delegate :collection_name, to: :base
27
28
 
@@ -37,9 +38,14 @@ module Mongoid
37
38
  #
38
39
  # @since 2.0.0.rc.1
39
40
  def init(base, target, metadata)
40
- @base, @target, @metadata = base, target, metadata
41
+ @base, @target, @__metadata = base, target, metadata
41
42
  yield(self) if block_given?
42
- extend_proxy(metadata.extension) if metadata.extension?
43
+ extend_proxies(metadata.extension) if metadata.extension?
44
+ end
45
+
46
+ # Allow extension to be an array and extend each module
47
+ def extend_proxies(*extension)
48
+ extension.flatten.each {|ext| extend_proxy(ext) }
43
49
  end
44
50
 
45
51
  # Get the class from the metadata, or return nil if no metadata present.
@@ -51,7 +57,7 @@ module Mongoid
51
57
  #
52
58
  # @since 3.0.15
53
59
  def klass
54
- metadata ? metadata.klass : nil
60
+ __metadata ? __metadata.klass : nil
55
61
  end
56
62
 
57
63
  # Resets the criteria inside the relation proxy. Used by many to many
@@ -103,7 +109,7 @@ module Mongoid
103
109
  #
104
110
  # @since 3.0.0
105
111
  def with(options)
106
- Threaded.set_persistence_options(klass, options)
112
+ @persistence_options = options
107
113
  self
108
114
  end
109
115
 
@@ -119,6 +125,7 @@ module Mongoid
119
125
  # @since 2.0.0
120
126
  def collection
121
127
  root = base._root
128
+ root.with(@persistence_options)
122
129
  root.collection unless root.embedded?
123
130
  end
124
131
 
@@ -131,7 +138,7 @@ module Mongoid
131
138
  #
132
139
  # @since 2.0.0.rc.4
133
140
  def characterize_one(document)
134
- document.metadata = metadata unless document.metadata
141
+ document.__metadata = __metadata unless document.__metadata
135
142
  end
136
143
 
137
144
  # Default behavior of method missing should be to delegate all calls
@@ -153,7 +160,7 @@ module Mongoid
153
160
  #
154
161
  # @since 2.0.0
155
162
  def raise_mixed
156
- raise Errors::MixedRelations.new(base.class, metadata.klass)
163
+ raise Errors::MixedRelations.new(base.class, __metadata.klass)
157
164
  end
158
165
 
159
166
  # When the base is not yet saved and the user calls create or create!
@@ -183,11 +190,12 @@ module Mongoid
183
190
  # @since 3.1.0
184
191
  def callback_method(callback_name)
185
192
  methods = []
186
- if metadata[callback_name]
187
- if metadata[callback_name].is_a? Array
188
- methods.concat(metadata[callback_name])
193
+ metadata = __metadata[callback_name]
194
+ if metadata
195
+ if metadata.is_a?(Array)
196
+ methods.concat(metadata)
189
197
  else
190
- methods << metadata[callback_name]
198
+ methods << metadata
191
199
  end
192
200
  end
193
201
  methods
@@ -230,34 +238,6 @@ module Mongoid
230
238
  def apply_ordering(criteria, metadata)
231
239
  metadata.order ? criteria.order_by(metadata.order) : criteria
232
240
  end
233
-
234
- # Get the criteria that is used to eager load a relation of this
235
- # type.
236
- #
237
- # @example Get the eager load criteria.
238
- # Proxy.eager_load(metadata, criteria)
239
- #
240
- # @param [ Metadata ] metadata The relation metadata.
241
- # @param [ Array<Object> ] ids The ids of the base docs.
242
- #
243
- # @return [ Criteria ] The criteria to eager load the relation.
244
- #
245
- # @since 2.2.0
246
- def eager_load_ids(metadata, ids)
247
- klass, foreign_key = metadata.klass, metadata.foreign_key
248
- eager_loaded = klass.any_in(foreign_key => ids).entries
249
- ids.each do |id|
250
- sel = { foreign_key => id }
251
- sel.merge!(metadata.type_relation) if klass.hereditary?
252
- IdentityMap.clear_many(klass, sel)
253
- end
254
- eager_loaded.each do |doc|
255
- base_id = doc.__send__(foreign_key)
256
- sel = { foreign_key => base_id }
257
- sel.merge!(metadata.type_relation) if klass.hereditary?
258
- yield(doc, sel)
259
- end
260
- end
261
241
  end
262
242
  end
263
243
  end
@@ -71,7 +71,7 @@ module Mongoid
71
71
  #
72
72
  # @since 2.0.0.rc.1
73
73
  def binding
74
- Bindings::Referenced::In.new(base, target, metadata)
74
+ Bindings::Referenced::In.new(base, target, __metadata)
75
75
  end
76
76
 
77
77
  # Normalize the value provided as a replacement for substitution.
@@ -88,7 +88,7 @@ module Mongoid
88
88
  # @since 3.1.5
89
89
  def normalize(replacement)
90
90
  return replacement if replacement.is_a?(Document)
91
- metadata.builder(klass, replacement).build
91
+ __metadata.builder(klass, replacement).build
92
92
  end
93
93
 
94
94
  # Are we able to persist this relation?
@@ -139,24 +139,8 @@ module Mongoid
139
139
  type.where(metadata.primary_key => object)
140
140
  end
141
141
 
142
- # Get the criteria that is used to eager load a relation of this
143
- # type.
144
- #
145
- # @example Get the eager load criteria.
146
- # Proxy.eager_load(metadata, criteria)
147
- #
148
- # @param [ Metadata ] metadata The relation metadata.
149
- # @param [ Array<Object> ] ids The ids of the target docs.
150
- #
151
- # @return [ Criteria ] The criteria to eager load the relation.
152
- #
153
- # @since 2.2.0
154
- def eager_load(metadata, ids)
155
- raise Errors::EagerLoad.new(metadata.name) if metadata.polymorphic?
156
- klass, _ = metadata.klass, metadata.foreign_key
157
- klass.any_in("_id" => ids.uniq).each do |doc|
158
- IdentityMap.set(doc)
159
- end
142
+ def eager_load_klass
143
+ Relations::Eager::BelongsTo
160
144
  end
161
145
 
162
146
  # Returns true if the relation is an embedded one. In this case