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
@@ -11,7 +11,75 @@ describe Mongoid::Attributes do
11
11
  end
12
12
 
13
13
  it "does not cause an infinite loop" do
14
- account.overridden.should eq("not recommended")
14
+ expect(account.overridden).to eq("not recommended")
15
+ end
16
+ end
17
+
18
+ context "when the attribute was excluded in a criteria" do
19
+
20
+ let!(:person) do
21
+ Person.create(title: "sir")
22
+ end
23
+
24
+ context "when the attribute is localized" do
25
+
26
+ before do
27
+ person.update_attribute(:desc, "test")
28
+ end
29
+
30
+ context "when the context includes" do
31
+
32
+ context "when the attribute exists" do
33
+
34
+ let(:from_db) do
35
+ Person.only(:desc).first
36
+ end
37
+
38
+ it "does not raise an error" do
39
+ expect(from_db.desc).to eq("test")
40
+ end
41
+ end
42
+ end
43
+
44
+ context "when the context excludes" do
45
+
46
+ context "when the attribute exists" do
47
+
48
+ let(:from_db) do
49
+ Person.without(:pets).first
50
+ end
51
+
52
+ it "does not raise an error" do
53
+ expect(from_db.desc).to eq("test")
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ context "when excluding with only" do
60
+
61
+ let(:from_db) do
62
+ Person.only(:_id).first
63
+ end
64
+
65
+ it "raises an error" do
66
+ expect {
67
+ from_db.title
68
+ }.to raise_error(ActiveModel::MissingAttributeError)
69
+ end
70
+ end
71
+
72
+ context "when excluding with without" do
73
+
74
+ let(:from_db) do
75
+ Person.without(:title).first
76
+ end
77
+
78
+ it "raises an error" do
79
+ expect {
80
+ from_db.title
81
+ }.to raise_error(ActiveModel::MissingAttributeError)
82
+ end
15
83
  end
16
84
  end
17
85
  end
@@ -33,14 +101,14 @@ describe Mongoid::Attributes do
33
101
  context "when passing just the name" do
34
102
 
35
103
  it "returns the full value" do
36
- person[:desc].should eq("en" => "testing")
104
+ expect(person[:desc]).to eq("en" => "testing")
37
105
  end
38
106
  end
39
107
 
40
108
  context "when passing the name with locale" do
41
109
 
42
110
  it "returns the value for the locale" do
43
- person["desc.en"].should eq("testing")
111
+ expect(person["desc.en"]).to eq("testing")
44
112
  end
45
113
  end
46
114
  end
@@ -48,7 +116,7 @@ describe Mongoid::Attributes do
48
116
  context "when attribute does not exist" do
49
117
 
50
118
  it "returns the default value" do
51
- person[:age].should eq(100)
119
+ expect(person[:age]).to eq(100)
52
120
  end
53
121
  end
54
122
 
@@ -59,7 +127,7 @@ describe Mongoid::Attributes do
59
127
  end
60
128
 
61
129
  it "returns the value" do
62
- person[:owner_id].should eq(5)
130
+ expect(person[:owner_id]).to eq(5)
63
131
  end
64
132
  end
65
133
  end
@@ -70,6 +138,35 @@ describe Mongoid::Attributes do
70
138
  Person.create(title: "sir")
71
139
  end
72
140
 
141
+ context "when the attribute was excluded in a criteria" do
142
+
143
+ context "when excluding with only" do
144
+
145
+ let(:from_db) do
146
+ Person.only(:_id).first
147
+ end
148
+
149
+ it "raises an error" do
150
+ expect {
151
+ from_db[:title]
152
+ }.to raise_error(ActiveModel::MissingAttributeError)
153
+ end
154
+ end
155
+
156
+ context "when excluding with without" do
157
+
158
+ let(:from_db) do
159
+ Person.without(:title).first
160
+ end
161
+
162
+ it "raises an error" do
163
+ expect {
164
+ from_db[:title]
165
+ }.to raise_error(ActiveModel::MissingAttributeError)
166
+ end
167
+ end
168
+ end
169
+
73
170
  context "when the attribute does not exist" do
74
171
 
75
172
  before do
@@ -85,7 +182,7 @@ describe Mongoid::Attributes do
85
182
  end
86
183
 
87
184
  it "returns the default value" do
88
- found[:age].should eq(100)
185
+ expect(found[:age]).to eq(100)
89
186
  end
90
187
  end
91
188
 
@@ -98,7 +195,7 @@ describe Mongoid::Attributes do
98
195
  end
99
196
 
100
197
  it "returns the default value" do
101
- person[:age].should eq(100)
198
+ expect(person[:age]).to eq(100)
102
199
  end
103
200
  end
104
201
  end
@@ -113,270 +210,31 @@ describe Mongoid::Attributes do
113
210
 
114
211
  context "when setting the attribute to nil" do
115
212
 
116
- before do
213
+ let!(:age) do
117
214
  person[:age] = nil
118
215
  end
119
216
 
120
217
  it "does not use the default value" do
121
- person.age.should be_nil
218
+ expect(person.age).to be_nil
219
+ end
220
+
221
+ it "returns the set value" do
222
+ expect(age).to be_nil
122
223
  end
123
224
  end
124
225
 
125
226
  context "when field has a default value" do
126
227
 
127
- before do
228
+ let!(:terms) do
128
229
  person[:terms] = true
129
230
  end
130
231
 
131
232
  it "allows overwriting of the default value" do
