mongoid 2.4.10 → 3.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 (356) hide show
  1. data/CHANGELOG.md +949 -10
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +3 -17
  5. data/lib/config/locales/en.yml +455 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +70 -16
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +106 -43
  16. data/lib/mongoid/components.rb +12 -23
  17. data/lib/mongoid/config/environment.rb +7 -4
  18. data/lib/mongoid/config/inflections.rb +6 -0
  19. data/lib/mongoid/config/options.rb +1 -1
  20. data/lib/mongoid/config/validators/option.rb +25 -0
  21. data/lib/mongoid/config/validators/session.rb +140 -0
  22. data/lib/mongoid/config/validators.rb +3 -0
  23. data/lib/mongoid/config.rb +104 -225
  24. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  25. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  26. data/lib/mongoid/contextual/atomic.rb +179 -0
  27. data/lib/mongoid/contextual/command.rb +43 -0
  28. data/lib/mongoid/contextual/find_and_modify.rb +68 -0
  29. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  30. data/lib/mongoid/contextual/memory.rb +406 -0
  31. data/lib/mongoid/contextual/mongo.rb +662 -0
  32. data/lib/mongoid/contextual.rb +50 -0
  33. data/lib/mongoid/copyable.rb +7 -25
  34. data/lib/mongoid/criteria.rb +515 -245
  35. data/lib/mongoid/criterion/inspection.rb +14 -8
  36. data/lib/mongoid/criterion/scoping.rb +114 -44
  37. data/lib/mongoid/dirty.rb +152 -67
  38. data/lib/mongoid/document.rb +71 -52
  39. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  40. data/lib/mongoid/errors/callback.rb +5 -6
  41. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  42. data/lib/mongoid/errors/document_not_found.rb +98 -17
  43. data/lib/mongoid/errors/eager_load.rb +3 -6
  44. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  45. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  46. data/lib/mongoid/errors/invalid_database.rb +3 -3
  47. data/lib/mongoid/errors/invalid_field.rb +54 -8
  48. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  49. data/lib/mongoid/errors/invalid_find.rb +3 -3
  50. data/lib/mongoid/errors/invalid_index.rb +28 -0
  51. data/lib/mongoid/errors/invalid_options.rb +4 -4
  52. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  53. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  54. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  55. data/lib/mongoid/errors/invalid_time.rb +3 -6
  56. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  57. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  58. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  59. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  60. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  61. data/lib/mongoid/errors/no_default_session.rb +23 -0
  62. data/lib/mongoid/errors/no_environment.rb +3 -3
  63. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  64. data/lib/mongoid/errors/no_metadata.rb +21 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +23 -1
  80. data/lib/mongoid/evolvable.rb +19 -0
  81. data/lib/mongoid/extensions/array.rb +164 -0
  82. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  83. data/lib/mongoid/extensions/boolean.rb +24 -0
  84. data/lib/mongoid/extensions/date.rb +70 -0
  85. data/lib/mongoid/extensions/date_time.rb +73 -0
  86. data/lib/mongoid/extensions/false_class.rb +38 -0
  87. data/lib/mongoid/extensions/float.rb +56 -0
  88. data/lib/mongoid/extensions/hash.rb +123 -0
  89. data/lib/mongoid/extensions/integer.rb +66 -0
  90. data/lib/mongoid/extensions/module.rb +28 -0
  91. data/lib/mongoid/extensions/nil_class.rb +21 -0
  92. data/lib/mongoid/extensions/object.rb +238 -0
  93. data/lib/mongoid/extensions/object_id.rb +54 -0
  94. data/lib/mongoid/extensions/range.rb +79 -0
  95. data/lib/mongoid/extensions/regexp.rb +27 -0
  96. data/lib/mongoid/extensions/set.rb +55 -0
  97. data/lib/mongoid/extensions/string.rb +181 -0
  98. data/lib/mongoid/extensions/symbol.rb +54 -0
  99. data/lib/mongoid/extensions/time.rb +78 -0
  100. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  101. data/lib/mongoid/extensions/true_class.rb +38 -0
  102. data/lib/mongoid/extensions.rb +28 -76
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields/foreign_key.rb +150 -0
  105. data/lib/mongoid/fields/localized.rb +73 -0
  106. data/lib/mongoid/fields/standard.rb +268 -0
  107. data/lib/mongoid/fields/validators/macro.rb +83 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields.rb +142 -208
  110. data/lib/mongoid/finders.rb +45 -50
  111. data/lib/mongoid/hierarchy.rb +44 -15
  112. data/lib/mongoid/identity_map.rb +49 -21
  113. data/lib/mongoid/indexes/validators/options.rb +80 -0
  114. data/lib/mongoid/indexes.rb +66 -15
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +9 -11
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +10 -44
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations/upsert.rb +28 -0
  159. data/lib/mongoid/persistence/operations.rb +22 -19
  160. data/lib/mongoid/persistence/upsertion.rb +30 -0
  161. data/lib/mongoid/persistence.rb +94 -39
  162. data/lib/mongoid/railtie.rb +26 -11
  163. data/lib/mongoid/railties/database.rake +22 -108
  164. data/lib/mongoid/relations/accessors.rb +120 -20
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +4 -4
  175. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  176. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  177. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  183. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  184. data/lib/mongoid/relations/builders.rb +19 -16
  185. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  186. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  187. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  188. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  189. data/lib/mongoid/relations/cascading.rb +10 -7
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +6 -7
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +347 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +100 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -60
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +277 -47
  200. data/lib/mongoid/relations/nested_builder.rb +4 -6
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +62 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +162 -130
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/relations/touchable.rb +32 -0
  213. data/lib/mongoid/relations.rb +22 -6
  214. data/lib/mongoid/reloading.rb +12 -14
  215. data/lib/mongoid/scoping.rb +312 -0
  216. data/lib/mongoid/serialization.rb +94 -42
  217. data/lib/mongoid/sessions/factory.rb +108 -0
  218. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sessions/validators.rb +2 -0
  221. data/lib/mongoid/sessions.rb +383 -0
  222. data/lib/mongoid/sharding.rb +6 -6
  223. data/lib/mongoid/state.rb +6 -7
  224. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  225. data/lib/mongoid/threaded/sessions.rb +0 -0
  226. data/lib/mongoid/threaded.rb +219 -59
  227. data/lib/mongoid/timestamps/created.rb +8 -4
  228. data/lib/mongoid/timestamps/timeless.rb +6 -4
  229. data/lib/mongoid/timestamps/updated.rb +4 -3
  230. data/lib/mongoid/timestamps.rb +1 -1
  231. data/lib/mongoid/unit_of_work.rb +61 -0
  232. data/lib/mongoid/validations/associated.rb +2 -2
  233. data/lib/mongoid/validations/format.rb +2 -2
  234. data/lib/mongoid/validations/presence.rb +34 -4
  235. data/lib/mongoid/validations/uniqueness.rb +11 -12
  236. data/lib/mongoid/validations.rb +28 -20
  237. data/lib/mongoid/version.rb +2 -2
  238. data/lib/mongoid/versioning.rb +25 -26
  239. data/lib/mongoid.rb +37 -37
  240. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  241. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  242. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +65 -17
  243. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  244. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  245. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  246. data/lib/rails/generators/mongoid_generator.rb +5 -5
  247. data/lib/rails/mongoid.rb +73 -26
  248. metadata +103 -148
  249. data/lib/config/locales/bg.yml +0 -61
  250. data/lib/config/locales/de.yml +0 -61
  251. data/lib/config/locales/en-GB.yml +0 -64
  252. data/lib/config/locales/es.yml +0 -59
  253. data/lib/config/locales/fr.yml +0 -62
  254. data/lib/config/locales/hi.yml +0 -53
  255. data/lib/config/locales/hu.yml +0 -64
  256. data/lib/config/locales/id.yml +0 -62
  257. data/lib/config/locales/it.yml +0 -59
  258. data/lib/config/locales/ja.yml +0 -57
  259. data/lib/config/locales/kr.yml +0 -54
  260. data/lib/config/locales/nl.yml +0 -61
  261. data/lib/config/locales/pl.yml +0 -59
  262. data/lib/config/locales/pt-BR.yml +0 -60
  263. data/lib/config/locales/pt.yml +0 -60
  264. data/lib/config/locales/ro.yml +0 -66
  265. data/lib/config/locales/ru.yml +0 -61
  266. data/lib/config/locales/sv.yml +0 -60
  267. data/lib/config/locales/vi.yml +0 -62
  268. data/lib/config/locales/zh-CN.yml +0 -53
  269. data/lib/mongoid/collection.rb +0 -157
  270. data/lib/mongoid/collections/master.rb +0 -45
  271. data/lib/mongoid/collections/operations.rb +0 -44
  272. data/lib/mongoid/collections/retry.rb +0 -59
  273. data/lib/mongoid/collections.rb +0 -120
  274. data/lib/mongoid/config/database.rb +0 -181
  275. data/lib/mongoid/config/replset_database.rb +0 -80
  276. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  277. data/lib/mongoid/contexts/enumerable.rb +0 -313
  278. data/lib/mongoid/contexts/mongo.rb +0 -487
  279. data/lib/mongoid/contexts.rb +0 -25
  280. data/lib/mongoid/criterion/builder.rb +0 -34
  281. data/lib/mongoid/criterion/complex.rb +0 -84
  282. data/lib/mongoid/criterion/creational.rb +0 -34
  283. data/lib/mongoid/criterion/exclusion.rb +0 -108
  284. data/lib/mongoid/criterion/inclusion.rb +0 -290
  285. data/lib/mongoid/criterion/optional.rb +0 -259
  286. data/lib/mongoid/criterion/selector.rb +0 -177
  287. data/lib/mongoid/cursor.rb +0 -88
  288. data/lib/mongoid/default_scope.rb +0 -36
  289. data/lib/mongoid/errors/invalid_type.rb +0 -25
  290. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  291. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  292. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  293. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  294. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  295. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  296. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  297. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  298. data/lib/mongoid/extensions/object/checks.rb +0 -29
  299. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  300. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  301. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  302. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  303. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  304. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  305. data/lib/mongoid/extensions/string/checks.rb +0 -36
  306. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  307. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  308. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  309. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  310. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  311. data/lib/mongoid/extras.rb +0 -31
  312. data/lib/mongoid/fields/internal/array.rb +0 -76
  313. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  314. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  315. data/lib/mongoid/fields/internal/binary.rb +0 -11
  316. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  317. data/lib/mongoid/fields/internal/date.rb +0 -51
  318. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  319. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  320. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  321. data/lib/mongoid/fields/internal/float.rb +0 -47
  322. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  323. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  324. data/lib/mongoid/fields/internal/hash.rb +0 -11
  325. data/lib/mongoid/fields/internal/integer.rb +0 -59
  326. data/lib/mongoid/fields/internal/localized.rb +0 -62
  327. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  328. data/lib/mongoid/fields/internal/object.rb +0 -11
  329. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  330. data/lib/mongoid/fields/internal/range.rb +0 -61
  331. data/lib/mongoid/fields/internal/set.rb +0 -57
  332. data/lib/mongoid/fields/internal/string.rb +0 -42
  333. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  334. data/lib/mongoid/fields/internal/time.rb +0 -23
  335. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  336. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  337. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  338. data/lib/mongoid/fields/mappings.rb +0 -42
  339. data/lib/mongoid/fields/serializable.rb +0 -270
  340. data/lib/mongoid/identity.rb +0 -92
  341. data/lib/mongoid/javascript/functions.yml +0 -63
  342. data/lib/mongoid/javascript.rb +0 -20
  343. data/lib/mongoid/keys.rb +0 -144
  344. data/lib/mongoid/logger.rb +0 -45
  345. data/lib/mongoid/multi_database.rb +0 -36
  346. data/lib/mongoid/named_scope.rb +0 -166
  347. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  348. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  349. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  350. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  351. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  352. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  353. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  354. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  355. data/lib/mongoid/safety.rb +0 -105
  356. data/lib/mongoid/scope.rb +0 -31
