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
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Sessions
4
+ module Validators
5
+
6
+ # Validates the options passed to :store_in.
7
+ module Storage
8
+ extend self
9
+
10
+ VALID_OPTIONS = [ :collection, :database, :session ]
11
+
12
+ # Validate the options provided to :store_in.
13
+ #
14
+ # @example Validate the options.
15
+ # Storage.validate(:collection_name)
16
+ #
17
+ # @param [ Class ] klass The model class.
18
+ # @param [ Hash, String, Symbol ] options The provided options.
19
+ #
20
+ # @since 3.0.0
21
+ def validate(klass, options)
22
+ if !options.is_a?(::Hash) || !valid_keys?(options)
23
+ raise Errors::InvalidStorageOptions.new(klass, options)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ # Determine if all keys in the options hash are valid.
30
+ #
31
+ # @api private
32
+ #
33
+ # @example Are all keys valid?
34
+ # validator.valid_keys?({ collection: "name" })
35
+ #
36
+ # @param [ Hash ] options The options hash.
37
+ #
38
+ # @return [ true, false ] If all keys are valid.
39
+ #
40
+ # @since 3.0.0
41
+ def valid_keys?(options)
42
+ options.keys.all? do |key|
43
+ VALID_OPTIONS.include?(key)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require "mongoid/sessions/validators/storage"
@@ -0,0 +1,383 @@
1
+ # encoding: utf-8
2
+ require "mongoid/sessions/factory"
3
+ require "mongoid/sessions/validators"
4
+
5
+ module Mongoid
6
+ module Sessions
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ cattr_accessor :default_collection_name, :storage_options
11
+ self.default_collection_name = self.name.collectionize.to_sym
12
+ end
13
+
14
+ # Get the collection for this model from the session. Will check for an
15
+ # overridden collection name from the store_in macro or the collection
16
+ # with a pluralized model name.
17
+ #
18
+ # @example Get the model's collection.
19
+ # Model.collection
20
+ #
21
+ # @return [ Moped::Collection ] The collection.
22
+ #
23
+ # @since 3.0.0
24
+ def collection
25
+ self.class.collection
26
+ end
27
+
28
+ # Get the name of the collection this model persists to. This will be
29
+ # either the pluralized class name or the option defined in the store_in
30
+ # macro.
31
+ #
32
+ # @example Get the collection name.
33
+ # Model.collection_name
34
+ #
35
+ # @return [ String ] The name of the collection.
36
+ #
37
+ # @since 3.0.0
38
+ def collection_name
39
+ self.class.collection_name
40
+ end
41
+
42
+ # Get the session for this model. This is determined in the following order:
43
+ #
44
+ # 1. Any custom configuration provided by the 'store_in' macro.
45
+ # 2. The 'default' session as provided in the mongoid.yml
46
+ #
47
+ # @example Get the session.
48
+ # model.mongo_session
49
+ #
50
+ # @return [ Moped::Session ] The default moped session.
51
+ #
52
+ # @since 3.0.0
53
+ def mongo_session
54
+ self.class.mongo_session
55
+ end
56
+
57
+ # Tell the next persistance operation to store in a specific collection,
58
+ # database or session.
59
+ #
60
+ # @example Save the current document to a different collection.
61
+ # model.with(collection: "secondary").save
62
+ #
63
+ # @example Save the current document to a different database.
64
+ # model.with(database: "secondary").save
65
+ #
66
+ # @example Save the current document to a different session.
67
+ # model.with(session: "replica_set").save
68
+ #
69
+ # @example Save with a combination of options.
70
+ # model.with(session: "sharded", database: "secondary").save
71
+ #
72
+ # @param [ Hash ] options The storage options.
73
+ #
74
+ # @option options [ String, Symbol ] :collection The collection name.
75
+ # @option options [ String, Symbol ] :database The database name.
76
+ # @option options [ String, Symbol ] :session The session name.
77
+ #
78
+ # @return [ Document ] The current document.
79
+ #
80
+ # @since 3.0.0
81
+ def with(options)
82
+ Threaded.set_persistence_options(self.class, options)
83
+ self
84
+ end
85
+
86
+ class << self
87
+
88
+ # Clear all sessions from the current thread.
89
+ #
90
+ # @example Clear all sessions.
91
+ # Mongoid::Sessions.clear
92
+ #
93
+ # @return [ Array ] The empty sessions.
94
+ #
95
+ # @since 3.0.0
96
+ def clear
97
+ Threaded.sessions.clear
98
+ end
99
+
100
+ # Get the default session.
101
+ #
102
+ # @example Get the default session.
103
+ # Mongoid::Sessions.default
104
+ #
105
+ # @return [ Moped::Session ] The default session.
106
+ #
107
+ # @since 3.0.0
108
+ def default
109
+ Threaded.sessions[:default] ||= Sessions::Factory.default
110
+ end
111
+
112
+ # Get a session with the provided name.
113
+ #
114
+ # @example Get a session with the name.
115
+ # Mongoid::Sessions.with_name(:replica)
116
+ #
117
+ # @param [ Symbol ] name The name of the session.
118
+ #
119
+ # @return [ Moped::Session ] The named session.
120
+ #
121
+ # @since 3.0.0
122
+ def with_name(name)
123
+ Threaded.sessions[name.to_sym] ||= Sessions::Factory.create(name)
124
+ end
125
+ end
126
+
127
+ module ClassMethods
128
+
129
+ # Clear all persistence options from the current thread.
130
+ #
131
+ # @example Clear the persistence options.
132
+ # Mongoid::Sessions.clear_persistence_options
133
+ #
134
+ # @return [ true ] True.
135
+ #
136
+ # @since 3.0.0
137
+ def clear_persistence_options
138
+ Threaded.clear_persistence_options(self)
139
+ end
140
+
141
+ # Get the collection for this model from the session. Will check for an
142
+ # overridden collection name from the store_in macro or the collection
143
+ # with a pluralized model name.
144
+ #
145
+ # @example Get the model's collection.
146
+ # Model.collection
147
+ #
148
+ # @return [ Moped::Collection ] The collection.
149
+ #
150
+ # @since 3.0.0
151
+ def collection
152
+ if opts = persistence_options
153
+ coll = mongo_session.with(opts)[opts[:collection] || collection_name]
154
+ clear_persistence_options
155
+ coll
156
+ else
157
+ mongo_session[collection_name]
158
+ end
159
+ end
160
+
161
+ # Get the name of the collection this model persists to. This will be
162
+ # either the pluralized class name or the option defined in the store_in
163
+ # macro.
164
+ #
165
+ # @example Get the collection name.
166
+ # Model.collection_name
167
+ #
168
+ # @return [ Symbol ] The name of the collection.
169
+ #
170
+ # @since 3.0.0
171
+ def collection_name
172
+ @collection_name ||= __collection_name__
173
+ end
174
+
175
+ # Get the default database name for this model.
176
+ #
177
+ # @example Get the default database name.
178
+ # Model.database_name
179
+ #
180
+ # @return [ Symbol ] The name of the database.
181
+ #
182
+ # @since 3.0.0
183
+ def database_name
184
+ @database_name ||= __database_name__
185
+ end
186
+
187
+ # Get the overridden database name. This either can be overridden by
188
+ # using +Model.with+ or by overriding at the global level via
189
+ # +Mongoid.override_database(:name)+.
190
+ #
191
+ # @example Get the overridden database name.
192
+ # Model.database_override
193
+ #
194
+ # @return [ String, Symbol ] The overridden database name.
195
+ #
196
+ # @since 3.0.0
197
+ def database_override
198
+ persistence_options.try { |opts| opts[:database] } || Threaded.database_override
199
+ end
200
+
201
+ # Get the session for this model. This is determined in the following order:
202
+ #
203
+ # 1. Any custom configuration provided by the 'store_in' macro.
204
+ # 2. The 'default' session as provided in the mongoid.yml
205
+ #
206
+ # @example Get the session.
207
+ # Model.mongo_session
208
+ #
209
+ # @return [ Moped::Session ] The default moped session.
210
+ #
211
+ # @since 3.0.0
212
+ def mongo_session
213
+ session = __session__
214
+ session.use(database_override || database_name)
215
+ session
216
+ end
217
+
218
+ # Get the persistence options from the current thread.
219
+ #
220
+ # @example Get the persistence options.
221
+ # Model.persistence_options
222
+ #
223
+ # @return [ Hash ] The persistence options.
224
+ #
225
+ # @since 3.0.0
226
+ def persistence_options
227
+ Threaded.persistence_options(self)
228
+ end
229
+
230
+ # Get the overridden session name. This either can be overridden by
231
+ # using +Model.with+ or by overriding at the global level via
232
+ # +Mongoid.override_session(:name)+.
233
+ #
234
+ # @example Get the overridden session name.
235
+ # Model.session_override
236
+ #
237
+ # @return [ String, Symbol ] The overridden session name.
238
+ #
239
+ # @since 3.0.0
240
+ def session_override
241
+ persistence_options.try { |opts| opts[:session] } || Threaded.session_override
242
+ end
243
+
244
+ # Give this model specific custom default storage options.
245
+ #
246
+ # @example Store this model by default in "artists"
247
+ # class Band
248
+ # include Mongoid::Document
249
+ # store_in collection: "artists"
250
+ # end
251
+ #
252
+ # @example Store this model by default in the sharded db.
253
+ # class Band
254
+ # include Mongoid::Document
255
+ # store_in database: "echo_shard"
256
+ # end
257
+ #
258
+ # @example Store this model by default in a different session.
259
+ # class Band
260
+ # include Mongoid::Document
261
+ # store_in session: "secondary"
262
+ # end
263
+ #
264
+ # @example Store this model with a combination of options.
265
+ # class Band
266
+ # include Mongoid::Document
267
+ # store_in collection: "artists", database: "secondary"
268
+ # end
269
+ #
270
+ # @param [ Hash ] options The storage options.
271
+ #
272
+ # @option options [ String, Symbol ] :collection The collection name.
273
+ # @option options [ String, Symbol ] :database The database name.
274
+ # @option options [ String, Symbol ] :session The session name.
275
+ #
276
+ # @return [ Class ] The model class.
277
+ #
278
+ # @since 3.0.0
279
+ def store_in(options)
280
+ Validators::Storage.validate(self, options)
281
+ @collection_name, @database_name = nil, nil
282
+ self.storage_options = options
283
+ end
284
+
285
+ # Tell the next persistance operation to store in a specific collection,
286
+ # database or session.
287
+ #
288
+ # @example Create a document in a different collection.
289
+ # Model.with(collection: "secondary").create(name: "test")
290
+ #
291
+ # @example Create a document in a different database.
292
+ # Model.with(database: "secondary").create(name: "test")
293
+ #
294
+ # @example Create a document in a different session.
295
+ # Model.with(session: "secondary").create(name: "test")
296
+ #
297
+ # @example Create with a combination of options.
298
+ # Model.with(session: "sharded", database: "secondary").create
299
+ #
300
+ # @param [ Hash ] options The storage options.
301
+ #
302
+ # @option options [ String, Symbol ] :collection The collection name.
303
+ # @option options [ String, Symbol ] :database The database name.
304
+ # @option options [ String, Symbol ] :session The session name.
305
+ #
306
+ # @return [ Class ] The model class.
307
+ #
308
+ # @since 3.0.0
309
+ def with(options)
310
+ Threaded.set_persistence_options(self, options)
311
+ self
312
+ end
313
+
314
+ private
315
+
316
+ # Get the name of the collection this model persists to.
317
+ #
318
+ # @example Get the collection name.
319
+ # Model.__collection_name__
320
+ #
321
+ # @return [ Symbol ] The name of the collection.
322
+ #
323
+ # @since 3.0.0
324
+ def __collection_name__
325
+ if storage_options && name = storage_options[:collection]
326
+ name.to_sym
327
+ else
328
+ default_collection_name
329
+ end
330
+ end
331
+
332
+ # Get the database name for the model.
333
+ #
334
+ # @example Get the database name.
335
+ # Model.__database_name__
336
+ #
337
+ # @return [ Symbol ] The name of the database.
338
+ #
339
+ # @since 3.0.0
340
+ def __database_name__
341
+ if storage_options && name = storage_options[:database]
342
+ name.to_sym
343
+ else
344
+ Mongoid.sessions[__session_name__][:database]
345
+ end
346
+ end
347
+
348
+ # Get the session name for the model.
349
+ #
350
+ # @example Get the session name.
351
+ # Model.__session_name__
352
+ #
353
+ # @return [ Symbol ] The name of the session.
354
+ #
355
+ # @since 3.0.0
356
+ def __session_name__
357
+ if storage_options && name = storage_options[:session]
358
+ name.to_sym
359
+ else
360
+ :default
361
+ end
362
+ end
363
+
364
+ # Get the session for this class.
365
+ #
366
+ # @example Get the session.
367
+ # Model.__session__
368
+ #
369
+ # @return [ Moped::Session ] The moped session.
370
+ #
371
+ # @since 3.0.0
372
+ def __session__
373
+ if name = session_override
374
+ Sessions.with_name(name)
375
+ elsif storage_options && name = storage_options[:session]
376
+ Sessions.with_name(name)
377
+ else
378
+ Sessions.default
379
+ end
380
+ end
381
+ end
382
+ end
383
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
2
+ module Mongoid
3
3
 