132
- person.terms.should be_true
133
- end
134
- end
135
- end
136
-
137
- describe ".attr_accessible" do
138
-
139
- context "when the field is not _id" do
140
-
141
- let(:account) do
142
- Account.new(number: 999999)
143
- end
144
-
145
- it "prevents setting via mass assignment" do
146
- account.number.should be_nil
147
- end
148
- end
149
-
150
- context "when the field is _id" do
151
-
152
- let(:account) do
153
- Account.new(_id: "ABBA")
154
- end
155
-
156
- it "prevents setting via mass assignment" do
157
- account._id.should_not eq("ABBA")
158
- end
159
- end
160
-
161
- context "when using instantiate" do
162
-
163
- let(:account) do
164
- Account.instantiate("_id" => "1", "balance" => "ABBA")
165
- end
166
-
167
- it "ignores any protected attribute" do
168
- account.balance.should eq("ABBA")
169
- end
170
- end
171
-
172
- context "when using override" do
173
-
174
- let(:account) do
175
- Account.new
176
- end
177
-
178
- it "ignores any protected attribute" do
179
- account.write_attributes({balance: "ABBA"}, false)
180
- account.balance.should eq("ABBA")
181
- end
182
- end
183
-
184
- context "when mass assignment role is indicated" do
185
-
186
- context "when attributes assigned from default role" do
187
-
188
- let(:article) do
189
- Article.new(
190
- title: "Some Title",
191
- is_rss: true,
192
- user_login: "SomeLogin"
193
- )
194
- end
195
-
196
- it "sets the title field for default role" do
197
- article.title.should eq("Some Title")
198
- end
199
-
200
- it "sets the user login field for the default role" do
201
- article.user_login.should eq("SomeLogin")
202
- end
203
-
204
- it "sets the rss field for the default role" do
205
- article.is_rss.should be_false
206
- end
207
- end
208
-
209
- context "when attributes assigned from parser role" do
210
-
211
- let(:article) do
212
- Article.new({
213
- title: "Some Title",
214
- is_rss: true,
215
- user_login: "SomeLogin"
216
- }, as: :parser
217
- )
218
- end
219
-
220
- it "sets the title field" do
221
- article.title.should eq("Some Title")
222
- end
223
-
224
- it "sets the rss field" do
225
- article.is_rss.should be_true
226
- end
227
-
228
- it "does not set the user login field" do
229
- article.user_login.should be_nil
230
- end
231
- end
232
-
233
- context "when attributes assigned without protection" do
234
-
235
- let(:article) do
236
- Article.new(
237
- { title: "Some Title",
238
- is_rss: true,
239
- user_login: "SomeLogin"
240
- }, without_protection: true
241
- )
242
- end
243
-
244
- it "sets the title field" do
245
- article.title.should eq("Some Title")
246
- end
247
-
248
- it "sets the user login field" do
249
- article.user_login.should eq("SomeLogin")
250
- end
251
-
252
- it "sets the rss field" do
253
- article.is_rss.should be_true
254
- end
255
- end
256
- end
257
- end
258
-
259
- describe ".attr_protected" do
260
-
261
- context "when the field is not _id" do
262
-
263
- let(:person) do
264
- Person.new(security_code: "ABBA")
265
- end
266
-
267
- it "prevents setting via mass assignment" do
268
- person.security_code.should be_nil
269
- end
270
- end
271
-
272
- context "when the field is _id" do
273
-
274
- let(:game) do
275
- Game.new(_id: "ABBA")
276
- end
277
-
278
- it "prevents setting via mass assignment" do
279
- game._id.should_not eq("ABBA")
280
- end
281
- end
282
-
283
- context "when using instantiate" do
284
-
285
- let(:person) do
286
- Person.instantiate("_id" => "1", "security_code" => "ABBA")
287
- end
288
-
289
- it "ignores any protected attribute" do
290
- person.security_code.should eq("ABBA")
291
- end
292
- end
293
-
294
- context "when using override" do
295
-
296
- let(:person) do
297
- Person.new
298
- end
299
-
300
- it "ignores any protected attribute" do
301
- person.write_attributes({security_code: "ABBA"}, false)
302
- person.security_code.should eq("ABBA")
303
- end
304
- end
305
-
306
- context "when mass assignment role is indicated" do
307
-
308
- let(:item) do
309
- Item.new
310
- end
311
-
312
- context "when attributes assigned from default role" do
313
-
314
- before do
315
- item.assign_attributes(
316
- title: "Some Title",
317
- is_rss: true,
318
- user_login: "SomeLogin"
319
- )
320
- end
321
-
322
- it "sets the field for the default role" do
323
- item.is_rss.should be_true
324
- end
325
-
326
- it "does not set the field for non default role title" do
327
- item.title.should be_nil
328
- end
329
-
330
- it "does not set the field for non default role user login" do
331
- item.user_login.should be_nil
332
- end
333
- end
334
-
335
- context "when attributes assigned from parser role" do
336
-
337
- before do
338
- item.assign_attributes(
339
- { title: "Some Title",
340
- is_rss: true,
341
- user_login: "SomeLogin" }, as: :parser
342
- )
343
- end
344
-
345
- it "sets the user login field for parser role" do
346
- item.user_login.should eq("SomeLogin")
347
- end
348
-
349
- it "sets the is rss field for parse role" do
350
- item.is_rss.should be_false
351
- end
352
-
353
- it "does not set the title field" do
354
- item.title.should be_nil
355
- end
233
+ expect(person.terms).to be true
356
234
  end
357
235
 
358
- context "when attributes assigned without protection" do
359
-
360
- before do
361
- item.assign_attributes(
362
- { title: "Some Title",
363
- is_rss: true,
364
- user_login: "SomeLogin"
365
- }, without_protection: true
366
- )
367
- end
368
-
369
- it "sets the title attribute" do
370
- item.title.should eq("Some Title")
371
- end
372
-
373
- it "sets the user login attribute" do
374
- item.user_login.should eq("SomeLogin")
375
- end
376
-
377
- it "sets the rss attribute" do
378
- item.is_rss.should be_true
379
- end
236
+ it "returns the set value" do
237
+ expect(terms).to eq(true)
380
238
  end
381
239
  end
382
240
  end
@@ -388,7 +246,7 @@ describe Mongoid::Attributes do
388
246
  end
389
247
 
390
248
  it "delegates to #id" do
391
- person._id.should eq(person.id)
249
+ expect(person._id).to eq(person.id)
392
250
  end
393
251
  end
394
252
 
@@ -397,9 +255,10 @@ describe Mongoid::Attributes do
397
255
  after(:all) do
