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
@@ -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
@@ -2,7 +2,9 @@
2
2
  module Mongoid
3
3
 
4
4
  # This module contains behaviour for adding shard key fields to updates.
5
- module Sharding
5
+ #
6
+ # @since 4.0.0
7
+ module Shardable
6
8
  extend ActiveSupport::Concern
7
9
 
8
10
  included do
@@ -18,6 +20,8 @@ module Mongoid
18
20
  # model.shard_key_fields
19
21
  #
20
22
  # @return [ Array<String> ] The shard key field names.
23
+ #
24
+ # @since 1.0.0
21
25
  def shard_key_fields
22
26
  self.class.shard_key_fields
23
27
  end
@@ -3,7 +3,7 @@ module Mongoid
3
3
 
4
4
  # This module contains the behaviour for getting the various states a
5
5
  # document can transition through.
6
- module State
6
+ module Stateful
7
7
 
8
8
  attr_writer :destroyed, :flagged_for_destroy, :new_record
9
9
 
@@ -70,6 +70,18 @@ module Mongoid
70
70
  !_parent.delayed_atomic_sets[atomic_path]
71
71
  end
72
72
 
73
+ # Is the document readonly?
74
+ #
75
+ # @example Is the document readonly?
76
+ # document.readonly?
77
+ #
78
+ # @return [ true, false ] If the document is readonly.
79
+ #
80
+ # @since 4.0.0
81
+ def readonly?
82
+ __selected_fields != nil
83
+ end
84
+
73
85
  # Determine if the document can be set.
74
86
  #
75
87
  # @example Is this settable?