4
4
  # This module contains behaviour for adding shard key fields to updates.
5
5
  module Sharding
@@ -31,14 +31,14 @@ module Mongoid #:nodoc
31
31
  #
32
32
  # @since 2.0.0
33
33
  def shard_key_selector
34
- {}.tap do |selector|
35
- shard_key_fields.each do |field|
36
- selector[field.to_s] = send(field)
37
- end
34
+ selector = {}
35
+ shard_key_fields.each do |field|
36
+ selector[field.to_s] = send(field)
38
37
  end
38
+ selector
39
39
  end
40
40
 
41
- module ClassMethods #:nodoc
41
+ module ClassMethods
42
42
 
43
43
  # Specifies a shard key with the field(s) specified.
44
44
  #
data/lib/mongoid/state.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
2
+ module Mongoid
3
3
 
4
4
  # This module contains the behaviour for getting the various states a
5
5
  # document can transition through.
@@ -16,9 +16,8 @@ module Mongoid #:nodoc:
16
16
  #
17
17
  # @return [ true, false ] True if new, false if not.
18
18
  def new_record?
19
- @new_record == true
19
+ @new_record ||= false
20
20
  end
21
- alias :new? :new_record?
22
21
 
23
22
  # Checks if the document has been saved to the database. Returns false
24
23
  # if the document has been destroyed.