@@ -1,34 +1,10 @@
1
1
  # encoding: utf-8
2
- require "mongoid/fields/mappings"
3
- require "mongoid/fields/serializable"
4
- require "mongoid/fields/internal/timekeeping"
5
- require "mongoid/fields/internal/array"
6
- require "mongoid/fields/internal/big_decimal"
7
- require "mongoid/fields/internal/binary"
8
- require "mongoid/fields/internal/boolean"
9
- require "mongoid/fields/internal/date"
10
- require "mongoid/fields/internal/date_time"
11
- require "mongoid/fields/internal/false_class"
12
- require "mongoid/fields/internal/float"
13
- require "mongoid/fields/internal/hash"
14
- require "mongoid/fields/internal/integer"
15
- require "mongoid/fields/internal/bignum"
16
- require "mongoid/fields/internal/fixnum"
17
- require "mongoid/fields/internal/localized"
18
- require "mongoid/fields/internal/nil_class"
19
- require "mongoid/fields/internal/object"
20
- require "mongoid/fields/internal/object_id"
21
- require "mongoid/fields/internal/range"
22
- require "mongoid/fields/internal/set"
23
- require "mongoid/fields/internal/string"
24
- require "mongoid/fields/internal/symbol"
25
- require "mongoid/fields/internal/time"
26
- require "mongoid/fields/internal/time_with_zone"
27
- require "mongoid/fields/internal/true_class"
28
- require "mongoid/fields/internal/foreign_keys/array"
29
- require "mongoid/fields/internal/foreign_keys/object"
30
-
31
- module Mongoid #:nodoc
2
+ require "mongoid/fields/standard"
3
+ require "mongoid/fields/foreign_key"
4
+ require "mongoid/fields/localized"
5
+ require "mongoid/fields/validators"
6
+
7
+ module Mongoid
32
8
 
