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
@@ -2,104 +2,83 @@ require "spec_helper"
2
2
 
3
3
  describe Mongoid::Sessions do
4
4
 
5
- describe ".clear_persistence_options" do
6
-
7
- context "when options exist on the current thread" do
8
-
9
- before do
10
- Band.with(safe: true)
11
- end
5
+ describe "#collection" do
12
6
 
13
- let!(:cleared) do
14
- Band.clear_persistence_options
15
- end
7
+ shared_examples_for "an overridden collection at the class level" do
16
8
 
17
- it "remove the options from the current thread" do
18
- Band.persistence_options.should be_nil
9
+ let(:band) do
10
+ klass.new
19
11
  end
20
12
 
21
- it "returns true" do
22
- cleared.should be_true
13
+ it "returns the collection for the model" do
14
+ expect(band.collection).to be_a(Moped::Collection)
23
15
  end
24
- end
25
16
 
26
- context "when options do not exist on the current thread" do
27
-
28
- it "returns true" do
29
- Band.clear_persistence_options.should be_true
17
+ it "sets the correct collection name" do
18
+ expect(band.collection.name).to eq("artists")
30
19
  end
31
- end
32
- end
33
20
 
34
- describe "#collection" do
35
-
36
- context "when overriding the default with store_in" do
37
-
38
- shared_examples_for "an overridden collection at the class level" do
39
-
40
- let(:band) do
41
- Band.new
42
- end
21
+ context "when accessing from the class level" do
43
22
 
44
23
  it "returns the collection for the model" do
45
- band.collection.should be_a(Moped::Collection)
24
+ expect(klass.collection).to be_a(Moped::Collection)
46
25
  end
47
26
 
48
27
  it "sets the correct collection name" do
49
- band.collection.name.to_s.should eq("artists")
28
+ expect(klass.collection.name).to eq("artists")
50
29
  end
30
+ end
31
+ end
51
32
 
52
- context "when accessing from the class level" do
53
-
54
- it "returns the collection for the model" do
55
- Band.collection.should be_a(Moped::Collection)
56
- end
33
+ context "when overriding the persistence options" do
57
34
 
58
- it "sets the correct collection name" do
59
- Band.collection.name.to_s.should eq("artists")
60
- end
61
- end
35
+ let(:klass) do
36
+ Band.with(collection: "artists")
37
+ end
62
38
 
63
- context "when safety options exist" do
39
+ it_behaves_like "an overridden collection at the class level"
40
+ end
64
41
 
65
- context "when the options are from the current thread" do
42
+ context "when overriding store_in and persistence options" do
66
43
 
67
- before do
68
- Band.with(safe: { w: 3 })
69
- end
44
+ let(:klass) do
45
+ Band.with(collection: "artists")
46
+ end
70
47
 
71
- it "clears the options from the current thread" do
72
- Band.collection
73
- Band.persistence_options.should be_nil
74
- end
48
+ before do
49
+ Band.store_in collection: "foo"
50
+ end
75
51
 
76
- it "returns the collection" do
77
- Band.collection.should be_a(Moped::Collection)
78
- end
79
- end
80
- end
52
+ after do
53
+ Band.reset_storage_options!
81
54
  end
82
55
 
56
+ it_behaves_like "an overridden collection at the class level"
57
+ end
58
+
59
+ context "when overriding the default with store_in" do
60
+
83
61
  after do
84
- Band.storage_options = nil
62
+ Band.reset_storage_options!
85
63
  end
86
64
 
87
65
  context "when called multiple times with different options" do
66
+
88
67
  before do
89
68
  Band.store_in collection: "artists"
90
69
  Band.store_in session: "another"
91
70
  end
92
71
 
93
72
  it "should merge the options together" do
94
- Band.storage_options.should == {
95
- collection: "artists",
96
- session: "another"
97
- }
73
+ expect(Band.storage_options[:collection]).to eq("artists")
74
+ expect(Band.storage_options[:session]).to eq("another")
98
75
  end
99
76
  end