398
256
  Person.field(
399
257
  :_id,
400
- type: Moped::BSON::ObjectId,
258
+ type: BSON::ObjectId,
401
259
  pre_processed: true,
402
- default: ->{ Moped::BSON::ObjectId.new }
260
+ default: ->{ BSON::ObjectId.new },
261
+ overwrite: true
403
262
  )
404
263
  end
405
264
 
@@ -408,9 +267,10 @@ describe Mongoid::Attributes do
408
267
  before(:all) do
409
268
  Person.field(
410
269
  :_id,
411
- type: Moped::BSON::ObjectId,
270
+ type: BSON::ObjectId,
412
271
  pre_processed: true,
413
- default: ->{ Moped::BSON::ObjectId.new }
272
+ default: ->{ BSON::ObjectId.new },
273
+ overwrite: true
414
274
  )
415
275
  end
416
276
 
@@ -419,7 +279,7 @@ describe Mongoid::Attributes do
419
279
  end
420
280
 
421
281
  let(:bson_id) do
422
- Moped::BSON::ObjectId.new
282
+ BSON::ObjectId.new
423
283
  end
424
284
 
425
285
  context "when providing an object id" do
@@ -429,7 +289,7 @@ describe Mongoid::Attributes do
429
289
  end
430
290
 
431
291
  it "sets the id as the object id" do
432
- person.id.should eq(bson_id)
292
+ expect(person.id).to eq(bson_id)
433
293
  end
434
294
  end
435
295
 
@@ -440,7 +300,7 @@ describe Mongoid::Attributes do
440
300
  end
441
301
 
442
302
  it "sets the id as the object id" do
443
- person.id.should eq(bson_id)
303
+ expect(person.id).to eq(bson_id)
444
304
  end
445
305
  end
446
306
 
@@ -451,7 +311,7 @@ describe Mongoid::Attributes do
451
311
  end
452
312
 
453
313
  it "sets the id as the supplied value to_s" do
454
- person.id.should eq(2)
314
+ expect(person.id).to eq(2)
455
315
  end
456
316
  end
457
317
  end
@@ -463,7 +323,8 @@ describe Mongoid::Attributes do
463
323
  :_id,
464
324
  type: String,
465
325
  pre_processed: true,
466
- default: ->{ Moped::BSON::ObjectId.new.to_s }
326
+ default: ->{ BSON::ObjectId.new.to_s },
327
+ overwrite: true
467
328
  )
468
329
  end
469
330
 
@@ -472,7 +333,7 @@ describe Mongoid::Attributes do
472
333
  end
473
334
 
474
335
  let(:bson_id) do
475
- Moped::BSON::ObjectId.new
336
+ BSON::ObjectId.new
476
337
  end
477
338
 
478
339
  context "when providing an object id" do
@@ -482,7 +343,7 @@ describe Mongoid::Attributes do
482
343
  end
483
344
 
484
345
  it "sets the id as the string of the object id" do
485
- person.id.should eq(bson_id.to_s)
346
+ expect(person.id).to eq(bson_id.to_s)
486
347
  end
487
348
  end
488
349
 
@@ -493,7 +354,7 @@ describe Mongoid::Attributes do
493
354
  end
494
355
 
495
356
  it "sets the id as the string" do
496
- person.id.should eq(bson_id.to_s)
357
+ expect(person.id).to eq(bson_id.to_s)
497
358
  end
498
359
  end
499
360
 
@@ -504,7 +365,7 @@ describe Mongoid::Attributes do
504
365
  end
505
366
 
506
367
  it "sets the id as the supplied value to_s" do
507
- person.id.should eq("2")
368
+ expect(person.id).to eq("2")
508
369
  end
509
370
  end
510
371
  end
@@ -512,7 +373,7 @@ describe Mongoid::Attributes do
512
373
  context "when using integer ids" do
513
374
 
514
375
  before(:all) do
515
- Person.field(:_id, type: Integer)
376
+ Person.field(:_id, type: Integer, overwrite: true)
516
377
  end
517
378
 
518
379
  let(:person) do
@@ -526,7 +387,7 @@ describe Mongoid::Attributes do
526
387
  end
527
388
 
528
389
  it "sets the id as the integer" do
529
- person.id.should eq(1)
390
+ expect(person.id).to eq(1)
530
391
  end
531
392
  end
532
393
 
@@ -537,7 +398,7 @@ describe Mongoid::Attributes do
537
398
  end
538
399
 
539
400
  it "sets the id as the supplied value" do
540
- person.id.should eq(2)
401
+ expect(person.id).to eq(2)
541
402
  end
542
403
  end
543
404
  end
@@ -553,27 +414,23 @@ describe Mongoid::Attributes do
553
414
  Person.new(attributes)
554
415
  end
555
416
 
556
- before do
557
- Mongoid.configure.allow_dynamic_fields = true
558
- end
559
-
560
417
  context "when an attribute exists" do
561
418
 
562
419
  it "allows the getter" do
563
- person.testing.should eq("Testing")
420
+ expect(person.testing).to eq("Testing")
564
421
  end
565
422
 
566
423
  it "allows the setter" do
567
424
  person.testing = "Test"
568
- person.testing.should eq("Test")
425
+ expect(person.testing).to eq("Test")
569
426
  end
570
427
 
571
428
  it "allows the getter before_type_cast" do
572
- person.testing_before_type_cast.should eq("Testing")
429
+ expect(person.testing_before_type_cast).to eq("Testing")
573
430
  end
574
431
 
575
432
  it "returns true for respond_to?" do
576
- person.respond_to?(:testing).should be_true
433
+ expect(person.respond_to?(:testing)).to be true
577
434
  end
578
435
  end
579
436
 
@@ -588,28 +445,17 @@ describe Mongoid::Attributes do
588
445
  end
589
446
 
590
447
  it "mongoizes the dynamic field" do
591
- person.new_years.should be_a(Time)
448
+ expect(person.new_years).to be_a(Time)
592
449
  end
593
450
 
594
451
  it "keeps the same value" do
595
- person.new_years.should eq(new_years)
452
+ expect(person.new_years).to eq(new_years)
596
453
  end