33
9
  # This module defines behaviour for fields.
34
10
  module Fields
@@ -37,31 +13,38 @@ module Mongoid #:nodoc
37
13
  included do
38
14
  class_attribute :aliased_fields
39
15
  class_attribute :fields
40
- class_attribute :non_proc_defaults
41
- class_attribute :proc_defaults
16
+ class_attribute :pre_processed_defaults
17
+ class_attribute :post_processed_defaults
42
18
 
43
- self.aliased_fields = {}
19
+ self.aliased_fields = { "id" => "_id" }
44
20
  self.fields = {}
45
- self.non_proc_defaults = []
46
- self.proc_defaults = []
21
+ self.pre_processed_defaults = []
22
+ self.post_processed_defaults = []
47
23
 
48
- field(:_type, :type => String)
49
- field(:_id, :type => BSON::ObjectId)
24
+ field(:_type, default: ->{ self.class.name if hereditary? }, type: String)
25
+ field(
26
+ :_id,
27
+ default: ->{ Moped::BSON::ObjectId.new },
28
+ pre_processed: true,
29
+ type: Moped::BSON::ObjectId
30
+ )
50
31
 
51
32
  alias :id :_id
52
33
  alias :id= :_id=
34
+
35
+ attr_protected(:id, :_id, :_type) if Mongoid.protect_sensitive_fields?
53
36
  end