100
77
 
101
78
  context "when overriding with a proc" do
102
79
 
80
+ let(:klass) { Band }
81
+
103
82
  before do
104
83
  Band.store_in(collection: ->{ "artists" })
105
84
  end
@@ -109,17 +88,29 @@ describe Mongoid::Sessions do
109
88
 
110
89
  context "when overriding with a string" do
111
90
 
91
+ let(:klass) { Band }
92
+
112
93
  before do
113
94
  Band.store_in(collection: "artists")
114
95
  end
115
96
 
97
+ after do
98
+ Band.reset_storage_options!
99
+ end
100
+
116
101
  it_behaves_like "an overridden collection at the class level"
117
102
  end
118
103
 
119
104
  context "when overriding with a symbol" do
120
105
 
106
+ let(:klass) { Band }
107
+
121
108
  before do
122
- Band.store_in(collection: :artists)
109
+ klass.store_in(collection: :artists)
110
+ end
111
+
112
+ after do
113
+ klass.reset_storage_options!
123
114
  end
124
115
 
125
116
  it_behaves_like "an overridden collection at the class level"
@@ -133,21 +124,21 @@ describe Mongoid::Sessions do
133
124
  end
134
125
 
135
126
  it "returns the collection for the model" do
136
- band.collection.should be_a(Moped::Collection)
127
+ expect(band.collection).to be_a(Moped::Collection)
137
128
  end
138
129
 
139
130
  it "sets the correct collection name" do
140
- band.collection.name.to_s.should eq("bands")
131
+ expect(band.collection.name.to_s).to eq("bands")
141
132
  end
142
133
 
143
134
  context "when accessing from the class level" do
144
135
 
145
136
  it "returns the collection for the model" do
146
- Band.collection.should be_a(Moped::Collection)
137
+ expect(Band.collection).to be_a(Moped::Collection)
147
138
  end
148
139
 
149
140
  it "sets the correct collection name" do
150
- Band.collection.name.to_s.should eq("bands")
141
+ expect(Band.collection.name.to_s).to eq("bands")
151
142
  end
152
143
  end
153
144
  end
@@ -155,31 +146,59 @@ describe Mongoid::Sessions do
155
146
 
156
147
  describe "#collection_name" do
157
148
 
158
- context "when overriding the default with store_in" do
149
+ shared_examples_for "an overridden collection name at the class level" do
159
150
 
160
- shared_examples_for "an overridden collection name at the class level" do
151
+ let(:band) do
152
+ klass.new
153
+ end
161
154
 
162
- let(:band) do
163
- Band.new
155
+ context "when accessing from the instance" do
156
+
157
+ it "returns the overridden value" do
158
+ expect(band.collection_name).to eq(:artists)
164
159
  end
160
+ end
165
161
 
166
- context "when accessing from the instance" do
162
+ context "when accessing from the class level" do
167
163
 
168
- it "returns the overridden value" do
169
- band.collection_name.should eq(:artists)
170
- end
164
+ it "returns the overridden value" do
165
+ expect(klass.collection_name).to eq(:artists)
171
166
  end
167
+ end
168
+ end
172
169
 
173
- context "when accessing from the class level" do
170
+ context "when overriding the persistence options" do
174
171
 
175
- it "returns the overridden value" do
176
- Band.collection_name.should eq(:artists)
177
- end
178
- end
172
+ let(:klass) do
173
+ Band.with(collection: "artists")
174
+ end
175
+
176
+ it_behaves_like "an overridden collection name at the class level"
177
+ end
178
+
179
+ context "when overriding store_in and persistence options" do
180
+
181
+ let(:klass) do
182
+ Band.with(collection: "artists")
183
+ end
184
+
185
+ before do
186
+ Band.store_in collection: "foo"
179
187
  end
180
188
 
181
189
  after do
