mongoid 2.4.10 → 3.0.0.rc

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 (351) hide show
  1. data/CHANGELOG.md +843 -9
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -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 +16 -9
  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 +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -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 +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +1 -1
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +31 -19
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.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 +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  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.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -160
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +2 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -128
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +8 -10
  234. data/lib/mongoid/validations.rb +28 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +92 -154
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -487
  276. data/lib/mongoid/contexts.rb +0 -25
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -108
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -76
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -0,0 +1,359 @@
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 session for this model. This is determined in the following order:
188
+ #
189
+ # 1. Any custom configuration provided by the 'store_in' macro.
190
+ # 2. The 'default' session as provided in the mongoid.yml
191
+ #
192
+ # @example Get the session.
193
+ # Model.mongo_session
194
+ #
195
+ # @return [ Moped::Session ] The default moped session.
196
+ #
197
+ # @since 3.0.0
198
+ def mongo_session
199
+ session = __session__
200
+ if persistence_options && name = persistence_options[:database]
201
+ session.use(name)
202
+ else
203
+ session.use(database_name)
204
+ end
205
+ session
206
+ end
207
+
208
+ # Get the persistence options from the current thread.
209
+ #
210
+ # @example Get the persistence options.
211
+ # Model.persistence_options
212
+ #
213
+ # @return [ Hash ] The persistence options.
214
+ #
215
+ # @since 3.0.0
216
+ def persistence_options
217
+ Threaded.persistence_options(self)
218
+ end
219
+
220
+ # Give this model specific custom default storage options.
221
+ #
222
+ # @example Store this model by default in "artists"
223
+ # class Band
224
+ # include Mongoid::Document
225
+ # store_in collection: "artists"
226
+ # end
227
+ #
228
+ # @example Store this model by default in the sharded db.
229
+ # class Band
230
+ # include Mongoid::Document
231
+ # store_in database: "echo_shard"
232
+ # end
233
+ #
234
+ # @example Store this model by default in a different session.
235
+ # class Band
236
+ # include Mongoid::Document
237
+ # store_in session: "secondary"
238
+ # end
239
+ #
240
+ # @example Store this model with a combination of options.
241
+ # class Band
242
+ # include Mongoid::Document
243
+ # store_in collection: "artists", database: "secondary"
244
+ # end
245
+ #
246
+ # @param [ Hash ] options The storage options.
247
+ #
248
+ # @option options [ String, Symbol ] :collection The collection name.
249
+ # @option options [ String, Symbol ] :database The database name.
250
+ # @option options [ String, Symbol ] :session The session name.
251
+ #
252
+ # @return [ Class ] The model class.
253
+ #
254
+ # @since 3.0.0
255
+ def store_in(options)
256
+ Validators::Storage.validate(self, options)
257
+ @collection_name, @database_name = nil, nil
258
+ self.storage_options = options
259
+ end
260
+
261
+ # Tell the next persistance operation to store in a specific collection,
262
+ # database or session.
263
+ #
264
+ # @example Create a document in a different collection.
265
+ # Model.with(collection: "secondary").create(name: "test")
266
+ #
267
+ # @example Create a document in a different database.
268
+ # Model.with(database: "secondary").create(name: "test")
269
+ #
270
+ # @example Create a document in a different session.
271
+ # Model.with(session: "secondary").create(name: "test")
272
+ #
273
+ # @example Create with a combination of options.
274
+ # Model.with(session: "sharded", database: "secondary").create
275
+ #
276
+ # @param [ Hash ] options The storage options.
277
+ #
278
+ # @option options [ String, Symbol ] :collection The collection name.
279
+ # @option options [ String, Symbol ] :database The database name.
280
+ # @option options [ String, Symbol ] :session The session name.
281
+ #
282
+ # @return [ Class ] The model class.
283
+ #
284
+ # @since 3.0.0
285
+ def with(options)
286
+ Threaded.set_persistence_options(self, options)
287
+ self
288
+ end
289
+
290
+ private
291
+
292
+ # Get the name of the collection this model persists to.
293
+ #
294
+ # @example Get the collection name.
295
+ # Model.__collection_name__
296
+ #
297
+ # @return [ Symbol ] The name of the collection.
298
+ #
299
+ # @since 3.0.0
300
+ def __collection_name__
301
+ if storage_options && name = storage_options[:collection]
302
+ name.to_sym
303
+ else
304
+ default_collection_name
305
+ end
306
+ end
307
+
308
+ # Get the database name for the model.
309
+ #
310
+ # @example Get the database name.
311
+ # Model.__database_name__
312
+ #
313
+ # @return [ Symbol ] The name of the database.
314
+ #
315
+ # @since 3.0.0
316
+ def __database_name__
317
+ if storage_options && name = storage_options[:database]
318
+ name.to_sym
319
+ else
320
+ Mongoid.sessions[__session_name__][:database]
321
+ end
322
+ end
323
+
324
+ # Get the session name for the model.
325
+ #
326
+ # @example Get the session name.
327
+ # Model.__session_name__
328
+ #
329
+ # @return [ Symbol ] The name of the session.
330
+ #
331
+ # @since 3.0.0
332
+ def __session_name__
333
+ if storage_options && name = storage_options[:session]
334
+ name.to_sym
335
+ else
336
+ :default
337
+ end
338
+ end
339
+
340
+ # Get the session for this class.
341
+ #
342
+ # @example Get the session.
343
+ # Model.__session__
344
+ #
345
+ # @return [ Moped::Session ] The moped session.
346
+ #
347
+ # @since 3.0.0
348
+ def __session__
349
+ if persistence_options && name = persistence_options[:session]
350
+ Sessions.with_name(name)
351
+ elsif storage_options && name = storage_options[:session]
352
+ Sessions.with_name(name)
353
+ else
354
+ Sessions.default
355
+ end
356
+ end
357
+ end
358
+ end
359
+ 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