54
37
 
55
38
  # Apply all default values to the document which are not procs.
56
39
  #
57
40
  # @example Apply all the non-proc defaults.
58
- # model.apply_non_proc_defaults
41
+ # model.apply_pre_processed_defaults
59
42
  #
60
43
  # @return [ Array<String ] The names of the non-proc defaults.
61
44
  #
62
45
  # @since 2.4.0
63
- def apply_non_proc_defaults
64
- non_proc_defaults.each do |name|
46
+ def apply_pre_processed_defaults
47
+ pre_processed_defaults.each do |name|
65
48
  apply_default(name)
66
49
  end
67
50
  end
@@ -69,13 +52,13 @@ module Mongoid #:nodoc
69
52
  # Apply all default values to the document which are procs.
70
53
  #
71
54
  # @example Apply all the proc defaults.
72
- # model.apply_proc_defaults
55
+ # model.apply_post_processed_defaults
73
56
  #
74
57
  # @return [ Array<String ] The names of the proc defaults.
75
58
  #
76
59
  # @since 2.4.0
77
- def apply_proc_defaults
78
- proc_defaults.each do |name|
60
+ def apply_post_processed_defaults
61
+ post_processed_defaults.each do |name|
79
62
  apply_default(name)
80
63
  end
81
64
  end
@@ -107,20 +90,35 @@ module Mongoid #:nodoc
107
90
  #
108
91
  # @since 2.4.0
109
92
  def apply_defaults
110
- apply_non_proc_defaults
111
- apply_proc_defaults
93
+ apply_pre_processed_defaults
94
+ apply_post_processed_defaults
112
95
  end
113
96
 
114
- # Get a list of all the default fields for the model.
97
+ # Returns an array of names for the attributes available on this object.
115
98
  #
116
- # @example Get a list of the defaults.
117
- # model.defaults
99
+ # Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
100
+ # method to automatically wrap params in JSON requests.
118
101
  #
119
- # @return [ Array<String ] The names of all defaults.
102
+ # @example Get the field names
103
+ # docment.attribute_names
120
104
  #
121
- # @since 2.4.0
122
- def defaults
123
- self.class.defaults
105
+ # @return [ Array<String> ] The field names
106
+ #
107
+ # @since 3.0.0
108
+ def attribute_names
109
+ self.class.attribute_names
110
+ end
111
+
112
+ # Is the document using object ids?
113
+ #
114
+ # @note Refactored from using delegate for class load performance.
115
+ #
116
+ # @example Is the document using object ids?
117
+ # model.using_object_ids?
118
+ #
119
+ # @return [ true, false ] Using object ids.
120
+ def using_object_ids?
121
+ self.class.using_object_ids?
124
122
  end
125
123
 
126
124
  class << self
@@ -160,18 +158,21 @@ module Mongoid #:nodoc
160
158
  end
161
159
  end
162
160
 
163
- module ClassMethods #:nodoc
161
+ module ClassMethods
164
162
 
