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
@@ -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.
@@ -8,13 +8,11 @@ module Mongoid #:nodoc
8
8
 
9
9
  # Get the name of the environment that we are running under. This first
10
10
  # looks for Rails, then Sinatra, then a RACK_ENV environment variable,
11
- # and if none of those are found raises an error.
11
+ # and if none of those are found returns "development".
12
12
  #
13
13
  # @example Get the env name.
14
14
  # Environment.env_name
15
15
  #
16
- # @raise [ Errors::NoEnvironment ] If no environment was set.
17
- #
18
16
  # @return [ String ] The name of the current environment.
19
17
  #
20
18
  # @since 2.3.0
@@ -35,8 +33,9 @@ module Mongoid #:nodoc
35
33
  # @return [ Hash ] The settings.
36
34
  #
37
35
  # @since 2.3.0
38
- def load_yaml(path)
39
- 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]
40
39
  end
41
40
  end
42
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,3 @@
1
+ # encoding: utf-8
2
+ require "mongoid/config/validators/option"
3
+ require "mongoid/config/validators/session"
@@ -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,50 @@
1
+ # encoding: utf-8
2
+ require "mongoid/contextual/memory"
3
+ require "mongoid/contextual/mongo"
4
+
5
+ module Mongoid
6
+ module Contextual
7
+
8
+ # The aggregate operations provided in the aggregate module get delegated
9
+ # through to the context from the criteria.
10
+ delegate(*Aggregable::Mongo.public_instance_methods(false), to: :context)
11
+
12
+ # The atomic operations provided in the atomic context get delegated
13
+ # through to the context from the criteria.
14
+ delegate(*Atomic.public_instance_methods(false), to: :context)
15
+
16
+ # The methods in the contexts themselves should all get delegated to,
17
+ # including destructive, modification, and optional methods.
18
+ delegate(*(Mongo.public_instance_methods(false) - [ :skip, :limit ]), to: :context)
19
+
20
+ # Get the context in which criteria queries should execute. This is either
21
+ # in memory (for embedded documents) or mongo (for root level documents.)
22
+ #
23
+ # @example Get the context.
24
+ # criteria.context
25
+ #
26
+ # @return [ Memory, Mongo ] The context.
27
+ #
28
+ # @since 3.0.0
29
+ def context
30
+ @context ||= create_context
31
+ end
32
+
33
+ private
34
+
35
+ # Create the context for the queries to execute. Will be memory for
36
+ # embedded documents and mongo for root documents.
37
+ #
38
+ # @api private
39
+ #
40
+ # @example Create the context.
41
+ # contextual.create_context
42
+ #
43
+ # @return [ Mongo, Memory ] The context.
44
+ #
45
+ # @since 3.0.0
46
+ def create_context
47
+ embedded ? Memory.new(self) : Mongo.new(self)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,98 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Contextual
4
+ module Aggregable
5
+ # Contains behaviour for aggregating values in memory.
6
+ module Memory
7
+
8
+ # Get the average value of the provided field.
9
+ #
10
+ # @example Get the average of a single field.
11
+ # aggregable.avg(:likes)
12
+ #
13
+ # @param [ Symbol ] field The field to average.
14
+ #
15
+ # @return [ Float ] The average.
16
+ #
17
+ # @since 3.0.0
18
+ def avg(field)
19
+ count > 0 ? sum(field).to_f / count.to_f : nil
20
+ end
21
+
22
+ # Get the max value of the provided field. If provided a block, will
23
+ # return the Document with the greatest value for the field, in
24
+ # accordance with Ruby's enumerable API.
25
+ #
26
+ # @example Get the max of a single field.
27
+ # aggregable.max(:likes)
28
+ #
29
+ # @example Get the document with the max value.
30
+ # aggregable.max do |a, b|
31
+ # a.likes <=> b.likes
32
+ # end
33
+ #
34
+ # @param [ Symbol ] field The field to max.
35
+ #
36
+ # @return [ Float, Document ] The max value or document with the max
37
+ # value.
38
+ #
39
+ # @since 3.0.0
40
+ def max(field = nil)
41
+ if block_given?
42
+ super()
43
+ else
44
+ count > 0 ? max_by { |doc| doc.send(field) }.send(field) : nil
45
+ end
46
+ end
47
+
48
+ # Get the min value of the provided field. If provided a block, will
49
+ # return the Document with the smallest value for the field, in
50
+ # accordance with Ruby's enumerable API.
51
+ #
52
+ # @example Get the min of a single field.
53
+ # aggregable.min(:likes)
54
+ #
55
+ # @example Get the document with the min value.
56
+ # aggregable.min do |a, b|
57
+ # a.likes <=> b.likes
58
+ # end
59
+ #
60
+ # @param [ Symbol ] field The field to min.
61
+ #
62
+ # @return [ Float, Document ] The min value or document with the min
63
+ # value.
64
+ #
65
+ # @since 3.0.0
66
+ def min(field = nil)
67
+ if block_given?
68
+ super()
69
+ else
70
+ count > 0 ? min_by { |doc| doc.send(field) }.send(field) : nil
71
+ end
72
+ end
73
+
74
+ # Get the sum value of the provided field. If provided a block, will
75
+ # return the sum in accordance with Ruby's enumerable API.
76
+ #
77
+ # @example Get the sum of a single field.
78
+ # aggregable.sum(:likes)
79
+ #
80
+ # @example Get the sum for the provided block.
81
+ # aggregable.sum(&:likes)
82
+ #
83
+ # @param [ Symbol ] field The field to sum.
84
+ #
85
+ # @return [ Float ] The sum value.
86
+ #
87
+ # @since 3.0.0
88
+ def sum(field = nil)
89
+ if block_given?
90
+ super()
91
+ else
92
+ count > 0 ? super(0) { |doc| doc.send(field) } : nil
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,181 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Contextual
4
+ module Aggregable
5
+ # Contains behaviour for aggregating values in Mongo.
6
+ module Mongo
7
+
8
+ # Get all the aggregate values for the provided field.
9
+ #
10
+ # @example Get all the aggregate values.
11
+ # aggregable.aggregates(:likes)
12
+ #
13
+ # @param [ String, Symbol ] field The field name.
14
+ #
15
+ # @return [ Hash ] The aggregate values in the form:
16
+ # {
17
+ # "count" => 2.0,
18
+ # "max" => 1000.0,
19
+ # "min" => 500.0,
20
+ # "sum" => 1500.0,
21
+ # "avg" => 750.0
22
+ # }
23
+ #
24
+ # @since 3.0.0
25
+ def aggregates(field)
26
+ if query.count > 0
27
+ map_reduce(mapper(field), reducer).
28
+ out(inline: 1).finalize(finalizer).first["value"]
29
+ else
30
+ { "count" => 0 }
31
+ end
32
+ end
33
+
34
+ # Get the average value of the provided field.
35
+ #
36
+ # @example Get the average of a single field.
37
+ # aggregable.avg(:likes)
38
+ #
39
+ # @param [ Symbol ] field The field to average.
40
+ #
41
+ # @return [ Float ] The average.
42
+ #
43
+ # @since 3.0.0
44
+ def avg(field)
45
+ aggregates(field)["avg"]
46
+ end
47
+
48
+ # Get the max value of the provided field. If provided a block, will
49
+ # return the Document with the greatest value for the field, in
50
+ # accordance with Ruby's enumerable API.
51
+ #
52
+ # @example Get the max of a single field.
53
+ # aggregable.max(:likes)
54
+ #
55
+ # @example Get the document with the max value.
56
+ # aggregable.max do |a, b|
57
+ # a.likes <=> b.likes
58
+ # end
59
+ #
60
+ # @param [ Symbol ] field The field to max.
61
+ #
62
+ # @return [ Float, Document ] The max value or document with the max
63
+ # value.
64
+ #
65
+ # @since 3.0.0
66
+ def max(field = nil)
67
+ block_given? ? super() : aggregates(field)["max"]
68
+ end
69
+
70
+ # Get the min value of the provided field. If provided a block, will
71
+ # return the Document with the smallest value for the field, in
72
+ # accordance with Ruby's enumerable API.
73
+ #
74
+ # @example Get the min of a single field.
75
+ # aggregable.min(:likes)
76
+ #
77
+ # @example Get the document with the min value.
78
+ # aggregable.min do |a, b|
79
+ # a.likes <=> b.likes
80
+ # end
81
+ #
82
+ # @param [ Symbol ] field The field to min.
83
+ #
84
+ # @return [ Float, Document ] The min value or document with the min
85
+ # value.
86
+ #
87
+ # @since 3.0.0
88
+ def min(field = nil)
89
+ block_given? ? super() : aggregates(field)["min"]
90
+ end
91
+
92
+ # Get the sum value of the provided field. If provided a block, will
93
+ # return the sum in accordance with Ruby's enumerable API.
94
+ #
95
+ # @example Get the sum of a single field.
96
+ # aggregable.sum(:likes)
97
+ #
98
+ # @example Get the sum for the provided block.
99
+ # aggregable.sum(&:likes)
100
+ #
101
+ # @param [ Symbol ] field The field to sum.
102
+ #
103
+ # @return [ Float ] The sum value.
104
+ #
105
+ # @since 3.0.0
106
+ def sum(field = nil)
107
+ block_given? ? super() : aggregates(field)["sum"]
108
+ end
109
+
110
+ private
111
+
112
+ # Get the finalize function.
113
+ #
114
+ # @api private
115
+ #
116
+ # @example Get the finalize function.
117
+ # aggregable.finalizer
118
+ #
119
+ # @return [ String ] The finalize JS function.
120
+ #
121
+ # @since 3.0.0
122
+ def finalizer
123
+ %Q{
124
+ function(key, agg) {
125
+ agg.avg = agg.sum / agg.count;
126
+ return agg;
127
+ }}
128
+ end
129
+
130
+ # Get the map function for the provided field.
131
+ #
132
+ # @api private
133
+ #
134
+ # @example Get the map function.
135
+ # aggregable.mapper(:likes)
136
+ #
137
+ # @param [ String, Symbol ] field The name of the field.
138
+ #
139
+ # @return [ String ] The map JS function.
140
+ #
141
+ # @since 3.0.0
142
+ def mapper(field)
143
+ %Q{
144
+ function() {
145
+ var agg = {
146
+ count: 1,
147
+ max: this.#{field},
148
+ min: this.#{field},
149
+ sum: this.#{field}
150
+ };
151
+ emit("#{field}", agg);
152
+ }}
153
+ end
154
+
155
+ # Get the reduce function for the provided field.
156
+ #
157
+ # @api private
158
+ #
159
+ # @example Get the reduce function.
160
+ # aggregable.reducer(:likes)
161
+ #
162
+ # @return [ String ] The reduce JS function.
163
+ #
164
+ # @since 3.0.0
165
+ def reducer
166
+ %Q{
167
+ function(key, values) {
168
+ var agg = { count: 0, max: null, min: null, sum: 0 };
169
+ values.forEach(function(val) {
170
+ if (agg.max == null || val.max > agg.max) agg.max = val.max;
171
+ if (agg.min == null || val.max < agg.min) agg.min = val.max;
172
+ agg.count += 1;
173
+ agg.sum += val.sum;
174
+ });
175
+ return agg;
176
+ }}
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end