182
- Band.storage_options = nil
190
+ Band.reset_storage_options!
191
+ end
192
+
193
+ it_behaves_like "an overridden collection name at the class level"
194
+ end
195
+
196
+ context "when overriding the default with store_in" do
197
+
198
+ let(:klass) { Band }
199
+
200
+ after do
201
+ Band.reset_storage_options!
183
202
  end
184
203
 
185
204
  context "when overriding with a proc" do
@@ -217,13 +236,13 @@ describe Mongoid::Sessions do
217
236
  end
218
237
 
219
238
  it "returns the pluralized model name" do
220
- band.collection_name.should eq(:bands)
239
+ expect(band.collection_name).to eq(:bands)
221
240
  end
222
241
 
223
242
  context "when accessing from the class level" do
224
243
 
225
244
  it "returns the pluralized model name" do
226
- Band.collection_name.should eq(:bands)
245
+ expect(Band.collection_name).to eq(:bands)
227
246
  end
228
247
  end
229
248
  end
@@ -235,14 +254,120 @@ describe Mongoid::Sessions do
235
254
  end
236
255
 
237
256
  it "returns the root class pluralized model name" do
238
- firefox.collection_name.should eq(:canvases)
257
+ expect(firefox.collection_name).to eq(:canvases)
239
258
  end
240
259
 
241
260
  context "when accessing from the class level" do
242
261
 
243
262
  it "returns the root class pluralized model name" do
244
- Firefox.collection_name.should eq(:canvases)
263
+ expect(Firefox.collection_name).to eq(:canvases)
264
+ end
265
+ end
266
+ end
267
+ end
268
+
269
+ describe "#database_name" do
270
+
271
+ shared_examples_for "an overridden database name" do
272
+
273
+ let(:band) do
274
+ klass.new
275
+ end
276
+
277
+ context "when accessing from the instance" do
278
+
279
+ it "returns the overridden value" do
280
+ expect(band.mongo_session.options[:database].to_s).to eq(database_id_alt)
281
+ end
282
+ end
283
+
284
+ context "when accessing from the class level" do
285
+
286
+ it "returns the overridden value" do
287
+ expect(klass.database_name.to_s).to eq(database_id_alt)
288
+ end
289
+
290
+ it "session returns the overridden value" do
291
+ expect(klass.mongo_session.options[:database].to_s).to eq(database_id_alt)
292
+ end
293
+ end
294
+ end
295
+
296
+ context "when overriding the persistence options" do
297
+
298
+ let(:klass) do
299
+ Band.with(database: database_id_alt)
300
+ end
301
+
302
+ it_behaves_like "an overridden database name"
303
+ end
304
+
305
+ context "when overriding with store_in" do
306
+
307
+ let(:klass) { Band }
308
+
309
+ before do
310
+ Band.store_in database: database_id_alt
311
+ end
312
+
313
+ after do
314
+ Band.reset_storage_options!
315
+ end
316
+
317
+ it_behaves_like "an overridden database name"
318
+ end
319
+
320
+ context "when overriding store_in and persistence options" do
321
+
322
+ let(:klass) do
323
+ Band.with(database: database_id_alt)
324
+ end
325
+
326
+ before do
327
+ Band.store_in database: "foo"
328
+ end
329
+
330
+ after do
331
+ Band.reset_storage_options!
332
+ end
333
+
334
+ it_behaves_like "an overridden database name"
335
+ end
336
+
337
+ context "when overriding using the session" do
338
+
339
+ let(:session_name) { :alternative }
340
+
341
+ before do
342
+ Mongoid.sessions[session_name] = { database: database_id_alt, hosts: [ "#{HOST}:#{PORT}" ] }
343
+ end
344
+
345
+ after do
346
+ Mongoid.sessions.delete(session_name)
347
+ end
348
+
349
+ context "when overriding the persistence options" do
350
+
351
+ let(:klass) do
352
+ Band.with(session: session_name)
245
353
  end
354
+
355
+ it_behaves_like "an overridden database name"
356
+ end
357
+
358
+ context "when overriding with store_in" do
359
+
360
+ let(:klass) { Band }
361
+
362
+ before do
363
+ Band.store_in(session: session_name)
364
+ end
365
+
366
+ after do
367
+ Band.reset_storage_options!
368
+ end
369
+
370
+ it_behaves_like "an overridden database name"
246
371
  end