@@ -41,7 +40,7 @@ module Mongoid #:nodoc:
41
40
  #
42
41
  # @since 2.3.2
43
42
  def flagged_for_destroy?
44
- !!@flagged_for_destroy
43
+ @flagged_for_destroy ||= false
45
44
  end
46
45
 
47
46
  # Returns true if the +Document+ has been succesfully destroyed, and false
@@ -53,7 +52,7 @@ module Mongoid #:nodoc:
53
52
  #
54
53
  # @return [ true, false ] True if destroyed, false if not.
55
54
  def destroyed?
56
- @destroyed == true
55
+ @destroyed ||= false
57
56
  end
58
57
  alias :deleted? :destroyed?
59
58
 
@@ -64,7 +63,7 @@ module Mongoid #:nodoc:
64
63
  #
65
64
  # @return [ true, false ] Is the document new and embedded?
66
65
  def pushable?
67
- new? &&
66
+ new_record? &&
68
67
  embedded_many? &&
69
68
  _parent.persisted? &&
70
69
  !_parent.delayed_atomic_sets[atomic_path]
@@ -79,7 +78,7 @@ module Mongoid #:nodoc:
79
78
  #
80
79
  # @since 2.1.0
81
80
  def settable?
82
- new? && embedded_one? && _parent.persisted?
81
+ new_record? && embedded_one? && _parent.persisted?
83
82
  end