165
- # Get a list of all the default fields for the model.
163
+ # Returns an array of names for the attributes available on this object.
166
164
  #
167
- # @example Get a list of the defaults.
168
- # Model.defaults
165
+ # Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
166
+ # method to automatically wrap params in JSON requests.
169
167
  #
170
- # @return [ Array<String ] The names of all defaults.
168
+ # @example Get the field names
169
+ # Model.attribute_names
171
170
  #
172
- # @since 2.4.0
173
- def defaults
174
- non_proc_defaults + proc_defaults
171
+ # @return [ Array<String> ] The field names
172
+ #
173
+ # @since 3.0.0
174
+ def attribute_names
175
+ fields.keys
175
176
  end
176
177
 
177
178
  # Defines all the fields that are accessible on the Document
@@ -191,45 +192,12 @@ module Mongoid #:nodoc
191
192
  # @return [ Field ] The generated field
192
193
  def field(name, options = {})
193
194
  named = name.to_s
194
- check_field_name!(name)
195
- add_field(named, options).tap do
196
- descendants.each do |subclass|
197
- subclass.add_field(named, options)
198
- end
195
+ Validators::Macro.validate(self, name, options)
196
+ added = add_field(named, options)
197
+ descendants.each do |subclass|
198
+ subclass.add_field(named, options)
199
199
  end
200
- end
201
-
202
- # When inheriting, we want to copy the fields from the parent class and
203
- # set the on the child to start, mimicking the behaviour of the old
204
- # class_inheritable_accessor that was deprecated in Rails edge.
205
- #
206
- # @example Inherit from this class.
207
- # Person.inherited(Doctor)
208
- #
209
- # @param [ Class ] subclass The inheriting class.
210
- #
211
- # @since 2.0.0.rc.6
212
- def inherited(subclass)
213
- super
214
- subclass.fields, subclass.non_proc_defaults, subclass.proc_defaults =
215
- fields.dup, non_proc_defaults.dup, proc_defaults.dup
216
- end
217
-
218
- # Is the field with the provided name a BSON::ObjectId?
219
- #
220
- # @example Is the field a BSON::ObjectId?
221
- # Person.object_id_field?(:name)
222
- #
223
- # @param [ String, Symbol ] name The name of the field.
224
- #
225
- # @return [ true, false ] If the field is a BSON::ObjectId.
226
- #
227
- # @since 2.2.0
228
- def object_id_field?(name)
229
- field_name = name.to_s
230
- field_name = "_id" if field_name == "id"
231
- field = fields[field_name]
232
- field ? field.object_id_field? : false
200
+ added
233
201
  end
234
202
 
235
203
  # Replace a field with a new type.
@@ -244,8 +212,21 @@ module Mongoid #:nodoc
244
212
  #
245
213
  # @since 2.1.0
246
214
  def replace_field(name, type)
247
- defaults.delete_one(name)
248
- add_field(name, fields[name].options.merge(:type => type))
215
+ remove_defaults(name)
216
+ add_field(name, fields[name].options.merge(type: type))
217
+ end
218
+
219
+ # Convenience method for determining if we are using +Moped::BSON::ObjectIds+ as
220
+ # our id.
221
+ #
222
+ # @example Does this class use object ids?
223
+ # person.using_object_ids?
224
+ #
225
+ # @return [ true, false ] If the class uses Moped::BSON::ObjectIds for the id.
226
+ #
227
+ # @since 1.0.0
228
+ def using_object_ids?
229
+ fields["_id"].object_id_field?
249
230
  end
250
231
 
251
232
  protected
@@ -261,11 +242,12 @@ module Mongoid #:nodoc
261
242
  # @since 2.4.0
262
243
  def add_defaults(field)
263
244
  default, name = field.default_val, field.name.to_s
245
+ remove_defaults(name)
264
246
  unless default.nil?
265
- if field.default_val.is_a?(::Proc)
266
- proc_defaults.push(name)
247
+ if field.pre_processed?
248
+ pre_processed_defaults.push(name)
267
249
  else
268
- non_proc_defaults.push(name)
250
+ post_processed_defaults.push(name)
269
251
  end
270
252
  end
271
253
  end
@@ -280,16 +262,15 @@ module Mongoid #:nodoc
280
262
  def add_field(name, options = {})
281
263
  aliased = options[:as]
282
264
  aliased_fields[aliased.to_s] = name if aliased
