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,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Hierarchy #:nodoc
2
+ module Mongoid
3
+ module Hierarchy
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
@@ -19,18 +19,29 @@ module Mongoid #:nodoc
19
19
  #
20
20
  # @return [ Array<Document> ] All child documents in the hierarchy.
21
21
  def _children
22
- @_children ||=
23
- [].tap do |children|
24
- relations.each_pair do |name, metadata|
25
- if metadata.embedded?
26
- child = send(name)
27
- Array.wrap(child).each do |doc|
28
- children.push(doc)
29
- children.concat(doc._children) unless metadata.versioned?
30
- end if child
31
- end
32
- end
22
+ @_children ||= collect_children
23
+ end
24
+
25
+ # Collect all the children of this document.
26
+ #
27
+ # @example Collect all the children.
28
+ # document.collect_children
29
+ #
30
+ # @return [ Array<Document> ] The children.
31
+ #
32
+ # @since 2.4.0
33
+ def collect_children
34
+ children = []
35
+ embedded_relations.each_pair do |name, metadata|
36
+ without_autobuild do
37
+ child = send(name)
38
+ Array.wrap(child).each do |doc|
39
+ children.push(doc)
40
+ children.concat(doc._children) unless metadata.versioned?
41
+ end if child
33
42
  end
43
+ end
44
+ children
34
45
  end
35
46
 
36
47
  # Determines if the document is a subclass of another document.
@@ -68,7 +79,7 @@ module Mongoid #:nodoc
68
79
  #
69
80
  # @since 2.0.0.beta.1
70
81
  def remove_child(child)
71
- name = child.metadata.name
82
+ name = child.metadata_name
72
83
  if child.embedded_one?
73
84
  remove_ivar(name)
74
85
  else
@@ -106,7 +117,7 @@ module Mongoid #:nodoc
106
117
  object || self
107
118
  end
108
119
 
109
- module ClassMethods #:nodoc:
120
+ module ClassMethods
110
121
 
111
122
  # Determines if the document is a subclass of another document.
112
123
  #
@@ -117,6 +128,24 @@ module Mongoid #:nodoc
117
128
  def hereditary?
118
129
  Mongoid::Document > superclass
119
130
  end
131
+
132
+ # When inheriting, we want to copy the fields from the parent class and
133
+ # set the on the child to start, mimicking the behaviour of the old
134
+ # class_inheritable_accessor that was deprecated in Rails edge.
135
+ #
136
+ # @example Inherit from this class.
137
+ # Person.inherited(Doctor)
138
+ #
139
+ # @param [ Class ] subclass The inheriting class.
140
+ #
141
+ # @since 2.0.0.rc.6
142
+ def inherited(subclass)
143
+ super
144
+ subclass.fields = fields.dup
145
+ subclass.pre_processed_defaults = pre_processed_defaults.dup
146
+ subclass.post_processed_defaults = post_processed_defaults.dup
147
+ subclass.scopes = scopes.dup
148
+ end
120
149
  end
121
150
  end
122
151
  end
@@ -1,22 +1,22 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # Defines behaviour for the identity map in Mongoid.
5
5
  class IdentityMap < Hash
6
6
 
7
- # Clear the many documents.
7
+ # Clear out the loaded documents for the provided selector.
8
8
  #
9
- # @example Clear the docs.
10
- # identity_map.clear_many(Post, selector)
9
+ # @example Clear out the documents.
10
+ # map.clear_many(Post, { person_id: person.id })
11
11
  #
12
- # @param [ Class ] klass The klass to clear.
13
- # @param [ Hash ] selector The selector to identify it.
12
+ # @param [ Class ] klass The class of the relation.
13
+ # @param [ Hash ] selector The selector.
14
14
  #
15
- # @return [ Array<Document> ] The documents.
15
+ # @return [ Array ] An empty array.
16
16
  #
17
17
  # @since 2.4.10
18
18
  def clear_many(klass, selector)
19
- (documents_for(klass)[selector] ||= []).clear
19
+ documents_for(klass)[selector] = {}
20
20
  end
21
21
 
22
22
  # Get a document from the identity map by its id.