597
454
  end
598
455
  end
599
456
 
600
457
  describe "#process" do
601
458
 
602
- context "when passing non accessible fields" do
603
-
604
- let(:person) do
605
- Person.new(owner_id: 6)
606
- end
607
-
608
- it "does not set the value" do
609
- person.owner_id.should be_nil
610
- end
611
- end
612
-
613
459
  context "when attributes dont have fields defined" do
614
460
 
615
461
  let(:attributes) do
@@ -626,43 +472,26 @@ describe Mongoid::Attributes do
626
472
  Person.new(attributes)
627
473
  end
628
474
 
629
- before do
630
- Mongoid.configure.allow_dynamic_fields = true
631
- end
632
-
633
475
  context "when attribute is a string" do
634
476
 
635
477
  it "adds the string to the attributes" do
636
- person.attributes["nofieldstring"].should eq("Testing")
478
+ expect(person.attributes["nofieldstring"]).to eq("Testing")
637
479
  end
638
480
  end
639
481
 
640
482
  context "when attribute is not a string" do
641
483
 
642
484
  it "adds a cast value to the attributes" do
643
- person.attributes["nofieldint"].should eq(5)
485
+ expect(person.attributes["nofieldint"]).to eq(5)
644
486
  end
645
487
  end
646
488
  end
647
489
 
648
490
  context "when not allowing dynamic fields" do
649
491
 
650
- let!(:attributes) do
651
- { nofieldstring: "Testing" }
652
- end
653
-
654
- before do
655
- Mongoid.configure.allow_dynamic_fields = false
656
- Person.fields.delete(:nofieldstring)
657
- end
658
-
659
- after do
660
- Mongoid.configure.allow_dynamic_fields = true
661
- end
662
-
663
- it "raises an unknown attribute error" do
492
+ it "raises an unknown attribute error on instantiation" do
664
493
  expect {
665
- Person.new({ anothernew: "Test" })
494
+ Account.new({ anothernew: "Test" })
666
495
  }.to raise_error(Mongoid::Errors::UnknownAttribute)
667
496
  end
668
497
  end
@@ -671,7 +500,7 @@ describe Mongoid::Attributes do
671
500
  context "when supplied hash has string values" do
672
501
 
673
502
  let(:bson_id) do
674
- Moped::BSON::ObjectId.new
503
+ BSON::ObjectId.new
675
504
  end
676
505
 
677
506
  let!(:attributes) do
@@ -695,15 +524,15 @@ describe Mongoid::Attributes do
695
524
  end
696
525
 
697
526
  it "casts integers" do
698
- person[:age].should eq(30)
527
+ expect(person[:age]).to eq(30)
699
528
  end
700
529
 
701
530
  it "casts booleans" do
702
- person[:terms].should be_true
531
+ expect(person[:terms]).to be true
703
532
  end
704
533
 
705
534
  it "sets empty strings to nil" do
706
- person[:score].should be_nil
535
+ expect(person[:score]).to be_nil
707
536
  end
708
537
  end
709
538
 
@@ -724,7 +553,7 @@ describe Mongoid::Attributes do
724
553
  end
725
554
 
726
555
  it "sets the associations" do
727
- person.name.should eq(name)
556
+ expect(person.name).to eq(name)
728
557
  end
729
558
  end
730
559
 
@@ -743,11 +572,11 @@ describe Mongoid::Attributes do
743
572
  end
744
573
 
745
574
  it "sets the parent association" do
746
- person.game.should eq(game)
575
+ expect(person.game).to eq(game)
747
576
  end
748
577
 
749
578
  it "sets the inverse association" do
750
- game.person.should eq(person)
579
+ expect(game.person).to eq(person)
751
580
  end
752
581
  end
753
582
 
@@ -762,7 +591,7 @@ describe Mongoid::Attributes do
762
591
  end
763
592
 
764
593
  it "sets the association" do
765
- name.person.should eq(person)
594
+ expect(name.person).to eq(person)
766
595
  end
767
596
  end
768
597
  end
@@ -782,7 +611,7 @@ describe Mongoid::Attributes do
782
611
  end
783
612
 
784
613
  it "calls the setter for the association" do
785
- person.employer_id.should eq("1")
614
+ expect(person.employer_id).to eq("1")
786
615
  end
787
616
  end
788
617
 
@@ -797,7 +626,7 @@ describe Mongoid::Attributes do
797
626
  end
798
627
 
799
628
  it "sets the empty array" do
800
- person.aliases.should be_empty
629
+ expect(person.aliases).to be_empty
801
630
  end
802
631
  end
803
632
 
@@ -812,7 +641,20 @@ describe Mongoid::Attributes do
812
641
  end
813
642
 
814
643
  it "sets the empty hash" do
815
- person.map.should eq({})
644
+ expect(person.map).to eq({})
645
+ end
646
+ end
647
+
648
+ context "when providing tainted parameters" do
649
+
650
+ let(:params) do
651
+ ActionController::Parameters.new(title: "sir")
652
+ end
653
+
654
+ it "raises an error" do
655
+ expect {
656
+ Person.new(params)
657
+ }.to raise_error(ActiveModel::ForbiddenAttributesError)
816
658
  end
817
659
  end
818
660
  end
@@ -832,7 +674,7 @@ describe Mongoid::Attributes do
832
674
  end
833
675
 
834
676
  it "only overwrites supplied attributes" do
835
- person.title.should eq("Sir")
677
+ expect(person.title).to eq("Sir")
836
678
  end
837
679
  end
838
680
 
@@ -847,8 +689,8 @@ describe Mongoid::Attributes do
847
689
  context "when attribute does not exist" do
848
690
 
849
691
  it "returns the default value" do
850
- person.age.should eq(100)
851
- person.pets.should be_false
692
+ expect(person.age).to eq(100)
693
+ expect(person.pets).to be false
852
694
  end
853
695
 
854
696
  end
@@ -860,7 +702,7 @@ describe Mongoid::Attributes do
860
702
  end
861
703
 
862
704
  it "returns the value" do
