mongoid 3.1.6 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +479 -8
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid.rb +10 -76
  6. data/lib/mongoid/atomic.rb +3 -14
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  9. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  10. data/lib/mongoid/atomic/paths/root.rb +0 -13
  11. data/lib/mongoid/attributes.rb +65 -101
  12. data/lib/mongoid/attributes/dynamic.rb +154 -0
  13. data/lib/mongoid/attributes/nested.rb +82 -0
  14. data/lib/mongoid/attributes/processing.rb +13 -66
  15. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  16. data/lib/mongoid/composable.rb +105 -0
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/config/options.rb +1 -1
  19. data/lib/mongoid/contextual.rb +2 -0
  20. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  21. data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
  22. data/lib/mongoid/contextual/atomic.rb +53 -53
  23. data/lib/mongoid/contextual/geo_near.rb +1 -1
  24. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  25. data/lib/mongoid/contextual/memory.rb +23 -11
  26. data/lib/mongoid/contextual/mongo.rb +75 -57
  27. data/lib/mongoid/contextual/none.rb +90 -0
  28. data/lib/mongoid/contextual/text_search.rb +178 -0
  29. data/lib/mongoid/copyable.rb +2 -3
  30. data/lib/mongoid/criteria.rb +39 -34
  31. data/lib/mongoid/criteria/#findable.rb# +141 -0
  32. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  33. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  34. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  35. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  36. data/lib/mongoid/criteria/permission.rb +70 -0
  37. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  38. data/lib/mongoid/document.rb +39 -24
  39. data/lib/mongoid/errors.rb +4 -1
  40. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  41. data/lib/mongoid/errors/document_not_found.rb +2 -1
  42. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  43. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  44. data/lib/mongoid/errors/invalid_value.rb +16 -0
  45. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  46. data/lib/mongoid/errors/readonly_document.rb +24 -0
  47. data/lib/mongoid/extensions.rb +15 -7
  48. data/lib/mongoid/extensions/array.rb +3 -3
  49. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  50. data/lib/mongoid/extensions/boolean.rb +15 -17
  51. data/lib/mongoid/extensions/date.rb +1 -1
  52. data/lib/mongoid/extensions/date_time.rb +3 -3
  53. data/lib/mongoid/extensions/float.rb +2 -1
  54. data/lib/mongoid/extensions/hash.rb +3 -3
  55. data/lib/mongoid/extensions/integer.rb +1 -1
  56. data/lib/mongoid/extensions/object.rb +7 -7
  57. data/lib/mongoid/extensions/object_id.rb +5 -5
  58. data/lib/mongoid/extensions/range.rb +9 -3
  59. data/lib/mongoid/extensions/regexp.rb +1 -1
  60. data/lib/mongoid/extensions/set.rb +1 -1
  61. data/lib/mongoid/extensions/string.rb +6 -18
  62. data/lib/mongoid/extensions/symbol.rb +1 -1
  63. data/lib/mongoid/extensions/time.rb +3 -3
  64. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  65. data/lib/mongoid/factory.rb +8 -6
  66. data/lib/mongoid/fields.rb +41 -8
  67. data/lib/mongoid/fields/foreign_key.rb +3 -3
  68. data/lib/mongoid/fields/localized.rb +1 -1
  69. data/lib/mongoid/fields/standard.rb +5 -17
  70. data/lib/mongoid/fields/validators/macro.rb +15 -5
  71. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/indexable/specification.rb +104 -0
  74. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  75. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  76. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  77. data/lib/mongoid/log_subscriber.rb +55 -0
  78. data/lib/mongoid/matchable.rb +152 -0
  79. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  81. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  86. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  87. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  88. data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
  89. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  90. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  91. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  92. data/lib/mongoid/persistable.rb +216 -0
  93. data/lib/mongoid/persistable/creatable.rb +189 -0
  94. data/lib/mongoid/persistable/deletable.rb +149 -0
  95. data/lib/mongoid/persistable/destroyable.rb +60 -0
  96. data/lib/mongoid/persistable/incrementable.rb +36 -0
  97. data/lib/mongoid/persistable/logical.rb +38 -0
  98. data/lib/mongoid/persistable/poppable.rb +39 -0
  99. data/lib/mongoid/persistable/pullable.rb +55 -0
  100. data/lib/mongoid/persistable/pushable.rb +62 -0
  101. data/lib/mongoid/persistable/renamable.rb +35 -0
  102. data/lib/mongoid/persistable/savable.rb +52 -0
  103. data/lib/mongoid/persistable/settable.rb +33 -0
  104. data/lib/mongoid/persistable/unsettable.rb +36 -0
  105. data/lib/mongoid/persistable/updatable.rb +153 -0
  106. data/lib/mongoid/persistable/upsertable.rb +55 -0
  107. data/lib/mongoid/positional.rb +71 -0
  108. data/lib/mongoid/query_cache.rb +255 -0
  109. data/lib/mongoid/railtie.rb +34 -60
  110. data/lib/mongoid/railties/database.rake +9 -25
  111. data/lib/mongoid/relations.rb +11 -25
  112. data/lib/mongoid/relations/accessors.rb +15 -51
  113. data/lib/mongoid/relations/auto_save.rb +15 -36
  114. data/lib/mongoid/relations/binding.rb +2 -25
  115. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  116. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  117. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  118. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  119. data/lib/mongoid/relations/builder.rb +1 -1
  120. data/lib/mongoid/relations/builders.rb +2 -2
  121. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  122. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  123. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  124. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  125. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  126. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  127. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  128. data/lib/mongoid/relations/cascading.rb +3 -5
  129. data/lib/mongoid/relations/constraint.rb +1 -1
  130. data/lib/mongoid/relations/conversions.rb +1 -1
  131. data/lib/mongoid/relations/counter_cache.rb +39 -15
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/eager/base.rb +149 -0
  134. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  135. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  136. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  137. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  138. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  139. data/lib/mongoid/relations/embedded/in.rb +4 -4
  140. data/lib/mongoid/relations/embedded/many.rb +14 -32
  141. data/lib/mongoid/relations/embedded/one.rb +1 -1
  142. data/lib/mongoid/relations/macros.rb +3 -4
  143. data/lib/mongoid/relations/many.rb +51 -31
  144. data/lib/mongoid/relations/marshalable.rb +3 -3
  145. data/lib/mongoid/relations/metadata.rb +14 -79
  146. data/lib/mongoid/relations/nested_builder.rb +2 -2
  147. data/lib/mongoid/relations/one.rb +1 -1
  148. data/lib/mongoid/relations/options.rb +1 -0
  149. data/lib/mongoid/relations/polymorphic.rb +0 -1
  150. data/lib/mongoid/relations/proxy.rb +21 -41
  151. data/lib/mongoid/relations/referenced/in.rb +4 -20
  152. data/lib/mongoid/relations/referenced/many.rb +22 -35
  153. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  154. data/lib/mongoid/relations/referenced/one.rb +6 -25
  155. data/lib/mongoid/relations/synchronization.rb +4 -4
  156. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  157. data/lib/mongoid/relations/touchable.rb +34 -1
  158. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  159. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  160. data/lib/mongoid/selectable.rb +59 -0
  161. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  162. data/lib/mongoid/sessions.rb +37 -345
  163. data/lib/mongoid/sessions/factory.rb +2 -0
  164. data/lib/mongoid/sessions/options.rb +185 -0
  165. data/lib/mongoid/sessions/storage_options.rb +140 -0
  166. data/lib/mongoid/sessions/thread_options.rb +19 -0
  167. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  168. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  169. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  170. data/lib/mongoid/support/query_counter.rb +23 -0
  171. data/lib/mongoid/tasks/database.rake +31 -0
  172. data/lib/mongoid/tasks/database.rb +107 -0
  173. data/lib/mongoid/threaded.rb +26 -172
  174. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  175. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  176. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  177. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  178. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  179. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  180. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  182. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  183. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  184. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  185. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  186. data/lib/mongoid/version.rb +1 -1
  187. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  188. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  189. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  190. data/lib/rails/generators/mongoid_generator.rb +3 -40
  191. data/lib/rails/mongoid.rb +0 -122
  192. data/lib/support/ruby_version.rb +1 -1
  193. data/spec/app/models/account.rb +2 -6
  194. data/spec/app/models/acolyte.rb +2 -1
  195. data/spec/app/models/actor.rb +0 -1
  196. data/spec/app/models/address.rb +8 -3
  197. data/spec/app/models/animal.rb +1 -1
  198. data/spec/app/models/appointment.rb +3 -3
  199. data/spec/app/models/article.rb +1 -4
  200. data/spec/app/models/audio.rb +5 -0
  201. data/spec/app/models/author.rb +0 -2
  202. data/spec/app/models/band.rb +3 -2
  203. data/spec/app/models/bar.rb +1 -0
  204. data/spec/app/models/book.rb +1 -0
  205. data/spec/app/models/building.rb +0 -2
  206. data/spec/app/models/building_address.rb +0 -2
  207. data/spec/app/models/bus.rb +1 -1
  208. data/spec/app/models/canvas.rb +1 -1
  209. data/spec/app/models/contextable_item.rb +5 -0
  210. data/spec/app/models/contractor.rb +0 -2
  211. data/spec/app/models/country_code.rb +1 -1
  212. data/spec/app/models/definition.rb +2 -2
  213. data/spec/app/models/dog.rb +1 -1
  214. data/spec/app/models/draft.rb +9 -0
  215. data/spec/app/models/dragon.rb +4 -0
  216. data/spec/app/models/drug.rb +1 -3
  217. data/spec/app/models/dungeon.rb +4 -0
  218. data/spec/app/models/edit.rb +5 -0
  219. data/spec/app/models/even.rb +7 -0
  220. data/spec/app/models/event.rb +1 -1
  221. data/spec/app/models/filesystem.rb +1 -0
  222. data/spec/app/models/fish.rb +0 -1
  223. data/spec/app/models/fruits.rb +6 -0
  224. data/spec/app/models/game.rb +0 -2
  225. data/spec/app/models/house.rb +1 -3
  226. data/spec/app/models/id_key.rb +6 -0
  227. data/spec/app/models/item.rb +1 -5
  228. data/spec/app/models/jar.rb +1 -1
  229. data/spec/app/models/label.rb +4 -4
  230. data/spec/app/models/line_item.rb +1 -1
  231. data/spec/app/models/login.rb +1 -1
  232. data/spec/app/models/message.rb +8 -0
  233. data/spec/app/models/movie.rb +1 -0
  234. data/spec/app/models/name.rb +3 -3
  235. data/spec/app/models/note.rb +3 -1
  236. data/spec/app/models/odd.rb +7 -0
  237. data/spec/app/models/oscar.rb +1 -1
  238. data/spec/app/models/parent_doc.rb +1 -1
  239. data/spec/app/models/person.rb +16 -10
  240. data/spec/app/models/phone.rb +1 -3
  241. data/spec/app/models/player.rb +3 -3
  242. data/spec/app/models/post.rb +5 -3
  243. data/spec/app/models/preference.rb +1 -1
  244. data/spec/app/models/quiz.rb +0 -3
  245. data/spec/app/models/record.rb +10 -5
  246. data/spec/app/models/registry.rb +1 -1
  247. data/spec/app/models/server.rb +1 -1
  248. data/spec/app/models/service.rb +3 -3
  249. data/spec/app/models/sound.rb +5 -0
  250. data/spec/app/models/symptom.rb +1 -1
  251. data/spec/app/models/template.rb +1 -1
  252. data/spec/app/models/title.rb +0 -1
  253. data/spec/app/models/track.rb +5 -5
  254. data/spec/app/models/tree.rb +3 -3
  255. data/spec/app/models/video.rb +1 -5
  256. data/spec/app/models/wiki_page.rb +2 -5
  257. data/spec/app/models/word.rb +3 -0
  258. data/spec/app/models/word_origin.rb +1 -1
  259. data/spec/config/mongoid.yml +7 -8
  260. data/spec/helpers.rb +18 -0
  261. data/spec/mongoid/#atomic_spec.rb# +365 -0
  262. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  263. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  264. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  265. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  266. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  267. data/spec/mongoid/atomic_spec.rb +19 -19
  268. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  269. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  270. data/spec/mongoid/attributes_spec.rb +349 -434
  271. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  272. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  273. data/spec/mongoid/config/environment_spec.rb +3 -3
  274. data/spec/mongoid/config/options_spec.rb +6 -6
  275. data/spec/mongoid/config_spec.rb +24 -48
  276. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  277. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
  278. data/spec/mongoid/contextual/atomic_spec.rb +60 -56
  279. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  280. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  281. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  282. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  283. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  284. data/spec/mongoid/contextual/none_spec.rb +127 -0
  285. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  286. data/spec/mongoid/copyable_spec.rb +56 -68
  287. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  288. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  289. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  290. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  291. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  292. data/spec/mongoid/criteria_spec.rb +715 -2421
  293. data/spec/mongoid/document_spec.rb +171 -121
  294. data/spec/mongoid/equality_spec.rb +22 -22
  295. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  296. data/spec/mongoid/errors/callback_spec.rb +3 -3
  297. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  298. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  299. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  300. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  308. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  311. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  312. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  313. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  314. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  315. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  316. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  317. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  318. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  325. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  326. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  327. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  328. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  329. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  330. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  331. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  332. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  333. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  334. data/spec/mongoid/errors/validations_spec.rb +7 -7
  335. data/spec/mongoid/extensions/array_spec.rb +61 -61
  336. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  337. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  338. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  339. data/spec/mongoid/extensions/date_spec.rb +13 -13
  340. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  341. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  342. data/spec/mongoid/extensions/float_spec.rb +29 -15
  343. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  344. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  345. data/spec/mongoid/extensions/module_spec.rb +2 -2
  346. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  347. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  348. data/spec/mongoid/extensions/object_spec.rb +26 -26
  349. data/spec/mongoid/extensions/range_spec.rb +61 -12
  350. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  351. data/spec/mongoid/extensions/set_spec.rb +4 -4
  352. data/spec/mongoid/extensions/string_spec.rb +35 -46
  353. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  354. data/spec/mongoid/extensions/time_spec.rb +49 -49
  355. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  356. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  357. data/spec/mongoid/extensions_spec.rb +29 -0
  358. data/spec/mongoid/factory_spec.rb +15 -15
  359. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  360. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  361. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  362. data/spec/mongoid/fields/localized_spec.rb +38 -23
  363. data/spec/mongoid/fields/standard_spec.rb +12 -12
  364. data/spec/mongoid/fields_spec.rb +263 -217
  365. data/spec/mongoid/findable_spec.rb +509 -0
  366. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  367. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  368. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  369. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  370. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  371. data/spec/mongoid/loggable_spec.rb +1 -1
  372. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  373. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  374. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  375. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  376. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  377. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  378. data/spec/mongoid/matchable/in_spec.rb +49 -0
  379. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  380. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  381. data/spec/mongoid/matchable/ne_spec.rb +46 -0
  382. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  383. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  384. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  385. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  386. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  387. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  388. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  389. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  390. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  391. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  392. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  393. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  394. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  395. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  396. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  397. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  398. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  399. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  400. data/spec/mongoid/persistable_spec.rb +206 -0
  401. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
  402. data/spec/mongoid/query_cache_spec.rb +263 -0
  403. data/spec/mongoid/railties/document_spec.rb +2 -2
  404. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  405. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  406. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  407. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  408. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  409. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  410. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  411. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  412. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  413. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  414. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  415. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  416. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  417. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  418. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  419. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  420. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  421. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  422. data/spec/mongoid/relations/builders_spec.rb +21 -21
  423. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  424. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  425. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  426. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  427. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  428. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  429. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  430. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  431. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  432. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  433. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  434. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  435. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  436. data/spec/mongoid/relations/eager_spec.rb +228 -0
  437. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  438. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  439. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  440. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  441. data/spec/mongoid/relations/macros_spec.rb +108 -102
  442. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  443. data/spec/mongoid/relations/options_spec.rb +1 -1
  444. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  445. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  446. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  447. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  448. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  449. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  450. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  451. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  452. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  453. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  454. data/spec/mongoid/relations_spec.rb +16 -15
  455. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  456. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  457. data/spec/mongoid/selectable_spec.rb +134 -0
  458. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  459. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  460. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  461. data/spec/mongoid/sessions/options_spec.rb +108 -0
  462. data/spec/mongoid/sessions_spec.rb +319 -178
  463. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  464. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  465. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  466. data/spec/mongoid/tasks/database_spec.rb +160 -0
  467. data/spec/mongoid/threaded_spec.rb +17 -70
  468. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  469. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  470. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  471. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  472. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  473. data/spec/mongoid/timestamps_spec.rb +9 -13
  474. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  475. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  476. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  477. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  478. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  479. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  480. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  481. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  482. data/spec/mongoid_spec.rb +8 -8
  483. data/spec/rails/mongoid_spec.rb +19 -335
  484. data/spec/spec_helper.rb +31 -13
  485. metadata +303 -283
  486. data/lib/mongoid/atomic/positionable.rb +0 -73
  487. data/lib/mongoid/components.rb +0 -92
  488. data/lib/mongoid/config/inflections.rb +0 -6
  489. data/lib/mongoid/contextual/eager.rb +0 -158
  490. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  491. data/lib/mongoid/identity_map.rb +0 -163
  492. data/lib/mongoid/json.rb +0 -16
  493. data/lib/mongoid/matchers.rb +0 -32
  494. data/lib/mongoid/matchers/strategies.rb +0 -97
  495. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  496. data/lib/mongoid/nested_attributes.rb +0 -78
  497. data/lib/mongoid/observer.rb +0 -192
  498. data/lib/mongoid/paranoia.rb +0 -136
  499. data/lib/mongoid/persistence.rb +0 -357
  500. data/lib/mongoid/persistence/atomic.rb +0 -231
  501. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  502. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  503. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  504. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  505. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  506. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  507. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  508. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  509. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  510. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  511. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  512. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  513. data/lib/mongoid/persistence/deletion.rb +0 -31
  514. data/lib/mongoid/persistence/insertion.rb +0 -38
  515. data/lib/mongoid/persistence/modification.rb +0 -35
  516. data/lib/mongoid/persistence/operations.rb +0 -214
  517. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  518. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  519. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  520. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  521. data/lib/mongoid/persistence/operations/update.rb +0 -59
  522. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  523. data/lib/mongoid/persistence/upsertion.rb +0 -31
  524. data/lib/mongoid/unit_of_work.rb +0 -61
  525. data/lib/mongoid/versioning.rb +0 -217
  526. data/lib/rack/mongoid.rb +0 -2
  527. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  528. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  529. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  530. data/spec/app/models/actor_observer.rb +0 -15
  531. data/spec/app/models/callback_recorder.rb +0 -25
  532. data/spec/app/models/paranoid_phone.rb +0 -25
  533. data/spec/app/models/paranoid_post.rb +0 -36
  534. data/spec/app/models/phone_observer.rb +0 -6
  535. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  536. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  537. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  538. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  539. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  540. data/spec/mongoid/finders_spec.rb +0 -321
  541. data/spec/mongoid/identity_map_spec.rb +0 -564
  542. data/spec/mongoid/json_spec.rb +0 -33
  543. data/spec/mongoid/matchers/in_spec.rb +0 -25
  544. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  545. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  546. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  547. data/spec/mongoid/observer_spec.rb +0 -290
  548. data/spec/mongoid/paranoia_spec.rb +0 -759
  549. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  550. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  551. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  552. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  553. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  554. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  555. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  556. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  557. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  558. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  559. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  560. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  561. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  562. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  563. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  564. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  565. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  566. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  567. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  568. data/spec/mongoid/persistence_spec.rb +0 -2279
  569. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  570. data/spec/mongoid/versioning_spec.rb +0 -540
  571. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
