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
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
3
- module Components #:nodoc
2
+ module Mongoid
3
+ module Components
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  # All modules that a +Document+ is composed of are defined in this
@@ -21,23 +21,19 @@ module Mongoid #:nodoc
21
21
  include Mongoid::Atomic
22
22
  include Mongoid::Dirty
23
23
  include Mongoid::Attributes
24
- include Mongoid::Collections
25
24
  include Mongoid::Copyable
26
- include Mongoid::DefaultScope
27
- include Mongoid::Extras
28
25
  include Mongoid::Fields
29
26
  include Mongoid::Hierarchy
30
27
  include Mongoid::Indexes
31
28
  include Mongoid::Inspection
32
29
  include Mongoid::JSON
33
- include Mongoid::Keys
34
30
  include Mongoid::Matchers
35
- include Mongoid::NamedScope
36
31
  include Mongoid::NestedAttributes
37
32
  include Mongoid::Persistence
38
33
  include Mongoid::Relations
39
34
  include Mongoid::Reloading
40
- include Mongoid::Safety
35
+ include Mongoid::Scoping
36
+ include Mongoid::Sessions
41
37
  include Mongoid::Serialization
42
38
  include Mongoid::Sharding
43
39
  include Mongoid::State
@@ -45,35 +41,29 @@ module Mongoid #:nodoc
45
41
  include Mongoid::Timestamps::Timeless
46
42
  include Mongoid::Validations
47
43
  include Mongoid::Callbacks
48
- include Mongoid::MultiDatabase
49
44
 
50
45
  MODULES = [
51
46
  Mongoid::Atomic,
52
47
  Mongoid::Attributes,
53
- Mongoid::Collections,
54
48
  Mongoid::Copyable,
55
- Mongoid::DefaultScope,
56
49
  Mongoid::Dirty,
57
- Mongoid::Extras,
58
50
  Mongoid::Fields,
59
51
  Mongoid::Hierarchy,
60
52
  Mongoid::Indexes,
61
53
  Mongoid::Inspection,
62
54
  Mongoid::JSON,
63
- Mongoid::Keys,
55
+ Mongoid::Loggable,
64
56
  Mongoid::Matchers,
65
- Mongoid::NamedScope,
66
57
  Mongoid::NestedAttributes,
67
58
  Mongoid::Persistence,
68
59
  Mongoid::Relations,
69
60
  Mongoid::Relations::Proxy,
70
- Mongoid::Safety,
61
+ Mongoid::Scoping,
71
62
  Mongoid::Serialization,
72
63
  Mongoid::Sharding,
73
64
  Mongoid::State,
74
65
  Mongoid::Validations,
75
- Mongoid::Callbacks,
76
- Mongoid::MultiDatabase,
66
+ Mongoid::Callbacks
77
67
  ]
78
68
 
79
69
  class << self
@@ -88,11 +78,9 @@ module Mongoid #:nodoc
88
78
  #
89
79
  # @since 2.1.8
90
80
  def prohibited_methods
91
- @prohibited_methods ||= MODULES.inject([]) do |methods, mod|
92
- methods.tap do |mets|
93
- mets << mod.instance_methods.map{ |m| m.to_sym }
94
- end
95
- end.flatten
81
+ @prohibited_methods ||= MODULES.flat_map do |mod|
82
+ mod.instance_methods.map{ |m| m.to_sym }
83
+ end
96
84
  end
97
85
  end
98
86
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
2
+ module Mongoid
3
3
  module Config
4
4
 
5
5
  # Encapsulates logic for getting environment information.
@@ -33,8 +33,9 @@ module Mongoid #:nodoc
33
33
  # @return [ Hash ] The settings.
34
34
  #
35
35
  # @since 2.3.0
36
- def load_yaml(path)
37
- YAML.load(ERB.new(File.new(path).read).result)[env_name]
36
+ def load_yaml(path, environment = nil)
37
+ env = environment ? environment.to_s : env_name
38
+ YAML.load(ERB.new(File.new(path).read).result)[env]
38
39
  end