@@ -31,8 +31,33 @@ module Mongoid #:nodoc:
31
31
  #
32
32
  # @since 2.1.0
33
33
  def get(klass, identifier)
34
- return nil unless Mongoid.identity_map_enabled? && klass
35
- documents_for(klass)[identifier]
34
+ if Mongoid.using_identity_map? && klass
35
+ if identifier.is_a?(::Array)
36
+ documents = documents_for(klass)
37
+ identifier.map do |id|
38
+ documents[id] || (return nil)
39
+ end
40
+ else
41
+ documents_for(klass)[identifier]
42
+ end
43
+ end
44
+ end
45
+
46
+ # Get many documents from the map via the selector
47
+ #
48
+ # @example Get the document from the map.
49
+ # map.get(Person, { post_id: post })
50
+ #
51
+ # @param [ Class ] klass The class of the document.
52
+ # @param [ Hash ] idenfier The selector.
53
+ #
54
+ # @return [ Array<Document> ] The matching documents.
55
+ #
56
+ # @since 3.0.0
57
+ def get_many(klass, identifier)
58
+ if Mongoid.using_identity_map? && klass
59
+ documents_for(klass)[identifier].try(:values)
60
+ end
36
61
  end
37
62
 
38
63
  # Remove the document from the identity map.
@@ -46,8 +71,9 @@ module Mongoid #:nodoc:
46
71
  #
47
72
  # @since 2.1.0
48
73
  def remove(document)
49
- return nil unless Mongoid.identity_map_enabled? && document && document.id
50
- documents_for(document.class).delete(document.id)
74
+ if Mongoid.using_identity_map? && document && document.id
75
+ documents_for(document.class).delete(document.id)
76
+ end
51
77
  end
52
78
 
53
79
  # Puts a document in the identity map, accessed by it's id.
@@ -61,8 +87,9 @@ module Mongoid #:nodoc:
61
87
  #
62
88
  # @since 2.1.0
63
89
  def set(document)
64
- return nil unless Mongoid.identity_map_enabled? && document && document.id
65
- documents_for(document.class)[document.id] = document
90
+ if Mongoid.using_identity_map? && document && document.id
91
+ documents_for(document.class)[document.id] = document
92
+ end
66
93
  end
67
94
 
68
95
  # Set a document in the identity map for the provided selector.
@@ -77,7 +104,7 @@ module Mongoid #:nodoc:
77
104
  #
78
105
  # @since 2.2.0
79
106
  def set_many(document, selector)
80
- (documents_for(document.class)[selector] ||= []).push(document)
107
+ (documents_for(document.class)[selector] ||= {})[document.id] = document
81
108
  end
82
109
 
83
110
  # Set a document in the identity map for the provided selector.
@@ -92,7 +119,7 @@ module Mongoid #:nodoc:
92
119
  #
93
120
  # @since 2.2.0
94
121
  def set_one(document, selector)
95
- documents_for(document.class)[selector] = document
122
+ documents_for(document.class)[selector] = document
96
123
  end
97
124
 
98
125
  private
@@ -108,8 +135,9 @@ module Mongoid #:nodoc:
108
135
  #
109
136
  # @since 2.1.0
110
137
  def documents_for(klass)
111
- return nil unless klass
112
- self[klass.collection_name] ||= {}
138
+ if klass
139
+ self[klass.collection_name] ||= {}
140
+ end
113
141
  end
114
142
 
115
143
  class << self
@@ -125,11 +153,11 @@ module Mongoid #:nodoc:
125
153
  # IdentityMap.set(document)
126
154
  #
127
155
  # @since 2.1.0
128
- delegate *(
156
+ delegate(*(
129
157
  Hash.public_instance_methods(false) +
130
158
  IdentityMap.public_instance_methods(false) <<
131
- { :to => :"Mongoid::Threaded.identity_map" }
132
- )
159
+ { to: :"Mongoid::Threaded.identity_map" }
160
+ ))
133
161
  end
134
162
  end
135
163
  end