84
83
 
85
84
  # Is the document updateable?
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Threaded #:nodoc:
2
+ module Mongoid
3
+ module Threaded
4
4
 
5
5
  # This module contains convenience methods for document lifecycle that
6
6
  # resides on thread locals.
@@ -22,10 +22,10 @@ module Mongoid #:nodoc:
22
22
  #
23
23
  # @since 2.2.0
24
24
  def _assigning
25
- Threaded.begin(:assign)
25
+ Threaded.begin("assign")
26
26
  yield
27
27
  ensure
28
- Threaded.exit(:assign)
28
+ Threaded.exit("assign")
29
29
  end
30
30
 
31
31
  # Is the current thread in assigning mode?
@@ -37,7 +37,7 @@ module Mongoid #:nodoc:
37
37
  #
38
38
  # @since 2.1.0
39
39
  def _assigning?
40
- Threaded.executing?(:assign)
40
+ Threaded.executing?("assign")
41
41
  end
42
42
 
43
43
  # Execute a block in binding mode.
@@ -51,10 +51,10 @@ module Mongoid #:nodoc:
51
51
  #
52
52
  # @since 2.1.0
53
53
  def _binding
54
- Threaded.begin(:bind)
54
+ Threaded.begin("bind")
55
55
  yield
56
56
  ensure