39
40
  end
40
41
  end
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+ ActiveSupport::Inflector.inflections do |inflect|
3
+ inflect.singular(/address$/, "address")
4
+ inflect.singular("addresses", "address")
5
+ inflect.irregular("canvas", "canvases")
6
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc
2
+ module Mongoid
3
3
  module Config
4
4
 
5
5
  # Encapsulates logic for setting options.
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Config
4
+ module Validators
5
+
6
+ # Validator for configuration options.
7
+ module Option
8
+ extend self
9
+
10
+ # Validate a configuration option.
11
+ #
12
+ # @example Validate a configuraiton option.
13
+ #
14
+ # @param [ String ] option The name of the option.
15
+ #
16
+ # @since 3.0.0
17
+ def validate(option)
18
+ unless Config.settings.keys.include?(option.to_sym)
19
+ raise Errors::InvalidConfigOption.new(option)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,140 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Config
4
+ module Validators
5
+
6
+ # Validator for session specific configuration.
7
+ module Session
8
+ extend self
9
+
10
+ STANDARD = [ :database, :hosts, :username, :password ]
11
+
12
+ # Validate the session configuration.
13
+ #
14
+ # @example Validate the session config.
15
+ # Session.validate({ default: { hosts: [ "localhost:27017" ] }})
16
+ #
17
+ # @param [ Hash ] sessions The sessions config.
18
+ #
19
+ # @since 3.0.0
20
+ def validate(sessions)
21
+ unless sessions.has_key?(:default)
22
+ raise Errors::NoDefaultSession.new(sessions.keys)
23
+ end
24
+ sessions.each_pair do |name, config|
25
+ validate_session_database(name, config)
26
+ validate_session_hosts(name, config)
27
+ validate_session_uri(name, config)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ # Validate that the session config has database.
34
+ #
35
+ # @api private
36
+ #
37
+ # @example Validate the session has database.
38
+ # validator.validate_session_database(:default, {})
39
+ #
40
+ # @param [ String, Symbol ] name The config key.
41
+ # @param [ Hash ] config The configuration.
42
+ #
43
+ # @since 3.0.0
44
+ def validate_session_database(name, config)
45
+ if no_database_or_uri?(config)
46
+ raise Errors::NoSessionDatabase.new(name, config)
47
+ end
48
+ end
49
+
50
+ # Validate that the session config has hosts.
51
+ #
52
+ # @api private
53
+ #
54
+ # @example Validate the session has hosts.
55
+ # validator.validate_session_hosts(:default, {})
56
+ #
57
+ # @param [ String, Symbol ] name The config key.
58
+ # @param [ Hash ] config The configuration.
59
+ #
60
+ # @since 3.0.0
61
+ def validate_session_hosts(name, config)
62
+ if no_hosts_or_uri?(config)
63
+ raise Errors::NoSessionHosts.new(name, config)
64
+ end
65
+ end
66
+
67
+ # Validate that not both a uri and standard options are provided for a
68
+ # single session.
69
+ #
70
+ # @api private
71
+ #
72
+ # @example Validate the uri and options.
73
+ # validator.validate_session_uri(:default, {})
74
+ #
75
+ # @param [ String, Symbol ] name The config key.
76
+ # @param [ Hash ] config The configuration.
77
+ #
78
+ # @since 3.0.0
79
+ def validate_session_uri(name, config)
80
+ if both_uri_and_standard?(config)
81
+ raise Errors::MixedSessionConfiguration.new(name, config)
82
+ end
83
+ end
84
+
85
+ # Return true if the configuration has no database or uri option
86
+ # defined.
87
+ #
88
+ # @api private
89
+ #
90
+ # @example Validate the options.
91
+ # validator.no_database_or_uri?(config)
92
+ #
93
+ # @param [ Hash ] config The configuration options.
94
+ #
95
+ # @return [ true, false ] If no database or uri is defined.
96
+ #
97
+ # @since 3.0.0
98
+ def no_database_or_uri?(config)
99
+ !config.has_key?(:database) && !config.has_key?(:uri)
100
+ end
101
+
102
+ # Return true if the configuration has no hosts or uri option
103
+ # defined.
104
+ #
105
+ # @api private
106
+ #
107
+ # @example Validate the options.
108
+ # validator.no_hosts_or_uri?(config)
109
+ #
110
+ # @param [ Hash ] config The configuration options.
111
+ #
112
+ # @return [ true, false ] If no hosts or uri is defined.
113
+ #
114
+ # @since 3.0.0
115
+ def no_hosts_or_uri?(config)
116
+ !config.has_key?(:hosts) && !config.has_key?(:uri)
117
+ end
118
+
119
+ # Return true if the configuration has both standard options and a uri
120
+ # defined.
121
+ #
122
+ # @api private
123
+ #
124
+ # @example Validate the options.
125
+ # validator.no_database_or_uri?(config)
126
+ #
127
+ # @param [ Hash ] config The configuration options.
128
+ #
129
+ # @return [ true, false ] If both standard and uri are defined.
130
+ #
131
+ # @since 3.0.0
132
+ def both_uri_and_standard?(config)
133
+ config.has_key?(:uri) && config.keys.any? do |key|
134
+ STANDARD.include?(key.to_sym)
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ require "mongoid/config/validators/option"
3
+ require "mongoid/config/validators/session"
@@ -1,90 +1,29 @@
1
1
  # encoding: utf-8