@@ -0,0 +1,80 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Indexes
4
+ module Validators
5
+
6
+ # Validates the options passed to the index macro.
7
+ module Options
8
+ extend self
9
+
10
+ VALID_OPTIONS = [ :background, :drop_dups, :name, :sparse, :unique, :max, :min ]
11
+ VALID_TYPES = [ 1, -1, "2d" ]
12
+
13
+ # Validate the index specification.
14
+ #
15
+ # @example Validate the index spec.
16
+ # Options.validate(Band, name: 1)
17
+ #
18
+ # @param [ Class ] klass The model class.
19
+ # @param [ Hash ] spec The index specification.
20
+ # @param [ Hash ] options The index options.
21
+ #
22
+ # @raise [ Errors::InvalidIndex ] If validation failed.
23
+ #
24
+ # @since 3.0.0
25
+ def validate(klass, spec, options)
26
+ validate_spec(klass, spec, options)
27
+ validate_options(klass, spec, options)
28
+ end
29
+
30
+ private
31
+
32
+ # Validates the options of the index spec.
33
+ #
34
+ # @api private
35
+ #
36
+ # @example Validate the options.
37
+ # Options.validate_options(Band, name: 1)
38
+ #
39
+ # @param [ Class ] klass The model class.
40
+ # @param [ Hash ] spec The index specification.
41
+ # @param [ Hash ] options The index options.
42
+ #
43
+ # @raise [ Errors::InvalidIndex ] If validation failed.
44
+ #
45
+ # @since 3.0.0
46
+ def validate_options(klass, spec, options)
47
+ options.each_pair do |name, value|
48
+ unless VALID_OPTIONS.include?(name)
49
+ raise Errors::InvalidIndex.new(klass, spec, options)
50
+ end
51
+ end
52
+ end
53
+
54
+ # Validates the index spec.
55
+ #
56
+ # @api private
57
+ #
58
+ # @example Validate the spec.
59
+ # Options.validate_spec(Band, name: 1)
60
+ #
61
+ # @param [ Class ] klass The model class.
62
+ # @param [ Hash ] spec The index specification.
63
+ # @param [ Hash ] options The index options.
64
+ #
65
+ # @raise [ Errors::InvalidIndex ] If validation failed.
66
+ #
67
+ # @since 3.0.0
68
+ def validate_spec(klass, spec, options)
69
+ raise Errors::InvalidIndex.new(klass, spec, options) if !spec.is_a?(::Hash)
70
+ spec.each_pair do |name, value|
71
+ next if name == :options
72
+ unless VALID_TYPES.include?(value)
73
+ raise Errors::InvalidIndex.new(klass, spec, options)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -1,6 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Indexes #:nodoc
2
+ require "mongoid/indexes/validators/options"
3
+
4
+ module Mongoid
5
+ module Indexes
4
6
  extend ActiveSupport::Concern
5
7
 
6
8
  included do
@@ -8,18 +10,37 @@ module Mongoid #:nodoc
8
10
  self.index_options = {}
9
11
  end
10
12
 
11
- module ClassMethods #:nodoc
13
+ module ClassMethods
12
14
 
13
15
  # Send the actual index creation comments to the MongoDB driver
14
16
  #
15
17
  # @example Create the indexes for the class.
16
18
  # Person.create_indexes
19
+ #
20
+ # @return [ true ] If the operation succeeded.
21
+ #
22
+ # @since 1.0.0
17
23
  def create_indexes
18
24
  return unless index_options
19
- current_collection = self._collection || set_collection
20
- index_options.each_pair do |name, options|
21
- current_collection.create_index(name, options)
22
- end
25
+ index_options.each_pair do |spec, options|
26
+ collection.indexes.create(spec, options)
27
+ end and true
28
+ end
29
+
30
+ # Send the actual index removal comments to the MongoDB driver,
31
+ # but lets _id untouched.
32
+ #
33
+ # @example Remove the indexes for the class.
34
+ # Person.remove_indexes
35
+ #
36
+ # @return [ true ] If the operation succeeded.
37
+ #
38
+ # @since 3.0.0
39
+ def remove_indexes
40
+ collection.indexes.each do |spec|
41
+ next if spec["name"] == "_id_"
42
+ collection.indexes.drop(spec["key"])
43
+ end and true
23
44
  end