247
372
  end
248
373
  end
@@ -259,10 +384,6 @@ describe Mongoid::Sessions do
259
384
  Mongoid.sessions[:default][:database] = database_id
260
385
  end
261
386
 
262
- after do
263
- Band.storage_options = nil
264
- end
265
-
266
387
  context "when getting the default" do
267
388
 
268
389
  let(:file) do
@@ -270,16 +391,11 @@ describe Mongoid::Sessions do
270
391
  end
271
392
 
272
393
  before do
273
- Band.storage_options = nil
274
394
  described_class.clear
275
395
  Mongoid.load!(file, :test)
276
396
  Mongoid.sessions[:default][:database] = database_id
277
397
  end
278
398
 
279
- after do
280
- Band.storage_options = nil
281
- end
282
-
283
399
  let!(:band) do
284
400
  Band.new
285
401
  end
@@ -289,7 +405,37 @@ describe Mongoid::Sessions do
289
405
  end
290
406
 
291
407
  it "returns the default session" do
292
- mongo_session.options[:database].should eq(database_id)
408
+ expect(mongo_session.options[:database].to_s).to eq(database_id)
409
+ end
410
+ end
411
+
412
+ context "when overridden the database with store_in" do
413
+
414
+ before do
415
+ Band.store_in(database: database_id_alt)
416
+ end
417
+
418
+ context "on instance level" do
419
+
420
+ let(:band) do
421
+ Band.new.with({:read=>:primary})
422
+ end
423
+
424
+ it "uses the new database" do
425
+ expect(band.mongo_session.send(:current_database).name).to eq database_id_alt
426
+ end
427
+
428
+ context "when using another database before" do
429
+
430
+ before do
431
+ band
432
+ User.create!
433
+ end
434
+
435
+ it "uses the new database" do
436
+ expect(band.mongo_session.send(:current_database).name).to eq database_id_alt
437
+ end
438
+ end
293
439
  end
294
440
  end
295
441
 
@@ -306,7 +452,7 @@ describe Mongoid::Sessions do
306
452
  end
307
453
 
308
454
  it "returns the default session" do
309
- single_session.options[:database].should eq(ENV["MONGOHQ_SINGLE_NAME"])
455
+ expect(single_session.options[:database].to_s).to eq(ENV["MONGOHQ_SINGLE_NAME"])
310
456
  end
311
457
  end
312
458
 
@@ -350,8 +496,12 @@ describe Mongoid::Sessions do
350
496
 
351
497
  shared_examples_for "an overridden session to a mongohq replica set" do
352
498
 
353
- it "returns the default session" do
354
- replica_session.options[:database].should eq(ENV["MONGOHQ_REPL_NAME"])
499
+ let(:seeds) do
500
+ replica_session.cluster.seeds.map{ |node| node.address.original }
501
+ end
502
+
503
+ it "returns the overridden session" do
504
+ expect(seeds).to eq([ ENV["MONGOHQ_REPL_1_URL"], ENV["MONGOHQ_REPL_2_URL"] ])
355
505
  end
356
506
  end
357
507
 
@@ -397,8 +547,12 @@ describe Mongoid::Sessions do
397
547
  band.mongo_session
398
548
  end
399
549
 
400
- it "returns the default session" do
401
- repl_session.options[:database].should eq(ENV["MONGOHQ_REPL_NAME"])
550
+ let(:seeds) do
551
+ repl_session.cluster.seeds.map{ |node| node.address.original }
552
+ end
553
+
554
+ it "returns the overridden session" do
555
+ expect(seeds).to eq([ ENV["MONGOHQ_REPL_1_URL"], ENV["MONGOHQ_REPL_2_URL"] ])
402
556
  end
403
557
  end
404
558
 
@@ -433,7 +587,7 @@ describe Mongoid::Sessions do
433
587
  end