863
- person.read_attribute(:owner_id).should eq(5)
705
+ expect(person.read_attribute(:owner_id)).to eq(5)
864
706
  end
865
707
  end
866
708
  end
@@ -883,7 +725,7 @@ describe Mongoid::Attributes do
883
725
  end
884
726
 
885
727
  it "returns the default value" do
886
- person.age.should eq(100)
728
+ expect(person.age).to eq(100)
887
729
  end
888
730
  end
889
731
  end
@@ -905,6 +747,7 @@ describe Mongoid::Attributes do
905
747
  end
906
748
 
907
749
  describe "#read_attribute_before_type_cast" do
750
+
908
751
  let(:person) do
909
752
  Person.create
910
753
  end
@@ -912,7 +755,7 @@ describe Mongoid::Attributes do
912
755
  context "when the attribute has not yet been assigned" do
913
756
 
914
757
  it "returns the default value" do
915
- person.age_before_type_cast.should eq(100)
758
+ expect(person.age_before_type_cast).to eq(100)
916
759
  end
917
760
  end
918
761
 
@@ -920,12 +763,11 @@ describe Mongoid::Attributes do
920
763
 
921
764
  it "returns the default value" do
922
765
  person.age = "old"
923
- person.age_before_type_cast.should eq("old")
766
+ expect(person.age_before_type_cast).to eq("old")
924
767
  end
925
768
  end
926
769
  end
927
770
 
928
-
929
771
  describe "#attribute_present?" do
930
772
 
931
773
  context "when document is a new record" do
@@ -937,7 +779,7 @@ describe Mongoid::Attributes do
937
779
  context "when attribute does not exist" do
938
780
 
939
781
  it "returns false" do
940
- person.attribute_present?(:owner_id).should be_false
782
+ expect(person.attribute_present?(:owner_id)).to be false
941
783
  end
942
784
  end
943
785
 
@@ -947,7 +789,7 @@ describe Mongoid::Attributes do
947
789
  end
948
790
 
949
791
  it "returns true" do
950
- person.attribute_present?(:owner_id).should be_true
792
+ expect(person.attribute_present?(:owner_id)).to be true
951
793
  end
952
794
  end
953
795
  end
@@ -970,7 +812,7 @@ describe Mongoid::Attributes do
970
812
  end
971
813
 
972
814
  it "returns true" do
973
- person.attribute_present?(:age).should be_true
815
+ expect(person.attribute_present?(:age)).to be true
974
816
  end
975
817
  end
976
818
  end
@@ -987,7 +829,7 @@ describe Mongoid::Attributes do
987
829
 
988
830
  it "return true" do
989
831
  person.terms = false
990
- person.attribute_present?(:terms).should be_true
832
+ expect(person.attribute_present?(:terms)).to be true
991
833
  end
992
834
  end
993
835
 
@@ -995,7 +837,7 @@ describe Mongoid::Attributes do
995
837
 
996
838
  it "return true" do
997
839
  person.terms = false
998
- person.attribute_present?(:terms).should be_true
840
+ expect(person.attribute_present?(:terms)).to be true
999
841
  end
1000
842
  end
1001
843
  end
@@ -1008,7 +850,7 @@ describe Mongoid::Attributes do
1008
850
  end
1009
851
 
1010
852
  it "return false" do
1011
- person.attribute_present?(:title).should be_false
853
+ expect(person.attribute_present?(:title)).to be false
1012
854
  end
1013
855
  end
1014
856
  end
@@ -1024,14 +866,14 @@ describe Mongoid::Attributes do
1024
866
  context "when provided a symbol" do
1025
867
 
1026
868
  it "returns true" do
1027
- person.has_attribute?(:title).should be_true
869
+ expect(person.has_attribute?(:title)).to be true
1028
870
  end
1029
871
  end
1030
872
 
1031
873
  context "when provided a string" do
1032
874
 
1033
875
  it "returns true" do
1034
- person.has_attribute?("title").should be_true
876
+ expect(person.has_attribute?("title")).to be true
1035
877
  end
1036
878
  end
1037
879
  end
@@ -1039,7 +881,7 @@ describe Mongoid::Attributes do
1039
881
  context "when the key is not in the attributes" do
1040
882
 
1041
883
  it "returns false" do
1042
- person.has_attribute?(:employer_id).should be_false
884
+ expect(person.has_attribute?(:employer_id)).to be false
1043
885
  end
1044
886
  end
1045
887
  end
@@ -1053,7 +895,7 @@ describe Mongoid::Attributes do
1053
895
  context "before the attribute has been assigned" do
1054
896
 
1055
897
  it "returns false" do
1056
- person.has_attribute_before_type_cast?(:age).should be_false
898
+ expect(person.has_attribute_before_type_cast?(:age)).to be false
1057
899
  end
1058
900
  end
1059
901
 
@@ -1061,7 +903,7 @@ describe Mongoid::Attributes do
1061
903
 
1062
904
  it "returns true" do
1063
905
  person.age = 'old'
1064
- person.has_attribute_before_type_cast?(:age).should be_true
906
+ expect(person.has_attribute_before_type_cast?(:age)).to be true
1065
907
  end
1066
908
  end
1067
909
  end
@@ -1079,11 +921,11 @@ describe Mongoid::Attributes do
1079
921
  end
1080
922
 
1081
923
  it "removes the attribute" do
1082
- person.title.should be_nil
924
+ expect(person.title).to be_nil
1083
925
  end
1084
926
 
1085
927
  it "removes the key from the attributes hash" do
1086
- person.has_attribute?(:title).should be_false
928
+ expect(person.has_attribute?(:title)).to be false
1087
929
  end
1088
930
 
1089
931
  context "when saving after the removal" do
@@ -1093,7 +935,7 @@ describe Mongoid::Attributes do
1093
935
  end
1094
936
 
1095
937
  it "persists the removal" do
1096
- person.reload.has_attribute?(:title).should be_false
938
+ expect(person.reload.has_attribute?(:title)).to be false
1097
939
  end
1098
940
  end
1099
941
  end
