mongoid 2.8.1 → 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 +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  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 +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  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 +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  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/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  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.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  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 -110
  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 -77
  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.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -0,0 +1,106 @@
1
+ # encoding: utf-8
2
+ require "mongoid/sessions/mongo_uri"
3
+
4
+ module Mongoid
5
+ module Sessions
6
+ module Factory
7
+ extend self
8
+
9
+ # Create a new session given the named configuration. If no name is
10
+ # provided, return a new session with the default configuration. If a
11
+ # name is provided for which no configuration exists, an error will be
12
+ # raised.
13
+ #
14
+ # @example Create the session.
15
+ # Factory.create(:secondary)
16
+ #
17
+ # @param [ String, Symbol ] name The named session configuration.
18
+ #
19
+ # @raise [ Errors::NoSessionConfig ] If no config could be found.
20
+ #
21
+ # @return [ Moped::Session ] The new session.
22
+ #
23
+ # @since 3.0.0
24
+ def create(name = nil)
25
+ return default unless name
26
+ config = Mongoid.sessions[name]
27
+ raise Errors::NoSessionConfig.new(name) unless config
28
+ create_session(config)
29
+ end
30
+
31
+ # Get the default session.
32
+ #
33
+ # @example Get the default session.
34
+ # Factory.default
35
+ #
36
+ # @raise [ Errors::NoSessionConfig ] If no default configuration is
37
+ # found.
38
+ #
39
+ # @return [ Moped::Session ] The default session.
40
+ #
41
+ # @since 3.0.0
42
+ def default
43
+ create_session(Mongoid.sessions[:default])
44
+ end
45
+
46
+ private
47
+
48
+ # Create the session for the provided config.
49
+ #
50
+ # @api private
51
+ #
52
+ # @example Create the session.
53
+ # Factory.create_session(config)
54
+ #
55
+ # @param [ Hash ] configuration The session config.
56
+ #
57
+ # @return [ Moped::Session ] The session.
58
+ #
59
+ # @since 3.0.0
60
+ def create_session(configuration)
61
+ config, options = parse(configuration)
62
+ session = Moped::Session.new(config[:hosts], options)
63
+ session.use(config[:database])
64
+ if authenticated?(config)
65
+ session.login(config[:username], config[:password])
66
+ end
67
+ session
68
+ end
69
+
70
+ # Are we authenticated with this session config?
71
+ #
72
+ # @api private
73
+ #
74
+ # @example Is this session authenticated?
75
+ # Factory.authenticated?(config)
76
+ #
77
+ # @param [ Hash ] config The session config.
78
+ #
79
+ # @return [ true, false ] If we are authenticated.
80
+ #
81
+ # @since 3.0.0
82
+ def authenticated?(config)
83
+ config.has_key?(:username) && config.has_key?(:password)
84
+ end
85
+
86
+ # Parse the configuration. If a uri is provided we need to extract the
87
+ # elements of it, otherwise the options are left alone.
88
+ #
89
+ # @api private
90
+ #
91
+ # @example Parse the config.
92
+ # Factory.parse(config)
93
+ #
94
+ # @param [ Hash ] config The configuration.
95
+ #
96
+ # @return [ Array<Hash> ] The configuration, parsed.
97
+ #
98
+ # @since 3.0.0
99
+ def parse(config)
100
+ options = config[:options].try(:dup) || {}
101
+ parsed = config.has_key?(:uri) ? MongoUri.new(config[:uri]).to_hash : config
102
+ [ parsed, options ]
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,93 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Sessions
4
+ class MongoUri
5
+
6
+ SCHEME = /(mongodb:\/\/)/
7
+ USER = /([-.\w:]+)/
8
+ PASS = /([^@,]+)/
9
+ NODES = /((([-.\w]+)(?::(\w+))?,?)+)/
10
+ DATABASE = /(?:\/([-\w]+))?/
11
+
12
+ URI = /#{SCHEME}(#{USER}:#{PASS}@)?#{NODES}#{DATABASE}/
13
+
14
+ attr_reader :match
15
+
16
+ # Get the database provided in the URI.
17
+ #
18
+ # @example Get the database.
19
+ # uri.database
20
+ #
21
+ # @return [ String ] The database.
22
+ #
23
+ # @since 3.0.0
24
+ def database
25
+ @database ||= match[9]
26
+ end
27
+
28
+ # Get the hosts provided in the URI.
29
+ #
30
+ # @example Get the hosts.
31
+ # uri.hosts
32
+ #
33
+ # @return [ Array<String> ] The hosts.
34
+ #
35
+ # @since 3.0.0
36
+ def hosts
37
+ @hosts ||= match[5].split(",")
38
+ end
39
+
40
+ # Create the new uri from the provided string.
41
+ #
42
+ # @example Create the new uri.
43
+ # MongoUri.new(uri)
44
+ #
45
+ # @param [ String ] string The uri string.
46
+ #
47
+ # @since 3.0.0
48
+ def initialize(string)
49
+ @match = string.match(URI)
50
+ end
51
+
52
+ # Get the password provided in the URI.
53
+ #
54
+ # @example Get the password.
55
+ # uri.password
56
+ #
57
+ # @return [ String ] The password.
58
+ #
59
+ # @since 3.0.0
60
+ def password
61
+ @password ||= match[4]
62
+ end
63
+
64
+ # Get the uri as a Mongoid friendly configuration hash.
65
+ #
66
+ # @example Get the uri as a hash.
67
+ # uri.to_hash
68
+ #
69
+ # @return [ Hash ] The uri as options.
70
+ #
71
+ # @since 3.0.0
72
+ def to_hash
73
+ config = { database: database, hosts: hosts }
74
+ if username && password
75
+ config.merge!(username: username, password: password)
76
+ end
77
+ config
78
+ end
79
+
80
+ # Get the username provided in the URI.
81
+ #
82
+ # @example Get the username.
83
+ # uri.username
84
+ #
85
+ # @return [ String ] The username.
86
+ #
87
+ # @since 3.0.0
88
+ def username
89
+ @username ||= match[3]
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require "mongoid/sessions/validators/storage"
@@ -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
@@ -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
  #