434
588
 
435
589
  after do
436
- Band.storage_options = nil
590
+ Band.reset_storage_options!
437
591
  end
438
592
 
439
593
  context "when getting the default" do
@@ -443,7 +597,7 @@ describe Mongoid::Sessions do
443
597
  end
444
598
 
445
599
  before do
446
- Band.storage_options = nil
600
+ Band.reset_storage_options!
447
601
  described_class.clear
448
602
  Mongoid.load!(file, :test)
449
603
  Mongoid.sessions[:default][:database] = database_id
@@ -454,7 +608,7 @@ describe Mongoid::Sessions do
454
608
  end
455
609
 
456
610
  it "returns the default session" do
457
- mongo_session.options[:database].should eq(database_id)
611
+ expect(mongo_session.options[:database].to_s).to eq(database_id)
458
612
  end
459
613
  end
460
614
 
@@ -469,7 +623,7 @@ describe Mongoid::Sessions do
469
623
  end
470
624
 
471
625
  it "returns the default session" do
472
- session.options[:database].should eq(ENV["MONGOHQ_SINGLE_NAME"])
626
+ expect(session.options[:database].to_s).to eq(ENV["MONGOHQ_SINGLE_NAME"])
473
627
  end
474
628
  end
475
629
 
@@ -483,8 +637,12 @@ describe Mongoid::Sessions do
483
637
  Band.mongo_session
484
638
  end
485
639
 
486
- it "returns the default session" do
487
- repl_session.options[:database].should eq(ENV["MONGOHQ_REPL_NAME"])
640
+ let(:seeds) do
641
+ repl_session.cluster.seeds.map{ |node| node.address.original }
642
+ end
643
+
644
+ it "returns the overridden session" do
645
+ expect(seeds).to eq([ ENV["MONGOHQ_REPL_1_URL"], ENV["MONGOHQ_REPL_2_URL"] ])
488
646
  end
489
647
  end
490
648
 
@@ -502,39 +660,27 @@ describe Mongoid::Sessions do
502
660
  end
503
661
  end
504
662
 
505
- describe ".persistence_options" do
506
-
507
- context "when options exist on the current thread" do
508
-
509
- before do
510
- Band.with(safe: { w: 2 })
511
- end
663
+ describe ".store_in" do
512
664
 
513
- after do
514
- Band.clear_persistence_options
515
- end
665
+ context "when provided a non hash" do
516
666
 
517
- it "returns the options" do
518
- Band.persistence_options.should eq(safe: { w: 2 })
667
+ it "raises an error" do
668
+ expect {
669
+ Band.store_in :artists
670
+ }.to raise_error(Mongoid::Errors::InvalidStorageOptions)
519
671
  end
520
672
  end
521
673
 
522
- context "when there are no options on the current thread" do
674
+ context "when provided a class that extend another document" do
523
675
 
524
- it "returns nil" do
525
- Band.persistence_options.should be_nil
676
+ let(:klass) do
677
+ Class.new(Band)
526
678
  end
527
- end
528
- end
529
-
530
- describe ".store_in" do
531
-
532
- context "when provided a non hash" do
533
679
 
534
680
  it "raises an error" do
535
681
  expect {
536
- Band.store_in :artists
537
- }.to raise_error(Mongoid::Errors::InvalidStorageOptions)
682
+ klass.store_in(database: :artists)
683
+ }.to raise_error(Mongoid::Errors::InvalidStorageParent)
538
684
  end
539
685
  end
540
686
 
@@ -556,13 +702,13 @@ describe Mongoid::Sessions do
556
702
  context "when sending operations to a different database" do
557
703
 
558
704
  after do
559
- Band.with(database: "mongoid_test_alt").delete_all
705
+ Band.with(database: database_id_alt).delete_all
560
706
  end
561
707
 
562
708
  describe ".create" do
563
709
 
564
710
  let!(:band) do
565
- Band.with(database: "mongoid_test_alt").create
711
+ Band.with(database: database_id_alt).create
566
712
  end