@@ -1114,11 +956,11 @@ describe Mongoid::Attributes do
1114
956
  end
1115
957
 
1116
958
  it "removes the attribute" do
1117
- person.pet.name.should be_nil
959
+ expect(person.pet.name).to be_nil
1118
960
  end
1119
961
 
1120
962
  it "removes the key from the attributes hash" do
1121
- person.pet.has_attribute?(:name).should be_false
963
+ expect(person.pet.has_attribute?(:name)).to be false
1122
964
  end
1123
965
 
1124
966
  context "when saving after the removal" do
@@ -1128,7 +970,7 @@ describe Mongoid::Attributes do
1128
970
  end
1129
971
 
1130
972
  it "persists the removal" do
1131
- person.reload.pet.has_attribute?(:name).should be_false
973
+ expect(person.reload.pet.has_attribute?(:name)).to be false
1132
974
  end
1133
975
  end
1134
976
 
@@ -1145,7 +987,7 @@ describe Mongoid::Attributes do
1145
987
  end
1146
988
 
1147
989
  it "does not fail" do
1148
- person.title.should be_nil
990
+ expect(person.title).to be_nil
1149
991
  end
1150
992
  end
1151
993
 
@@ -1160,7 +1002,7 @@ describe Mongoid::Attributes do
1160
1002
  end
1161
1003
 
1162
1004
  it "does not add a delayed unset operation" do
1163
- person.delayed_atomic_unsets.should be_empty
1005
+ expect(person.delayed_atomic_unsets).to be_empty
1164
1006
  end
1165
1007
  end
1166
1008
  end
@@ -1173,10 +1015,6 @@ describe Mongoid::Attributes do
1173
1015
  Person.new
1174
1016
  end
1175
1017
 
1176
- before(:all) do
1177
- Mongoid.allow_dynamic_fields = true
1178
- end
1179
-
1180
1018
  context "when asking for the getter" do
1181
1019
 
1182
1020
  context "when the attribute exists" do
@@ -1186,14 +1024,14 @@ describe Mongoid::Attributes do
1186
1024
  end
1187
1025
 
1188
1026
  it "returns true" do
1189
- person.should respond_to(:attr)
1027
+ expect(person).to respond_to(:attr)
1190
1028
  end
1191
1029
  end
1192
1030
 
1193
1031
  context "when the attribute does not exist" do
1194
1032
 
1195
1033
  it "returns false" do
1196
- person.should_not respond_to(:attr)
1034
+ expect(person).to_not respond_to(:attr)
1197
1035
  end
1198
1036
  end
1199
1037
  end
@@ -1207,14 +1045,14 @@ describe Mongoid::Attributes do
1207
1045
  end
1208
1046
 
1209
1047
  it "returns true" do
1210
- person.should respond_to(:attr=)
1048
+ expect(person).to respond_to(:attr=)
1211
1049
  end
1212
1050
  end
1213
1051
 
1214
1052
  context "when the attribute does not exist" do
1215
1053
 
1216
1054
  it "returns false" do
1217
- person.should_not respond_to(:attr=)
1055
+ expect(person).to_not respond_to(:attr=)
1218
1056
  end
1219
1057
  end
1220
1058
  end
@@ -1222,29 +1060,21 @@ describe Mongoid::Attributes do
1222
1060
 
1223
1061
  context "when not allowing dynamic fields" do
1224
1062
 
1225
- let(:person) do
1226
- Person.new
1227
- end
1228
-
1229
- before(:all) do
1230
- Mongoid.allow_dynamic_fields = false
1231
- end
1232
-
1233
- after(:all) do
1234
- Mongoid.allow_dynamic_fields = true
1063
+ let(:bar) do
1064
+ Bar.new
1235
1065
  end
1236
1066
 
1237
1067
  context "when asking for the getter" do
1238
1068
 
1239
1069
  it "returns false" do
1240
- person.should_not respond_to(:attr)
1070
+ expect(bar).to_not respond_to(:attr)
1241
1071
  end
1242
1072
  end
1243
1073
 
1244
1074
  context "when asking for the setter" do
1245
1075
 
1246
1076
  it "returns false" do
1247
- person.should_not respond_to(:attr=)
1077
+ expect(bar).to_not respond_to(:attr=)
1248
1078
  end
1249
1079
  end
1250
1080
  end
@@ -1259,7 +1089,7 @@ describe Mongoid::Attributes do
1259
1089
  end
1260
1090
 
1261
1091
  it "returns the default value" do
1262
- person.age.should eq(100)
1092
+ expect(person.age).to eq(100)
1263
1093
  end
1264
1094
  end
1265
1095
 
@@ -1269,7 +1099,7 @@ describe Mongoid::Attributes do
1269
1099
  end
1270
1100
 
1271
1101
  it "should store the attribute before type cast" do
1272
- person.age_before_type_cast.should eq("old")
1102
+ expect(person.age_before_type_cast).to eq("old")
1273
1103
  end
1274
1104
  end
1275
1105
 
@@ -1280,7 +1110,7 @@ describe Mongoid::Attributes do
1280
1110
  end
1281
1111
 
1282
1112
  it "does not use the default value" do
1283
- person.age.should be_nil
1113
+ expect(person.age).to be_nil
1284
1114
  end
1285
1115
  end
1286
1116
 
@@ -1295,7 +1125,7 @@ describe Mongoid::Attributes do
1295
1125
  end
1296
1126
 
1297
1127
  it "allows overwriting of the default value" do
1298
- person.terms.should be_true
1128
+ expect(person.terms).to be true
1299
1129
  end
1300
1130
  end
1301
1131
 
@@ -1310,7 +1140,35 @@ describe Mongoid::Attributes do
1310
1140
  end
1311
1141
 
1312
1142
  it "allows the field name to be udpated" do