57
- Threaded.exit(:bind)
57
+ Threaded.exit("bind")
58
58
  end
59
59
 
60
60
  # Is the current thread in binding mode?
@@ -66,7 +66,7 @@ module Mongoid #:nodoc:
66
66
  #
67
67
  # @since 2.1.0
68
68
  def _binding?
69
- Threaded.executing?(:bind)
69
+ Threaded.executing?("bind")
70
70
  end
71
71
 
72
72
  # Execute a block in building mode.
@@ -80,10 +80,10 @@ module Mongoid #:nodoc:
80
80
  #
81
81
  # @since 2.1.0
82
82
  def _building
83
- Threaded.begin(:build)
83
+ Threaded.begin("build")
84
84
  yield
85
85
  ensure
86
- Threaded.exit(:build)
86
+ Threaded.exit("build")
87
87
  end
88
88
 
89
89
  # Is the current thread in building mode?
@@ -95,7 +95,7 @@ module Mongoid #:nodoc:
95
95
  #
96
96
  # @since 2.1.0
97
97
  def _building?
98
- Threaded.executing?(:build)
98
+ Threaded.executing?("build")
99
99
  end
100
100
 
101
101
  # Is the current thread in creating mode?
@@ -107,7 +107,7 @@ module Mongoid #:nodoc:
107
107
  #
108
108
  # @since 2.1.0
109
109
  def _creating?
110
- Threaded.executing?(:create)
110
+ Threaded.executing?("create")
111
111
  end
112
112
 
113
113
  # Execute a block in loading mode.
@@ -121,10 +121,10 @@ module Mongoid #:nodoc:
121
121
  #
122
122
  # @since 2.3.2
123
123
  def _loading
124
- Threaded.begin(:load)
124
+ Threaded.begin("load")
125
125
  yield
126
126
  ensure
127
- Threaded.exit(:load)
127
+ Threaded.exit("load")
128
128
  end
129
129
 
130
130
  # Is the current thread in loading mode?
@@ -136,7 +136,7 @@ module Mongoid #:nodoc:
136
136
  #
137
137
  # @since 2.3.2
138
138
  def _loading?
139
- Threaded.executing?(:load)
139
+ Threaded.executing?("load")
140
140
  end
141
141
 
142
142
  # Execute a block in loading revision mode.
@@ -150,13 +150,13 @@ module Mongoid #:nodoc:
150
150
  #
151
151
  # @since 2.3.4
152
152
  def _loading_revision
153
- Threaded.begin(:load_revision)
153
+ Threaded.begin("load_revision")
154
154
  yield
155
155
  ensure
156
- Threaded.exit(:load_revision)
156
+ Threaded.exit("load_revision")
157
157
  end
158
158
 
159
- module ClassMethods #:nodoc:
159
+ module ClassMethods
160
160
 
161
161
  # Execute a block in creating mode.
162
162
  #
@@ -169,10 +169,10 @@ module Mongoid #:nodoc:
169
169
  #
170
170
  # @since 2.1.0
171
171
  def _creating
172
- Threaded.begin(:create)
172
+ Threaded.begin("create")
173
173
  yield
174
174
  ensure
175
- Threaded.exit(:create)
175
+ Threaded.exit("create")
176
176
  end
177
177
 
178
178
  # Is the current thread in loading revision mode?
@@ -184,7 +184,7 @@ module Mongoid #:nodoc:
184
184
  #
185
185
  # @since 2.3.4
186
186
  def _loading_revision?
187
- Threaded.executing?(:load_revision)
187
+ Threaded.executing?("load_revision")
188
188
  end
189
189
  end
190
190
  end
File without changes