567
713
 
568
714
  it "does not persist to the default database" do
@@ -572,15 +718,15 @@ describe Mongoid::Sessions do
572
718
  end
573
719
 
574
720
  let(:from_db) do
575
- Band.with(database: "mongoid_test_alt").find(band.id)
721
+ Band.with(database: database_id_alt).find(band.id)
576
722
  end
577
723
 
578
724
  it "persists to the specified database" do
579
- from_db.should eq(band)
725
+ expect(from_db).to eq(band)
580
726
  end
581
727
 
582
728
  it "persists the correct number of documents" do
583
- Band.with(database: "mongoid_test_alt").count.should eq(1)
729
+ expect(Band.with(database: database_id_alt).count).to eq(1)
584
730
  end
585
731
  end
586
732
 
@@ -605,40 +751,40 @@ describe Mongoid::Sessions do
605
751
  end
606
752
 
607
753
  before do
608
- Band.with(database: "mongoid_test_alt").delete_all
754
+ Band.with(database: database_id_alt).delete_all
609
755
  end
610
756
 
611
757
  let!(:depeche_mode) do
612
- Band.with(database: "mongoid_test_alt").
758
+ Band.with(database: database_id_alt).
613
759
  create(name: "Depeche Mode", likes: 200)
614
760
  end
615
761
 
616
762
  let!(:tool) do
617
- Band.with(database: "mongoid_test_alt").
763
+ Band.with(database: database_id_alt).
618
764
  create(name: "Tool", likes: 100)
619
765
  end
620
766
 
621
767
  context "when outputting in memory" do
622
768
 
623
769
  let(:results) do
624
- Band.with(database: "mongoid_test_alt").
770
+ Band.with(database: database_id_alt).
625
771
  map_reduce(map, reduce).out(inline: 1)
626
772
  end
627
773
 
628
774
  it "executes the map/reduce on the correct database" do
629
- results.first["value"].should eq({ "likes" => 200 })
775
+ expect(results.first["value"]).to eq({ "likes" => 200 })
630
776
  end
631
777
  end
632
778
 
633
779
  context "when outputting to a collection" do
634
780
 
635
781
  let(:results) do
636
- Band.with(database: "mongoid_test_alt").
782
+ Band.with(database: database_id_alt).
637
783
  map_reduce(map, reduce).out(replace: "bands_output")
638
784
  end
639
785
 
640
786
  it "executes the map/reduce on the correct database" do
641
- results.first["value"].should eq({ "likes" => 200 })
787
+ expect(results.first["value"]).to eq({ "likes" => 200 })
642
788
  end
643
789
  end
644
790
  end
@@ -663,11 +809,11 @@ describe Mongoid::Sessions do
663
809
  end
664
810
 
665
811
  it "persists to the specified database" do
666
- from_db.should eq(band)
812
+ expect(from_db).to eq(band)
667
813
  end
668
814
 
669
815
  it "persists the correct number of documents" do
670
- Band.with(collection: "artists").count.should eq(1)
816
+ expect(Band.with(collection: "artists").count).to eq(1)
671
817
  end
672
818
  end
673
819
 
@@ -711,7 +857,7 @@ describe Mongoid::Sessions do
711
857
  end
712
858
 
713
859
  it "executes the map/reduce on the correct collection" do
714
- results.first["value"].should eq({ "likes" => 200 })
860
+ expect(results.first["value"]).to eq({ "likes" => 200 })
715
861
  end
716
862
  end
717
863
  end
@@ -746,7 +892,7 @@ describe Mongoid::Sessions do
746
892
  end
747
893
 
748
894
  it "persists to the specified database" do
749
- from_db.should eq(band)
895
+ expect(from_db).to eq(band)
750
896
  end
751
897
  end
752
898
 
@@ -767,7 +913,7 @@ describe Mongoid::Sessions do
767
913
  end
768
914
 
769
915
  it "persists to the specified database" do