1313
- person.t.should eq("aliased field to test")
1143
+ expect(person.t).to eq("aliased field to test")
1144
+ end
1145
+ end
1146
+
1147
+ context "when attribute is a Hash" do
1148
+ let(:person) { Person.new map: { somekey: "somevalue" } }
1149
+
1150
+ it "raises an error when try to set an invalid value" do
1151
+ expect {
1152
+ person.map = []
1153
+ }.to raise_error(Mongoid::Errors::InvalidValue)
1154
+ end
1155
+
1156
+ it "can set a Hash value" do
1157
+ expect(person.map).to eq( { somekey: "somevalue" } )
1158
+ end
1159
+ end
1160
+
1161
+ context "when attribute is an Array" do
1162
+ let(:person) { Person.new aliases: [ :alias_1 ] }
1163
+
1164
+ it "can set an Array Value" do
1165
+ expect(person.aliases).to eq([ :alias_1 ])
1166
+ end
1167
+
1168
+ it "raises an error when try to set an invalid value" do
1169
+ expect {
1170
+ person.aliases = {}
1171
+ }.to raise_error(Mongoid::Errors::InvalidValue)
1314
1172
  end
1315
1173
  end
1316
1174
  end
@@ -1331,11 +1189,11 @@ describe Mongoid::Attributes do
1331
1189
  context "when the key has not been specified as a field" do
1332
1190
 
1333
1191
  before do
1334
- person.stub(:fields).and_return({})
1192
+ allow(person).to receive(:fields).and_return({})
1335
1193
  end
1336
1194
 
1337
1195
  it "returns the value" do
1338
- person.send(:typed_value_for, "age", "51").should eq("51")
1196
+ person.send(:typed_value_for, "age", expect("51")).to eq("51")
1339
1197
  end
1340
1198
  end
1341
1199
  end
@@ -1347,7 +1205,7 @@ describe Mongoid::Attributes do
1347
1205
  end
1348
1206
 
1349
1207
  it "typecasts proc values" do
1350
- person.age.should eq(100)
1208
+ expect(person.age).to eq(100)
1351
1209
  end
1352
1210
  end
1353
1211
 
@@ -1366,7 +1224,7 @@ describe Mongoid::Attributes do
1366
1224
  end
1367
1225
 
1368
1226
  it "sets nested documents" do
1369
- person.videos.first.title.should eq("Fight Club")
1227
+ expect(person.videos.first.title).to eq("Fight Club")
1370
1228
  end
1371
1229
  end
1372
1230
 
@@ -1387,7 +1245,7 @@ describe Mongoid::Attributes do
1387
1245
  end
1388
1246
 
1389
1247
  it "properly casts values" do
1390
- person.age.should eq(50)
1248
+ expect(person.age).to eq(50)
1391
1249
  end
1392
1250
  end
1393
1251
 
@@ -1398,11 +1256,38 @@ describe Mongoid::Attributes do
1398
1256
  end
1399
1257
 
1400
1258
  it "does not set anything" do
1401
- person.age.should eq(100)
1259
+ expect(person.age).to eq(100)
1402
1260
  end
1403
1261
  end
1404
1262
  end
1405
1263
 
1264
+ context "copying from instance" do
1265
+
1266
+ let(:person) do
1267
+ Person.new
1268
+ end
1269
+
1270
+ let(:instance) do
1271
+ Person.new(attributes)
1272
+ end
1273
+
1274
+ let(:attributes) do
1275
+ { age: 50, range: 1..100 }
1276
+ end
1277
+
1278
+ before do
1279
+ person.send(method, instance.attributes)
1280
+ end
1281
+
1282
+ it "properly copies values" do
1283
+ expect(person.age).to eq(50)
1284
+ end
1285
+
1286
+ it "properly copies ranges" do
1287
+ expect(person.range).to eq(1..100)
1288
+ end
1289
+ end
1290
+
1406
1291
  context "on a parent document" do
1407
1292
 
1408
1293
  context "when the parent has a has many through a has one" do
@@ -1426,8 +1311,8 @@ describe Mongoid::Attributes do
1426
1311
  end
1427
1312
 
1428
1313
  it "does not overwrite child attributes if not in the hash" do
1429
- owner.pet.name.should eq("Bingo")
1430
- owner.pet.vet_visits.size.should eq(1)
1314
+ expect(owner.pet.name).to eq("Bingo")
1315
+ expect(owner.pet.vet_visits.size).to eq(1)
1431
1316
  end
1432
1317
  end
1433
1318
 
@@ -1451,11 +1336,11 @@ describe Mongoid::Attributes do
1451
1336
  end
1452
1337
 
1453
1338
  it "has 3 new entries" do
1454
- pet.vet_visits.count.should eq(3)
1339
+ expect(pet.vet_visits.count).to eq(3)
1455
1340
  end
1456
1341
 
1457
1342
  it "persists the changes" do
1458
- pet.reload.vet_visits.count.should eq(3)
1343
+ expect(pet.reload.vet_visits.count).to eq(3)
1459
1344
  end
1460
1345
  end
1461
1346
 
@@ -1493,7 +1378,7 @@ describe Mongoid::Attributes do
1493
1378
  end
1494
1379
 
1495
1380
  it "sets the child attributes on the parent" do