24
45
 
25
46
  # Add the default indexes to the root document if they do not already
@@ -27,11 +48,15 @@ module Mongoid #:nodoc
27
48
  #
28
49
  # @example Add Mongoid internal indexes.
29
50
  # Person.add_indexes
51
+ #
52
+ # @return [ true ] If the operation succeeded.
53
+ #
54
+ # @since 1.0.0
30
55
  def add_indexes
31
- if hereditary? && !index_options[:_type]
32
- self.index_options[:_type] = {:unique => false, :background => true}
56
+ if hereditary? && !index_options[{ _type: 1 }]
57
+ index({ _type: 1 }, { unique: false, background: true })
33
58
  end
34
- create_indexes if Mongoid.autocreate_indexes
59
+ true
35
60
  end
36
61
 
37
62
  # Adds an index on the field specified. Options can be :unique => true or
@@ -40,14 +65,40 @@ module Mongoid #:nodoc
40
65
  # @example Create a basic index.
41
66
  # class Person
42
67
  # include Mongoid::Document
43
- # field :name, :type => String
44
- # index :name, :background => true
68
+ # field :name, type: String
69
+
70
+ # index({ name: 1 }, { background: true })
71
+ # end
45
72
  #
46
73
  # @param [ Symbol ] name The name of the field.
47
74
  # @param [ Hash ] options The index options.
48
- def index(name, options = { :unique => false })
49
- self.index_options[name] = options
50
- create_indexes if Mongoid.autocreate_indexes
75
+ #
76
+ # @return [ Hash ] The index options.
77
+ #
78
+ # @since 1.0.0
79
+ def index(spec, options = nil)
80
+ Validators::Options.validate(self, spec, options || {})
81
+ index_options[spec] = normalize_index_options(options)
82
+ end
83
+
84
+ private
85
+
86
+ # Normalize the index options, if any are provided.
87
+ #
88
+ # @api private
89
+ #
90
+ # @example Normalize the index options.
91
+ # Model.normalize_index_options(drop_dups: true)
92
+ #
93
+ # @param [ Hash ] options The index options.
94
+ #
95
+ # @return [ Hash ] The normalized options.
96
+ #
97
+ # @since 3.0.0
98
+ def normalize_index_options(options)
99
+ opts = options || {}
100
+ opts[:dropDups] = opts.delete(:drop_dups) if opts.has_key?(:drop_dups)
101
+ opts
51
102
  end
52
103
  end
53
104
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
2
+ module Mongoid
3
3
 
4
4
  # Contains the bahviour around inspecting documents via
5
5
  # <tt>Object#inspect</tt>.
data/lib/mongoid/json.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
  # This module is for hooking in to +ActiveModel+s serialization to let
4
4
  # configuring the ability to include the root in JSON happen from the Mongoid
5
5
  # config.
@@ -10,7 +10,7 @@ module Mongoid #:nodoc:
10
10
  # similar to +ActiveRecord+.
11
11
  included do
12
12
  undef_method :include_root_in_json
13
- delegate :include_root_in_json, :to => ::Mongoid
13
+ delegate :include_root_in_json, to: ::Mongoid
14
14
  end
15
15
  end
16
16
  end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+