770
- from_db.should eq(band)
916
+ expect(from_db).to eq(band)
771
917
  end
772
918
  end
773
919
 
@@ -788,7 +934,7 @@ describe Mongoid::Sessions do
788
934
  end
789
935
 
790
936
  it "persists to the specified database" do
791
- from_db.should eq(band)
937
+ expect(from_db).to eq(band)
792
938
  end
793
939
  end
794
940
  end
@@ -851,7 +997,7 @@ describe Mongoid::Sessions do
851
997
  end
852
998
 
853
999
  it "executes the map/reduce on the correct session" do
854
- results.first["value"].should eq({ "likes" => 200 })
1000
+ expect(results.first["value"]).to eq({ "likes" => 200 })
855
1001
  end
856
1002
  end
857
1003
  end
@@ -861,33 +1007,34 @@ describe Mongoid::Sessions do
861
1007
  describe ".create" do
862
1008
 
863
1009
  before do
864
- Person.with(safe: true).create(ssn: "432-97-1111")
1010
+ Person.create_indexes
1011
+ Person.create(ssn: "432-97-1111")
865
1012
  end
866
1013
 
867
1014
  context "when no error occurs" do
868
1015
 
869
1016
  it "inserts the document" do
870
- Person.count.should eq(1)
1017
+ expect(Person.count).to eq(1)
871
1018
  end
872
1019
  end
873
1020
 
874
1021
  context "when a mongodb error occurs" do
875
1022
 
876
- before do
877
- Person.create_indexes
878
- end
879
-
880
1023
  it "bubbles up to the caller" do
881
1024
  expect {
882
- Person.with(safe: true).create(ssn: "432-97-1111")
1025
+ Person.create(ssn: "432-97-1111")
883
1026
  }.to raise_error(Moped::Errors::OperationFailure)
884
1027
  end
885
1028
  end
886
1029
 
887
- context "when using safe: false" do
1030
+ context "when using write -1" do
1031
+
1032
+ let(:new_person) do
1033
+ Person.with(write: {w: -1}).create(ssn: "432-97-1111")
1034
+ end
888
1035
 
889
1036
  it "ignores mongodb error" do
890
- Person.with(safe: false).create(ssn: "432-97-1111").should be_true
1037
+ expect(new_person).to_not be nil
891
1038
  end
892
1039
  end
893
1040
  end
@@ -895,13 +1042,13 @@ describe Mongoid::Sessions do
895
1042
  describe ".create!" do
896
1043
 
897
1044
  before do
898
- Person.with(safe: true).create!(ssn: "432-97-1112")
1045
+ Person.create!(ssn: "432-97-1112")
899
1046
  end
900
1047
 
901
1048
  context "when no error occurs" do
902
1049
 
903
1050
  it "inserts the document" do
904
- Person.count.should eq(1)
1051
+ expect(Person.count).to eq(1)
905
1052
  end
906
1053
  end
907
1054
 
@@ -913,7 +1060,7 @@ describe Mongoid::Sessions do
913
1060
 
914
1061
  it "bubbles up to the caller" do
915
1062
  expect {
916
- Person.with(safe: true).create!(ssn: "432-97-1112")
1063
+ Person.create!(ssn: "432-97-1112")
917
1064
  }.to raise_error(Moped::Errors::OperationFailure)
918
1065
  end
919
1066
  end
@@ -922,7 +1069,7 @@ describe Mongoid::Sessions do
922
1069
 
923
1070
  it "raises the validation error" do
924
1071
  expect {
925
- Account.with(safe: true).create!(name: "this name is way too long")
1072
+ Account.create!(name: "this name is way too long")
926
1073
  }.to raise_error(Mongoid::Errors::Validations)
927
1074
  end
928
1075
  end
@@ -931,7 +1078,7 @@ describe Mongoid::Sessions do
931
1078
  describe ".save" do
932
1079
 
933
1080
  before do
934
- Person.with(safe: true).create(ssn: "432-97-1113")
1081
+ Person.create(ssn: "432-97-1113")
935
1082
  end