@@ -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,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  require "mongoid/threaded/lifecycle"
3
3
 
4
- module Mongoid #:nodoc:
4
+ module Mongoid
5
5
 
6
6
  # This module contains logic for easy access to objects that have a lifecycle
7
7
  # on the current thread.
@@ -13,7 +13,7 @@ module Mongoid #:nodoc:
13
13
  # @example Begin entry into the stack.
14
14
  # Threaded.begin(:create)
15
15
  #
16
- # @param [ Symbol ] name The name of the stack
16
+ # @param [ String ] name The name of the stack
17
17
  #
18
18
  # @return [ true ] True.
19
19
  #
@@ -22,6 +22,18 @@ module Mongoid #:nodoc:
22
22
  stack(name).push(true)
23
23
  end
24
24
 
25
+ # Get the database sessions from the current thread.
26
+ #
27
+ # @example Get the database sessions.
28
+ # Threaded.sessions
29
+ #
30
+ # @return [ Hash ] The sessions.
31
+ #
32
+ # @since 3.0.0
33
+ def sessions
34
+ Thread.current["[mongoid]:sessions"] ||= {}
35
+ end
36
+
25
37
  # Are in the middle of executing the named stack
26
38
  #
27
39
  # @example Are we in the stack execution?
@@ -61,7 +73,19 @@ module Mongoid #:nodoc:
61
73
  #
62
74
  # @since 2.4.0
63
75
  def stack(name)
64
- Thread.current[:"[mongoid]:#{name}-stack"] ||= []
76
+ Thread.current["[mongoid]:#{name}-stack"] ||= []
77
+ end
78
+
79
+ # Begin autosaving a document on the current thread.
80
+ #
81
+ # @example Begin autosave.
82
+ # Threaded.begin_autosave(doc)
83
+ #
84
+ # @param [ Document ] document The document to autosave.
85
+ #
86
+ # @since 3.0.0
87
+ def begin_autosave(document)
88
+ autosaves_for(document.class).push(document.id)
65
89
  end