283
- type = options[:localize] ? Fields::Internal::Localized : options[:type]
284
- Mappings.for(type, options[:identity]).instantiate(name, options).tap do |field|
285
- fields[name] = field
286
- add_defaults(field)
287
- create_accessors(name, name, options)
288
- create_accessors(name, aliased, options) if aliased
289
- process_options(field)
290
- create_dirty_methods(name, name)
291
- create_dirty_methods(name, aliased) if aliased
292
- end
265
+ field = field_for(name, options)
266
+ fields[name] = field
267
+ add_defaults(field)
268
+ create_accessors(name, name, options)
269
+ create_accessors(name, aliased, options) if aliased
270
+ process_options(field)
271
+ create_dirty_methods(name, name)
272
+ create_dirty_methods(name, aliased) if aliased
273
+ field
293
274
  end
294
275
 
295
276
  # Run through all custom options stored in Mongoid::Fields.options and
@@ -315,22 +296,6 @@ module Mongoid #:nodoc
315
296
  end
316
297
  end
317
298
 
318
- # Determine if the field name is allowed, if not raise an error.
319
- #
320
- # @example Check the field name.
321
- # Model.check_field_name!(:collection)
322
- #
323
- # @param [ Symbol ] name The field name.
324
- #
325
- # @raise [ Errors::InvalidField ] If the name is not allowed.
326
- #
327
- # @since 2.1.8
328
- def check_field_name!(name)
329
- if Mongoid.destructive_fields.include?(name)
330
- raise Errors::InvalidField.new(name)
331
- end
332
- end
333
-
334
299
  # Create the field accessors.
335
300
  #
336
301
  # @example Generate the accessors.
@@ -348,12 +313,12 @@ module Mongoid #:nodoc
348
313
  field = fields[name]
349
314
 
350
315
  create_field_getter(name, meth, field)
351
- create_field_setter(name, meth)
316
+ create_field_setter(name, meth, field)
352
317
  create_field_check(name, meth)
353
318
 
354
319
  if options[:localize]
355
320
  create_translations_getter(name, meth)
356
- create_translations_setter(name, meth)
321
+ create_translations_setter(name, meth, field)
357
322
  end
358
323
  end
359
324
 
@@ -369,38 +334,10 @@ module Mongoid #:nodoc
369
334
  # @since 2.4.0
370
335
  def create_field_getter(name, meth, field)
371
336
  generated_methods.module_eval do