2
- require "uri"
3
- require "mongoid/config/database"
4
2
  require "mongoid/config/environment"
5
- require "mongoid/config/replset_database"
3
+ require "mongoid/config/inflections"
6
4
  require "mongoid/config/options"
5
+ require "mongoid/config/validators"
7
6
 
8
- module Mongoid #:nodoc
7
+ module Mongoid
9
8
 
10
9
  # This module defines all the configuration options for Mongoid, including the
11
10
  # database connections.
12
- #
13
- # @todo Durran: This module needs an overhaul, remove singleton, etc.
14
11
  module Config
15
12
  extend self
16
13
  extend Options
17
14
  include ActiveModel::Observing
18
15
 
19
- # @attribute [rw] master The master database.
20
- attr_accessor :master
21
-
22
- option :allow_dynamic_fields, :default => true
23
- option :autocreate_indexes, :default => false
24
- option :identity_map_enabled, :default => false
25
- option :include_root_in_json, :default => false
26
- option :include_type_for_serialization, :default => false
27
- option :max_retries_on_connection_failure, :default => 0
28
- option :parameterize_keys, :default => true
29
- option :scope_overwrite_exception, :default => false
30
- option :persist_in_safe_mode, :default => false
31
- option :preload_models, :default => false
32
- option :raise_not_found_error, :default => true
33
- option :skip_version_check, :default => false
34
- option :time_zone, :default => nil
35
- option :use_utc, :default => false
36
-
37
- # Adds a new I18n locale file to the load path.
38
- #
39
- # @example Add a portuguese locale.
40
- # Mongoid::Config.add_language('pt')
41
- #
42
- # @example Add all available languages.
43
- # Mongoid::Config.add_language('*')
44
- #
45
- # @param [ String ] language_code The language to add.
46
- def add_language(language_code = nil)
47
- Dir[
48
- File.join(
49
- File.dirname(__FILE__), "..", "config", "locales", "#{language_code}.yml"
50
- )
51
- ].each do |file|
52
- I18n.load_path << File.expand_path(file)
53
- end
54
- end
55
-
56
- # keys to remove from self to not pass through to Mongo::Connection
57
- PRIVATE_OPTIONS =
58
- %w(uri host hosts port database databases username
59
- password logger use_activesupport_time_zone)
60
-
61
- # Get the blacklisted options from passing through to the driver.
62
- #
63
- # @example Get the blacklisted options.
64
- # Config.blacklisted_options
65
- #
66
- # @return [ Array<String> ] The blacklist.
67
- #
68
- # @since 2.4.7
69
- def blacklisted_options
70
- PRIVATE_OPTIONS + settings.keys.map(&:to_s)
71
- end
72
-
73
- # Get any extra databases that have been configured.
74
- #
75
- # @example Get the extras.
76
- # config.databases
77
- #
78
- # @return [ Hash ] A hash of secondary databases.
79
- def databases
80
- configure_extras(@settings["databases"]) unless @databases || !@settings
81
- @databases || {}
82
- end
83
-
84
- # @todo Durran: There were no tests around the databases setter, not sure
85
- # what the exact expectation was. Set with a hash?
86
- def databases=(databases)
87
- end
16
+ option :allow_dynamic_fields, default: true
17
+ option :identity_map_enabled, default: false
18
+ option :include_root_in_json, default: false
19
+ option :include_type_for_serialization, default: false
20
+ option :preload_models, default: false
21
+ option :protect_sensitive_fields, default: true
22
+ option :raise_not_found_error, default: true
23
+ option :scope_overwrite_exception, default: false
24
+ option :skip_version_check, default: false
25
+ option :use_activesupport_time_zone, default: true
26
+ option :use_utc, default: false
88
27
 