1496
- name.attributes.should eq(
1381
+ expect(name.attributes).to eq(
1497
1382
  { "_id" => "Test-User", "first_name" => "Test2", "last_name" => "User2" }
1498
1383
  )
1499
1384
  end
@@ -1515,7 +1400,7 @@ describe Mongoid::Attributes do
1515
1400
  end
1516
1401
 
1517
1402
  it "updates the child attributes on the parent" do
1518
- address.attributes.should eq(
1403
+ expect(address.attributes).to eq(
1519
1404
  { "_id" => "test", "street" => "Test2" }
1520
1405
  )
1521
1406
  end
@@ -1536,38 +1421,42 @@ describe Mongoid::Attributes do
1536
1421
  product.cost = 500
1537
1422
  end
1538
1423
 
1424
+ it "adds the alias for criteria" do
1425
+ expect(Product.where(cost: 500).selector).to eq("price" => 500)
1426
+ end
1427
+
1539
1428
  it "aliases the getter" do
1540
- product.cost.should eq(500)
1429
+ expect(product.cost).to eq(500)
1541
1430
  end
1542
1431
 
1543
1432
  it "aliases the existance check" do
1544
- product.cost?.should be_true
1433
+ expect(product.cost?).to be true
1545
1434
  end
1546
1435
 
1547
1436
  it "aliases *_changed?" do
1548
- product.cost_changed?.should be_true
1437
+ expect(product.cost_changed?).to be true
1549
1438
  end
1550
1439
 
1551
1440
  it "aliases *_change" do
1552
- product.cost_change.should eq([ nil, 500 ])
1441
+ expect(product.cost_change).to eq([ nil, 500 ])
1553
1442
  end
1554
1443
 
1555
1444
  it "aliases *_will_change!" do
1556
- product.should respond_to(:cost_will_change!)
1445
+ expect(product).to respond_to(:cost_will_change!)
1557
1446
  end
1558
1447
 
1559
1448
  it "aliases *_was" do
1560
- product.cost_was.should be_nil
1449
+ expect(product.cost_was).to be_nil
1561
1450
  end
1562
1451
 
1563
1452
  it "aliases reset_*!" do
1564
1453
  product.reset_cost!
1565
- product.cost.should be_nil
1454
+ expect(product.cost).to be_nil
1566
1455
  end
1567
1456
 
1568
1457
  it "aliases *_before_type_cast" do
1569
1458
  product.cost = "expensive"
1570
- product.cost_before_type_cast.should eq("expensive")
1459
+ expect(product.cost_before_type_cast).to eq("expensive")
1571
1460
  end
1572
1461
  end
1573
1462
 
@@ -1578,32 +1467,32 @@ describe Mongoid::Attributes do
1578
1467
  end
1579
1468
 
1580
1469
  it "aliases the getter" do
1581
- product.price.should eq(500)
1470
+ expect(product.price).to eq(500)
1582
1471
  end
1583
1472
 
1584
1473
  it "aliases the existance check" do
1585
- product.price?.should be_true
1474
+ expect(product.price?).to be true
1586
1475
  end
1587
1476
 
1588
1477
  it "aliases *_changed?" do
1589
- product.price_changed?.should be_true
1478
+ expect(product.price_changed?).to be true
1590
1479
  end
1591
1480
 
1592
1481
  it "aliases *_change" do
1593
- product.price_change.should eq([ nil, 500 ])
1482
+ expect(product.price_change).to eq([ nil, 500 ])
1594
1483
  end
1595
1484
 
1596
1485
  it "aliases *_will_change!" do
1597
- product.should respond_to(:price_will_change!)
1486
+ expect(product).to respond_to(:price_will_change!)
1598
1487
  end
1599
1488
 
1600
1489
  it "aliases *_was" do
1601
- product.price_was.should be_nil
1490
+ expect(product.price_was).to be_nil
1602
1491
  end
1603
1492
 
1604
1493
  it "aliases reset_*!" do
1605
1494
  product.reset_price!
1606
- product.price.should be_nil
1495
+ expect(product.price).to be_nil
1607
1496
  end
1608
1497
  end
1609
1498
  end
@@ -1615,7 +1504,7 @@ describe Mongoid::Attributes do
1615
1504
  end
1616
1505
 
1617
1506
  it "has an entry in the attributes" do
1618
- person.reload.attributes.should have_key("score")
1507
+ expect(person.reload.attributes).to have_key("score")
1619
1508
  end
1620
1509
  end
1621
1510
 
@@ -1627,7 +1516,7 @@ describe Mongoid::Attributes do
1627
1516
 
1628
1517
  it "saves the default" do
1629
1518
  expect { person.save }.to_not raise_error
1630
- person.last_drink_taken_at.should eq(1.day.ago.in_time_zone("Alaska").to_date)
1519
+ expect(person.last_drink_taken_at).to eq(1.day.ago.in_time_zone("Alaska").to_date)
1631
1520
  end
1632
1521
  end
1633
1522
 
@@ -1640,7 +1529,7 @@ describe Mongoid::Attributes do
1640
1529
  end
1641
1530
 
1642
1531
  it "applies the default value" do
1643
- person.last_drink_taken_at.should eq(1.day.ago.in_time_zone("Alaska").to_date)
1532
+ expect(person.last_drink_taken_at).to eq(1.day.ago.in_time_zone("Alaska").to_date)
1644
1533
  end
1645
1534
  end
1646
1535
 
@@ -1657,7 +1546,7 @@ describe Mongoid::Attributes do
1657
1546
  end
1658
1547
 
1659
1548
  it "does not set the default" do
1660
- from_db.age.should eq(50)
1549
+ expect(from_db.age).to eq(50)
1661
1550
  end
1662
1551
  end
1663
1552
 
@@ -1672,7 +1561,7 @@ describe Mongoid::Attributes do
1672
1561
  end
1673
1562
 
1674
1563
  it "does not set the default" do
1675
- from_db.age.should be_nil
1564
+ expect(from_db.age).to be_nil
1676
1565
  end
1677
1566
  end
1678
1567
 
@@ -1687,32 +1576,7 @@ describe Mongoid::Attributes do
1687
1576
  end
1688
1577
 
1689
1578
  it "applies the defaults after all attributes are set" do
1690
- from_db.should be_balanced
1691
- end
1692
- end
1693
- end
1694
- end
1695
-
1696
- context "when dynamic fields are not allowed" do
1697
-
1698
- before do
1699
- Mongoid.configure.allow_dynamic_fields = false
1700
- end
1701
-
1702
- after do
1703
- Mongoid.configure.allow_dynamic_fields = true
1704
- end
1705
-
1706
- context "when an embedded document has been persisted" do
1707
-
1708
- context "when the field is no longer recognized" do
1709
-
1710
- before do
1711
- Person.collection.insert 'pet' => { 'unrecognized_field' => true }
1712
- end
1713
-
1714
- it "allows access to the legacy data" do
1715
- Person.first.pet.read_attribute(:unrecognized_field).should be_true
1579
+ expect(from_db).to be_balanced
1716
1580
  end
1717
1581
  end
1718
1582
  end