mongoid 3.1.6 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
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/README.md CHANGED
@@ -1,19 +1,24 @@
1
- Mongoid [![Build Status](https://secure.travis-ci.org/mongoid/mongoid.png?branch=master&.png)](http://travis-ci.org/mongoid/mongoid)
2
- ========
1
+ # Mongoid
2
+ [![Build Status](https://travis-ci.org/mongoid/mongoid.svg?branch=master)](https://travis-ci.org/mongoid/mongoid)
3
+ [![Code Climate](https://codeclimate.com/github/mongoid/mongoid.svg)](https://codeclimate.com/github/mongoid/mongoid)
4
+ [![Coverage Status](https://img.shields.io/coveralls/mongoid/mongoid/master.svg)](https://coveralls.io/r/mongoid/mongoid?branch=master)
5
+ [![Dependency Status](https://www.versioneye.com/ruby/mongoid/4.0.0/badge.svg)](https://www.versioneye.com/ruby/mongoid/4.0.0)
6
+
3
7
 
4
8
  Mongoid is an ODM (Object-Document-Mapper) framework for MongoDB in Ruby.
5
9
 
6
10
  Project Tracking
7
11
  ----------------
8
12
 
9
- * [Mongoid Google Group](http://groups.google.com/group/mongoid)
10
13
  * [Mongoid Website and Documentation](http://mongoid.org)
11
- * [Mongoid Code Climate](https://codeclimate.com/github/mongoid/mongoid)
14
+ * [Mongoid Google Group](http://groups.google.com/group/mongoid)
15
+ * [Stackoverflow](http://stackoverflow.com/questions/tagged/mongoid)
16
+ * [#mongoid](http://webchat.freenode.net/?channels=mongoid) on freenode IRC
12
17
 
13
18
  Compatibility
14
19
  -------------
15
20
 
16
- Mongoid is tested against MRI 1.9.3, 2.0.0, and JRuby (1.9).
21
+ Mongoid is tested against MRI 1.9.3, 2.0.0, 2.1.0 and JRuby (1.9).
17
22
 
18
23
  Documentation
19
24
  -------------
@@ -24,8 +29,6 @@ Please see the new Mongoid website for up-to-date documentation:
24
29
  Donating
25
30
  --------
26
31
 
27
- [Support Mongoid at Wepay](https://www.wepay.com/donations/mongoid)
28
-
29
32
  [Support Mongoid at Pledgie](http://www.pledgie.com/campaigns/7757)
30
33
 
31
34
  <a href='http://www.pledgie.com/campaigns/7757'>
@@ -19,7 +19,7 @@ en:
19
19
  message: "Calling %{method} on %{klass} resulted in a false return
20
20
  from a callback."
21
21
  summary: "If a before callback returns false when using Document.create!,
22
- Document#save!, or Documnet#update_attributes! this error will get raised
22
+ Document#save!, or Document#update_attributes! this error will get raised
23
23
  since the document did not actually get saved."
24
24
  resolution: "Double check all before callbacks to make sure they are
25
25
  not unintentionally returning false."
@@ -31,6 +31,13 @@ en:
31
31
  resolution: "Most likely this is caused by passing parameters directly
32
32
  through to the find, and the parameter either is not present or the
33
33
  key from which it is accessed is incorrect."
34
+ document_not_destroyed:
35
+ message: "%{klass} with id %{id} was not destroyed."
36
+ summary: "When calling %{klass}#destroy! and a callback halts the destroy
37
+ callback chain by returning a false value, the deletion will not
38
+ actually occur."
39
+ resolution: "Check the before/after destroy callbacks to ensure that the
40
+ return values are truthy for the chain to continue."
34
41
  document_not_found:
35
42
  message: "Document(s) not found for class %{klass} with id(s) %{missing}."
36
43
  summary: "When calling %{klass}.find with an id or array of ids, each
@@ -119,6 +126,7 @@ en:
119
126
  has the correct options.\n\n
120
127
  Valid options are:\n
121
128
  \_\_background: true|false\n
129
+ \_\_database: 'database_name'\n
122
130
  \_\_drop_dups: true|false\n
123
131
  \_\_name: 'index_name'\n
124
132
  \_\_sparse: true|false\n
@@ -128,6 +136,7 @@ en:
128
136
  \_\_bits: 26\n
129
137
  \_\_bucket_size : 1\n
130
138
  \_\_weights: { content: 1, title: 2 }\n
139
+ \_\_expire_after_seconds: number_of_seconds\n
131
140
  Valid types are: 1, -1, '2d', '2dsphere', 'geoHaystack', 'text', 'hashed'\n\n
132
141
  Example:\n
133
142
  \_\_class Band\n
@@ -156,15 +165,11 @@ en:
156
165
  invalid_scope:
157
166
  message: "Defining a scope of value %{value} on %{klass} is not
158
167
  allowed."
159
- summary: "Scopes in Mongoid must be either criteria objects or procs
160
- that wrap criteria objects."
161
- resolution: "Change the scope to be a criteria or proc wrapped
162
- critera.\n\n
168
+ summary: "Scopes in Mongoid must be procs that wrap criteria objects."
169
+ resolution: "Change the scope to be a proc wrapped critera.\n\n
163
170
  Example:\n
164
171
  \_\_class Band\n
165
172
  \_\_\_\_include Mongoid::Document\n
166
- \_\_\_\_field :active, type: Boolean, default: true\n
167
- \_\_\_\_scope :active, where(active: true)\n
168
173
  \_\_\_\_scope :inactive, ->{ where(active: false) }\n
169
174
  \_\_end\n\n"
170
175
  invalid_storage_options:
@@ -179,6 +184,12 @@ en:
179
184
  \_\_\_\_include Mongoid::Document\n
180
185
  \_\_\_\_store_in collection: 'artists', database: 'secondary'\n
181
186
  \_\_end\n\n"
187
+ invalid_storage_parent:
188
+ message: "Invalid store_in call on class %{klass}."
189
+ summary: "The :store_in macro can only be called on a base Mongoid Document"
190
+ resolution: "Remove the store_in call on class %{klass}, as it will use its
191
+ parent store configuration. Or remove the hierarchy extension for this
192
+ class."
182
193
  invalid_time:
183
194
  message: "'%{value}' is not a valid Time."
184
195
  summary: "Mongoid tries to serialize the values for Date, DateTime, and
@@ -222,6 +233,10 @@ en:
222
233
  from the child side which relation to go in."
223
234
  resolution: "Set the values from the parent, or redefine the relation
224
235
  with only a single definition in the parent."
236
+ invalid_value:
237
+ message: "Value of type %{value_class} cannot be written to a field of type %{field_class}"
238
+ summary: "Tried to set a value of type %{value_class} to a field of type %{field_class}"
239
+ resolution: "Verify if the value to be set correspond to field definition"
225
240
  mixed_relations:
226
241
  message: "Referencing a(n) %{embedded} document from the %{root}
227
242
  document via a relational association is not allowed since the
@@ -321,7 +336,7 @@ en:
321
336
  %{klass}.create! without setting the parent document as an
322
337
  attribute."
323
338
  resolution: "Ensure that you've set the parent relation if
324
- instantiating the embedded document direcly, or always create new
339
+ instantiating the embedded document directly, or always create new
325
340
  embedded documents via the parent relation."
326
341
  no_session_config:
327
342
  message: "No configuration could be found for a session named
@@ -387,6 +402,12 @@ en:
387
402
  can only have values set when the document is a new record."
388
403
  resolution: "Don't define '%{name}' as readonly, or do not attempt
389
404
  to update its value after the document is persisted."
405
+ readonly_document:
406
+ message: "Attempted to persist the readonly document '%{klass}'."
407
+ summary: "Documents loaded from the database using #only
408
+ cannot be persisted."
409
+ resolution: "Don't attempt to persist documents that are flagged as
410
+ readonly."
390
411
  scope_overwrite:
391
412
  message: "Cannot create scope :%{scope_name}, because of existing
392
413
  method %{model_name}.%{scope_name}."
@@ -411,12 +432,12 @@ en:
411
432
  unknown_attribute:
412
433
  message: "Attempted to set a value for '%{name}' which is not
413
434
  allowed on the model %{klass}."
414
- summary: "When setting Mongoid.allow_dynamic_fields to false and the
415
- attribute does not already exist in the attributes hash, attempting
416
- to call %{klass}#%{name}= for it is not allowed. This is also
417
- triggered by passing the attribute to any method that accepts an
435
+ summary: "Without including Mongoid::Attributes::Dynamic in your model
436
+ and the attribute does not already exist in the attributes hash,
437
+ attempting to call %{klass}#%{name}= for it is not allowed. This is
438
+ also triggered by passing the attribute to any method that accepts an
418
439
  attributes hash, and is raised instead of getting a NoMethodError."
419
- resolution: "You can set Mongoid.allow_dynamic_fields to true if you
440
+ resolution: "You can include Mongoid::Attributes::Dynamic if you
420
441
  expect to be writing values for undefined fields often."
421
442
  unsaved_document:
422
443
  message: "Attempted to save %{document} before the parent %{base}."
@@ -439,13 +460,6 @@ en:
439
460
  summary: "The following errors were found: %{errors}"
440
461
  resolution: "Try persisting the document with valid data or remove
441
462
  the validations."
442
- versioning_not_on_root:
443
- message: "Versioning not allowed on embedded document: %{klass}."
444
- summary: "Mongoid::Versioning behaviour is only allowed on documents
445
- that are the root document in the hierarchy."
446
- resolution: "Remove the versioning from the embedded %{klass} or
447
- consider moving it to a root location in the hierarchy if
448
- versioning is needed."
449
463
  delete_restriction:
450
464
  message: "Cannot delete %{document} because of dependent '%{relation}'."
451
465
  summary: "When defining '%{relation}' with a :dependent => :restrict,
data/lib/mongoid.rb CHANGED
@@ -1,34 +1,13 @@
1
1
  # encoding: utf-8
2
-
3
- # Copyright (c) 2009 - 2011 Durran Jordan and friends.
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining
6
- # a copy of this software and associated documentation files (the
7
- # "Software"), to deal in the Software without restriction, including
8
- # without limitation the rights to use, copy, modify, merge, publish,
9
- # distribute, sublicense, and/or sell copies of the Software, and to
10
- # permit persons to whom the Software is furnished to do so, subject to
11
- # the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be
14
- # included in all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
-
24
- require 'support/ruby_version'
2
+ require "support/ruby_version"
25
3
 
26
4
  require "delegate"
27
5
  require "time"
28
6
  require "set"
29
7
 
8
+ require "active_support"
30
9
  require "active_support/core_ext"
31
- require 'active_support/json'
10
+ require "active_support/json"
32
11
  require "active_support/inflector"
33
12
  require "active_support/time_with_zone"
34
13
  require "active_model"
@@ -36,49 +15,14 @@ require "active_model"
36
15
  require "origin"
37
16
  require "moped"
38
17
 
39
- require "mongoid/atomic/positionable"
40
- require "mongoid/evolvable"
41
- require "mongoid/extensions"
42
- require "mongoid/errors"
43
- require "mongoid/threaded"
44
- require "mongoid/relations"
45
- require "mongoid/atomic"
46
- require "mongoid/attributes"
47
- require "mongoid/callbacks"
18
+ require "mongoid/version"
48
19
  require "mongoid/config"
49
- require "mongoid/contextual"
50
- require "mongoid/copyable"
51
- require "mongoid/equality"
52
- require "mongoid/criteria"
53
- require "mongoid/dirty"
54
- require "mongoid/factory"
55
- require "mongoid/fields"
56
- require "mongoid/finders"
57
- require "mongoid/hierarchy"
58
- require "mongoid/identity_map"
59
- require "mongoid/indexes"
60
- require "mongoid/inspection"
61
- require "mongoid/json"
62
20
  require "mongoid/loggable"
63
- require "mongoid/matchers"
64
- require "mongoid/multi_parameter_attributes"
65
- require "mongoid/nested_attributes"
66
- require "mongoid/observer"
67
- require "mongoid/persistence"
68
- require "mongoid/reloading"
69
- require "mongoid/scoping"
70
- require "mongoid/serialization"
71
21
  require "mongoid/sessions"
72
- require "mongoid/sharding"
73
- require "mongoid/state"
74
- require "mongoid/timestamps"
75
- require "mongoid/unit_of_work"
76
- require "mongoid/validations"
77
- require "mongoid/version"
78
- require "mongoid/versioning"
79
- require "mongoid/components"
80
- require "mongoid/paranoia"
81
22
  require "mongoid/document"
23
+ require "mongoid/log_subscriber"
24
+ require "mongoid/tasks/database"
25
+ require "mongoid/query_cache"
82
26
 
83
27
  # If we are using Rails then we will include the Mongoid railtie. This has all
84
28
  # the nifty initializers that Mongoid needs.
@@ -86,28 +30,20 @@ if defined?(Rails)
86
30
  require "mongoid/railtie"
87
31
  end
88
32
 
89
- # If we are using any Rack based application then we need the Mongoid rack
90
- # middleware to ensure our app is running properly.
91
- if defined?(Rack)
92
- require "rack/mongoid"
93
- end
94
-
95
33
  # add english load path by default
96
34
  I18n.load_path << File.join(File.dirname(__FILE__), "config", "locales", "en.yml")
97
35
 
98
36
  module Mongoid
99
37
  extend Loggable
100
- extend UnitOfWork
101
38
  extend self
102
39
 
103
- MONGODB_VERSION = "2.0.0"
40
+ MONGODB_VERSION = "2.2.0"
104
41
 
105
42
  # Sets the Mongoid configuration options. Best used by passing a block.
106
43
  #
107
44
  # @example Set up configuration options.
108
45
  # Mongoid.configure do |config|
109
- # config.allow_dynamic_fields = false
110
- # config.use(name: "mongoid_test", host: "localhost", port: 27017)
46
+ # config.connect_to("mongoid_test")
111
47
  # end
112
48
  #
113
49
  # @return [ Config ] The configuration object.
@@ -160,7 +96,5 @@ module Mongoid
160
96
  # Mongoid.database = Mongo::Connection.new.db("test")
161
97
  #
162
98
  # @since 1.0.0
163
- delegate(*(Config.public_instance_methods(false) +
164
- ActiveModel::Observing::ClassMethods.public_instance_methods(false) - [:logger=, :logger] <<
165
- { to: Config }))
99
+ delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ] << { to: Config }))
166
100
  end
@@ -125,7 +125,7 @@ module Mongoid
125
125
  # @return [ Hash ] The updates and their modifiers.
126
126
  #
127
127
  # @since 2.1.0
128
- def atomic_updates(use_indexes = false)
128
+ def atomic_updates(_use_indexes = false)
129
129
  process_flagged_destroys
130
130
  mods = Modifiers.new
131
131
  generate_atomic_updates(mods, self)
@@ -189,7 +189,7 @@ module Mongoid
189
189
  #
190
190
  # @since 2.1.0
191
191
  def atomic_paths
192
- @atomic_paths ||= metadata ? metadata.path(self) : Atomic::Paths::Root.new(self)
192
+ @atomic_paths ||= __metadata ? __metadata.path(self) : Atomic::Paths::Root.new(self)
193
193
  end
194
194
 
195
195
  # Get all the attributes that need to be pulled.
@@ -206,7 +206,7 @@ module Mongoid
206
206
  path = nil
207
207
  ids = docs.map do |doc|
208
208
  path ||= doc.flag_as_destroyed
209
- doc.id
209
+ doc._id
210
210
  end
211
211
  pulls[path] = { "_id" => { "$in" => ids }} and path = nil
212
212
  end
@@ -225,17 +225,6 @@ module Mongoid
225
225
  pushable? ? { atomic_position => as_document } : {}
226
226
  end
227
227
 
228
- # Return the selector for this document to be matched exactly for use
229
- # with MongoDB's $ operator.
230
- #
231
- # @example Get the selector.
232
- # address.atomic_selector
233
- #
234
- # @return [ String ] The exact selector for this document.
235
- def atomic_selector
236
- atomic_paths.selector
237
- end
238
-
239
228
  # Get all the attributes that need to be set.
240
229
  #
241
230
  # @example Get the sets.
@@ -22,36 +22,6 @@ module Mongoid
22
22
  def path
23
23
  @path ||= position.sub(/\.\d+$/, "")
24
24
  end
25
-
26
- # Get the selector to use for the root document when performing atomic
27
- # updates. When sharding this will include the shard key.
28
- #
29
- # @example Get the selector.
30
- # many.selector
31
- #
32
- # @return [ Hash ] The selector to identify the document with.
33
- #
34
- # @since 2.1.0
35
- def selector
36
- @selector ||= generate_selector
37
- end
38
-
39
- private
40
-
41
- def generate_selector
42
- if only_root_selector?
43
- parent.atomic_selector
44
- else
45
- parent.
46
- atomic_selector.
47
- merge("#{path}._id" => document._id).
48
- merge(document.shard_key_selector)
49
- end
50
- end
51
-
52
- def only_root_selector?
53
- document.persisted? && document._id_changed?
54
- end
55
25
  end
56
26
  end
57
27
  end
@@ -35,7 +35,7 @@ module Mongoid
35
35
  def position
36
36
  pos = parent.atomic_position
37
37
  locator = document.new_record? ? "" : ".#{document._index}"
38
- "#{pos}#{"." unless pos.blank?}#{document.metadata.store_as}#{locator}"
38
+ "#{pos}#{"." unless pos.blank?}#{document.__metadata.store_as}#{locator}"
39
39
  end
40
40
  end
41
41
  end
@@ -34,7 +34,7 @@ module Mongoid
34
34
  # @since 2.1.0
35
35
  def position
36
36
  pos = parent.atomic_position
37
- "#{pos}#{"." unless pos.blank?}#{document.metadata.store_as}"
37
+ "#{pos}#{"." unless pos.blank?}#{document.__metadata.store_as}"
38
38
  end
39
39
  end
40
40
  end
@@ -33,19 +33,6 @@ module Mongoid
33
33
  def insert_modifier
34
34
  raise Errors::InvalidPath.new(document.class)
35
35
  end
36
-
37
- # Get the selector to use for the root document when performing atomic
38
- # updates. When sharding this will include the shard key.
39
- #
40
- # @example Get the selector.
41
- # root.selector
42
- #
43
- # @return [ Hash ] The selector to identify the document with.
44
- #
45
- # @since 2.1.0
46
- def selector
47
- @selector ||= { "_id" => document._id }.merge!(document.shard_key_selector)
48
- end
49
36
  end
50
37
  end
51
38
  end
@@ -1,4 +1,7 @@
1
1
  # encoding: utf-8
2
+ require "active_model/attribute_methods"
3
+ require "mongoid/attributes/dynamic"
4
+ require "mongoid/attributes/nested"
2
5
  require "mongoid/attributes/processing"
3
6
  require "mongoid/attributes/readonly"
4
7
 
@@ -8,6 +11,7 @@ module Mongoid
8
11
  # and how to get and set values.
9
12
  module Attributes
10
13
  extend ActiveSupport::Concern
14
+ include Nested
11
15
  include Processing
12
16
  include Readonly
13
17
 
@@ -27,6 +31,8 @@ module Mongoid
27
31
  def attribute_present?(name)
28
32
  attribute = read_attribute(name)
29
33
  !attribute.blank? || attribute == false
34
+ rescue ActiveModel::MissingAttributeError
35
+ false
30
36
  end
31
37
 
32
38
  # Get the attributes that have not been cast.
@@ -86,7 +92,10 @@ module Mongoid
86
92
  #
87
93
  # @since 1.0.0
88
94
  def read_attribute(name)
89
- normalized = name.to_s
95
+ normalized = database_field_name(name.to_s)
96
+ if attribute_missing?(normalized)
97
+ raise ActiveModel::MissingAttributeError, "Missing attribute: '#{name}'."
98
+ end
90
99
  if hash_dot_syntax?(normalized)
91
100
  attributes.__nested__(normalized)
92
101
  else
@@ -141,25 +150,6 @@ module Mongoid
141
150
  end
142
151
  end
143
152
 
144
- # Override respond_to? so it responds properly for dynamic attributes.
145
- #
146
- # @example Does this object respond to the method?
147
- # person.respond_to?(:title)
148
- #
149
- # @param [ Array ] *args The name of the method.
150
- #
151
- # @return [ true, false ] True if it does, false if not.
152
- #
153
- # @since 1.0.0
154
- def respond_to?(name, include_private = false)
155
- super || (
156
- Mongoid.allow_dynamic_fields &&
157
- attributes &&
158
- attributes.has_key?(name.to_s.reader) &&
159
- name.to_s.valid_method_name?
160
- )
161
- end
162
-
163
153
  # Write a single attribute to the document attribute hash. This will
164
154
  # also fire the before and after update callbacks, and perform any
165
155
  # necessary typecasting.
@@ -178,6 +168,7 @@ module Mongoid
178
168
  access = database_field_name(name.to_s)
179
169
  if attribute_writable?(access)
180
170
  _assigning do
171
+ validate_attribute_value(access, value)
181
172
  localized = fields[access].try(:localized?)
182
173
  attributes_before_type_cast[name.to_s] = value
183
174
  typed_value = typed_value_for(access, value)
@@ -207,12 +198,11 @@ module Mongoid
207
198
  # person.assign_attributes({ :title => "Mr." }, :as => :admin)
208
199
  #
209
200
  # @param [ Hash ] attrs The new attributes to set.
210
- # @param [ Hash ] options Supported options: :without_protection, :as
211
201
  #
212
202
  # @since 2.2.1
213
- def assign_attributes(attrs = nil, options = {})
203
+ def assign_attributes(attrs = nil)
214
204
  _assigning do
215
- process_attributes(attrs, options[:as] || :default, !options[:without_protection])
205
+ process_attributes(attrs)
216
206
  end
217
207
  end
218
208
 
@@ -230,71 +220,46 @@ module Mongoid
230
220
  # @param [ Boolean ] guard_protected_attributes False to skip mass assignment protection.
231
221
  #
232
222
  # @since 1.0.0
233
- def write_attributes(attrs = nil, guard_protected_attributes = true)
234
- assign_attributes(attrs, without_protection: !guard_protected_attributes)
223
+ def write_attributes(attrs = nil)
224
+ assign_attributes(attrs)
235
225
  end
236
226
  alias :attributes= :write_attributes
237
227
 
238
- private
239
-
240
- # Define a reader method for a dynamic attribute.
228
+ # Determine if the attribute is missing from the document, due to loading
229
+ # it from the database with missing fields.
241
230
  #
242
- # @api private
231
+ # @example Is the attribute missing?
232
+ # document.attribute_missing?("test")
243
233
  #
244
- # @example Define a reader method.
245
- # model.define_dynamic_reader(:field)
234
+ # @param [ String ] name The name of the attribute.
246
235
  #
247
- # @param [ String ] name The name of the field.
236
+ # @return [ true, false ] If the attribute is missing.
248
237
  #
249
- # @since 3.0.0
250
- def define_dynamic_reader(name)
251
- return unless name.valid_method_name?
252
-
253
- class_eval <<-READER
254
- def #{name}
255
- attribute_will_change!(#{name.inspect})
256
- read_attribute(#{name.inspect})
257
- end
258
- READER
238
+ # @since 4.0.0
239
+ def attribute_missing?(name)
240
+ selection = __selected_fields
241
+ return false unless selection
242
+ field = fields[name]
243
+ (selection.values.first == 0 && selection_excluded?(name, selection, field)) ||
244
+ (selection.values.first == 1 && !selection_included?(name, selection, field))
259
245
  end
260
246
 
261
- # Define a reader method for a dynamic attribute before type cast.
262
- #
263
- # @api private
264
- #
265
- # @example Define a reader method for an attribute.
266
- # model.define_dynamic_before_type_cast_reader(:field)
267
- #
268
- # @param [ String ] name The name of the field.
269
- #
270
- # @since 3.1.0
271
- def define_dynamic_before_type_cast_reader(name)
272
- class_eval <<-READER
273
- def #{name}_before_type_cast
274
- attribute_will_change!(#{name.inspect})
275
- read_attribute_before_type_cast(#{name.inspect})
276
- end
277
- READER
278
- end
247
+ private
279
248
 
280
- # Define a writer method for a dynamic attribute.
281
- #
282
- # @api private
283
- #
284
- # @example Define a writer method.
285
- # model.define_dynamic_writer(:field)
286
- #
287
- # @param [ String ] name The name of the field.
288
- #
289
- # @since 3.0.0
290
- def define_dynamic_writer(name)
291
- return unless name.valid_method_name?
249
+ def selection_excluded?(name, selection, field)
250
+ if field && field.localized?
251
+ selection["#{name}.#{::I18n.locale}"] == 0
252
+ else
253
+ selection[name] == 0
254
+ end
255
+ end
292
256
 
293
- class_eval <<-WRITER
294
- def #{name}=(value)
295
- write_attribute(#{name.inspect}, value)
296
- end
297
- WRITER
257
+ def selection_included?(name, selection, field)
258
+ if field && field.localized?
259
+ selection.has_key?("#{name}.#{::I18n.locale}")
260
+ else
261
+ selection.has_key?(name)
262
+ end
298
263
  end
299
264
 
300
265
  # Does the string contain dot syntax for accessing hashes?
@@ -308,30 +273,7 @@ module Mongoid
308
273
  #
309
274
  # @since 3.0.15
310
275
  def hash_dot_syntax?(string)
311
- string =~ /\./
312
- end
313
-
314
- # Used for allowing accessor methods for dynamic attributes.
315
- #
316
- # @param [ String, Symbol ] name The name of the method.
317
- # @param [ Array ] *args The arguments to the method.
318
- def method_missing(name, *args)
319
- attr = name.to_s
320
- return super unless attributes.has_key?(attr.reader)
321
- if attr.writer?
322
- getter = attr.reader
323
- define_dynamic_writer(getter)
324
- write_attribute(getter, args.first)
325
- elsif attr.before_type_cast?
326
- define_dynamic_before_type_cast_reader(attr.reader)
327
- attribute_will_change!(attr.reader)
328
- read_attribute_before_type_cast(attr.reader)
329
- else
330
- getter = attr.reader
331
- define_dynamic_reader(getter)
332
- attribute_will_change!(attr.reader)
333
- read_attribute(getter)
334
- end
276
+ string.include?(".")
335
277
  end
336
278
 
337
279
  # Return the typecasted value for a field.
@@ -367,6 +309,7 @@ module Mongoid
367
309
  #
368
310
  # @since 2.3.0
369
311
  def alias_attribute(name, original)
312
+ aliased_fields[name.to_s] = original.to_s
370
313
  class_eval <<-RUBY
371
314
  alias #{name} #{original}
372
315
  alias #{name}= #{original}=
@@ -374,11 +317,32 @@ module Mongoid
374
317
  alias #{name}_change #{original}_change
375
318
  alias #{name}_changed? #{original}_changed?
376
319
  alias reset_#{name}! reset_#{original}!
320
+ alias reset_#{name}_to_default! reset_#{original}_to_default!
377
321
  alias #{name}_was #{original}_was
378
322
  alias #{name}_will_change! #{original}_will_change!
379
323
  alias #{name}_before_type_cast #{original}_before_type_cast
380
324
  RUBY
381
325
  end
382
326
  end
327
+
328
+ private
329
+
330
+ # Validates an attribute value. This provides validation checking if
331
+ # the value is valid for given a field.
332
+ # For now, only Hash and Array fields are validated.
333
+ #
334
+ # @param [ String, Symbol ] name The name of the attribute to validate.
335
+ # @param [ Object ] value The to be validated.
336
+ #
337
+ # @since 3.0.10
338
+ def validate_attribute_value(access, value)
339
+ return unless fields[access] && value
340
+ validatable_types = [ Hash, Array ]
341
+ if validatable_types.include? fields[access].type
342
+ unless value.is_a? fields[access].type
343
+ raise Mongoid::Errors::InvalidValue.new(fields[access].type, value.class)
344
+ end
345
+ end
346
+ end
383
347
  end
384
348
  end