89
28
  # Return field names that could cause destructive things to happen if
90
29
  # defined in a Mongoid::Document.
@@ -97,21 +36,6 @@ module Mongoid #:nodoc
97
36
  Components.prohibited_methods
98
37
  end
99
38
 
100
- # Configure mongoid from a hash. This is usually called after parsing a
101
- # yaml config file such as mongoid.yml.
102
- #
103
- # @example Configure Mongoid.
104
- # config.from_hash({})
105
- #
106
- # @param [ Hash ] options The settings to use.
107
- def from_hash(options = {})
108
- options.except("database", "slaves", "databases").each_pair do |name, value|
109
- send("#{name}=", value) if respond_to?("#{name}=")
110
- end
111
- @master, @slaves = configure_databases(options)
112
- configure_extras(options["databases"])
113
- end
114
-
115
39
  # Load the settings from a compliant mongoid.yml file. This can be used for
116
40
  # easy setup with frameworks other than Rails.
117
41
  #
@@ -119,48 +43,32 @@ module Mongoid #:nodoc
119
43
  # Mongoid.load!("/path/to/mongoid.yml")
120
44
  #
121
45
  # @param [ String ] path The path to the file.
46
+ # @param [ String, Symbol ] environment The environment to load.
122
47
  #
123
48
  # @since 2.0.1
124
- def load!(path)
125
- Environment.load_yaml(path).tap do |settings|
126
- from_hash(settings) if settings.present?
127
- end
128
- end
129
-
130
- # Returns the default logger, which is either a Rails logger of stdout logger
131
- #
132
- # @example Get the default logger
133
- # config.default_logger
134
- #
135
- # @return [ Logger ] The default Logger instance.
136
- def default_logger
137
- defined?(Rails) && Rails.respond_to?(:logger) ? Rails.logger : ::Logger.new($stdout)
49
+ def load!(path, environment = nil)
50
+ settings = Environment.load_yaml(path, environment)
51
+ load_configuration(settings) if settings.present?
52
+ settings
138
53
  end
139
54
 
140
- # Returns the logger, or defaults to Rails logger or stdout logger.
55
+ # Connect to the provided database name on the default session.
141
56
  #
142
- # @example Get the logger.
143
- # config.logger
57
+ # @note Use only in development or test environments for convenience.
144
58
  #
145
- # @return [ Logger ] The configured logger or a default Logger instance.
146
- def logger
147
- @logger = default_logger unless defined?(@logger)
148
- @logger
149
- end
150
-
151
- # Sets the logger for Mongoid to use.
59
+ # @example Set the database to connect to.
60
+ # config.connect_to("mongoid_test")
152
61
  #
153
- # @example Set the logger.
154
- # config.logger = Logger.new($stdout, :warn)
62
+ # @param [ String ] name The database name.
155
63
  #
