mongoid 3.1.7 → 4.0.0.alpha1

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 (521) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +317 -11
  3. data/README.md +4 -5
  4. data/lib/config/locales/en.yml +9 -12
  5. data/lib/mongoid.rb +6 -75
  6. data/lib/mongoid/atomic.rb +0 -11
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/root.rb +0 -13
  9. data/lib/mongoid/attributes.rb +30 -108
  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/{dirty.rb → changeable.rb} +5 -2
  14. data/lib/mongoid/composable.rb +104 -0
  15. data/lib/mongoid/config.rb +3 -9
  16. data/lib/mongoid/config/options.rb +1 -1
  17. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
  18. data/lib/mongoid/contextual/atomic.rb +53 -53
  19. data/lib/mongoid/contextual/command.rb +26 -0
  20. data/lib/mongoid/contextual/map_reduce.rb +1 -1
  21. data/lib/mongoid/contextual/memory.rb +6 -5
  22. data/lib/mongoid/contextual/mongo.rb +59 -28
  23. data/lib/mongoid/contextual/text_search.rb +180 -0
  24. data/lib/mongoid/copyable.rb +2 -3
  25. data/lib/mongoid/criteria.rb +13 -33
  26. data/lib/mongoid/criteria/{#findable.rb# → findable.rb} +0 -2
  27. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  28. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  29. data/lib/mongoid/{criterion → criteria}/modifiable.rb +1 -1
  30. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  31. data/lib/mongoid/document.rb +28 -12
  32. data/lib/mongoid/errors.rb +1 -1
  33. data/lib/mongoid/errors/document_not_found.rb +2 -1
  34. data/lib/mongoid/errors/invalid_value.rb +16 -0
  35. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  36. data/lib/mongoid/extensions.rb +2 -7
  37. data/lib/mongoid/extensions/array.rb +2 -2
  38. data/lib/mongoid/extensions/boolean.rb +14 -17
  39. data/lib/mongoid/extensions/float.rb +1 -0
  40. data/lib/mongoid/extensions/hash.rb +1 -1
  41. data/lib/mongoid/extensions/object.rb +4 -4
  42. data/lib/mongoid/extensions/object_id.rb +5 -5
  43. data/lib/mongoid/extensions/range.rb +8 -2
  44. data/lib/mongoid/extensions/string.rb +5 -17
  45. data/lib/mongoid/extensions/time.rb +2 -2
  46. data/lib/mongoid/factory.rb +3 -3
  47. data/lib/mongoid/fields.rb +9 -8
  48. data/lib/mongoid/fields/foreign_key.rb +3 -3
  49. data/lib/mongoid/fields/standard.rb +4 -16
  50. data/lib/mongoid/fields/validators/macro.rb +11 -3
  51. data/lib/mongoid/{finders.rb → findable.rb} +6 -2
  52. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  53. data/lib/mongoid/indexable/specification.rb +104 -0
  54. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  55. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  56. data/lib/mongoid/{callbacks.rb → interceptable.rb} +3 -52
  57. data/lib/mongoid/log_subscriber.rb +22 -0
  58. data/lib/mongoid/matchable.rb +152 -0
  59. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  60. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  61. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  62. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  63. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  64. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  65. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  66. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  67. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  68. data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
  69. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  70. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  71. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  72. data/lib/mongoid/persistable.rb +212 -0
  73. data/lib/mongoid/persistable/creatable.rb +188 -0
  74. data/lib/mongoid/persistable/deletable.rb +148 -0
  75. data/lib/mongoid/persistable/destroyable.rb +55 -0
  76. data/lib/mongoid/persistable/incrementable.rb +36 -0
  77. data/lib/mongoid/persistable/logical.rb +38 -0
  78. data/lib/mongoid/persistable/poppable.rb +39 -0
  79. data/lib/mongoid/persistable/pullable.rb +55 -0
  80. data/lib/mongoid/persistable/pushable.rb +62 -0
  81. data/lib/mongoid/persistable/renamable.rb +35 -0
  82. data/lib/mongoid/persistable/savable.rb +52 -0
  83. data/lib/mongoid/persistable/settable.rb +33 -0
  84. data/lib/mongoid/persistable/unsettable.rb +36 -0
  85. data/lib/mongoid/persistable/updatable.rb +151 -0
  86. data/lib/mongoid/persistable/upsertable.rb +55 -0
  87. data/lib/mongoid/positional.rb +71 -0
  88. data/lib/mongoid/railtie.rb +32 -45
  89. data/lib/mongoid/railties/database.rake +12 -6
  90. data/lib/mongoid/relations.rb +3 -3
  91. data/lib/mongoid/relations/accessors.rb +13 -46
  92. data/lib/mongoid/relations/auto_save.rb +15 -36
  93. data/lib/mongoid/relations/binding.rb +0 -23
  94. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  95. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  96. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
  97. data/lib/mongoid/relations/builder.rb +1 -1
  98. data/lib/mongoid/relations/builders.rb +2 -2
  99. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  100. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
  101. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  102. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  103. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  104. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  105. data/lib/mongoid/relations/cascading.rb +3 -5
  106. data/lib/mongoid/relations/constraint.rb +1 -1
  107. data/lib/mongoid/relations/conversions.rb +1 -1
  108. data/lib/mongoid/relations/counter_cache.rb +39 -15
  109. data/lib/mongoid/relations/eager.rb +47 -0
  110. data/lib/mongoid/relations/eager/base.rb +57 -0
  111. data/lib/mongoid/relations/eager/belongs_to.rb +30 -0
  112. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +40 -0
  113. data/lib/mongoid/relations/eager/has_many.rb +37 -0
  114. data/lib/mongoid/relations/eager/has_one.rb +29 -0
  115. data/lib/mongoid/relations/embedded/batchable.rb +3 -4
  116. data/lib/mongoid/relations/embedded/many.rb +7 -27
  117. data/lib/mongoid/relations/macros.rb +2 -4
  118. data/lib/mongoid/relations/many.rb +30 -31
  119. data/lib/mongoid/relations/metadata.rb +6 -75
  120. data/lib/mongoid/relations/nested_builder.rb +2 -2
  121. data/lib/mongoid/relations/options.rb +1 -0
  122. data/lib/mongoid/relations/polymorphic.rb +0 -1
  123. data/lib/mongoid/relations/proxy.rb +10 -32
  124. data/lib/mongoid/relations/referenced/in.rb +2 -18
  125. data/lib/mongoid/relations/referenced/many.rb +9 -22
  126. data/lib/mongoid/relations/referenced/many_to_many.rb +10 -33
  127. data/lib/mongoid/relations/referenced/one.rb +2 -21
  128. data/lib/mongoid/relations/synchronization.rb +3 -3
  129. data/lib/mongoid/relations/touchable.rb +33 -0
  130. data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
  131. data/lib/mongoid/{scoping.rb → scopable.rb} +26 -3
  132. data/lib/mongoid/selectable.rb +59 -0
  133. data/lib/mongoid/{serialization.rb → serializable.rb} +10 -1
  134. data/lib/mongoid/sessions.rb +37 -345
  135. data/lib/mongoid/sessions/factory.rb +2 -0
  136. data/lib/mongoid/sessions/options.rb +176 -0
  137. data/lib/mongoid/sessions/storage_options.rb +140 -0
  138. data/lib/mongoid/sessions/thread_options.rb +19 -0
  139. data/lib/mongoid/sessions/validators/storage.rb +15 -1
  140. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  141. data/lib/mongoid/support/query_counter.rb +23 -0
  142. data/lib/mongoid/threaded.rb +0 -110
  143. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  144. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  145. data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
  146. data/lib/mongoid/{validations.rb → validatable.rb} +23 -9
  147. data/lib/mongoid/{validations → validatable}/associated.rb +3 -1
  148. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  149. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  150. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  151. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  152. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  153. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  154. data/lib/mongoid/{validations → validatable}/uniqueness.rb +3 -3
  155. data/lib/mongoid/version.rb +1 -1
  156. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +9 -13
  157. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  158. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  159. data/lib/rails/generators/mongoid_generator.rb +3 -40
  160. data/lib/rails/mongoid.rb +59 -57
  161. data/lib/support/ruby_version.rb +1 -1
  162. data/spec/app/models/account.rb +2 -6
  163. data/spec/app/models/acolyte.rb +1 -0
  164. data/spec/app/models/actor.rb +0 -1
  165. data/spec/app/models/address.rb +6 -1
  166. data/spec/app/models/animal.rb +1 -1
  167. data/spec/app/models/appointment.rb +2 -2
  168. data/spec/app/models/article.rb +1 -4
  169. data/spec/app/models/audio.rb +5 -0
  170. data/spec/app/models/author.rb +0 -2
  171. data/spec/app/models/band.rb +3 -2
  172. data/spec/app/models/bar.rb +1 -0
  173. data/spec/app/models/book.rb +1 -0
  174. data/spec/app/models/building.rb +0 -2
  175. data/spec/app/models/building_address.rb +0 -2
  176. data/spec/app/models/bus.rb +1 -1
  177. data/spec/app/models/canvas.rb +1 -1
  178. data/spec/app/models/contractor.rb +0 -2
  179. data/spec/app/models/country_code.rb +1 -1
  180. data/spec/app/models/definition.rb +2 -2
  181. data/spec/app/models/dragon.rb +4 -0
  182. data/spec/app/models/drug.rb +1 -3
  183. data/spec/app/models/dungeon.rb +4 -0
  184. data/spec/app/models/filesystem.rb +1 -0
  185. data/spec/app/models/fish.rb +0 -1
  186. data/spec/app/models/fruits.rb +6 -0
  187. data/spec/app/models/game.rb +0 -2
  188. data/spec/app/models/house.rb +0 -2
  189. data/spec/app/models/item.rb +1 -5
  190. data/spec/app/models/jar.rb +1 -1
  191. data/spec/app/models/label.rb +4 -4
  192. data/spec/app/models/login.rb +1 -1
  193. data/spec/app/models/movie.rb +1 -0
  194. data/spec/app/models/name.rb +3 -3
  195. data/spec/app/models/note.rb +1 -1
  196. data/spec/app/models/oscar.rb +1 -1
  197. data/spec/app/models/parent_doc.rb +1 -1
  198. data/spec/app/models/person.rb +13 -8
  199. data/spec/app/models/phone.rb +1 -3
  200. data/spec/app/models/player.rb +1 -1
  201. data/spec/app/models/post.rb +2 -1
  202. data/spec/app/models/quiz.rb +0 -3
  203. data/spec/app/models/record.rb +5 -5
  204. data/spec/app/models/registry.rb +1 -1
  205. data/spec/app/models/server.rb +1 -1
  206. data/spec/app/models/service.rb +3 -3
  207. data/spec/app/models/sound.rb +5 -0
  208. data/spec/app/models/template.rb +1 -1
  209. data/spec/app/models/title.rb +0 -1
  210. data/spec/app/models/track.rb +5 -5
  211. data/spec/app/models/tree.rb +1 -1
  212. data/spec/app/models/video.rb +0 -4
  213. data/spec/app/models/wiki_page.rb +1 -4
  214. data/spec/app/models/word.rb +3 -0
  215. data/spec/app/models/word_origin.rb +1 -1
  216. data/spec/config/mongoid.yml +7 -8
  217. data/spec/helpers.rb +18 -0
  218. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  219. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  220. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  221. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  222. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  223. data/spec/mongoid/atomic_spec.rb +19 -19
  224. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
  225. data/spec/mongoid/attributes/readonly_spec.rb +16 -16
  226. data/spec/mongoid/attributes_spec.rb +188 -434
  227. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +117 -148
  228. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  229. data/spec/mongoid/config/environment_spec.rb +3 -3
  230. data/spec/mongoid/config/options_spec.rb +6 -6
  231. data/spec/mongoid/config_spec.rb +24 -48
  232. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  233. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
  234. data/spec/mongoid/contextual/atomic_spec.rb +60 -56
  235. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  236. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  237. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  238. data/spec/mongoid/contextual/memory_spec.rb +94 -94
  239. data/spec/mongoid/contextual/mongo_spec.rb +225 -139
  240. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  241. data/spec/mongoid/copyable_spec.rb +56 -68
  242. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  243. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  244. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  245. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  246. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +31 -31
  247. data/spec/mongoid/criteria_spec.rb +530 -2207
  248. data/spec/mongoid/document_spec.rb +166 -120
  249. data/spec/mongoid/equality_spec.rb +22 -22
  250. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  251. data/spec/mongoid/errors/callback_spec.rb +3 -3
  252. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  253. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  254. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  255. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  256. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  257. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  258. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  259. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  260. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  261. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  262. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  263. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  264. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -3
  265. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  266. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  267. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  268. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  269. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  270. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  271. data/spec/mongoid/errors/mongoid_error_spec.rb +7 -7
  272. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  273. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  274. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  275. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  276. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  277. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  278. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  279. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  280. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  281. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  282. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  283. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  284. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  285. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  286. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  287. data/spec/mongoid/errors/validations_spec.rb +7 -7
  288. data/spec/mongoid/extensions/array_spec.rb +61 -61
  289. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  290. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  291. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  292. data/spec/mongoid/extensions/date_spec.rb +13 -13
  293. data/spec/mongoid/extensions/date_time_spec.rb +9 -9
  294. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  295. data/spec/mongoid/extensions/float_spec.rb +29 -15
  296. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  297. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  298. data/spec/mongoid/extensions/module_spec.rb +2 -2
  299. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  300. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  301. data/spec/mongoid/extensions/object_spec.rb +26 -26
  302. data/spec/mongoid/extensions/range_spec.rb +61 -12
  303. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  304. data/spec/mongoid/extensions/set_spec.rb +4 -4
  305. data/spec/mongoid/extensions/string_spec.rb +35 -46
  306. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  307. data/spec/mongoid/extensions/time_spec.rb +49 -49
  308. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  309. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  310. data/spec/mongoid/extensions_spec.rb +15 -0
  311. data/spec/mongoid/factory_spec.rb +15 -15
  312. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  313. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  314. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  315. data/spec/mongoid/fields/localized_spec.rb +23 -23
  316. data/spec/mongoid/fields/standard_spec.rb +12 -12
  317. data/spec/mongoid/fields_spec.rb +168 -209
  318. data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +62 -27
  319. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  320. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  321. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  322. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +105 -105
  323. data/spec/mongoid/log_subscriber_spec.rb +74 -0
  324. data/spec/mongoid/loggable_spec.rb +1 -1
  325. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  326. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  327. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  328. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  329. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  330. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  331. data/spec/mongoid/matchable/in_spec.rb +49 -0
  332. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  333. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  334. data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
  335. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  336. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  337. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  338. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  339. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  340. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  341. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  342. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  343. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  344. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  345. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  346. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  347. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  348. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  349. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  350. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  351. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  352. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  353. data/spec/mongoid/persistable_spec.rb +206 -0
  354. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +19 -14
  355. data/spec/mongoid/railties/document_spec.rb +2 -2
  356. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  357. data/spec/mongoid/relations/auto_save_spec.rb +36 -16
  358. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +6 -6
  359. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +2 -2
  360. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +3 -3
  361. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +12 -12
  362. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +6 -6
  363. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +9 -9
  364. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +6 -6
  365. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  366. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  367. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  368. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  369. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  370. data/spec/mongoid/relations/builders/referenced/in_spec.rb +22 -33
  371. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  372. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  373. data/spec/mongoid/relations/builders/referenced/one_spec.rb +11 -24
  374. data/spec/mongoid/relations/builders_spec.rb +21 -21
  375. data/spec/mongoid/relations/cascading/delete_spec.rb +7 -7
  376. data/spec/mongoid/relations/cascading/destroy_spec.rb +2 -2
  377. data/spec/mongoid/relations/cascading/nullify_spec.rb +2 -2
  378. data/spec/mongoid/relations/cascading/restrict_spec.rb +3 -3
  379. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  380. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  381. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  382. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  383. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  384. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  385. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +143 -0
  386. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  387. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  388. data/spec/mongoid/relations/eager_spec.rb +228 -0
  389. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  390. data/spec/mongoid/relations/embedded/in_spec.rb +55 -56
  391. data/spec/mongoid/relations/embedded/many_spec.rb +357 -367
  392. data/spec/mongoid/relations/embedded/one_spec.rb +98 -139
  393. data/spec/mongoid/relations/macros_spec.rb +108 -102
  394. data/spec/mongoid/relations/metadata_spec.rb +147 -241
  395. data/spec/mongoid/relations/options_spec.rb +1 -1
  396. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  397. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  398. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  399. data/spec/mongoid/relations/referenced/many_spec.rb +379 -522
  400. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +345 -417
  401. data/spec/mongoid/relations/referenced/one_spec.rb +148 -263
  402. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  403. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  404. data/spec/mongoid/relations/targets/enumerable_spec.rb +116 -116
  405. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  406. data/spec/mongoid/relations_spec.rb +16 -15
  407. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
  408. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +74 -126
  409. data/spec/mongoid/selectable_spec.rb +134 -0
  410. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +111 -82
  411. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  412. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  413. data/spec/mongoid/sessions/options_spec.rb +92 -0
  414. data/spec/mongoid/sessions_spec.rb +288 -177
  415. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  416. data/spec/mongoid/state_spec.rb +10 -10
  417. data/spec/mongoid/threaded_spec.rb +17 -70
  418. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  419. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  420. data/spec/mongoid/timestamps/updated/short_spec.rb +10 -10
  421. data/spec/mongoid/timestamps/updated_spec.rb +8 -12
  422. data/spec/mongoid/timestamps_spec.rb +7 -11
  423. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  424. data/spec/mongoid/{validations → validatable}/associated_spec.rb +18 -18
  425. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  426. data/spec/mongoid/{validations → validatable}/length_spec.rb +7 -7
  427. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  428. data/spec/mongoid/{validations → validatable}/presence_spec.rb +31 -38
  429. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +126 -183
  430. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  431. data/spec/mongoid_spec.rb +8 -8
  432. data/spec/rails/mongoid_spec.rb +72 -87
  433. data/spec/spec_helper.rb +19 -17
  434. metadata +261 -283
  435. data/lib/mongoid/atomic/positionable.rb +0 -73
  436. data/lib/mongoid/components.rb +0 -92
  437. data/lib/mongoid/config/inflections.rb +0 -6
  438. data/lib/mongoid/contextual/eager.rb +0 -158
  439. data/lib/mongoid/criterion/findable.rb +0 -179
  440. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  441. data/lib/mongoid/identity_map.rb +0 -163
  442. data/lib/mongoid/json.rb +0 -16
  443. data/lib/mongoid/matchers.rb +0 -32
  444. data/lib/mongoid/matchers/strategies.rb +0 -97
  445. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  446. data/lib/mongoid/nested_attributes.rb +0 -78
  447. data/lib/mongoid/observer.rb +0 -192
  448. data/lib/mongoid/paranoia.rb +0 -136
  449. data/lib/mongoid/persistence.rb +0 -357
  450. data/lib/mongoid/persistence/atomic.rb +0 -231
  451. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  452. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  453. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  454. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  455. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  456. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  457. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  458. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  459. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  460. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  461. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  462. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  463. data/lib/mongoid/persistence/deletion.rb +0 -31
  464. data/lib/mongoid/persistence/insertion.rb +0 -38
  465. data/lib/mongoid/persistence/modification.rb +0 -35
  466. data/lib/mongoid/persistence/operations.rb +0 -214
  467. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  468. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  469. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  470. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  471. data/lib/mongoid/persistence/operations/update.rb +0 -59
  472. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  473. data/lib/mongoid/persistence/upsertion.rb +0 -31
  474. data/lib/mongoid/unit_of_work.rb +0 -61
  475. data/lib/mongoid/versioning.rb +0 -217
  476. data/lib/rack/mongoid.rb +0 -2
  477. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  478. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  479. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  480. data/spec/app/models/actor_observer.rb +0 -15
  481. data/spec/app/models/callback_recorder.rb +0 -25
  482. data/spec/app/models/draft.rb +0 -9
  483. data/spec/app/models/paranoid_phone.rb +0 -25
  484. data/spec/app/models/paranoid_post.rb +0 -36
  485. data/spec/app/models/phone_observer.rb +0 -6
  486. data/spec/mongoid/#atomic_spec.rb# +0 -365
  487. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  488. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  489. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  490. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  491. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  492. data/spec/mongoid/identity_map_spec.rb +0 -564
  493. data/spec/mongoid/json_spec.rb +0 -33
  494. data/spec/mongoid/matchers/in_spec.rb +0 -25
  495. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  496. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  497. data/spec/mongoid/observer_spec.rb +0 -290
  498. data/spec/mongoid/paranoia_spec.rb +0 -759
  499. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  500. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  501. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  502. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  503. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  504. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  505. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  506. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  507. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  508. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  509. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  510. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  511. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  512. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  513. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  514. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  515. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  516. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  517. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  518. data/spec/mongoid/persistence_spec.rb +0 -2279
  519. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  520. data/spec/mongoid/versioning_spec.rb +0 -540
  521. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -1,90 +1,18 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/sessions/factory"
3
3
  require "mongoid/sessions/validators"
4
+ require "mongoid/sessions/storage_options"
5
+ require "mongoid/sessions/thread_options"
6
+ require "mongoid/sessions/options"
4
7
 
5
8
  module Mongoid
6
9
  module Sessions
7
10
  extend ActiveSupport::Concern
8
-
9
- included do
10
- cattr_accessor :default_collection_name, :storage_options
11
- self.default_collection_name = self.name.collectionize.to_sym
12
- end
13
-
14
- # Get the collection for this model from the session. Will check for an
15
- # overridden collection name from the store_in macro or the collection
16
- # with a pluralized model name.
17
- #
18
- # @example Get the model's collection.
19
- # Model.collection
20
- #
21
- # @return [ Moped::Collection ] The collection.
22
- #
23
- # @since 3.0.0
24
- def collection
25
- self.class.collection
26
- end
27
-
28
- # Get the name of the collection this model persists to. This will be
29
- # either the pluralized class name or the option defined in the store_in
30
- # macro.
31
- #
32
- # @example Get the collection name.
33
- # Model.collection_name
34
- #
35
- # @return [ String ] The name of the collection.
36
- #
37
- # @since 3.0.0
38
- def collection_name
39
- self.class.collection_name
40
- end
41
-
42
- # Get the session for this model. This is determined in the following order:
43
- #
44
- # 1. Any custom configuration provided by the 'store_in' macro.
45
- # 2. The 'default' session as provided in the mongoid.yml
46
- #
47
- # @example Get the session.
48
- # model.mongo_session
49
- #
50
- # @return [ Moped::Session ] The default moped session.
51
- #
52
- # @since 3.0.0
53
- def mongo_session
54
- self.class.mongo_session
55
- end
56
-
57
- # Tell the next persistance operation to store in a specific collection,
58
- # database or session.
59
- #
60
- # @example Save the current document to a different collection.
61
- # model.with(collection: "secondary").save
62
- #
63
- # @example Save the current document to a different database.
64
- # model.with(database: "secondary").save
65
- #
66
- # @example Save the current document to a different session.
67
- # model.with(session: "replica_set").save
68
- #
69
- # @example Save with a combination of options.
70
- # model.with(session: "sharded", database: "secondary").save
71
- #
72
- # @param [ Hash ] options The storage options.
73
- #
74
- # @option options [ String, Symbol ] :collection The collection name.
75
- # @option options [ String, Symbol ] :database The database name.
76
- # @option options [ String, Symbol ] :session The session name.
77
- #
78
- # @return [ Document ] The current document.
79
- #
80
- # @since 3.0.0
81
- def with(options)
82
- Threaded.set_persistence_options(self.class, options)
83
- self
84
- end
11
+ include StorageOptions
12
+ include ThreadOptions
13
+ include Options
85
14
 
86
15
  class << self
87
-
88
16
  # Clear all sessions from the current thread.
89
17
  #
90
18
  # @example Clear all sessions.
@@ -138,79 +66,29 @@ module Mongoid
138
66
  end
139
67
  end
140
68
 
141
- module ClassMethods
142
-
143
- # Clear all persistence options from the current thread.
144
- #
145
- # @example Clear the persistence options.
146
- # Mongoid::Sessions.clear_persistence_options
147
- #
148
- # @return [ true ] True.
149
- #
150
- # @since 3.0.0
151
- def clear_persistence_options
152
- Threaded.clear_persistence_options(self)
153
- end
154
-
155
- # Get the collection for this model from the session. Will check for an
156
- # overridden collection name from the store_in macro or the collection
157
- # with a pluralized model name.
158
- #
159
- # @example Get the model's collection.
160
- # Model.collection
161
- #
162
- # @return [ Moped::Collection ] The collection.
163
- #
164
- # @since 3.0.0
165
- def collection
166
- if opts = persistence_options
167
- coll = mongo_session.with(opts)[opts[:collection] || collection_name]
168
- clear_persistence_options unless validating_with_query? || _loading_revision?
169
- coll
170
- else
171
- mongo_session[collection_name]
172
- end
173
- end
69
+ # Get the collection for this model from the session. Will check for an
70
+ # overridden collection name from the store_in macro or the collection
71
+ # with a pluralized model name.
72
+ #
73
+ # @example Get the model's collection.
74
+ # Model.collection
75
+ #
76
+ # @return [ Moped::Collection ] The collection.
77
+ #
78
+ # @since 3.0.0
79
+ def collection
80
+ mongo_session[collection_name]
81
+ end
174
82
 
175
- # Get the name of the collection this model persists to. This will be
176
- # either the pluralized class name or the option defined in the store_in
177
- # macro.
178
- #
179
- # @example Get the collection name.
180
- # Model.collection_name
181
- #
182
- # @return [ Symbol ] The name of the collection.
183
- #
184
- # @since 3.0.0
185
- def collection_name
186
- __collection_name__
187
- end
83
+ def mongo_session
84
+ super || self.class.mongo_session
85
+ end
188
86
 
189
- # Get the default database name for this model.
190
- #
191
- # @example Get the default database name.
192
- # Model.database_name
193
- #
194
- # @return [ Symbol ] The name of the database.
195
- #
196
- # @since 3.0.0
197
- def database_name
198
- __database_name__
199
- end
87
+ def collection_name
88
+ super || self.class.collection_name
89
+ end
200
90
 
201
- # Get the overridden database name. This either can be overridden by
202
- # using +Model.with+ or by overriding at the global level via
203
- # +Mongoid.override_database(:name)+.
204
- #
205
- # @example Get the overridden database name.
206
- # Model.database_override
207
- #
208
- # @return [ String, Symbol ] The overridden database name.
209
- #
210
- # @since 3.0.0
211
- def database_override
212
- persistence_options.try { |opts| opts[:database] } || Threaded.database_override
213
- end
91
+ module ClassMethods
214
92
 
215
93
  # Get the session for this model. This is determined in the following order:
216
94
  #
@@ -224,209 +102,23 @@ module Mongoid
224
102
  #
225
103
  # @since 3.0.0
226
104
  def mongo_session
227
- session = __session__
228
- session.use(database_override || current_database_name(session))
229
- session
105
+ session = Sessions.with_name(session_name)
106
+ session.use(database_name)
107
+ self.persistence_options ? session.with(self.persistence_options) : session
230
108
  end
231
109
 
232
- # Get the persistence options from the current thread.
233
- #
234
- # @example Get the persistence options.
235
- # Model.persistence_options
236
- #
237
- # @return [ Hash ] The persistence options.
238
- #
239
- # @since 3.0.0
240
- def persistence_options
241
- Threaded.persistence_options(self)
242
- end
243
-
244
- # Get the overridden session name. This either can be overridden by
245
- # using +Model.with+ or by overriding at the global level via
246
- # +Mongoid.override_session(:name)+.
247
- #
248
- # @example Get the overridden session name.
249
- # Model.session_override
250
- #
251
- # @return [ String, Symbol ] The overridden session name.
252
- #
253
- # @since 3.0.0
254
- def session_override
255
- persistence_options.try { |opts| opts[:session] } || Threaded.session_override
256
- end
257
-
258
- # Give this model specific custom default storage options.
259
- #
260
- # @example Store this model by default in "artists"
261
- # class Band
262
- # include Mongoid::Document
263
- # store_in collection: "artists"
264
- # end
265
- #
266
- # @example Store this model by default in the sharded db.
267
- # class Band
268
- # include Mongoid::Document
269
- # store_in database: "echo_shard"
270
- # end
271
- #
272
- # @example Store this model by default in a different session.
273
- # class Band
274
- # include Mongoid::Document
275
- # store_in session: "secondary"
276
- # end
277
- #
278
- # @example Store this model with a combination of options.
279
- # class Band
280
- # include Mongoid::Document
281
- # store_in collection: "artists", database: "secondary"
282
- # end
283
- #
284
- # @param [ Hash ] options The storage options.
285
- #
286
- # @option options [ String, Symbol ] :collection The collection name.
287
- # @option options [ String, Symbol ] :database The database name.
288
- # @option options [ String, Symbol ] :session The session name.
289
- #
290
- # @return [ Class ] The model class.
291
- #
292
- # @since 3.0.0
293
- def store_in(options)
294
- Validators::Storage.validate(self, options)
295
- self.storage_options ||= {}
296
- self.storage_options.merge!(options)
297
- end
298
-
299
- # Tell the next persistance operation to store in a specific collection,
300
- # database or session.
301
- #
302
- # @example Create a document in a different collection.
303
- # Model.with(collection: "secondary").create(name: "test")
304
- #
305
- # @example Create a document in a different database.
306
- # Model.with(database: "secondary").create(name: "test")
307
- #
308
- # @example Create a document in a different session.
309
- # Model.with(session: "secondary").create(name: "test")
310
- #
311
- # @example Create with a combination of options.
312
- # Model.with(session: "sharded", database: "secondary").create
313
- #
314
- # @param [ Hash ] options The storage options.
315
- #
316
- # @option options [ String, Symbol ] :collection The collection name.
317
- # @option options [ String, Symbol ] :database The database name.
318
- # @option options [ String, Symbol ] :session The session name.
319
- #
320
- # @return [ Class ] The model class.
321
- #
322
- # @since 3.0.0
323
- def with(options)
324
- Threaded.set_persistence_options(self, options)
325
- self
326
- end
327
-
328
- private
329
-
330
- # Get the name of the collection this model persists to.
331
- #
332
- # @example Get the collection name.
333
- # Model.__collection_name__
334
- #
335
- # @return [ Symbol ] The name of the collection.
336
- #
337
- # @since 3.0.0
338
- def __collection_name__
339
- if storage_options && name = storage_options[:collection]
340
- __evaluate__(name)
341
- else
342
- default_collection_name
343
- end
344
- end
345
-
346
- # Get the database name for the model.
347
- #
348
- # @example Get the database name.
349
- # Model.__database_name__
350
- #
351
- # @return [ Symbol ] The name of the database.
352
- #
353
- # @since 3.0.0
354
- def __database_name__
355
- if storage_options && name = storage_options[:database]
356
- __evaluate__(name)
357
- else
358
- Mongoid.sessions[__session_name__][:database]
359
- end
360
- end
361
-
362
- # Get the session name for the model.
363
- #
364
- # @example Get the session name.
365
- # Model.__session_name__
366
- #
367
- # @return [ Symbol ] The name of the session.
368
- #
369
- # @since 3.0.0
370
- def __session_name__
371
- if storage_options && name = storage_options[:session]
372
- __evaluate__(name)
373
- else
374
- :default
375
- end
376
- end
377
-
378
- # Get the session for this class.
110
+ # Get the collection for this model from the session. Will check for an
111
+ # overridden collection name from the store_in macro or the collection
112
+ # with a pluralized model name.
379
113
  #
380
- # @example Get the session.
381
- # Model.__session__
114
+ # @example Get the model's collection.
115
+ # Model.collection
382
116
  #
383
- # @return [ Moped::Session ] The moped session.
117
+ # @return [ Moped::Collection ] The collection.
384
118
  #
385
119
  # @since 3.0.0
386
- def __session__
387
- if !(name = session_override).nil?
388
- Sessions.with_name(name)
389
- else
390
- Sessions.with_name(__session_name__)
391
- end
392
- end
393
-
394
- # Eval the provided value, either byt calling it if it responds to call
395
- # or returning the value itself.
396
- #
397
- # @api private
398
- #
399
- # @example Evaluate the name.
400
- # Model.__evaluate__(:name)
401
- #
402
- # @param [ String, Symbol, Proc ] name The name.
403
- #
404
- # @return [ Symbol ] The value as a symbol.
405
- #
406
- # @since 3.1.0
407
- def __evaluate__(name)
408
- name.respond_to?(:call) ? name.call.to_sym : name.to_sym
409
- end
410
-
411
- # Get the name of the current database to use. Will check for a session
412
- # override with a database first, then database name.
413
- #
414
- # @api private
415
- #
416
- # @example Get the current database name.
417
- # Model.current_database_name
418
- #
419
- # @param [ Moped::Session ] session The current session.
420
- #
421
- # @return [ Symbol ] The current database name.
422
- #
423
- # @since 3.1.0
424
- def current_database_name(session)
425
- if session_override && name = session.options[:database]
426
- name
427
- else
428
- database_name
429
- end
120
+ def collection
121
+ mongo_session[collection_name]
430
122
  end
431
123
  end
432
124
  end
@@ -61,6 +61,8 @@ module Mongoid
61
61
  raise Errors::NoSessionsConfig.new unless configuration
62
62
  config, options = parse(configuration)
63
63
  configuration.merge!(config) if configuration.delete(:uri)
64
+
65
+ options[:instrumenter] = ActiveSupport::Notifications
64
66
  session = Moped::Session.new(config[:hosts], options)
65
67
  session.use(config[:database])
66
68
  if authenticated?(config)
@@ -0,0 +1,176 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Sessions
4
+ module Options
5
+ extend ActiveSupport::Concern
6
+
7
+ # Tell the next persistance operation to store in a specific collection,
8
+ # database or session.
9
+ #
10
+ # @example Save the current document to a different collection.
11
+ # model.with(collection: "secondary").save
12
+ #
13
+ # @example Save the current document to a different database.
14
+ # model.with(database: "secondary").save
15
+ #
16
+ # @example Save the current document to a different session.
17
+ # model.with(session: "replica_set").save
18
+ #
19
+ # @example Save with a combination of options.
20
+ # model.with(session: "sharded", database: "secondary").save
21
+ #
22
+ # @param [ Hash ] options The storage options.
23
+ #
24
+ # @option options [ String, Symbol ] :collection The collection name.
25
+ # @option options [ String, Symbol ] :database The database name.
26
+ # @option options [ String, Symbol ] :session The session name.
27
+ #
28
+ # @return [ Document ] The current document.
29
+ #
30
+ # @since 3.0.0
31
+ def with(options)
32
+ @persistence_options = options
33
+ self
34
+ end
35
+
36
+ def persistence_options
37
+ @persistence_options
38
+ end
39
+
40
+ def mongo_session
41
+ if persistence_options
42
+ session_name = persistence_options[:session] || self.class.session_name
43
+ Sessions.with_name(session_name).with(persistence_options)
44
+ end
45
+ end
46
+
47
+ def collection_name
48
+ if persistence_options && v = persistence_options[:collection]
49
+ return v.to_sym
50
+ end
51
+ end
52
+
53
+ module Threaded
54
+
55
+ # Get the persistence options for the current thread.
56
+ #
57
+ # @example Get the persistence options.
58
+ # Threaded.persistence_options(Band)
59
+ #
60
+ # @param [ Class ] klass The model class.
61
+ #
62
+ # @return [ Hash ] The current persistence options.
63
+ #
64
+ # @since 4.0.0
65
+ def persistence_options(klass = self)
66
+ Thread.current["[mongoid][#{klass}]:persistence-options"]
67
+ end
68
+
69
+ private
70
+ # Set the persistence options on the current thread.
71
+ #
72
+ # @api private
73
+ #
74
+ # @example Set the persistence options.
75
+ # Threaded.set_persistence_options(Band, { safe: { fsync: true }})
76
+ #
77
+ # @param [ Class ] klass The model class.
78
+ # @param [ Hash ] options The persistence options.
79
+ #
80
+ # @return [ Hash ] The persistence options.
81
+ #
82
+ # @since 4.0.0
83
+ def set_persistence_options(klass, options)
84
+ Thread.current["[mongoid][#{klass}]:persistence-options"] = options
85
+ end
86
+ end
87
+
88
+ module ClassMethods
89
+ include Threaded
90
+
91
+ def session_name
92
+ if persistence_options && v = persistence_options[:session]
93
+ return v.to_sym
94
+ end
95
+ super
96
+ end
97
+
98
+ def collection_name
99
+ if persistence_options && v = persistence_options[:collection]
100
+ return v.to_sym
101
+ end
102
+ super
103
+ end
104
+
105
+ def database_name
106
+ if persistence_options && v = persistence_options[:database]
107
+ return v.to_sym
108
+ end
109
+ super
110
+ end
111
+
112
+ # Tell the next persistance operation to store in a specific collection,
113
+ # database or session.
114
+ #
115
+ # @example Create a document in a different collection.
116
+ # Model.with(collection: "secondary").create(name: "test")
117
+ #
118
+ # @example Create a document in a different database.
119
+ # Model.with(database: "secondary").create(name: "test")
120
+ #
121
+ # @example Create a document in a different session.
122
+ # Model.with(session: "secondary").create(name: "test")
123
+ #
124
+ # @example Create with a combination of options.
125
+ # Model.with(session: "sharded", database: "secondary").create
126
+ #
127
+ # @param [ Hash ] options The storage options.
128
+ #
129
+ # @option options [ String, Symbol ] :collection The collection name.
130
+ # @option options [ String, Symbol ] :database The database name.
131
+ # @option options [ String, Symbol ] :session The session name.
132
+ #
133
+ # @return [ Class ] The model class.
134
+ #
135
+ # @since 3.0.0
136
+ def with(options)
137
+ Proxy.new(self, (persistence_options || {}).merge(options))
138
+ end
139
+ end
140
+
141
+ class Proxy < BasicObject
142
+ include Threaded
143
+
144
+ undef_method :==
145
+
146
+ def initialize(target, options)
147
+ @target = target
148
+ @options = options
149
+ end
150
+
151
+ def persistence_options
152
+ @options
153
+ end
154
+
155
+ def respond_to?(*args)
156
+ @target.respond_to?(*args)
157
+ end
158
+
159
+ def method_missing(name, *args, &block)
160
+ set_persistence_options(@target, @options)
161
+ @target.send(name, *args, &block)
162
+ ensure
163
+ set_persistence_options(@target, nil)
164
+ end
165
+
166
+ def send(symbol, *args)
167
+ __send__(symbol, *args)
168
+ end
169
+
170
+ def self.const_missing(name)
171
+ ::Object.const_get(name)
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end