66
90
 
67
91
  # Begin validating a document on the current thread.
@@ -76,16 +100,19 @@ module Mongoid #:nodoc:
76
100
  validations_for(document.class).push(document.id)
77
101
  end
78
102
 
79
- # Clear out all the safety options set using the safely proxy.
103
+ # Clear out all the persistence options.
80
104
  #
81
- # @example Clear out the options.
82
- # Threaded.clear_safety_options!
105
+ # @example Clear out the persistence options.
106
+ # Threaded.clear_persistence_options(Band)
83
107
  #
84
- # @return [ nil ] nil
108
+ # @param [ Class ] klass The model class.
85
109
  #
86
- # @since 2.1.0
87
- def clear_safety_options!
88
- Thread.current[:"[mongoid]:safety-options"] = nil
110
+ # @return [ true ] true.
111
+ #
112
+ # @since 2.0.0
113
+ def clear_persistence_options(klass)
114
+ Thread.current["[mongoid][#{klass}]:persistence-options"] = nil
115
+ true
89
116
  end
90
117
 
91
118
  # Clear out all options set on a one-time basis.
@@ -95,10 +122,21 @@ module Mongoid #:nodoc:
95
122
  #
96
123
  # @since 2.3.0
97
124
  def clear_options!
98
- clear_safety_options!
99
125
  self.timeless = false
100
126
  end
101
127
 
128
+ # Exit autosaving a document on the current thread.
129
+ #
130
+ # @example Exit autosave.
131
+ # Threaded.exit_autosave(doc)
132
+ #
133
+ # @param [ Document ] document The document to autosave.
134
+ #
135
+ # @since 3.0.0
136
+ def exit_autosave(document)
137
+ autosaves_for(document.class).delete_one(document.id)
138
+ end
139
+
102
140
  # Exit validating a document on the current thread.
103
141
  #
104
142
  # @example Exit validation.
@@ -120,7 +158,61 @@ module Mongoid #:nodoc:
120
158
  #
121
159
  # @since 2.1.0
122
160
  def identity_map
123
- Thread.current[:"[mongoid]:identity-map"] ||= IdentityMap.new
161
+ Thread.current["[mongoid]:identity-map"] ||= IdentityMap.new
162
+ end
163
+
164
+ # Is the identity map enabled on the current thread?
165
+ #
166
+ # @example Is the identity map enabled?
167
+ # Threaded.identity_map_enabled?
168
+ #
169
+ # @return [ true, false ] If the identity map is enabled.
170
+ #
171
+ # @since 3.0.0
172
+ def identity_map_enabled?
173
+ Thread.current["[mongoid]:identity-map-enabled"] != false
174
+ end
175
+
176
+ # Disable the identity map on either the current thread or all threads.
177
+ #
178
+ # @example Disable the identity map on all threads.
179
+ # Threaded.disable_identity_map(:all)
180
+ #
181
+ # @example Disable the identity map on the current thread.
182
+ # Threaded.disable_identity_map(:current)
183
+ #
184
+ # @param [ Symbol ] option The disabling option.
185
+ #
186
+ # @since 3.0.0
187
+ def disable_identity_map(option)
188
+ if option == :all
189
+ Thread.list.each do |thread|
190
+ thread["[mongoid]:identity-map-enabled"] = false
191
+ end
192
+ else
193
+ Thread.current["[mongoid]:identity-map-enabled"] = false
194
+ end
195
+ end
196
+
197
+ # Enable the identity map on either the current thread or all threads.
198
+ #
199
+ # @example Enable the identity map on all threads.
200
+ # Threaded.enable_identity_map(:all)
201
+ #
202
+ # @example Enable the identity map on the current thread.
203
+ # Threaded.enable_identity_map(:current)
204
+ #
205
+ # @param [ Symbol ] option The disabling option.
206
+ #
207
+ # @since 3.0.0
208
+ def enable_identity_map(option)
209
+ if option == :all
210
+ Thread.list.each do |thread|
211
+ thread["[mongoid]:identity-map-enabled"] = true
212
+ end
213
+ else
214
+ Thread.current["[mongoid]:identity-map-enabled"] = true
215
+ end
124
216
  end