156
- # @return [ Logger ] The newly set logger.
157
- def logger=(logger)
158
- case logger
159
- when false, nil then @logger = nil
160
- when true then @logger = default_logger
161
- else
162
- @logger = logger if logger.respond_to?(:info)
163
- end
64
+ # @since 3.0.0
65
+ def connect_to(name)
66
+ self.sessions = {
67
+ default: {
68
+ database: name,
69
+ hosts: [ "localhost:27017" ]
70
+ }
71
+ }
164
72
  end
165
73
 
166
74
  # Purge all data in all collections, including indexes.
@@ -168,143 +76,89 @@ module Mongoid #:nodoc
168
76
  # @example Purge all data.
169
77
  # Mongoid::Config.purge!
170
78
  #
79
+ # @return [ true ] true.
80
+ #
171
81
  # @since 2.0.2
172
82
  def purge!
173
- master.collections.map do |collection|
174
- collection.drop if collection.name !~ /system/
175
- end
83
+ session = Sessions.default
84
+ collections = session["system.namespaces"].find(name: { "$not" => /system|\$/ }).to_a
85
+ collections.each do |collection|
86
+ _, name = collection["name"].split(".", 2)
87
+ session[name].drop
88
+ end and true
176
89
  end
177
90
 
178
- # Sets whether the times returned from the database use the ruby or
179
- # the ActiveSupport time zone.
91
+ # Set the configuration options. Will validate each one individually.
180
92
  #
181
- # @note If you omit this setting, then times will use the ruby time zone.
93
+ # @example Set the options.
94
+ # config.options = { raise_not_found_error: true }
182
95
  #
183
- # @example Set the time zone config.
184
- # Config.use_activesupport_time_zone = true
96
+ # @param [ Hash ] options The configuration options.
185
97
  #
186
- # @param [ true, false ] value Whether to use Active Support time zones.
187
- #
188
- # @return [ true, false ] The supplied value or false if nil.
189
- def use_activesupport_time_zone=(value)
190
- @use_activesupport_time_zone = value || false
98
+ # @since 3.0.0
99
+ def options=(options)
100
+ if options
101
+ options.each_pair do |option, value|
102
+ Validators::Option.validate(option)
103
+ send("#{option}=", value)
104
+ end
105
+ end
191
106
  end
192
- attr_reader :use_activesupport_time_zone
193
- alias_method :use_activesupport_time_zone?, :use_activesupport_time_zone
194
107
 
195
- # Sets the Mongo::DB master database to be used. If the object trying to be
196
- # set is not a valid +Mongo::DB+, then an error will be raised.
197
- #
198
- # @example Set the master database.
199
- # config.master = Mongo::Connection.new.db("test")
108
+ # Get the session configuration or an empty hash.
200
109
  #
201
- # @param [ Mongo::DB ] db The master database.
110
+ # @example Get the sessions configuration.
111
+ # config.sessions
202
112
  #
203
- # @raise [ Errors::InvalidDatabase ] If the master isnt a valid object.
113
+ # @return [ Hash ] The sessions configuration.
204
114
  #
205
- # @return [ Mongo::DB ] The master instance.
206
- def master=(db)
207
- check_database!(db)
208
- @master = db
115
+ # @since 3.0.0
116
+ def sessions
117
+ @sessions ||= {}
209
118
  end
210
- alias :database= :master=
211
119
 
212
- # Returns the master database, or if none has been set it will raise an
213
- # error.
120
+ # Set the session configuration options.
214
121
  #
215
- # @example Get the master database.
216
- # config.master
217
- #
218
- # @raise [ Errors::InvalidDatabase ] If the database was not set.
219
- #
220
- # @return [ Mongo::DB ] The master database.
221
- def master
222
- unless @master
223
- @master, @slaves = configure_databases(@settings) unless @settings.blank?
224
- raise Errors::InvalidDatabase.new(nil) unless @master
225
- end
226
- if @reconnect
227
- @reconnect = false
228
- reconnect!
229
- end
230
- @master
231
- end
232
- alias :database :master
233
-
234
- # Convenience method for connecting to the master database after forking a
235
- # new process.
122
+ # @example Set the session configuration options.
123
+ # config.sessions = { default: { hosts: [ "localhost:27017" ] }}
236
124
  #
