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,402 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Criteria do
4
-
5
- describe "#update" do
6
-
7
- let!(:person) do
8
- Person.create!(title: "Sir")
9
- end
10
-
11
- let!(:address_one) do
12
- person.addresses.create(street: "Oranienstr")
13
- end
14
-
15
- let!(:address_two) do
16
- person.addresses.create(street: "Wienerstr")
17
- end
18
-
19
- context "when updating the root document" do
20
-
21
- context "when updating with a criteria" do
22
-
23
- before do
24
- Person.where(title: "Sir").update(title: "Madam")
25
- end
26
-
27
- it "updates all the matching documents" do
28
- person.reload.title.should eq("Madam")
29
- end
30
- end
31
-
32
- context "when updating all directly" do
33
-
34
- before do
35
- Person.update(title: "Madam")
36
- end
37
-
38
- it "updates all the matching documents" do
39
- person.reload.title.should eq("Madam")
40
- end
41
- end
42
- end
43
-
44
- context "when updating an embedded document" do
45
-
46
- before do
47
- Person.where(title: "Sir").update(
48
- "addresses.0.city" => "Berlin"
49
- )
50
- end
51
-
52
- let!(:from_db) do
53
- Person.first
54
- end
55
-
56
- it "updates all the matching documents" do
57
- from_db.addresses.first.city.should eq("Berlin")
58
- end
59
-
60
- it "does not update non matching documents" do
61
- from_db.addresses.last.city.should be_nil
62
- end
63
- end
64
-
65
- context "when updating a relation" do
66
-
67
- context "when the relation is an embeds many" do
68
-
69
- let(:from_db) do
70
- Person.first
71
- end
72
-
73
- context "when updating the relation directly" do
74
-
75
- before do
76
- person.addresses.update(city: "London")
77
- end
78
-
79
- it "updates the first document" do
80
- from_db.addresses.first.city.should eq("London")
81
- end
82
-
83
- it "does not update the last document" do
84
- from_db.addresses.last.city.should be_nil
85
- end
86
- end
87
-
88
- context "when updating the relation through a criteria" do
89
-
90
- before do
91
- person.addresses.where(street: "Oranienstr").update(city: "Berlin")
92
- end
93
-
94
- it "updates the matching documents" do
95
- from_db.addresses.first.city.should eq("Berlin")
96
- end
97
-
98
- it "does not update non matching documents" do
99
- from_db.addresses.last.city.should be_nil
100
- end
101
- end
102
- end
103
-
104
- context "when the relation is a references many" do
105
-
106
- let!(:post_one) do
107
- person.posts.create(title: "First")
108
- end
109
-
110
- let!(:post_two) do
111
- person.posts.create(title: "Second")
112
- end
113
-
114
- context "when updating the relation directly" do
115
-
116
- before do
117
- person.posts.update(title: "London")
118
- end
119
-
120
- let!(:from_db) do
121
- Person.first
122
- end
123
-
124
- it "updates the first document" do
125
- from_db.posts.first.title.should eq("London")
126
- end
127
-
128
- it "does not update the last document" do
129
- from_db.posts.last.title.should eq("Second")
130
- end
131
- end
132
-
133
- context "when updating the relation through a criteria" do
134
-
135
- before do
136
- person.posts.where(title: "First").update(title: "Berlin")
137
- end
138
-
139
- let!(:from_db) do
140
- Person.first
141
- end
142
-
143
- it "updates the matching documents" do
144
- from_db.posts.where(title: "Berlin").count.should eq(1)
145
- end
146
-
147
- it "does not update non matching documents" do
148
- from_db.posts.where(title: "Second").count.should eq(1)
149
- end
150
- end
151
- end
152
-
153
- context "when the relation is a references many to many" do
154
-
155
- let(:from_db) do
156
- Person.first
157
- end
158
-
159
- let!(:preference_one) do
160
- person.preferences.create(name: "First")
161
- end
162
-
163
- let!(:preference_two) do
164
- person.preferences.create(name: "Second")
165
- end
166
-
167
- context "when updating the relation directly" do
168
-
169
- before do
170
- person.preferences.update(name: "London")
171
- end
172
-
173
- it "updates the first document" do
174
- from_db.preferences.first.name.should eq("London")
175
- end
176
-
177
- it "does not update the last document" do
178
- from_db.preferences.last.name.should eq("Second")
179
- end
180
- end
181
-
182
- context "when updating the relation through a criteria" do
183
-
184
- before do
185
- person.preferences.where(name: "First").update(name: "Berlin")
186
- end
187
-
188
- it "updates the matching documents" do
189
- from_db.preferences.first.name.should eq("Berlin")
190
- end
191
-
192
- it "does not update non matching documents" do
193
- from_db.preferences.last.name.should eq("Second")
194
- end
195
- end
196
- end
197
- end
198
- end
199
-
200
- describe "#update_all" do
201
-
202
- let!(:person) do
203
- Person.create(title: "Sir")
204
- end
205
-
206
- let!(:address_one) do
207
- person.addresses.create(street: "Oranienstr")
208
- end
209
-
210
- let!(:address_two) do
211
- person.addresses.create(street: "Wienerstr")
212
- end
213
-
214
- context "when updating the root document" do
215
-
216
- context "when updating with a criteria" do
217
-
218
- let(:from_db) do
219
- Person.first
220
- end
221
-
222
- before do
223
- Person.where(title: "Sir").update_all(title: "Madam")
224
- end
225
-
226
- it "updates all the matching documents" do
227
- from_db.title.should eq("Madam")
228
- end
229
- end
230
-
231
- context "when updating all directly" do
232
-
233
- let(:from_db) do
234
- Person.first
235
- end
236
-
237
- before do
238
- Person.update_all(title: "Madam")
239
- end
240
-
241
- it "updates all the matching documents" do
242
- from_db.title.should eq("Madam")
243
- end
244
- end
245
- end
246
-
247
- context "when updating an embedded document" do
248
-
249
- before do
250
- Person.where(title: "Sir").update_all(
251
- "addresses.0.city" => "Berlin"
252
- )
253
- end
254
-
255
- let!(:from_db) do
256
- Person.first
257
- end
258
-
259
- it "updates all the matching documents" do
260
- from_db.addresses.first.city.should eq("Berlin")
261
- end
262
-
263
- it "does not update non matching documents" do
264
- from_db.addresses.last.city.should be_nil
265
- end
266
- end
267
-
268
- context "when updating a relation" do
269
-
270
- context "when the relation is an embeds many" do
271
-
272
- let(:from_db) do
273
- Person.first
274
- end
275
-
276
- context "when updating the relation directly" do
277
-
278
- before do
279
- person.addresses.update_all(city: "London")
280
- end
281
-
282
- it "updates the first document" do
283
- from_db.addresses.first.city.should eq("London")
284
- end
285
-
286
- it "updates the last document" do
287
- from_db.addresses.last.city.should eq("London")
288
- end
289
- end
290
-
291
- context "when updating the relation through a criteria" do
292
-
293
- before do
294
- person.addresses.where(street: "Oranienstr").update_all(city: "Berlin")
295
- end
296
-
297
- it "updates the matching documents" do
298
- from_db.addresses.first.city.should eq("Berlin")
299
- end
300
-
301
- it "does not update non matching documents" do
302
- from_db.addresses.last.city.should be_nil
303
- end
304
- end
305
- end
306
-
307
- context "when the relation is a references many" do
308
-
309
- let!(:post_one) do
310
- person.posts.create(title: "First")
311
- end
312
-
313
- let!(:post_two) do
314
- person.posts.create(title: "Second")
315
- end
316
-
317
- context "when updating the relation directly" do
318
-
319
- before do
320
- person.posts.update_all(title: "London")
321
- end
322
-
323
- let!(:from_db) do
324
- Person.first
325
- end
326
-
327
- it "updates the first document" do
328
- from_db.posts.first.title.should eq("London")
329
- end
330
-
331
- it "updates the last document" do
332
- from_db.posts.last.title.should eq("London")
333
- end
334
- end
335
-
336
- context "when updating the relation through a criteria" do
337
-
338
- before do
339
- person.posts.where(title: "First").update_all(title: "Berlin")
340
- end
341
-
342
- let!(:from_db) do
343
- Person.first
344
- end
345
-
346
- it "updates the matching documents" do
347
- from_db.posts.where(title: "Berlin").count.should eq(1)
348
- end
349
-
350
- it "does not update non matching documents" do
351
- from_db.posts.where(title: "Second").count.should eq(1)
352
- end
353
- end
354
- end
355
-
356
- context "when the relation is a references many to many" do
357
-
358
- let(:from_db) do
359
- Person.first
360
- end
361
-
362
- let!(:preference_one) do
363
- person.preferences.create(name: "First")
364
- end
365
-
366
- let!(:preference_two) do
367
- person.preferences.create(name: "Second")
368
- end
369
-
370
- context "when updating the relation directly" do
371
-
372
- before do
373
- person.preferences.update_all(name: "London")
374
- end
375
-
376
- it "updates the first document" do
377
- from_db.preferences.first.name.should eq("London")
378
- end
379
-
380
- it "updates the last document" do
381
- from_db.preferences.last.name.should eq("London")
382
- end
383
- end
384
-
385
- context "when updating the relation through a criteria" do
386
-
387
- before do
388
- person.preferences.where(name: "First").update_all(name: "Berlin")
389
- end
390
-
391
- it "updates the matching documents" do
392
- from_db.preferences.first.name.should eq("Berlin")
393
- end
394
-
395
- it "does not update non matching documents" do
396
- from_db.preferences.last.name.should eq("Second")
397
- end
398
- end
399
- end
400
- end
401
- end
402
- end
@@ -1,29 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Errors::VersioningNotOnRoot do
4
-
5
- describe "#message" do
6
-
7
- let(:error) do
8
- described_class.new(Address)
9
- end
10
-
11
- it "contains the problem in the message" do
12
- error.message.should include(
13
- "Versioning not allowed on embedded document: Address."
14
- )
15
- end
16
-
17
- it "contains the summary in the message" do
18
- error.message.should include(
19
- "Mongoid::Versioning behaviour is only allowed on documents"
20
- )
21
- end
22
-
23
- it "contains the resolution in the message" do
24
- error.message.should include(
25
- "Remove the versioning from the embedded Address"
26
- )
27
- end
28
- end
29
- end
@@ -1,564 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::IdentityMap do
4
-
5
- before(:all) do
6
- Mongoid.identity_map_enabled = true
7
- end
8
-
9
- after(:all) do
10
- Mongoid.identity_map_enabled = false
11
- end
12
-
13
- let(:identity_map) do
14
- described_class.new
15
- end
16
-
17
- describe "#clear" do
18
-
19
- before do
20
- identity_map.set(Person.new)
21
- end
22
-
23
- let!(:clear) do
24
- identity_map.clear
25
- end
26
-
27
- it "empties the identity map" do
28
- identity_map.should be_empty
29
- end
30
-
31
- it "returns an empty hash" do
32
- clear.should eq({})
33
- end
34
- end
35
-
36
- describe ".clear" do
37
-
38
- before do
39
- described_class.set(Person.new)
40
- end
41
-
42
- let!(:clear) do
43
- described_class.clear
44
- end
45
-
46
- it "returns an empty hash" do
47
- clear.should eq({})
48
- end
49
- end
50
-
51
- describe "#get" do
52
-
53
- context "normal model" do
54
- let!(:person) do
55
- Person.new
56
- end
57
-
58
- context "when getting by id" do
59
-
60
- context "when the document exists in the identity map" do
61
-
62
- before do
63
- identity_map.set(person)
64
- end
65
-
66
- let(:get) do
67
- identity_map.get(Person, person.id)
68
- end
69
-
70
- it "returns the matching person" do
71
- get.should eq(person)
72
- end
73
- end
74
-
75
- context "when the person does not exist in the map" do
76
-
77
- let(:get) do
78
- identity_map.get(Person, person.id)
79
- end
80
-
81
- it "returns nil" do
82
- get.should be_nil
83
- end
84
- end
85
- end
86
-
87
- context "when getting by an array of ids" do
88
-
89
- context "when the document exists in the identity map" do
90
-
91
- before do
92
- identity_map.set(person)
93
- end
94
-
95
- let(:get) do
96
- identity_map.get(Person, [ person.id ])
97
- end
98
-
99
- it "returns the matching documents" do
100
- get.should eq([ person ])
101
- end
102
- end
103
-
104
- context "when any id is not found in the map" do
105
-
106
- before do
107
- identity_map.set(person)
108
- end
109
-
110
- let(:get) do
111
- identity_map.get(Person, [ person.id, Moped::BSON::ObjectId.new ])
112
- end
113
-
114
- it "returns nil" do
115
- get.should be_nil
116
- end
117
- end
118
- end
119
- end
120
-
121
- context "inherited class" do
122
-
123
- let!(:document) do
124
- Firefox.new
125
- end
126
-
127
- context "when getting by id" do
128
-
129
- context "when the document exists in the identity map" do
130
-
131
- before do
132
- identity_map.set(document)
133
- end
134
-
135
- it "returns the matching document by class" do
136
- get = identity_map.get(Firefox, document.id)
137
- get.should eq(document)
138
- end
139
-
140
- it "returns the matching document by superclass" do
141
- get = identity_map.get(Browser, document.id)
142
- get.should eq(document)
143
- end
144
-
145
- it "returns the matching document by class" do
146
- get = identity_map.get(Canvas, document.id)
147
- get.should eq(document)
148
- end
149
- end
150
-
151
- context "when the document does not exist in the map" do
152
-
153
- let(:get) do
154
- identity_map.get(Firefox, document.id)
155
- end
156
-
157
- it "returns nil" do
158
- get.should be_nil
159
- end
160
- end
161
- end
162
- end
163
-
164
- context "embedded class" do
165
-
166
- let!(:animal) do
167
- circus = Circus.new(animals: [ Animal.new(name: "Lion") ])
168
- circus.animals.first
169
- end
170
-
171
- context "when getting by id" do
172
-
173
- context "when the document exists in the identity map" do
174
-
175
- before do
176
- identity_map.set(animal)
177
- end
178
-
179
- let(:get) do
180
- identity_map.get(Animal, animal.id)
181
- end
182
-
183
- it "returns the matching document" do
184
- get.should eq(animal)
185
- end
186
- end
187
-
188
- context "when the document does not exist in the map" do
189
-
190
- let(:get) do
191
- identity_map.get(Animal, animal.id)
192
- end
193
-
194
- it "returns nil" do
195
- get.should be_nil
196
- end
197
- end
198
- end
199
- end
200
- end
201
-
202
- describe ".get" do
203
-
204
- let(:document) do
205
- Person.new
206
- end
207
-
208
- context "when the document exists in the identity map" do
209
-
210
- before do
211
- described_class.set(document)
212
- end
213
-
214
- let(:get) do
215
- described_class.get(Person, document.id)
216
- end
217
-
218
- it "returns the matching document" do
219
- get.should eq(document)
220
- end
221
- end
222
-
223
- context "when the document does not exist in the map" do
224
-
225
- let(:get) do
226
- described_class.get(Person, document.id)
227
- end
228
-
229
- it "returns nil" do
230
- get.should be_nil
231
- end
232
- end
233
-
234
- context "when the mongoid identity map is disabled" do
235
-
236
- before do
237
- Mongoid.identity_map_enabled = false
238
- end
239
-
240
- after do
241
- Mongoid.identity_map_enabled = true
242
- end
243
-
244
- let(:get) do
245
- described_class.get(Person, document.id)
246
- end
247
-
248
- it "returns nil" do
249
- get.should be_nil
250
- end
251
- end
252
- end
253
-
254
- describe "#get_many" do
255
-
256
- let!(:person) do
257
- Person.new
258
- end
259
-
260
- context "when getting by selector" do
261
-
262
- let!(:post_one) do
263
- Post.new(person: person)
264
- end
265
-
266
- let!(:post_two) do
267
- Post.new(person: person)
268
- end
269
-
270
- context "when there are documents in the map" do
271
-
272
- before do
273
- identity_map.set_many(post_one, person_id: person.id)
274
- identity_map.set_many(post_two, person_id: person.id)
275
- end
276
-
277
- let(:documents) do
278
- identity_map.get_many(Post, person_id: person.id)
279
- end
280
-
281
- it "returns the matching documents" do
282
- documents.should eq([ post_one, post_two ])
283
- end
284
- end
285
-
286
- context "when there are no documents in the map" do
287
-
288
- let(:documents) do
289
- identity_map.get_many(Post, person_id: person.id)
290
- end
291
-
292
- it "returns nil" do
293
- documents.should be_nil
294
- end
295
- end
296
- end
297
- end
298
-
299
- describe "#remove" do
300
-
301
- let(:document) do
302
- Person.new
303
- end
304
-
305
- let!(:set) do
306
- identity_map.set(document)
307
- end
308
-
309
- context "when provided a document" do
310
-
311
- context "when the document has an id" do
312
-
313
- let!(:removed) do
314
- identity_map.remove(document)
315
- end
316
-
317
- it "deletes the document from the map" do
318
- identity_map.get(Person, document.id).should be_nil
319
- end
320
-
321
- it "returns the document" do
322
- removed.should eq(document)
323
- end
324
- end
325
-
326
- context "when the document has no id" do
327
-
328
- before do
329
- document.id = nil
330
- end
331
-
332
- let!(:removed) do
333
- identity_map.remove(document)
334
- end
335
-
336
- it "returns nil" do
337
- removed.should be_nil
338
- end
339
- end
340
- end
341
-
342
- context "when provided nil" do
343
-
344
- let!(:removed) do
345
- identity_map.remove(nil)
346
- end
347
-
348
- it "returns nil" do
349
- removed.should be_nil
350
- end
351
- end
352
- end
353
-
354
- describe "#set" do
355
-
356
- context "when setting a document" do
357
-
358
- context "when the identity map is enabled" do
359
-
360
- let(:document) do
361
- Person.new
362
- end
363
-
364
- let!(:set) do
365
- identity_map.set(document)
366
- end
367
-
368
- it "puts the object in the identity map" do
369
- identity_map.get(Person, document.id).should eq(document)
370
- end
371
-
372
- it "returns the document" do
373
- set.should eq(document)
374
- end
375
- end
376
-
377
- context "when the identity map is disabled" do
378
-
379
- before do
380
- Mongoid.identity_map_enabled = false
381
- end
382
-
383
- after do
384
- Mongoid.identity_map_enabled = true
385
- end
386
-
387
- let(:document) do
388
- Person.new
389
- end
390
-
391
- let!(:set) do
392
- identity_map.set(document)
393
- end
394
-
395
- it "does not put the object in the identity map" do
396
- identity_map.should be_empty
397
- end
398
-
399
- it "returns nil" do
400
- set.should be_nil
401
- end
402
- end
403
- end
404
-
405
- context "when setting a document with a nil id" do
406
-
407
- let(:document) do
408
- Person.new.tap do |person|
409
- person.id = nil
410
- end
411
- end
412
-
413
- let!(:set) do
414
- identity_map.set(document)
415
- end
416
-
417
- it "does not put the object in the identity map" do
418
- identity_map.get(nil, nil).should be_nil
419
- end
420
-
421
- it "returns nil" do
422
- set.should be_nil
423
- end
424
- end
425
-
426
- context "when setting nil" do
427
-
428
- let!(:set) do
429
- identity_map.set(nil)
430
- end
431
-
432
- it "places nothing in the map" do
433
- identity_map.should be_empty
434
- end
435
-
436
- it "returns nil" do
437
- set.should be_nil
438
- end
439
- end
440
- end
441
-
442
- describe "#set_many" do
443
-
444
- let!(:person) do
445
- Person.new
446
- end
447
-
448
- let!(:post_one) do
449
- Post.new(person: person)
450
- end
451
-
452
- let!(:post_two) do
453
- Post.new(person: person)
454
- end
455
-
456
- context "when no documents exist for the selector" do
457
-
458
- let!(:set) do
459
- identity_map.set_many(post_one, { person_id: person.id })
460
- identity_map.set_many(post_two, { person_id: person.id })
461
- end
462
-
463
- let(:documents) do
464
- identity_map[Post.collection_name][{ person_id: person.id }]
465
- end
466
-
467
- it "puts the documents in the map" do
468
- documents.should eq({
469
- post_one.id => post_one, post_two.id => post_two
470
- })
471
- end
472
- end
473
- end
474
-
475
- describe "#set_one" do
476
-
477
- let!(:person) do
478
- Person.new
479
- end
480
-
481
- let!(:post_one) do
482
- Post.new(person: person)
483
- end
484
-
485
- context "when no documents exist for the selector" do
486
-
487
- let!(:set) do
488
- identity_map.set_one(post_one, { person_id: person.id })
489
- end
490
-
491
- let(:document) do
492
- identity_map[Post.collection_name][{ person_id: person.id }]
493
- end
494
-
495
- it "puts the documents in the map" do
496
- document.should eq(post_one)
497
- end
498
- end
499
- end
500
-
501
- describe ".set" do
502
-
503
- context "when setting a document" do
504
-
505
- let(:document) do
506
- Person.new
507
- end
508
-
509
- let!(:set) do
510
- described_class.set(document)
511
- end
512
-
513
- it "puts the object in the identity map" do
514
- described_class.get(Person, document.id).should eq(document)
515
- end
516
-
517
- it "returns the document" do
518
- set.should eq(document)
519
- end
520
- end
521
-
522
- context "when setting nil" do
523
-
524
- let!(:set) do
525
- described_class.set(nil)
526
- end
527
-
528
- it "returns nil" do
529
- set.should be_nil
530
- end
531
- end
532
- end
533
-
534
- context "when accessing hash methods directly" do
535
-
536
- Hash.public_instance_methods(false).each do |method|
537
-
538
- it "can access #{method} at the class level" do
539
- described_class.should respond_to(method)
540
- end
541
- end
542
- end
543
-
544
- context "when executing in a fiber" do
545
-
546
- describe "#.get" do
547
-
548
- let(:document) do
549
- Person.new
550
- end
551
-
552
- let(:fiber) do
553
- Fiber.new do
554
- described_class.set(document)
555
- described_class.get(Person, document.id).should eq(document)
556
- end
557
- end
558
-
559
- it "gets the object from the identity map" do
560
- fiber.resume
561
- end
562
- end
563
- end
564
- end