125
217
 
126
218
  # Get the insert consumer from the current thread.
@@ -132,7 +224,7 @@ module Mongoid #:nodoc:
132
224
  #
133
225
  # @since 2.1.0
134
226
  def insert(name)
135
- Thread.current[:"[mongoid][#{name}]:insert-consumer"]
227
+ Thread.current["[mongoid][#{name}]:insert-consumer"]
136
228
  end
137
229
 
138
230
  # Set the insert consumer on the current thread.
@@ -146,33 +238,36 @@ module Mongoid #:nodoc:
146
238
  #
147
239
  # @since 2.1.0
148
240
  def set_insert(name, consumer)
149
- Thread.current[:"[mongoid][#{name}]:insert-consumer"] = consumer
241
+ Thread.current["[mongoid][#{name}]:insert-consumer"] = consumer
150
242
  end
151
243
 
152
- # Get the safety options for the current thread.
244
+ # Get the persistence options for the current thread.
245
+ #
246
+ # @example Get the persistence options.
247
+ # Threaded.persistence_options(Band)
153
248
  #
154
- # @example Get the safety options.
155
- # Threaded.safety_options
249
+ # @param [ Class ] klass The model class.
156
250
  #
157
- # @return [ Hash ] The current safety options.
251
+ # @return [ Hash ] The current persistence options.
158
252
  #
159
253
  # @since 2.1.0
160
- def safety_options
161
- Thread.current[:"[mongoid]:safety-options"]
254
+ def persistence_options(klass)
255
+ Thread.current["[mongoid][#{klass}]:persistence-options"]
162
256
  end
163
257
 
164
- # Set the safety options on the current thread.
258
+ # Set the persistence options on the current thread.
165
259
  #
166
- # @example Set the safety options.
167
- # Threaded.safety_options = { :fsync => true }
260
+ # @example Set the persistence options.
261
+ # Threaded.set_persistence_options(Band, { safe: { fsync: true }})
168
262
  #
169
- # @param [ Hash ] options The safety options.
263
+ # @param [ Class ] klass The model class.
264
+ # @param [ Hash ] options The persistence options.
170
265
  #
171
- # @return [ Hash ] The safety options.
266
+ # @return [ Hash ] The persistence options.
172
267
  #
173
268
  # @since 2.1.0
174
- def safety_options=(options)
175
- Thread.current[:"[mongoid]:safety-options"] = options
269
+ def set_persistence_options(klass, options)
270
+ Thread.current["[mongoid][#{klass}]:persistence-options"] = options
176
271
  end
177
272
 
178
273
  # Get the field selection options from the current thread.
@@ -184,7 +279,7 @@ module Mongoid #:nodoc:
184
279
  #
185
280
  # @since 2.4.4
186
281
  def selection
187
- Thread.current[:"[mongoid]:selection"]
282
+ Thread.current["[mongoid]:selection"]
188
283
  end
189
284
 
190
285
  # Set the field selection on the current thread.
@@ -198,7 +293,7 @@ module Mongoid #:nodoc:
198
293
  #
199
294
  # @since 2.4.4
200
295
  def selection=(value)
201
- Thread.current[:"[mongoid]:selection"] = value
296
+ Thread.current["[mongoid]:selection"] = value
202
297
  end
203
298
 
204
299
  # Get the mongoid scope stack for chained criteria.
@@ -210,7 +305,7 @@ module Mongoid #:nodoc:
210
305
  #
211
306
  # @since 2.1.0
212
307
  def scope_stack