237
- # @example Reconnect to the master.
238
- # Mongoid.reconnect!
125
+ # @param [ Hash ] sessions The configuration options.
239
126
  #
240
- # @param [ true, false ] now Perform the reconnection immediately?
241
- def reconnect!(now = true)
242
- if now
243
- master.connection.connect
244
- else
245
- # We set a @reconnect flag so that #master knows to reconnect the next
246
- # time the connection is accessed.
247
- @reconnect = true
248
- end
127
+ # @since 3.0.0
128
+ def sessions=(sessions)
129
+ raise Errors::NoSessionsConfig.new unless sessions
130
+ sess = sessions.with_indifferent_access
131
+ Validators::Session.validate(sess)
132
+ @sessions = sess
133
+ sess
249
134
  end
250
135
 
251
- protected
252
-
253
- # Check if the database is valid and the correct version.
136
+ # Get the time zone to use.
254
137
  #
255
- # @example Check if the database is valid.
256
- # config.check_database!
138
+ # @example Get the time zone.
139
+ # Config.time_zone
257
140
  #
258
- # @param [ Mongo::DB ] database The db to check.
141
+ # @return [ String ] The time zone.
259
142
  #
260
- # @raise [ Errors::InvalidDatabase ] If the object is not valid.
261
- # @raise [ Errors::UnsupportedVersion ] If the db version is too old.
262
- def check_database!(database)
263
- raise Errors::InvalidDatabase.new(database) unless database.kind_of?(Mongo::DB)
264
- unless skip_version_check
265
- version = database.connection.server_version
266
- raise Errors::UnsupportedVersion.new(version) if version < Mongoid::MONGODB_VERSION
267
- end
143
+ # @since 3.0.0
144
+ def time_zone
145
+ use_utc? ? "UTC" : ::Time.zone
268
146
  end
269
147
 
270
- # Get a database from settings.
271
- #
272
- # @example Configure the master and slave dbs.
273
- # config.configure_databases("database" => "mongoid")
274
- #
275
- # @param [ Hash ] options The options to use.
276
- #
277
- # @option options [ String ] :database The database name.
278
- # @option options [ String ] :host The database host.
279
- # @option options [ String ] :password The password for authentication.
280
- # @option options [ Integer ] :port The port for the database.
281
- # @option options [ Array<Hash> ] :slaves The slave db options.
282
- # @option options [ String ] :uri The uri for the database.
283
- # @option options [ String ] :username The user for authentication.
284
- #
285
- # @since 2.0.0.rc.1
286
- def configure_databases(options)
287
- if options.has_key?('hosts')
288
- ReplsetDatabase.new(options).configure
289
- else
290
- Database.new(options).configure
291
- end
292
- end
148
+ private
293
149
 
294
- # Get the secondary databases from settings.
150
+ # From a hash of settings, load all the configuration.
295
151
  #
296
- # @example Configure the master and slave dbs.
297
- # config.configure_extras("databases" => settings)
152
+ # @example Load the configuration.
153
+ # config.load_configuration(settings)
298
154
  #
299
- # @param [ Hash ] options The options to use.
155
+ # @param [ Hash ] settings The configuration settings.
300
156
  #
301
- # @since 2.0.0.rc.1
302
- def configure_extras(extras)
303
- @databases = (extras || []).inject({}) do |dbs, (name, options)|
304
- dbs.tap do |extra|
305
- dbs[name], dbs["#{name}_slaves"] = configure_databases(options)
306
- end
307
- end
157
+ # @since 3.0.0
158
+ def load_configuration(settings)
159
+ configuration = settings.with_indifferent_access
160
+ self.options = configuration[:options]
161
+ self.sessions = configuration[:sessions]
308
162
  end
309
163
  end
310
164
  end