372
- if meth =~ /\W/
373
- if field.cast_on_read?
374
- define_method(meth) do
375
- fields[name].deserialize(read_attribute(name))
376
- end
377
- else
378
- define_method(meth) do
379
- read_attribute(name).tap do |value|
380
- if value.is_a?(Array) || value.is_a?(Hash)
381
- attribute_will_change!(name)
382
- end
383
- end
384
- end
385
- end
386
- else
387
- if field.cast_on_read?
388
- class_eval <<-EOM
389
- def #{meth}
390
- fields[#{name.inspect}].deserialize(read_attribute(#{name.inspect}))
391
- end
392
- EOM
393
- else
394
- class_eval <<-EOM
395
- def #{meth}
396
- read_attribute(#{name.inspect}).tap do |value|
397
- if value.is_a?(Array) || value.is_a?(Hash)
398
- attribute_will_change!(#{name.inspect})
399
- end
400
- end
401
- end
402
- EOM
403
- end
337
+ re_define_method(meth) do
338
+ value = fields[name].demongoize(read_attribute(name))
339
+ attribute_will_change!(name) if value.resizable?
340
+ value
404
341
  end
405
342
  end
406
343
  end
@@ -412,20 +349,16 @@ module Mongoid #:nodoc
412
349
  #
413
350
  # @param [ String ] name The name of the attribute.
414
351
  # @param [ String ] meth The name of the method.
352
+ # @param [ Field ] field The field.
415
353
  #
416
354
  # @since 2.4.0
417
- def create_field_setter(name, meth)
355
+ def create_field_setter(name, meth, field)
418
356
  generated_methods.module_eval do
419
- if meth =~ /\W/
420
- define_method(meth) do |value|
421
- write_attribute(name, value)
357
+ re_define_method("#{meth}=") do |value|
358
+ write_attribute(name, value)
359
+ if field.foreign_key?
360
+ remove_ivar(field.metadata.name)
422
361
  end
423
- else
424
- class_eval <<-EOM
425
- def #{meth}=(value)
426
- write_attribute(#{name.inspect}, value)
427
- end
428
- EOM
429
362
  end
430
363
  end
431
364
  end
@@ -441,18 +374,9 @@ module Mongoid #:nodoc
441
374
  # @since 2.4.0
442
375
  def create_field_check(name, meth)
443
376
  generated_methods.module_eval do
444
- if meth =~ /\W/
445
- define_method("#{meth}?") do
446
- attr = read_attribute(name)
447
- attr == true || attr.present?
448
- end
449
- else
450
- class_eval <<-EOM
451
- def #{meth}?
452
- attr = read_attribute(#{name.inspect})
453
- attr == true || attr.present?
454
- end
455
- EOM
377
+ re_define_method("#{meth}?") do
378
+ attr = read_attribute(name)
379
+ attr == true || attr.present?
456
380
  end
457
381
  end
458
382
  end
@@ -468,16 +392,8 @@ module Mongoid #:nodoc
468
392
  # @since 2.4.0
469
393
  def create_translations_getter(name, meth)
470
394
  generated_methods.module_eval do
471
- if meth =~ /\W/
472
- define_method("#{meth}_translations") do
473
- attributes[name]
474
- end
475
- else
476
- class_eval <<-EOM
477
- def #{meth}_translations
478
- attributes[#{name.inspect}]
479
- end
480
- EOM
395
+ re_define_method("#{meth}_translations") do
396
+ attributes[name] ||= {}
481
397
  end
482
398
  end
483
399
  end
@@ -489,22 +405,19 @@ module Mongoid #:nodoc
489
405
  #
490
406
  # @param [ String ] name The name of the attribute.
491
407
  # @param [ String ] meth The name of the method.
408
+ # @param [ Field ] field The field.
492
409
  #
493
410
  # @since 2.4.0
494
- def create_translations_setter(name, meth)
411
+ def create_translations_setter(name, meth, field)
495
412
  generated_methods.module_eval do
496
- if meth =~ /\W/
497
- define_method("#{meth}_translations=") do |value|
498
- attribute_will_change!(name)
499
- attributes[name] = value
500
- end
501
- else
502
- class_eval <<-EOM
503
- def #{meth}_translations=(value)
504
- attribute_will_change!(#{name.inspect})
505
- attributes[#{name.inspect}] = value
413
+ re_define_method("#{meth}_translations=") do |value|
414
+ attribute_will_change!(name)
415
+ if value
416
+ value.update_values do |value|
417
+ field.type.mongoize(value)
506
418
  end
507
- EOM
419
+ end
420
+ attributes[name] = value
508
421
  end
509
422
  end
510
423
  end
@@ -519,9 +432,30 @@ module Mongoid #:nodoc
519
432
  # @since 2.0.0
520
433
  def generated_methods
521
434
  @generated_methods ||= begin
522
- Module.new.tap { |mod| include(mod) }
435
+ mod = Module.new
436
+ include(mod)
437
+ mod
523
438
  end
524
439
  end
440
+
441
+ # Remove the default keys for the provided name.
442
+ #
443
+ # @example Remove the default keys.
444
+ # Model.remove_defaults(name)
445
+ #
446
+ # @param [ String ] name The field name.
447
+ #
448
+ # @since 2.4.0
449
+ def remove_defaults(name)
450
+ pre_processed_defaults.delete_one(name)
451
+ post_processed_defaults.delete_one(name)
452
+ end
453
+
454
+ def field_for(name, options)
455
+ return Fields::Localized.new(name, options) if options[:localize]
456
+ return Fields::ForeignKey.new(name, options) if options[:identity]
457
+ Fields::Standard.new(name, options)
458
+ end
525
459
  end
526
460
  end
527
461
  end
@@ -1,42 +1,25 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # This module defines the finder methods that hang off the document at the
5
5
  # class level.
6
6
  module Finders
7
+ extend Origin::Forwardable
7
8
 
8
- # Delegate to the criteria methods that are natural for creating a new
9
- # criteria.
10
- critera_methods = [ :all_in, :all_of, :any_in, :any_of, :asc, :ascending,
11
- :avg, :desc, :descending, :excludes,
12
- :includes, :limit, :max, :min, :not_in, :only,
13
- :order_by, :search, :skip, :sum, :without, :where,
14
- :update, :update_all, :near ]
15
- delegate *(critera_methods.dup << { :to => :criteria })
9
+ select_with :with_default_scope
10
+ delegate :aggregates, :avg, :each, :extras, :find_and_modify, :includes,
11
+ :map_reduce, :max, :min, :sum, :update, :update_all, to: :with_default_scope
16
12
 
17
- # Find all documents that match the given conditions.
18
- #
19
- # @example Find all matching documents given conditions.
20
- # Person.all(:conditions => { :attribute => "value" })
21
- #
22
- # @param [ Array ] args The conditions with options.
23
- #
24
- # @return [ Criteria ] The matching documents.
25
- def all(*args)
26
- find(:all, *args)
27
- end
28
-
29
- # Returns a count of matching records in the database based on the
30
- # provided arguments.
13
+ # Returns a count of records in the database.
14
+ # If you want to specify conditions use where.
31
15
  #
32
16
  # @example Get the count of matching documents.
33
- # Person.count(:conditions => { :attribute => "value" })
34
- #
35
- # @param [ Array ] args The conditions.
17
+ # Person.count
18
+ # Person.where(title: "Sir").count
36
19
  #
37
20
  # @return [ Integer ] The number of matching documents.
38
- def count(*args)
39
- find(:all, *args).count
21
+ def count
22
+ with_default_scope.count
40
23
  end
41
24
 
42
25
  # Returns true if count is zero
@@ -53,11 +36,11 @@ module Mongoid #:nodoc:
53
36
  # provided arguments.
54
37
  #
55
38
  # @example Do any documents exist for the conditions?
56
- # Person.exists?(:conditions => { :attribute => "value" })
39
+ # Person.exists?
57
40
  #
58
41
  # @param [ Array ] args The conditions.
59
- def exists?(*args)
60
- find(:all, *args).count > 0
42
+ def exists?
43
+ with_default_scope.exists?
61
44
  end
62
45
 
63
46
  # Find a +Document+ in several different ways.
@@ -68,20 +51,14 @@ module Mongoid #:nodoc:
68
51
  # it will attempt to find either a single +Document+ or multiples based
69
52
  # on the conditions provided and the first parameter.
70
53
  #
71
- # @example Find the first matching document.
72
- # Person.find(:first, :conditions => { :attribute => "value" })
73
- #
74
- # @example Find all matching documents.
75
- # Person.find(:all, :conditions => { :attribute => "value" })
76
- #
77
54
  # @example Find a single document by an id.
78
- # Person.find(BSON::ObjectId)
55
+ # Person.find(Moped::BSON::ObjectId)
79
56
  #
80
57
  # @param [ Array ] args An assortment of finder options.
81
58
  #
82
59
  # @return [ Document, nil, Criteria ] A document or matching documents.
83
60
  def find(*args)
84
- criteria.find(*args)
61
+ with_default_scope.find(*args)
85
62
  end
86
63
 
87
64
  # Find the first +Document+ given the conditions, or creates a new document
@@ -110,28 +87,46 @@ module Mongoid #:nodoc:
110
87
  find_or(:new, attrs, &block)
111
88
  end
112
89
 
90
+ # Find the first +Document+ given the conditions, or raises
91
+ # Mongoid::Errors::DocumentNotFound
92
+ #
93
+ # @example Find the document by attribute other than id
94
+ # Person.find_by(:username => "superuser")
95
+ #
96
+ # @param [ Hash ] attrs The attributes to check.
97
+ #
98
+ # @raise [ Errors::DocumentNotFound ] If no document found.
99
+ #
100
+ # @return [ Document ] A matching document.
101
+ #
102
+ # @since 3.0.0
103
+ def find_by(attrs = {})
104
+ result = where(attrs).first
105
+ if result.nil? && Mongoid.raise_not_found_error
106
+ raise(Errors::DocumentNotFound.new(self, attrs))
107
+ end
108
+ yield(result) if result && block_given?
109
+ result
110
+ end
111
+
113
112
  # Find the first +Document+ given the conditions.
114
113
  #
115
114
  # @example Find the first document.
116
- # Person.first(:conditions => { :attribute => "value" })
117
- #
118
- # @param [ Array ] args The conditions with options.
115
+ # Person.first
119
116
  #
120
117
  # @return [ Document ] The first matching document.
121
- def first(*args)
122
- find(:first, *args)
118
+ def first
119
+ with_default_scope.first
123
120
  end
124
121
 
125
122
  # Find the last +Document+ given the conditions.
126
123
  #
127
124
  # @example Find the last document.
128
- # Person.last(:conditions => { :attribute => "value" })
129
- #
130
- # @param [ Array ] args The conditions with options.
125
+ # Person.last
131
126
  #
132
127
  # @return [ Document ] The last matching document.
133
- def last(*args)
134
- find(:last, *args)
128
+ def last
129
+ with_default_scope.last
135
130
  end
136
131
 
137
132
  protected
@@ -146,7 +141,7 @@ module Mongoid #:nodoc:
146
141
  #
147
142
  # @return [ Document ] The first or new document.
148
143
  def find_or(method, attrs = {}, &block)
149
- first(:conditions => attrs) || send(method, attrs, &block)
144
+ where(attrs).first || send(method, attrs, &block)
150
145
  end
151
146
  end
152
147
  end