4
+ # Contains logging behaviour.
5
+ module Loggable
6
+
7
+ # Get the logger.
8
+ #
9
+ # @note Will try to grab Rails' logger first before creating a new logger
10
+ # with stdout.
11
+ #
12
+ # @example Get the logger.
13
+ # Loggable.logger
14
+ #
15
+ # @return [ Logger ] The logger.
16
+ #
17
+ # @since 3.0.0
18
+ def logger
19
+ return @logger if defined?(@logger)
20
+ @logger = rails_logger || default_logger
21
+ end
22
+
23
+ # Set the logger.
24
+ #
25
+ # @example Set the logger.
26
+ # Loggable.logger = Logger.new($stdout)
27
+ #
28
+ # @param [ Logger ] The logger to set.
29
+ #
30
+ # @return [ Logger ] The new logger.
31
+ #
32
+ # @since 3.0.0
33
+ def logger=(logger)
34
+ @logger = logger
35
+ end
36
+
37
+ private
38
+
39
+ # Gets the default Mongoid logger - stdout.
40
+ #
41
+ # @api private
42
+ #
43
+ # @example Get the default logger.
44
+ # Loggable.default_logger
45
+ #
46
+ # @return [ Logger ] The default logger.
47
+ #
48
+ # @since 3.0.0
49
+ def default_logger
50
+ logger = Logger.new($stdout)
51
+ logger.level = Logger::INFO
52
+ logger
53
+ end
54
+
55
+ # Get the Rails logger if it's defined.
56
+ #
57
+ # @api private
58
+ #
59
+ # @example Get Rails' logger.
60
+ # Loggable.rails_logger
61
+ #
62
+ # @return [ Logger ] The Rails logger.
63
+ #
64
+ # @since 3.0.0
65
+ def rails_logger
66
+ defined?(::Rails) && ::Rails.respond_to?(:logger) && ::Rails.logger
67
+ end
68
+ end
69
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Checks that all values match.
6
6
  class All < Default
@@ -14,13 +14,12 @@ module Mongoid #:nodoc:
14
14
  #
15
15
  # @return [ true, false ] If the values match.
16
16
  def matches?(value)
17
+ first = first(value)
18
+ return false if first.is_a?(Array) && first.empty?
19
+
17
20
  attribute_array = Array.wrap(@attribute)
18
- value.values.first.all? do |e|
19
- if e.is_a?(Regexp)
20
- attribute_array.any? { |_attribute| _attribute =~ e }
21
- else
22
- attribute_array.include?(e)
23
- end
21
+ first.all? do |e|
22
+ attribute_array.any? { |_attribute| e === _attribute }
24
23
  end
25
24
  end
26
25
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Defines behavior for handling $or expressions in embedded documents.
6
6
  class And < Default
@@ -8,7 +8,7 @@ module Mongoid #:nodoc:
8
8
  # Does the supplied query match the attribute?
9
9
  #
10
10
  # @example Does this match?
11
- # matcher.matches?("$and" => [ { field => value } ])
11
+ # matcher.matches?([ { field => value } ])
12
12
  #
13
13
  # @param [ Array ] conditions The or expression.
14
14
  #
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Contains all the default behavior for checking for matching documents
6
6
  # given MongoDB expressions.
@@ -32,7 +32,7 @@ module Mongoid #:nodoc:
32
32
  #
33
33
  # @since 1.0.0
34
34
  def matches?(value)
35
- attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.include?(value) : value === attribute
35
+ attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.any? { |_attribute| value === _attribute } : value === attribute
36
36
  end
37
37
 
38
38
  protected
@@ -63,7 +63,9 @@ module Mongoid #:nodoc:
63
63
  #
64
64
  # @since 1.0.0
65
65
  def determine(value, operator)
66
- attribute ? attribute.send(operator, first(value)) : false
66
+ attribute.__array__.any? {|attr|
67
+ attr ? attr.send(operator, first(value)) : false
68
+ }
67
69
  end
68
70
  end
69
71
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Checks for existance.
6
6
  class Exists < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs Greater Than matching.
6
6
  class Gt < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs Greater than or equal to matching.
6
6
  class Gte < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs matching for any value in an array.
6
6
  class In < Default
@@ -16,11 +16,7 @@ module Mongoid #:nodoc:
16
16
  def matches?(value)
17
17
  attribute_array = Array.wrap(@attribute)
18
18
  value.values.first.any? do |e|
19
- if e.is_a?(Regexp)
20
- attribute_array.any? { |_attribute| _attribute =~ e }
21
- else
22
- attribute_array.include?(e)
23
- end
19
+ attribute_array.any? { |_attribute| e === _attribute }
24
20
  end
25
21
  end
26
22
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs less than matching.
6
6
  class Lt < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs less than or equal to matching.
6
6
  class Lte < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs non-equivalency checks.
6
6
  class Ne < Default
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Matchers #:nodoc:
2
+ module Mongoid
3
+ module Matchers
4
4
 
5
5
  # Performs not in checking.
6
6
  class Nin < Default