data/lib/rack/mongoid.rb DELETED
@@ -1,2 +0,0 @@
1
- # encoding: utf-8
2
- require "rack/mongoid/middleware/identity_map"
@@ -1,39 +0,0 @@
1
- # encoding: utf-8
2
- module Rack
3
- module Mongoid
4
- module Middleware
5
-
6
- # This middleware contains the behaviour needed to properly use the
7
- # identity map in Rack based applications. This middleware will properly
8
- # handle Rails or Rack streaming responses.
9
- class IdentityMap
10
-
11
- # Initialize the new middleware.
12
- #
13
- # @example Init the middleware.
14
- # IdentityMap.new(app)
15
- #
16
- # @param [ Object ] app The application.
17
- #
18
- # @since 2.1.0
19
- def initialize(app)
20
- @app = app
21
- end
22
-
23
- # Make the request with the provided environment.
24
- #
25
- # @example Make the request.
26
- # identity_map.call(env)
27
- #
28
- # @param [ Object ] env The environment.
29
- #
30
- # @return [ Array ] The status, headers, and response.
31
- #
32
- # @since 2.1.0
33
- def call(env)
34
- ::Mongoid.unit_of_work { @app.call(env) }
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,17 +0,0 @@
1
- # encoding: utf-8
2
- require "rails/generators/mongoid_generator"
3
-
4
- module Mongoid
5
- module Generators
6
- class ObserverGenerator < Base
7
-
8
- check_class_collision suffix: "Observer"
9
-
10
- def create_observer_file
11
- template 'observer.rb.tt', File.join('app/models', class_path, "#{file_name}_observer.rb")
12
- end
13
-
14
- hook_for :test_framework
15
- end
16
- end
17
- end
@@ -1,4 +0,0 @@
1
- <% module_namespacing do -%>
2
- class <%= class_name %>Observer < Mongoid::Observer
3
- end
4
- <% end -%>
@@ -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,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
@@ -1,101 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Criteria do
4
-
5
- let(:name) do
6
- Name.new(first_name: "Durran")
7
- end
8
-
9
- let(:address_one) do
10
- Address.new(street: "Forsterstr")
11
- end
12
-
13
- let(:address_two) do
14
- Address.new(street: "Hobrechtstr")
15
- end
16
-
17
- before do
18
- Person.create(title: "Madam")
19
- 2.times do |n|
20
- Person.create(
21
- title: "Sir",
22
- name: name,
23
- addresses: [ address_one, address_two ]
24
- )
25
- end
26
- end
27
-
28
- [ :delete, :delete_all, :destroy, :destroy_all ].each do |method|
29
-
30
- describe "##{method}" do
31
-
32
- context "when removing root documents" do
33
-
34
- let(:criteria) do
35
- Person.where(title: "Sir", :age.gt => 5)
36
- end
37
-
38
- let!(:removed) do
39
- criteria.send(method)
40
- end
41
-
42
- it "deletes the removes the documents from the database" do
43
- Person.count.should eq(1)
44
- end
45
-
46
- it "returns the number removed" do
47
- removed.should eq(2)
48
- end
49
- end
50
-
51
- context "when removing embedded documents" do
52
-
53
- context "when removing a single document" do
54
-
55
- let(:person) do
56
- Person.where(title: "Sir").first
57
- end
58
-
59
- let(:criteria) do
60
- person.addresses.where(street: "Forsterstr")
61
- end
62
-
63
- let!(:removed) do
64
- criteria.send(method)
65
- end
66
-
67
- it "deletes the removes the documents from the database" do
68
- person.addresses.count.should eq(1)
69
- end
70
-
71
- it "returns the number removed" do
72
- removed.should eq(1)
73
- end
74
- end
75
-
76
- context "when removing multiple documents" do
77
-
78
- let(:person) do
79
- Person.where(title: "Sir").first
80
- end
81
-
82
- let(:criteria) do
83
- person.addresses.where(city: nil)
84
- end
85
-
86
- let!(:removed) do
87
- criteria.send(method)
88
- end
89
-
90
- it "deletes the removes the documents from the database" do
91
- person.addresses.count.should eq(0)
92
- end
93
-
94
- it "returns the number removed" do
95
- removed.should eq(2)
96
- end
97
- end
98
- end
99
- end
100
- end
101
- end
@@ -1,409 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Criterion::Modifiable do
4
-
5
- describe ".find_or_create_by" do
6
-
7
- context "when the document is found" do
8
-
9
- context "when providing an attribute" do
10
-
11
- let!(:person) do
12
- Person.create(title: "Senior")
13
- end
14
-
15
- it "returns the document" do
16
- Person.find_or_create_by(title: "Senior").should eq(person)
17
- end
18
- end
19
-
20
- context "when providing a document" do
21
-
22
- context "with an owner with a BSON identity type" do
23
-
24
- let!(:person) do
25
- Person.create
26
- end
27
-
28
- let!(:game) do
29
- Game.create(person: person)
30
- end
31
-
32
- context "when providing the object directly" do
33
-
34
- let(:from_db) do
35
- Game.find_or_create_by(person: person)
36
- end
37
-
38
- it "returns the document" do
39
- from_db.should eq(game)
40
- end
41
- end
42
-
43
- context "when providing the proxy relation" do
44
-
45
- let(:from_db) do
46
- Game.find_or_create_by(person: game.person)
47
- end
48
-
49
- it "returns the document" do
50
- from_db.should eq(game)
51
- end
52
- end
53
- end
54
-
55
- context "with an owner with an Integer identity type" do
56
-
57
- let!(:jar) do
58
- Jar.create
59
- end
60
-
61
- let!(:cookie) do
62
- Cookie.create(jar: jar)
63
- end
64
-
65
- let(:from_db) do
66
- Cookie.find_or_create_by(jar: jar)
67
- end
68
-
69
- it "returns the document" do
70
- from_db.should eq(cookie)
71
- end
72
- end
73
- end
74
- end
75
-
76
- context "when the document is not found" do
77
-
78
- context "when providing a document" do
79
-
80
- let!(:person) do
81
- Person.create
82
- end
83
-
84
- let!(:game) do
85
- Game.create
86
- end
87
-
88
- let(:from_db) do
89
- Game.find_or_create_by(person: person)
90
- end
91
-
92
- it "returns the new document" do
93
- from_db.person.should eq(person)
94
- end
95
-
96
- it "does not return an existing false document" do
97
- from_db.should_not eq(game)
98
- end
99
- end
100
-
101
- context "when not providing a block" do
102
-
103
- let!(:person) do
104
- Person.find_or_create_by(title: "Senorita")
105
- end
106
-
107
- it "creates a persisted document" do
108
- person.should be_persisted
109
- end
110
-
111
- it "sets the attributes" do
112
- person.title.should eq("Senorita")
113
- end
114
- end
115
-
116
- context "when providing a block" do
117
-
118
- let!(:person) do
119
- Person.find_or_create_by(title: "Senorita") do |person|
120
- person.pets = true
121
- end
122
- end
123
-
124
- it "creates a persisted document" do
125
- person.should be_persisted
126
- end
127
-
128
- it "sets the attributes" do
129
- person.title.should eq("Senorita")
130
- end
131
-
132
- it "calls the block" do
133
- person.pets.should be_true
134
- end
135
- end
136
- end
137
- end
138
-
139
- describe ".find_or_initialize_by" do
140
-
141
- context "when the document is found" do
142
-
143
- let!(:person) do
144
- Person.create(title: "Senior")
145
- end
146
-
147
- it "returns the document" do
148
- Person.find_or_initialize_by(title: "Senior").should eq(person)
149
- end
150
- end
151
-
152
- context "when the document is not found" do
153
-
154
- context "when not providing a block" do
155
-
156
- let!(:person) do
157
- Person.find_or_initialize_by(title: "Senorita")
158
- end
159
-
160
- it "creates a new document" do
161
- person.should be_new_record
162
- end
163
-
164
- it "sets the attributes" do
165
- person.title.should eq("Senorita")
166
- end
167
- end
168
-
169
- context "when providing a block" do
170
-
171
- let!(:person) do
172
- Person.find_or_initialize_by(title: "Senorita") do |person|
173
- person.pets = true
174
- end
175
- end
176
-
177
- it "creates a new document" do
178
- person.should be_new_record
179
- end
180
-
181
- it "sets the attributes" do
182
- person.title.should eq("Senorita")
183
- end
184
-
185
- it "calls the block" do
186
- person.pets.should be_true
187
- end
188
- end
189
- end
190
- end
191
-
192
- describe "first_or_create" do
193
-
194
- let!(:band) do
195
- Band.create(name: "Depeche Mode")
196
- end
197
-
198
- context "when the document is found" do
199
-
200
- let(:found) do
201
- Band.where(name: "Depeche Mode").first_or_create
202
- end
203
-
204
- it "returns the document" do
205
- expect(found).to eq(band)
206
- end
207
- end
208
-
209
- context "when the document is not found" do
210
-
211
- context "when attributes are provided" do
212
-
213
- let(:document) do
214
- Band.where(name: "Tool").first_or_create(origin: "Essex")
215
- end
216
-
217
- it "returns a new document" do
218
- expect(document.name).to eq("Tool")
219
- end
220
-
221
- it "returns a persisted document" do
222
- expect(document).to be_persisted
223
- end
224
-
225
- it "sets the additional attributes" do
226
- expect(document.origin).to eq("Essex")
227
- end
228
- end
229
-
230
- context "when attributes are not provided" do
231
-
232
- let(:document) do
233
- Band.where(name: "Tool").first_or_create
234
- end
235
-
236
- it "returns a new document" do
237
- expect(document.name).to eq("Tool")
238
- end
239
-
240
- it "returns a persisted document" do
241
- expect(document).to be_persisted
242
- end
243
- end
244
-
245
- context "when a block is provided" do
246
-
247
- let(:document) do
248
- Band.where(name: "Tool").first_or_create do |doc|
249
- doc.active = false
250
- end
251
- end
252
-
253
- it "returns a new document" do
254
- expect(document.name).to eq("Tool")
255
- end
256
-
257
- it "returns a persisted document" do
258
- expect(document).to be_persisted
259
- end
260
-
261
- it "yields to the block" do
262
- expect(document.active).to be_false
263
- end
264
- end
265
-
266
- context "when the criteria is complex" do
267
-
268
- context "when the document is not found" do
269
-
270
- let(:document) do
271
- Band.in(name: [ "New Order" ]).first_or_create(active: false)
272
- end
273
-
274
- it "returns a new document" do
275
- expect(document.active).to be_false
276
- end
277
-
278
- it "returns a persisted document" do
279
- expect(document).to be_persisted
280
- end
281
- end
282
- end
283
- end
284
- end
285
-
286
- describe "first_or_create!" do
287
-
288
- context "when validation fails on the new document" do
289
-
290
- it "raises an error" do
291
- expect {
292
- Account.where(number: "12345").first_or_create!
293
- }.to raise_error(Mongoid::Errors::Validations)
294
- end
295
- end
296
-
297
- context "when passing a block" do
298
-
299
- let(:account) do
300
- Account.where(number: "12345").first_or_create! do |account|
301
- account.name = "testing"
302
- end
303
- end
304
-
305
- it "passes the block to the create call" do
306
- expect(account.name).to eq("testing")
307
- end
308
-
309
- it "persists the new document" do
310
- expect(account).to be_persisted
311
- end
312
- end
313
-
314
- context "when the document is found" do
315
-
316
- let!(:band) do
317
- Band.with(safe: true).create!(name: "Depeche Mode")
318
- end
319
-
320
- let(:found) do
321
- Band.where(name: "Depeche Mode").first_or_create!
322
- end
323
-
324
- it "returns the document" do
325
- expect(found).to eq(band)
326
- end
327
- end
328
-
329
- context "when the document is not found" do
330
-
331
- let!(:band) do
332
- Band.with(safe: true).create!(name: "Depeche Mode")
333
- end
334
-
335
- context "when attributes are provided" do
336
-
337
- let(:document) do
338
- Band.where(name: "Tool").first_or_create!(origin: "Essex")
339
- end
340
-
341
- it "returns a new document" do
342
- expect(document.name).to eq("Tool")
343
- end
344
-
345
- it "returns a persisted document" do
346
- expect(document).to be_persisted
347
- end
348
-
349
- it "sets the additional attributes" do
350
- expect(document.origin).to eq("Essex")
351
- end
352
- end
353
-
354
- context "when attributes are not provided" do
355
-
356
- let(:document) do
357
- Band.where(name: "Tool").first_or_create!
358
- end
359
-
360
- it "returns a new document" do
361
- expect(document.name).to eq("Tool")
362
- end
363
-
364
- it "returns a persisted document" do
365
- expect(document).to be_persisted
366
- end
367
- end
368
-
369
- context "when a block is provided" do
370
-
371
- let(:document) do
372
- Band.where(name: "Tool").first_or_create! do |doc|
373
- doc.active = false
374
- end
375
- end
376
-
377
- it "returns a new document" do
378
- expect(document.name).to eq("Tool")
379
- end
380
-
381
- it "returns a persisted document" do
382
- expect(document).to be_persisted
383
- end
384
-
385
- it "yields to the block" do
386
- expect(document.active).to be_false
387
- end
388
- end
389
-
390
- context "when the criteria is complex" do
391
-
392
- context "when the document is not found" do
393
-
394
- let(:document) do
395
- Band.in(name: [ "New Order" ]).first_or_create!(active: false)
396
- end
397
-
398
- it "returns a new document" do
399
- expect(document.active).to be_false
400
- end
401
-
402
- it "returns a persisted document" do
403
- expect(document).to be_persisted
404
- end
405
- end
406
- end
407
- end
408
- end
409
- end