213
- Thread.current[:"[mongoid]:scope-stack"] ||= {}
308
+ Thread.current["[mongoid]:scope-stack"] ||= {}
214
309
  end
215
310
 
216
311
  # Get the value of the one-off timeless call.
@@ -222,7 +317,7 @@ module Mongoid #:nodoc:
222
317
  #
223
318
  # @since 2.3.0
224
319
  def timeless
225
- !!Thread.current[:"[mongoid]:timeless"]
320
+ !!Thread.current["[mongoid]:timeless"]
226
321
  end
227
322
 
228
323
  # Set the value of the one-off timeless call.
@@ -234,33 +329,7 @@ module Mongoid #:nodoc:
234
329
  #
235
330
  # @since 2.3.0
236
331
  def timeless=(value)
237
- Thread.current[:"[mongoid]:timeless"] = value
238
- end
239
-
240
- # Get the update consumer from the current thread.
241
- #
242
- # @example Get the update consumer.
243
- # Threaded.update
244
- #
245
- # @return [ Object ] The atomic update consumer.
246
- #
247
- # @since 2.1.0
248
- def update_consumer(klass)
249
- Thread.current[:"[mongoid][#{klass}]:update-consumer"]
250
- end
251
-
252
- # Set the update consumer on the current thread.
253
- #
254
- # @example Set the update consumer.
255
- # Threaded.update = consumer
256
- #
257
- # @param [ Object ] consumer The update consumer.
258
- #
259
- # @return [ Object ] The update consumer.
260
- #
261
- # @since 2.1.0
262
- def set_update_consumer(klass, consumer)
263
- Thread.current[:"[mongoid][#{klass}]:update-consumer"] = consumer
332
+ Thread.current["[mongoid]:timeless"] = value
264
333
  end
265
334
 
266
335
  # Is the current thread setting timestamps?
@@ -275,6 +344,20 @@ module Mongoid #:nodoc:
275
344
  !timeless
276
345
  end
277
346
 
347
+ # Is the document autosaved on the current thread?
348
+ #
349
+ # @example Is the document autosaved?
350
+ # Threaded.autosaved?(doc)
351
+ #
352
+ # @param [ Document ] document The document to check.
353
+ #
354
+ # @return [ true, false ] If the document is autosaved.
355
+ #
356
+ # @since 2.1.9
357
+ def autosaved?(document)
358
+ autosaves_for(document.class).include?(document.id)
359
+ end
360
+
278
361
  # Is the document validated on the current thread?
279
362
  #
280
363
  # @example Is the document validated?
@@ -289,6 +372,18 @@ module Mongoid #:nodoc:
289
372
  validations_for(document.class).include?(document.id)
290
373
  end
291
374
 
375
+ # Get all autosaves on the current thread.
376
+ #
377
+ # @example Get all autosaves.
378
+ # Threaded.autosaves
379
+ #
380
+ # @return [ Hash ] The current autosaves.
381
+ #
382
+ # @since 3.0.0
383
+ def autosaves
384
+ Thread.current["[mongoid]:autosaves"] ||= {}
385
+ end
386
+
292
387
  # Get all validations on the current thread.
293
388
  #
294
389
  # @example Get all validations.
@@ -298,9 +393,22 @@ module Mongoid #:nodoc:
298
393
  #
299
394
  # @since 2.1.9
300
395
  def validations
301
- Thread.current[:"[mongoid]:validations"] ||= {}
396
+ Thread.current["[mongoid]:validations"] ||= {}
302
397
  end
303
398
 
399
+ # Get all autosaves on the current thread for the class.
400
+ #
401
+ # @example Get all autosaves.
402
+ # Threaded.autosaves_for(Person)
403
+ #
404
+ # @param [ Class ] The class to check.
405
+ #
406
+ # @return [ Array ] The current autosaves.
407
+ #
408
+ # @since 3.0.0
409
+ def autosaves_for(klass)
410
+ autosaves[klass] ||= []
411
+ end
304
412
  # Get all validations on the current thread for the class.
305
413
  #
306
414
  # @example Get all validations.