mongoid 3.1.7 → 4.0.0

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 (562) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +423 -9
  3. data/README.md +5 -6
  4. data/lib/config/locales/en.yml +32 -18
  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 +1 -12
  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 +61 -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/mongo.rb +5 -9
  19. data/lib/mongoid/contextual/atomic.rb +53 -53
  20. data/lib/mongoid/contextual/geo_near.rb +1 -1
  21. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  22. data/lib/mongoid/contextual/memory.rb +18 -6
  23. data/lib/mongoid/contextual/mongo.rb +64 -56
  24. data/lib/mongoid/contextual/none.rb +90 -0
  25. data/lib/mongoid/contextual/text_search.rb +178 -0
  26. data/lib/mongoid/contextual.rb +2 -0
  27. data/lib/mongoid/copyable.rb +2 -3
  28. data/lib/mongoid/criteria/{#findable.rb# → findable.rb} +0 -2
  29. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  30. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  31. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  32. data/lib/mongoid/criteria/permission.rb +70 -0
  33. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  34. data/lib/mongoid/criteria.rb +39 -34
  35. data/lib/mongoid/document.rb +32 -17
  36. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  37. data/lib/mongoid/errors/document_not_found.rb +2 -1
  38. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  39. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  40. data/lib/mongoid/errors/invalid_value.rb +16 -0
  41. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  42. data/lib/mongoid/errors/readonly_document.rb +24 -0
  43. data/lib/mongoid/errors.rb +4 -1
  44. data/lib/mongoid/extensions/array.rb +3 -3
  45. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  46. data/lib/mongoid/extensions/boolean.rb +15 -17
  47. data/lib/mongoid/extensions/date.rb +1 -1
  48. data/lib/mongoid/extensions/date_time.rb +3 -3
  49. data/lib/mongoid/extensions/float.rb +2 -1
  50. data/lib/mongoid/extensions/hash.rb +3 -3
  51. data/lib/mongoid/extensions/integer.rb +1 -1
  52. data/lib/mongoid/extensions/object.rb +7 -7
  53. data/lib/mongoid/extensions/object_id.rb +5 -5
  54. data/lib/mongoid/extensions/range.rb +9 -3
  55. data/lib/mongoid/extensions/regexp.rb +1 -1
  56. data/lib/mongoid/extensions/set.rb +1 -1
  57. data/lib/mongoid/extensions/string.rb +6 -18
  58. data/lib/mongoid/extensions/symbol.rb +1 -1
  59. data/lib/mongoid/extensions/time.rb +3 -3
  60. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  61. data/lib/mongoid/extensions.rb +2 -7
  62. data/lib/mongoid/factory.rb +8 -6
  63. data/lib/mongoid/fields/foreign_key.rb +3 -3
  64. data/lib/mongoid/fields/localized.rb +1 -1
  65. data/lib/mongoid/fields/standard.rb +5 -17
  66. data/lib/mongoid/fields/validators/macro.rb +15 -5
  67. data/lib/mongoid/fields.rb +41 -8
  68. data/lib/mongoid/{finders.rb → findable.rb} +8 -2
  69. data/lib/mongoid/indexable/specification.rb +104 -0
  70. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  71. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  72. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  73. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  74. data/lib/mongoid/log_subscriber.rb +55 -0
  75. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  76. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  77. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  78. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  79. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  81. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  82. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  86. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  87. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  88. data/lib/mongoid/matchable.rb +152 -0
  89. data/lib/mongoid/persistable/creatable.rb +188 -0
  90. data/lib/mongoid/persistable/deletable.rb +149 -0
  91. data/lib/mongoid/persistable/destroyable.rb +60 -0
  92. data/lib/mongoid/persistable/incrementable.rb +36 -0
  93. data/lib/mongoid/persistable/logical.rb +38 -0
  94. data/lib/mongoid/persistable/poppable.rb +39 -0
  95. data/lib/mongoid/persistable/pullable.rb +55 -0
  96. data/lib/mongoid/persistable/pushable.rb +62 -0
  97. data/lib/mongoid/persistable/renamable.rb +35 -0
  98. data/lib/mongoid/persistable/savable.rb +52 -0
  99. data/lib/mongoid/persistable/settable.rb +33 -0
  100. data/lib/mongoid/persistable/unsettable.rb +36 -0
  101. data/lib/mongoid/persistable/updatable.rb +152 -0
  102. data/lib/mongoid/persistable/upsertable.rb +55 -0
  103. data/lib/mongoid/persistable.rb +216 -0
  104. data/lib/mongoid/positional.rb +71 -0
  105. data/lib/mongoid/query_cache.rb +247 -0
  106. data/lib/mongoid/railtie.rb +32 -45
  107. data/lib/mongoid/railties/database.rake +9 -25
  108. data/lib/mongoid/relations/accessors.rb +13 -49
  109. data/lib/mongoid/relations/auto_save.rb +15 -36
  110. data/lib/mongoid/relations/binding.rb +1 -24
  111. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  112. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  113. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
  115. data/lib/mongoid/relations/builder.rb +1 -1
  116. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  117. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
  118. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  119. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  120. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  121. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  122. data/lib/mongoid/relations/builders.rb +2 -2
  123. data/lib/mongoid/relations/cascading.rb +3 -5
  124. data/lib/mongoid/relations/constraint.rb +1 -1
  125. data/lib/mongoid/relations/conversions.rb +1 -1
  126. data/lib/mongoid/relations/counter_cache.rb +39 -15
  127. data/lib/mongoid/relations/eager/base.rb +149 -0
  128. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  129. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  130. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  131. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  134. data/lib/mongoid/relations/embedded/in.rb +4 -4
  135. data/lib/mongoid/relations/embedded/many.rb +14 -32
  136. data/lib/mongoid/relations/embedded/one.rb +1 -1
  137. data/lib/mongoid/relations/macros.rb +3 -4
  138. data/lib/mongoid/relations/many.rb +30 -31
  139. data/lib/mongoid/relations/marshalable.rb +3 -3
  140. data/lib/mongoid/relations/metadata.rb +14 -79
  141. data/lib/mongoid/relations/nested_builder.rb +2 -2
  142. data/lib/mongoid/relations/options.rb +1 -0
  143. data/lib/mongoid/relations/polymorphic.rb +0 -1
  144. data/lib/mongoid/relations/proxy.rb +21 -41
  145. data/lib/mongoid/relations/referenced/in.rb +4 -20
  146. data/lib/mongoid/relations/referenced/many.rb +19 -32
  147. data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
  148. data/lib/mongoid/relations/referenced/one.rb +6 -25
  149. data/lib/mongoid/relations/synchronization.rb +3 -3
  150. data/lib/mongoid/relations/touchable.rb +34 -1
  151. data/lib/mongoid/relations.rb +11 -25
  152. data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
  153. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  154. data/lib/mongoid/selectable.rb +59 -0
  155. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  156. data/lib/mongoid/sessions/factory.rb +2 -0
  157. data/lib/mongoid/sessions/options.rb +180 -0
  158. data/lib/mongoid/sessions/storage_options.rb +140 -0
  159. data/lib/mongoid/sessions/thread_options.rb +19 -0
  160. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  161. data/lib/mongoid/sessions.rb +37 -345
  162. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  163. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  164. data/lib/mongoid/support/query_counter.rb +23 -0
  165. data/lib/mongoid/tasks/database.rake +31 -0
  166. data/lib/mongoid/tasks/database.rb +107 -0
  167. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  168. data/lib/mongoid/threaded.rb +0 -157
  169. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  170. data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
  171. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  172. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  173. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  174. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  175. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  176. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  177. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  178. data/lib/mongoid/{validations → validatable}/uniqueness.rb +23 -19
  179. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  180. data/lib/mongoid/version.rb +1 -1
  181. data/lib/mongoid.rb +10 -76
  182. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
  183. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  184. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  185. data/lib/rails/generators/mongoid_generator.rb +3 -40
  186. data/lib/rails/mongoid.rb +0 -122
  187. data/lib/support/ruby_version.rb +1 -1
  188. data/spec/app/models/account.rb +2 -6
  189. data/spec/app/models/acolyte.rb +2 -1
  190. data/spec/app/models/actor.rb +0 -1
  191. data/spec/app/models/address.rb +8 -3
  192. data/spec/app/models/animal.rb +1 -1
  193. data/spec/app/models/appointment.rb +3 -3
  194. data/spec/app/models/article.rb +1 -4
  195. data/spec/app/models/audio.rb +5 -0
  196. data/spec/app/models/author.rb +0 -2
  197. data/spec/app/models/band.rb +3 -2
  198. data/spec/app/models/bar.rb +1 -0
  199. data/spec/app/models/book.rb +1 -0
  200. data/spec/app/models/building.rb +0 -2
  201. data/spec/app/models/building_address.rb +0 -2
  202. data/spec/app/models/bus.rb +1 -1
  203. data/spec/app/models/canvas.rb +1 -1
  204. data/spec/app/models/contractor.rb +0 -2
  205. data/spec/app/models/country_code.rb +1 -1
  206. data/spec/app/models/definition.rb +2 -2
  207. data/spec/app/models/dog.rb +1 -1
  208. data/spec/app/models/dragon.rb +4 -0
  209. data/spec/app/models/drug.rb +1 -3
  210. data/spec/app/models/dungeon.rb +4 -0
  211. data/spec/app/models/edit.rb +5 -0
  212. data/spec/app/models/even.rb +7 -0
  213. data/spec/app/models/event.rb +1 -1
  214. data/spec/app/models/filesystem.rb +1 -0
  215. data/spec/app/models/fish.rb +0 -1
  216. data/spec/app/models/fruits.rb +6 -0
  217. data/spec/app/models/game.rb +0 -2
  218. data/spec/app/models/house.rb +1 -3
  219. data/spec/app/models/item.rb +1 -5
  220. data/spec/app/models/jar.rb +1 -1
  221. data/spec/app/models/label.rb +4 -4
  222. data/spec/app/models/line_item.rb +1 -1
  223. data/spec/app/models/login.rb +1 -1
  224. data/spec/app/models/message.rb +8 -0
  225. data/spec/app/models/movie.rb +1 -0
  226. data/spec/app/models/name.rb +3 -3
  227. data/spec/app/models/note.rb +3 -1
  228. data/spec/app/models/odd.rb +7 -0
  229. data/spec/app/models/oscar.rb +1 -1
  230. data/spec/app/models/parent_doc.rb +1 -1
  231. data/spec/app/models/person.rb +16 -10
  232. data/spec/app/models/phone.rb +1 -3
  233. data/spec/app/models/player.rb +3 -3
  234. data/spec/app/models/post.rb +5 -3
  235. data/spec/app/models/preference.rb +1 -1
  236. data/spec/app/models/quiz.rb +0 -3
  237. data/spec/app/models/record.rb +10 -5
  238. data/spec/app/models/registry.rb +1 -1
  239. data/spec/app/models/server.rb +1 -1
  240. data/spec/app/models/service.rb +3 -3
  241. data/spec/app/models/sound.rb +5 -0
  242. data/spec/app/models/symptom.rb +1 -1
  243. data/spec/app/models/template.rb +1 -1
  244. data/spec/app/models/title.rb +0 -1
  245. data/spec/app/models/track.rb +5 -5
  246. data/spec/app/models/tree.rb +3 -3
  247. data/spec/app/models/video.rb +1 -5
  248. data/spec/app/models/wiki_page.rb +2 -5
  249. data/spec/app/models/word.rb +3 -0
  250. data/spec/app/models/word_origin.rb +1 -1
  251. data/spec/config/mongoid.yml +7 -8
  252. data/spec/helpers.rb +18 -0
  253. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  254. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  255. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  256. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  257. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  258. data/spec/mongoid/atomic_spec.rb +19 -19
  259. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
  260. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  261. data/spec/mongoid/attributes_spec.rb +300 -436
  262. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  263. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  264. data/spec/mongoid/config/environment_spec.rb +3 -3
  265. data/spec/mongoid/config/options_spec.rb +6 -6
  266. data/spec/mongoid/config_spec.rb +24 -48
  267. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  268. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
  269. data/spec/mongoid/contextual/atomic_spec.rb +69 -59
  270. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  271. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  272. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  273. data/spec/mongoid/contextual/memory_spec.rb +151 -94
  274. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  275. data/spec/mongoid/contextual/none_spec.rb +127 -0
  276. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  277. data/spec/mongoid/copyable_spec.rb +56 -68
  278. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  279. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  280. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  281. data/spec/mongoid/criteria/modifiable_spec.rb +1255 -0
  282. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  283. data/spec/mongoid/criteria_spec.rb +576 -2293
  284. data/spec/mongoid/document_spec.rb +166 -120
  285. data/spec/mongoid/equality_spec.rb +22 -22
  286. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  287. data/spec/mongoid/errors/callback_spec.rb +3 -3
  288. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  289. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  290. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  291. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  292. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  293. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  294. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  295. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  296. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  297. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  298. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  299. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  300. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  302. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  305. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  306. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  307. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  308. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  309. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  310. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  311. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  312. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  313. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  314. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  315. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  316. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  317. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  319. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  320. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  321. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  322. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  323. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  324. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  325. data/spec/mongoid/errors/validations_spec.rb +7 -7
  326. data/spec/mongoid/extensions/array_spec.rb +61 -61
  327. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  328. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  329. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  330. data/spec/mongoid/extensions/date_spec.rb +13 -13
  331. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  332. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  333. data/spec/mongoid/extensions/float_spec.rb +29 -15
  334. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  335. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  336. data/spec/mongoid/extensions/module_spec.rb +2 -2
  337. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  338. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  339. data/spec/mongoid/extensions/object_spec.rb +26 -26
  340. data/spec/mongoid/extensions/range_spec.rb +61 -12
  341. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  342. data/spec/mongoid/extensions/set_spec.rb +4 -4
  343. data/spec/mongoid/extensions/string_spec.rb +35 -46
  344. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  345. data/spec/mongoid/extensions/time_spec.rb +49 -49
  346. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  347. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  348. data/spec/mongoid/extensions_spec.rb +15 -0
  349. data/spec/mongoid/factory_spec.rb +15 -15
  350. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  351. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  352. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  353. data/spec/mongoid/fields/localized_spec.rb +38 -23
  354. data/spec/mongoid/fields/standard_spec.rb +12 -12
  355. data/spec/mongoid/fields_spec.rb +263 -217
  356. data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +127 -27
  357. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  358. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  359. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  360. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  361. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  362. data/spec/mongoid/loggable_spec.rb +1 -1
  363. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  364. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  365. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  366. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  367. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  368. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  369. data/spec/mongoid/matchable/in_spec.rb +49 -0
  370. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  371. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  372. data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
  373. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  374. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  375. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  376. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  377. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  378. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  379. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  380. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  381. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  382. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  383. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  384. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  385. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  386. data/spec/mongoid/persistable/savable_spec.rb +461 -0
  387. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  388. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  389. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  390. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  391. data/spec/mongoid/persistable_spec.rb +206 -0
  392. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +19 -14
  393. data/spec/mongoid/query_cache_spec.rb +231 -0
  394. data/spec/mongoid/railties/document_spec.rb +2 -2
  395. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  396. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  397. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  398. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  399. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  400. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  401. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  402. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  403. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  404. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  405. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  406. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  407. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  408. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  409. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  410. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  411. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  412. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  413. data/spec/mongoid/relations/builders_spec.rb +21 -21
  414. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  415. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  416. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  417. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  418. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  419. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  420. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  421. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  422. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  423. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  424. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  425. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  426. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  427. data/spec/mongoid/relations/eager_spec.rb +228 -0
  428. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  429. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  430. data/spec/mongoid/relations/embedded/many_spec.rb +393 -372
  431. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  432. data/spec/mongoid/relations/macros_spec.rb +108 -102
  433. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  434. data/spec/mongoid/relations/options_spec.rb +1 -1
  435. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  436. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  437. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  438. data/spec/mongoid/relations/referenced/many_spec.rb +434 -527
  439. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -424
  440. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  441. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  442. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  443. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  444. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  445. data/spec/mongoid/relations_spec.rb +16 -15
  446. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
  447. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  448. data/spec/mongoid/selectable_spec.rb +134 -0
  449. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  450. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  451. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  452. data/spec/mongoid/sessions/options_spec.rb +107 -0
  453. data/spec/mongoid/sessions_spec.rb +289 -178
  454. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  455. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  456. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  457. data/spec/mongoid/tasks/database_spec.rb +160 -0
  458. data/spec/mongoid/threaded_spec.rb +17 -70
  459. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  460. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  461. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  462. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  463. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  464. data/spec/mongoid/timestamps_spec.rb +9 -13
  465. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  466. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  467. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  468. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  469. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  470. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  471. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  472. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  473. data/spec/mongoid_spec.rb +8 -8
  474. data/spec/rails/mongoid_spec.rb +19 -350
  475. data/spec/spec_helper.rb +24 -15
  476. metadata +259 -251
  477. data/lib/mongoid/atomic/positionable.rb +0 -73
  478. data/lib/mongoid/components.rb +0 -92
  479. data/lib/mongoid/config/inflections.rb +0 -6
  480. data/lib/mongoid/contextual/eager.rb +0 -158
  481. data/lib/mongoid/criterion/findable.rb +0 -179
  482. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  483. data/lib/mongoid/identity_map.rb +0 -163
  484. data/lib/mongoid/json.rb +0 -16
  485. data/lib/mongoid/matchers/strategies.rb +0 -97
  486. data/lib/mongoid/matchers.rb +0 -32
  487. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  488. data/lib/mongoid/nested_attributes.rb +0 -78
  489. data/lib/mongoid/observer.rb +0 -192
  490. data/lib/mongoid/paranoia.rb +0 -136
  491. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  492. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  493. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  494. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  495. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  496. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  497. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  498. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  499. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  500. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  501. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  502. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  503. data/lib/mongoid/persistence/atomic.rb +0 -231
  504. data/lib/mongoid/persistence/deletion.rb +0 -31
  505. data/lib/mongoid/persistence/insertion.rb +0 -38
  506. data/lib/mongoid/persistence/modification.rb +0 -35
  507. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  508. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  509. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  510. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  511. data/lib/mongoid/persistence/operations/update.rb +0 -59
  512. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  513. data/lib/mongoid/persistence/operations.rb +0 -214
  514. data/lib/mongoid/persistence/upsertion.rb +0 -31
  515. data/lib/mongoid/persistence.rb +0 -357
  516. data/lib/mongoid/unit_of_work.rb +0 -61
  517. data/lib/mongoid/versioning.rb +0 -217
  518. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  519. data/lib/rack/mongoid.rb +0 -2
  520. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  521. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  522. data/spec/app/models/actor_observer.rb +0 -15
  523. data/spec/app/models/callback_recorder.rb +0 -25
  524. data/spec/app/models/paranoid_phone.rb +0 -25
  525. data/spec/app/models/paranoid_post.rb +0 -36
  526. data/spec/app/models/phone_observer.rb +0 -6
  527. data/spec/mongoid/#atomic_spec.rb# +0 -365
  528. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  529. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  530. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  531. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  532. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  533. data/spec/mongoid/identity_map_spec.rb +0 -564
  534. data/spec/mongoid/json_spec.rb +0 -33
  535. data/spec/mongoid/matchers/in_spec.rb +0 -25
  536. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  537. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  538. data/spec/mongoid/observer_spec.rb +0 -290
  539. data/spec/mongoid/paranoia_spec.rb +0 -759
  540. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  541. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  542. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  543. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  544. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  545. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  546. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  547. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  548. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  549. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  550. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  551. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  552. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  553. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  554. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  555. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  556. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  557. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  558. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  559. data/spec/mongoid/persistence_spec.rb +0 -2279
  560. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  561. data/spec/mongoid/versioning_spec.rb +0 -540
  562. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -1,15 +0,0 @@
1
- class ActorObserver < Mongoid::Observer
2
- attr_reader :last_after_create_record
3
-
4
- def after_create(record)
5
- @last_after_create_record = record
6
- end
7
-
8
- def after_custom(record)
9
- record.after_custom_count += 1
10
- end
11
-
12
- def before_custom(record)
13
- @after_custom_called = true
14
- end
15
- end
@@ -1,25 +0,0 @@
1
- class CallbackRecorder < Mongoid::Observer
2
- observe :actor
3
-
4
- attr_reader :last_callback, :call_count, :last_record
5
-
6
- def initialize
7
- reset
8
- super
9
- end
10
-
11
- def reset
12
- @last_callback = nil
13
- @call_count = Hash.new(0)
14
- @last_record = {}
15
- end
16
-
17
- Mongoid::Callbacks.observables.each do |callback|
18
- define_method(callback) do |record, &block|
19
- @last_callback = callback
20
- @call_count[callback] += 1
21
- @last_record[callback] = record
22
- block ? block.call : true
23
- end
24
- end
25
- end
@@ -1,25 +0,0 @@
1
- class ParanoidPhone
2
- include Mongoid::Document
3
- include Mongoid::Paranoia
4
-
5
- attr_accessor :after_destroy_called, :before_destroy_called
6
-
7
- field :number, type: String
8
-
9
- embedded_in :person
10
-
11
- before_destroy :before_destroy_stub, :halt_me
12
- after_destroy :after_destroy_stub
13
-
14
- def before_destroy_stub
15
- self.before_destroy_called = true
16
- end
17
-
18
- def after_destroy_stub
19
- self.after_destroy_called = true
20
- end
21
-
22
- def halt_me
23
- person.age == 42 ? false : true
24
- end
25
- end
@@ -1,36 +0,0 @@
1
- class ParanoidPost
2
- include Mongoid::Document
3
- include Mongoid::Versioning
4
- include Mongoid::Paranoia
5
-
6
- max_versions 2
7
-
8
- field :title, type: String
9
-
10
- attr_accessor :after_destroy_called, :before_destroy_called
11
-
12
- belongs_to :person
13
-
14
- has_and_belongs_to_many :tags
15
- has_many :authors, dependent: :delete
16
- has_many :titles, dependent: :restrict
17
-
18
- scope :recent, where(created_at: { "$lt" => Time.now, "$gt" => 30.days.ago })
19
-
20
- before_destroy :before_destroy_stub
21
- after_destroy :after_destroy_stub
22
-
23
- def before_destroy_stub
24
- self.before_destroy_called = true
25
- end
26
-
27
- def after_destroy_stub
28
- self.after_destroy_called = true
29
- end
30
-
31
- class << self
32
- def old
33
- where(created_at: { "$lt" => 30.days.ago })
34
- end
35
- end
36
- end
@@ -1,6 +0,0 @@
1
- class PhoneObserver < Mongoid::Observer
2
-
3
- def after_save(phone)
4
- phone.number_in_observer = phone.number
5
- end
6
- end
@@ -1,365 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Atomic do
4
-
5
- describe "#add_atomic_pull" do
6
-
7
- let!(:person) do
8
- Person.create
9
- end
10
-
11
- let(:address) do
12
- person.addresses.create
13
- end
14
-
15
- let(:location) do
16
- address.locations.create
17
- end
18
-
19
- before do
20
- person.add_atomic_pull(address)
21
- end
22
-
23
- it "adds the document to the delayed atomic pulls" do
24
- expect(person.delayed_atomic_pulls["addresses"]).to eq([ address ])
25
- end
26
-
27
- it "flags the document for destruction" do
28
- expect(address).to be_flagged_for_destroy
29
- end
30
- end
31
-
32
- describe "#add_atomic_unset" do
33
-
34
- let!(:person) do
35
- Person.new
36
- end
37
-
38
- let(:name) do
39
- person.build_name
40
- end
41
-
42
- before do
43
- person.add_atomic_unset(name)
44
- end
45
-
46
- it "adds the document to the delayed atomic unsets" do
47
- expect(person.delayed_atomic_unsets["name"]).to eq([ name ])
48
- end
49
-
50
- it "flags the document for destruction" do
51
- expect(name).to be_flagged_for_destroy
52
- end
53
- end
54
-
55
- describe "#atomic_updates" do
56
-
57
- context "when the document is persisted" do
58
-
59
- let(:person) do
60
- Person.create
61
- end
62
-
63
- context "when the document is modified" do
64
-
65
- before do
66
- person.title = "Sir"
67
- end
68
-
69
- it "returns the atomic updates" do
70
- expect(person.atomic_updates).to eq({ "$set" => { "title" => "Sir" }})
71
- end
72
-
73
- context "when an embeds many child is added" do
74
-
75
- let!(:address) do
76
- person.addresses.build(street: "Oxford St")
77
- end
78
-
79
- it "returns a $set and $pushAll for modifications" do
80
- expect(person.atomic_updates).to eq(
81
- {
82
- "$set" => { "title" => "Sir" },
83
- "$pushAll" => { "addresses" => [
84
- { "_id" => "oxford-st", "street" => "Oxford St" }
85
- ]}
86
- }
87
- )
88
- end
89
- end
90
-
91
- context "when an embeds one child is added" do
92
-
93
- let!(:name) do
94
- person.build_name(first_name: "Lionel")
95
- end
96
-
97
- it "returns a $set for modifications" do
98
- expect(person.atomic_updates).to eq(
99
- {
100
- "$set" => {
101
- "title" => "Sir",
102
- "name" => { "_id" => "Lionel-", "first_name" => "Lionel" }
103
- }
104
- }
105
- )
106
- end
107
- end
108
-
109
- context "when an existing embeds many gets modified" do
110
-
111
- let!(:address) do
112
- person.addresses.create(street: "Oxford St")
113
- end
114
-
115
- before do
116
- address.street = "Bond St"
117
- end
118
-
119
- context "when asking for the updates from the root" do
120
-
121
- it "returns the $set with correct position and modifications" do
122
- expect(person.atomic_updates).to eq(
123
- { "$set" => { "title" => "Sir", "addresses.0.street" => "Bond St" }}
124
- )
125
- end
126
- end
127
-
128
- context "when asking for the updates from the child" do
129
-
130
- it "returns the $set with correct position and modifications" do
131
- expect(address.atomic_updates).to eq(
132
- { "$set" => { "addresses.0.street" => "Bond St" }}
133
- )
134
- end
135
- end
136
-
137
- context "when an existing 2nd level embedded child gets modified" do
138
-
139
- let!(:location) do
140
- address.locations.create(name: "Home")
141
- end
142
-
143
- before do
144
- location.name = "Work"
145
- end
146
-
147
- context "when asking for the updates from the root" do
148
-
149
- it "returns the $set with correct positions and modifications" do
150
- expect(person.atomic_updates).to eq(
151
- { "$set" => {
152
- "title" => "Sir",
153
- "addresses.0.street" => "Bond St",
154
- "addresses.0.locations.0.name" => "Work" }
155
- }
156
- )
157
- end
158
- end
159
-
160
- context "when asking for the updates from the 1st level child" do
161
-
162
- it "returns the $set with correct positions and modifications" do
163
- expect(address.atomic_updates).to eq(
164
- { "$set" => {
165
- "addresses.0.street" => "Bond St",
166
- "addresses.0.locations.0.name" => "Work" }
167
- }
168
- )
169
- end
170
- end
171
-
172
- context "when asking for the updates from the 2nd level child" do
173
-
174
- it "returns the $set with correct positions and modifications" do
175
- expect(location.atomic_updates).to eq(
176
- { "$set" => {
177
- "addresses.0.locations.0.name" => "Work" }
178
- }
179
- )
180
- end
181
- end
182
- end
183
-
184
- context "when a 2nd level embedded child gets added" do
185
-
186
- let!(:location) do
187
- address.locations.build(name: "Home")
188
- end
189
-
190
- context "when asking for the updates from the root" do
191
-
192
- it "returns the $set with correct positions and modifications" do
193
- expect(person.atomic_updates).to eq(
194
- {
195
- "$set" => {
196
- "title" => "Sir",
197
- "addresses.0.street" => "Bond St"
198
- },
199
- conflicts: {
200
- "$pushAll" => {
201
- "addresses.0.locations" => [{ "_id" => location.id, "name" => "Home" }]
202
- }
203
- }
204
- }
205
- )
206
- end
207
- end
208
-
209
- context "when asking for the updates from the 1st level child" do
210
-
211
- it "returns the $set with correct positions and modifications" do
212
- expect(address.atomic_updates).to eq(
213
- {
214
- "$set" => {
215
- "addresses.0.street" => "Bond St"
216
- },
217
- conflicts: {
218
- "$pushAll" => {
219
- "addresses.0.locations" => [{ "_id" => location.id, "name" => "Home" }]
220
- }
221
- }
222
- }
223
- )
224
- end
225
- end
226
- end
227
-
228
- context "when an embedded child gets unset" do
229
-
230
- before do
231
- person.attributes = { addresses: nil }
232
- end
233
-
234
- let(:updates) do
235
- person.atomic_updates
236
- end
237
-
238
- it "returns the $set for the first level and $unset for other." do
239
- expect(updates).to eq({
240
- "$unset" => { "addresses" => true },
241
- "$set" => { "title" => "Sir" }
242
- })
243
- end
244
- end
245
-
246
- context "when adding a new second level child" do
247
-
248
- let!(:new_address) do
249
- person.addresses.build(street: "Another")
250
- end
251
-
252
- let!(:location) do
253
- new_address.locations.build(name: "Home")
254
- end
255
-
256
- context "when asking for the updates from the root document" do
257
-
258
- it "returns the $set for 1st level and other for the 2nd level" do
259
- expect(person.atomic_updates).to eq(
260
- {
261
- "$set" => {
262
- "title" => "Sir",
263
- "addresses.0.street" => "Bond St"
264
- },
265
- conflicts: {
266
- "$pushAll" => {
267
- "addresses" => [{
268
- "_id" => new_address.id,
269
- "street" => "Another",
270
- "locations" => [
271
- "_id" => location.id,
272
- "name" => "Home"
273
- ]
274
- }]
275
- }
276
- }
277
- }
278
- )
279
- end
280
- end
281
-
282
- context "when asking for the updates from the 1st level document" do
283
-
284
- it "returns the $set for 1st level and other for the 2nd level" do
285
- expect(address.atomic_updates).to eq(
286
- { "$set" => { "addresses.0.street" => "Bond St" }}
287
- )
288
- end
289
- end
290
- end
291
-
292
- context "when adding a new child beetween two existing and updating one of them" do
293
-
294
- let!(:new_address) do
295
- person.addresses.build(street: "Ipanema")
296
- end
297
-
298
- let!(:location) do
299
- new_address.locations.build(name: "Home")
300
- end
301
-
302
- before do
303
- person.addresses[0] = new_address
304
- person.addresses[1] = address
305
- end
306
-
307
- it "returns the $set for 1st and 2nd level and other for the 3nd level" do
308
- expect(person.atomic_updates).to eq(
309
- {
310
- "$set" => {
311
- "title" => "Sir"
312
- },
313
- "$pushAll" => {
314
- "addresses" => [{
315
- "_id" => new_address.id,
316
- "street" => "Ipanema",
317
- "locations" => [
318
- "_id" => location.id,
319
- "name" => "Home"
320
- ]
321
- }]
322
- },
323
- conflicts: {
324
- "$set" => { "addresses.0.street"=>"Bond St" }
325
- }
326
- }
327
- )
328
- end
329
- end
330
- end
331
-
332
- context "when adding new embedded docs at multiple levels" do
333
-
334
- let!(:address) do
335
- person.addresses.build(street: "Another")
336
- end
337
-
338
- let!(:location) do
339
- address.locations.build(name: "Home")
340
- end
341
-
342
- it "returns the proper $sets and $pushAlls for all levels" do
343
- expect(person.atomic_updates).to eq(
344
- {
345
- "$set" => {
346
- "title" => "Sir",
347
- },
348
- "$pushAll" => {
349
- "addresses" => [{
350
- "_id" => address.id,
351
- "street" => "Another",
352
- "locations" => [
353
- "_id" => location.id,
354
- "name" => "Home"
355
- ]
356
- }]
357
- }
358
- }
359
- )
360
- end
361
- end
362
- end
363
- end
364
- end
365
- end
@@ -1,149 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Attributes::Processing do
4
-
5
- describe "#process_attributes" do
6
-
7
- let(:building) do
8
- Building.new
9
- end
10
-
11
- context "when setting embedded documents via the parent" do
12
-
13
- let(:attributes) do
14
- {
15
- building_address: { city: "Berlin" },
16
- contractors: [{ name: "Joe" }]
17
- }
18
- end
19
-
20
- context "when providing a role" do
21
-
22
- context "when creating new documents" do
23
-
24
- before do
25
- building.process_attributes(attributes, :admin, true)
26
- end
27
-
28
- let(:building_address) do
29
- building.building_address
30
- end
31
-
32
- let(:contractor) do
33
- building.contractors.first
34
- end
35
-
36
- context "when the child fields are accessible to the role" do
37
-
38
- it "sets the fields on the 1-1 child" do
39
- building_address.city.should eq("Berlin")
40
- end
41
-
42
- it "sets the fields on the 1-n child" do
43
- contractor.name.should eq("Joe")
44
- end
45
- end
46
-
47
- context "when updating the document" do
48
-
49
- let(:updates) do
50
- {
51
- building_address: { city: "Kiew" },
52
- contractors: [{ name: "Jim" }]
53
- }
54
- end
55
-
56
- before do
57
- building.process_attributes(updates, :admin, true)
58
- end
59
-
60
- it "updates the 1-1 child" do
61
- building_address.city.should eq("Kiew")
62
- end
63
-
64
- it "updates the 1-n child" do
65
- contractor.name.should eq("Jim")
66
- end
67
- end
68
- end
69
- end
70
-
71
- context "when turning off mass assignment" do
72
-
73
- context "when creating new documents" do
74
-
75
- before do
76
- building.process_attributes(attributes, :default, false)
77
- end
78
-
79
- let(:building_address) do
80
- building.building_address
81
- end
82
-
83
- let(:contractor) do
84
- building.contractors.first
85
- end
86
-
87
- context "when the child fields are accessible to the role" do
88
-
89
- it "sets the fields on the 1-1 child" do
90
- building_address.city.should eq("Berlin")
91
- end
92
-
93
- it "sets the fields on the 1-n child" do
94
- contractor.name.should eq("Joe")
95
- end
96
- end
97
-
98
- context "when updating the document" do
99
-
100
- let(:updates) do
101
- {
102
- building_address: { city: "Kiew" },
103
- contractors: [{ name: "Jim" }]
104
- }
105
- end
106
-
107
- before do
108
- building.process_attributes(updates, :default, false)
109
- end
110
-
111
- it "updates the 1-1 child" do
112
- building_address.city.should eq("Kiew")
113
- end
114
-
115
- it "updates the 1-n child" do
116
- contractor.name.should eq("Jim")
117
- end
118
-
119
- context "with a key that is not a valid ruby identifier" do
120
- let(:dynamic_updates) do
121
- {
122
- building_address: { :"postal-code" => "V8N 1A1" },
123
- contractors: [{ :"license number" => "12345" }]
124
- }
125
- end
126
-
127
- before do
128
- building.process_attributes(dynamic_updates, :default, false)
129
- end
130
-
131
- it "updates the 1-1 child" do
132
- building_address['postal-code'].should eq("V8N 1A1")
133
- end
134
-
135
- it "updates the 1-n child" do
136
- contractor['license number'].should eq("12345")
137
- end
138
-
139
- it "correctly handles a second call to #process_attributes" do
140
- building.process_attributes(dynamic_updates, :default, false)
141
- end
142
- end
143
-
144
- end
145
- end
146
- end
147
- end
148
- end
149
- end