936
1083
 
937
1084
  context "when a mongodb error occurs" do
@@ -946,7 +1093,7 @@ describe Mongoid::Sessions do
946
1093
 
947
1094
  it "bubbles up to the caller" do
948
1095
  expect {
949
- person.with(safe: true).save
1096
+ person.save
950
1097
  }.to raise_error(Moped::Errors::OperationFailure)
951
1098
  end
952
1099
  end
@@ -955,7 +1102,7 @@ describe Mongoid::Sessions do
955
1102
  describe ".save!" do
956
1103
 
957
1104
  before do
958
- Person.with(safe: true).create!(ssn: "432-97-1114")
1105
+ Person.create!(ssn: "432-97-1114")
959
1106
  end
960
1107
 
961
1108
  context "when a mongodb error occurs" do
@@ -970,7 +1117,7 @@ describe Mongoid::Sessions do
970
1117
 
971
1118
  it "bubbles up to the caller" do
972
1119
  expect {
973
- person.with(safe: true).save!
1120
+ person.save!
974
1121
  }.to raise_error(Moped::Errors::OperationFailure)
975
1122
  end
976
1123
  end
@@ -983,7 +1130,7 @@ describe Mongoid::Sessions do
983
1130
 
984
1131
  it "raises the validation error" do
985
1132
  expect {
986
- account.with(safe: true).save!
1133
+ account.save!
987
1134
  }.to raise_error(Mongoid::Errors::Validations)
988
1135
  end
989
1136
  end
@@ -1013,7 +1160,7 @@ describe Mongoid::Sessions do
1013
1160
  end
1014
1161
 
1015
1162
  it "persists the document to the correct database" do
1016
- Band.find(band.id).should eq(band)
1163
+ expect(Band.find(band.id)).to eq(band)
1017
1164
  end
1018
1165
  end
1019
1166
  end
@@ -1045,7 +1192,7 @@ describe Mongoid::Sessions do
1045
1192
 
1046
1193
  it "persists to the overridden database" do
1047
1194
  Band.mongo_session.with(database: :mongoid_optional) do |sess|
1048
- sess[:bands].find(name: "Tool").should_not be_nil
1195
+ expect(sess[:bands].find(name: "Tool")).to_not be_nil
1049
1196
  end
1050
1197
  end
1051
1198
  end
@@ -1055,19 +1202,13 @@ describe Mongoid::Sessions do
1055
1202
 
1056
1203
  context "when the override is configured with a uri" do
1057
1204
 
1058
- let(:database_name) do
1059
- "mongoid_other"
1060
- end
1061
-
1062
- let(:config) do
1063
- { default: { uri: "mongodb://localhost:#{PORT}/#{database_id}" },
1064
- session1: { uri: "mongodb://localhost:#{PORT}/#{database_name}" }}
1205
+ let(:file) do
1206
+ File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
1065
1207
  end
1066
1208
 
1067
1209
  before do
1068
- Mongoid::Threaded.sessions.clear
1069
- Mongoid.sessions = config
1070
- Mongoid.override_session(:session1)
1210
+ Mongoid::Config.load!(file, :test)
1211
+ Mongoid.override_session(:mongohq_repl_uri)
1071
1212
  end
1072
1213
 
1073
1214
  after do
@@ -1075,7 +1216,7 @@ describe Mongoid::Sessions do
1075
1216
  end
1076
1217
 
1077
1218
  it "has some database name on session" do
1078
- Band.mongo_session.options[:database].should eq(database_name)
1219
+ expect(Band.mongo_session.options[:database]).to eq(:mongoid_replica)
1079
1220
  end
1080
1221
  end
1081
1222
 
@@ -1104,7 +1245,7 @@ describe Mongoid::Sessions do
1104
1245
  end
1105
1246
 
1106
1247
  it "persists to the overridden session" do
1107
- persisted.should eq(band)
1248
+ expect(persisted).to eq(band)
1108
1249
  end
1109
1250
  end
1110
1251
  end