@@ -0,0 +1,23 @@
1
+ module Mongoid
2
+
3
+ class QueryCounter
4
+ attr_reader :events
5
+
6
+ def initialize
7
+ @events = []
8
+ end
9
+
10
+ def instrument
11
+ subscriber = ActiveSupport::Notifications.subscribe('query.moped') do |*args|
12
+ @events << ActiveSupport::Notifications::Event.new(*args)
13
+ end
14
+ yield
15
+ ensure
16
+ ActiveSupport::Notifications.unsubscribe(subscriber)
17
+ end
18
+
19
+ def inspect
20
+ @events.map { |e| e.payload[:ops].map(&:log_inspect) }.join("\n")
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ namespace :db do
2
+ namespace :mongoid do
3
+ task :load_models do
4
+ end
5
+
6
+ desc "Create the indexes defined on your mongoid models"
7
+ task :create_indexes => [:environment, :load_models] do
8
+ ::Mongoid::Tasks::Database.create_indexes
9
+ end
10
+
11
+ desc "Remove indexes that exist in the database but aren't specified on the models"
12
+ task :remove_undefined_indexes => [:environment, :load_models] do
13
+ ::Mongoid::Tasks::Database.remove_undefined_indexes
14
+ end
15
+
16
+ desc "Remove the indexes defined on your mongoid models without questions!"
17
+ task :remove_indexes => [:environment, :load_models] do
18
+ ::Mongoid::Tasks::Database.remove_indexes
19
+ end
20
+
21
+ desc "Drops the default session"
22
+ task :drop => :environment do
23
+ ::Mongoid::Sessions.default.drop
24
+ end
25
+
26
+ desc "Drop all collections except the system collections"
27
+ task :purge => :environment do
28
+ ::Mongoid.purge!
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,107 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Tasks
4
+ module Database
5
+ extend self
6
+
7
+ # Create indexes for each model given the provided globs and the class is
8
+ # not embedded.
9
+ #
10
+ # @example Create all the indexes.
11
+ # Mongoid::Tasks::Database.create_indexes
12
+ #
13
+ # @return [ Array<Class> ] The indexed models.
14
+ #
15
+ # @since 2.1.0
16
+ def create_indexes(models = ::Mongoid.models)
17
+ models.each do |model|
18
+ next if model.index_specifications.empty?
19
+ if !model.embedded? || model.cyclic?
20
+ model.create_indexes
21
+ logger.info("MONGOID: Created indexes on #{model}:")
22
+ model.index_specifications.each do |spec|
23
+ logger.info("MONGOID: Index: #{spec.key}, Options: #{spec.options}")
24
+ end
25
+ model
26
+ else
27
+ logger.info("MONGOID: Index ignored on: #{model}, please define in the root model.")
28
+ nil
29
+ end
30
+ end.compact
31
+ end
32
+
33
+ # Return the list of indexes by model that exist in the database but aren't
34
+ # specified on the models.
35
+ #
36
+ # @example Return the list of unused indexes.
37
+ # Mongoid::Tasks::Database.undefined_indexes
38
+ #
39
+ # @return Hash{Class => Array(Hash)} The list of undefined indexes by model.
40
+ def undefined_indexes(models = ::Mongoid.models)
41
+ undefined_by_model = {}
42
+
43
+ models.each do |model|
44
+ unless model.embedded?
45
+ model.collection.indexes.each do |index|
46
+ # ignore default index
47
+ unless index['name'] == '_id_'
48
+ key = index['key'].symbolize_keys
49
+ spec = model.index_specification(key)
50
+ unless spec
51
+ # index not specified
52
+ undefined_by_model[model] ||= []
53
+ undefined_by_model[model] << index
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ undefined_by_model
61
+ end
62
+
63
+ # Remove indexes that exist in the database but aren't specified on the
64
+ # models.
65
+ #
66
+ # @example Remove undefined indexes.
67
+ # Mongoid::Tasks::Database.remove_undefined_indexes
68
+ #
69
+ # @return [ Hash{Class => Array(Hash)}] The list of indexes that were removed by model.
70
+ #
71
+ # @since 4.0.0
72
+ def remove_undefined_indexes(models = ::Mongoid.models)
73
+ undefined_indexes(models).each do |model, indexes|
74
+ indexes.each do |index|
75
+ key = index['key'].symbolize_keys
76
+ model.collection.indexes.drop(key)
77
+ logger.info("MONGOID: Removing index: #{index['name']} on #{model}.")
78
+ end
79
+ end
80
+ end
81
+
82
+ # Remove indexes for each model given the provided globs and the class is
83
+ # not embedded.
84
+ #
85
+ # @example Remove all the indexes.
86
+ # Mongoid::Tasks::Database.remove_indexes
87
+ #
88
+ # @return [ Array<Class> ] The un-indexed models.
89
+ #
90
+ def remove_indexes(models = ::Mongoid.models)
91
+ models.each do |model|
92
+ next if model.embedded?
93
+ indexes = model.collection.indexes.map{ |doc| doc["name"] }
94
+ indexes.delete_one("_id_")
95
+ model.remove_indexes
96
+ logger.info("MONGOID: Removing indexes on: #{model} for: #{indexes.join(', ')}.")
97
+ model
98
+ end.compact
99
+ end
100
+
101
+ private
102
+ def logger
103
+ @logger ||= Logger.new($stdout)
104
+ end
105
+ end
106
+ end
107
+ end
@@ -139,23 +139,6 @@ module Mongoid
139
139
  Threaded.executing?("load")
140
140
  end
141
141
 
142
- # Execute a block in loading revision mode.
143
- #
144
- # @example Execute in loading revision mode.
145
- # _loading_revision do
146
- # load_revision
147
- # end
148
- #
149
- # @return [ Object ] The return value of the block.
150
- #
151
- # @since 2.3.4
152
- def _loading_revision
153
- Threaded.begin_execution("load_revision")
154
- yield
155
- ensure
156
- Threaded.exit_execution("load_revision")
157
- end
158
-
159
142
  module ClassMethods
160
143
 
161
144
  # Execute a block in creating mode.
@@ -175,17 +158,6 @@ module Mongoid
175
158
  Threaded.exit_execution("create")
176
159
  end
177
160
 
178
- # Is the current thread in loading revision mode?
179
- #
180
- # @example Is the current thread in loading revision mode?
181
- # proxy._loading_revision?
182
- #
183
- # @return [ true, false ] If the thread is loading a revision.
184
- #
185
- # @since 2.3.4
186
- def _loading_revision?
187
- Threaded.executing?("load_revision")
188
- end
189
161
  end
190
162
  end
191
163
  end