mongoid 7.1.1 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1094) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/README.md +15 -8
  5. data/Rakefile +61 -5
  6. data/lib/config/locales/en.yml +162 -56
  7. data/lib/mongoid/association/accessors.rb +89 -40
  8. data/lib/mongoid/association/bindable.rb +50 -23
  9. data/lib/mongoid/association/builders.rb +5 -12
  10. data/lib/mongoid/association/constrainable.rb +1 -5
  11. data/lib/mongoid/association/depending.rb +5 -17
  12. data/lib/mongoid/association/eager_loadable.rb +29 -10
  13. data/lib/mongoid/association/embedded/batchable.rb +64 -52
  14. data/lib/mongoid/association/embedded/cyclic.rb +3 -12
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -9
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -5
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -16
  18. data/lib/mongoid/association/embedded/embedded_in.rb +4 -26
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -7
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -6
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +110 -92
  22. data/lib/mongoid/association/embedded/embeds_many.rb +4 -34
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -8
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +50 -19
  26. data/lib/mongoid/association/embedded/embeds_one.rb +5 -31
  27. data/lib/mongoid/association/embedded.rb +0 -1
  28. data/lib/mongoid/association/macros.rb +27 -5
  29. data/lib/mongoid/association/many.rb +14 -27
  30. data/lib/mongoid/association/marshalable.rb +0 -5
  31. data/lib/mongoid/association/nested/many.rb +6 -16
  32. data/lib/mongoid/association/nested/nested_buildable.rb +4 -13
  33. data/lib/mongoid/association/nested/one.rb +48 -23
  34. data/lib/mongoid/association/nested.rb +0 -3
  35. data/lib/mongoid/association/one.rb +2 -11
  36. data/lib/mongoid/association/options.rb +9 -42
  37. data/lib/mongoid/association/proxy.rb +22 -27
  38. data/lib/mongoid/association/referenced/auto_save.rb +6 -14
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -8
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +5 -6
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -19
  43. data/lib/mongoid/association/referenced/belongs_to.rb +11 -36
  44. data/lib/mongoid/association/referenced/counter_cache.rb +12 -25
  45. data/lib/mongoid/association/referenced/eager.rb +5 -26
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +81 -51
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +17 -41
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +438 -461
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +58 -84
  56. data/lib/mongoid/association/referenced/has_many.rb +15 -42
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +12 -5
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +7 -22
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -16
  62. data/lib/mongoid/association/referenced/has_one.rb +12 -35
  63. data/lib/mongoid/association/referenced/syncable.rb +4 -21
  64. data/lib/mongoid/association/referenced.rb +0 -1
  65. data/lib/mongoid/association/reflections.rb +4 -5
  66. data/lib/mongoid/association/relatable.rb +46 -71
  67. data/lib/mongoid/association.rb +5 -22
  68. data/lib/mongoid/atomic/modifiers.rb +7 -54
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -5
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
  71. data/lib/mongoid/atomic/paths/embedded.rb +0 -3
  72. data/lib/mongoid/atomic/paths/root.rb +0 -5
  73. data/lib/mongoid/atomic/paths.rb +0 -1
  74. data/lib/mongoid/atomic.rb +40 -47
  75. data/lib/mongoid/attributes/dynamic.rb +5 -22
  76. data/lib/mongoid/attributes/nested.rb +6 -11
  77. data/lib/mongoid/attributes/processing.rb +11 -21
  78. data/lib/mongoid/attributes/projector.rb +119 -0
  79. data/lib/mongoid/attributes/readonly.rb +3 -8
  80. data/lib/mongoid/attributes.rb +82 -88
  81. data/lib/mongoid/cacheable.rb +4 -9
  82. data/lib/mongoid/changeable.rb +148 -69
  83. data/lib/mongoid/clients/factory.rb +41 -17
  84. data/lib/mongoid/clients/options.rb +13 -14
  85. data/lib/mongoid/clients/sessions.rb +8 -11
  86. data/lib/mongoid/clients/storage_options.rb +7 -17
  87. data/lib/mongoid/clients/validators/storage.rb +3 -24
  88. data/lib/mongoid/clients/validators.rb +0 -1
  89. data/lib/mongoid/clients.rb +1 -10
  90. data/lib/mongoid/collection_configurable.rb +58 -0
  91. data/lib/mongoid/composable.rb +3 -7
  92. data/lib/mongoid/config/defaults.rb +60 -0
  93. data/lib/mongoid/config/environment.rb +28 -5
  94. data/lib/mongoid/config/options.rb +0 -11
  95. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  96. data/lib/mongoid/config/validators/client.rb +6 -23
  97. data/lib/mongoid/config/validators/option.rb +0 -3
  98. data/lib/mongoid/config/validators.rb +1 -1
  99. data/lib/mongoid/config.rb +183 -39
  100. data/lib/mongoid/contextual/aggregable/memory.rb +37 -26
  101. data/lib/mongoid/contextual/aggregable/mongo.rb +29 -32
  102. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  103. data/lib/mongoid/contextual/aggregable.rb +17 -0
  104. data/lib/mongoid/contextual/atomic.rb +7 -27
  105. data/lib/mongoid/contextual/command.rb +0 -5
  106. data/lib/mongoid/contextual/geo_near.rb +8 -41
  107. data/lib/mongoid/contextual/map_reduce.rb +2 -33
  108. data/lib/mongoid/contextual/memory.rb +383 -79
  109. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  110. data/lib/mongoid/contextual/mongo.rb +636 -283
  111. data/lib/mongoid/contextual/none.rb +262 -31
  112. data/lib/mongoid/contextual/queryable.rb +1 -4
  113. data/lib/mongoid/contextual.rb +14 -7
  114. data/lib/mongoid/copyable.rb +39 -16
  115. data/lib/mongoid/criteria/findable.rb +9 -19
  116. data/lib/mongoid/criteria/includable.rb +27 -31
  117. data/lib/mongoid/criteria/inspectable.rb +0 -3
  118. data/lib/mongoid/criteria/marshalable.rb +10 -7
  119. data/lib/mongoid/criteria/modifiable.rb +2 -20
  120. data/lib/mongoid/criteria/options.rb +0 -3
  121. data/lib/mongoid/criteria/permission.rb +1 -2
  122. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -15
  123. data/lib/mongoid/criteria/queryable/expandable.rb +0 -25
  124. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -40
  125. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -7
  126. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -6
  127. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -8
  128. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -6
  129. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -40
  130. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
  131. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -20
  132. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -29
  133. data/lib/mongoid/criteria/queryable/extensions/range.rb +46 -16
  134. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -18
  135. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -4
  136. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -31
  137. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -21
  138. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -8
  139. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +16 -6
  140. data/lib/mongoid/criteria/queryable/extensions.rb +0 -5
  141. data/lib/mongoid/criteria/queryable/key.rb +6 -19
  142. data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
  143. data/lib/mongoid/criteria/queryable/mergeable.rb +123 -38
  144. data/lib/mongoid/criteria/queryable/optional.rb +11 -62
  145. data/lib/mongoid/criteria/queryable/options.rb +2 -21
  146. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -14
  147. data/lib/mongoid/criteria/queryable/selectable.rb +138 -125
  148. data/lib/mongoid/criteria/queryable/selector.rb +94 -30
  149. data/lib/mongoid/criteria/queryable/smash.rb +40 -18
  150. data/lib/mongoid/criteria/queryable/storable.rb +14 -10
  151. data/lib/mongoid/criteria/queryable.rb +11 -13
  152. data/lib/mongoid/criteria/scopable.rb +27 -21
  153. data/lib/mongoid/criteria/translator.rb +45 -0
  154. data/lib/mongoid/criteria.rb +88 -108
  155. data/lib/mongoid/deprecable.rb +36 -0
  156. data/lib/mongoid/deprecation.rb +25 -0
  157. data/lib/mongoid/document.rb +149 -99
  158. data/lib/mongoid/equality.rb +32 -16
  159. data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
  160. data/lib/mongoid/errors/callback.rb +0 -3
  161. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  162. data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
  163. data/lib/mongoid/errors/delete_restriction.rb +8 -12
  164. data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
  165. data/lib/mongoid/errors/document_not_found.rb +33 -21
  166. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  167. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  168. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  169. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -3
  170. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  171. data/lib/mongoid/errors/invalid_collection.rb +0 -1
  172. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  173. data/lib/mongoid/errors/invalid_config_option.rb +1 -4
  174. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -4
  175. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  176. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  177. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  178. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  179. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  180. data/lib/mongoid/errors/invalid_field.rb +6 -7
  181. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  182. data/lib/mongoid/errors/invalid_field_option.rb +0 -3
  183. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  184. data/lib/mongoid/errors/invalid_find.rb +0 -3
  185. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  186. data/lib/mongoid/errors/invalid_includes.rb +0 -3
  187. data/lib/mongoid/errors/invalid_index.rb +0 -3
  188. data/lib/mongoid/errors/invalid_options.rb +0 -3
  189. data/lib/mongoid/errors/invalid_path.rb +0 -3
  190. data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
  191. data/lib/mongoid/errors/invalid_query.rb +40 -0
  192. data/lib/mongoid/errors/invalid_relation.rb +1 -8
  193. data/lib/mongoid/errors/invalid_relation_option.rb +1 -4
  194. data/lib/mongoid/errors/invalid_scope.rb +0 -3
  195. data/lib/mongoid/errors/invalid_session_use.rb +1 -6
  196. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
  197. data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
  198. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  199. data/lib/mongoid/errors/invalid_time.rb +0 -3
  200. data/lib/mongoid/errors/inverse_not_found.rb +0 -3
  201. data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
  202. data/lib/mongoid/errors/mixed_relations.rb +0 -3
  203. data/lib/mongoid/errors/mongoid_error.rb +4 -13
  204. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
  205. data/lib/mongoid/errors/no_client_config.rb +2 -5
  206. data/lib/mongoid/errors/no_client_database.rb +1 -4
  207. data/lib/mongoid/errors/no_client_hosts.rb +1 -4
  208. data/lib/mongoid/errors/no_clients_config.rb +0 -3
  209. data/lib/mongoid/errors/no_default_client.rb +1 -4
  210. data/lib/mongoid/errors/no_environment.rb +0 -3
  211. data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
  212. data/lib/mongoid/errors/no_metadata.rb +0 -3
  213. data/lib/mongoid/errors/no_parent.rb +0 -3
  214. data/lib/mongoid/errors/readonly_attribute.rb +1 -4
  215. data/lib/mongoid/errors/readonly_document.rb +1 -6
  216. data/lib/mongoid/errors/scope_overwrite.rb +0 -1
  217. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -2
  218. data/lib/mongoid/errors/unknown_attribute.rb +1 -4
  219. data/lib/mongoid/errors/unknown_model.rb +0 -3
  220. data/lib/mongoid/errors/unsaved_document.rb +1 -2
  221. data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
  222. data/lib/mongoid/errors/validations.rb +0 -1
  223. data/lib/mongoid/errors.rb +15 -4
  224. data/lib/mongoid/evolvable.rb +1 -4
  225. data/lib/mongoid/extensions/array.rb +12 -36
  226. data/lib/mongoid/extensions/big_decimal.rb +33 -21
  227. data/lib/mongoid/extensions/binary.rb +42 -0
  228. data/lib/mongoid/extensions/boolean.rb +8 -6
  229. data/lib/mongoid/extensions/date.rb +26 -29
  230. data/lib/mongoid/extensions/date_time.rb +1 -10
  231. data/lib/mongoid/extensions/decimal128.rb +0 -5
  232. data/lib/mongoid/extensions/false_class.rb +3 -8
  233. data/lib/mongoid/extensions/float.rb +7 -11
  234. data/lib/mongoid/extensions/hash.rb +19 -37
  235. data/lib/mongoid/extensions/integer.rb +7 -13
  236. data/lib/mongoid/extensions/module.rb +1 -4
  237. data/lib/mongoid/extensions/nil_class.rb +0 -5
  238. data/lib/mongoid/extensions/object.rb +11 -48
  239. data/lib/mongoid/extensions/object_id.rb +0 -7
  240. data/lib/mongoid/extensions/range.rb +40 -20
  241. data/lib/mongoid/extensions/regexp.rb +12 -8
  242. data/lib/mongoid/extensions/set.rb +11 -11
  243. data/lib/mongoid/extensions/string.rb +12 -52
  244. data/lib/mongoid/extensions/symbol.rb +4 -22
  245. data/lib/mongoid/extensions/time.rb +28 -26
  246. data/lib/mongoid/extensions/time_with_zone.rb +14 -11
  247. data/lib/mongoid/extensions/true_class.rb +3 -8
  248. data/lib/mongoid/extensions.rb +17 -3
  249. data/lib/mongoid/factory.rb +80 -16
  250. data/lib/mongoid/fields/foreign_key.rb +11 -25
  251. data/lib/mongoid/fields/localized.rb +19 -15
  252. data/lib/mongoid/fields/standard.rb +17 -40
  253. data/lib/mongoid/fields/validators/macro.rb +25 -24
  254. data/lib/mongoid/fields/validators.rb +0 -1
  255. data/lib/mongoid/fields.rb +346 -75
  256. data/lib/mongoid/findable.rb +107 -31
  257. data/lib/mongoid/indexable/specification.rb +2 -17
  258. data/lib/mongoid/indexable/validators/options.rb +6 -9
  259. data/lib/mongoid/indexable.rb +3 -20
  260. data/lib/mongoid/inspectable.rb +2 -11
  261. data/lib/mongoid/interceptable.rb +79 -41
  262. data/lib/mongoid/loggable.rb +0 -9
  263. data/lib/mongoid/matchable.rb +2 -155
  264. data/lib/mongoid/matcher/all.rb +22 -0
  265. data/lib/mongoid/matcher/and.rb +21 -0
  266. data/lib/mongoid/matcher/bits.rb +41 -0
  267. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  268. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  269. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  271. data/lib/mongoid/matcher/elem_match.rb +36 -0
  272. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  273. data/lib/mongoid/matcher/eq.rb +11 -0
  274. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  275. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  276. data/lib/mongoid/matcher/exists.rb +15 -0
  277. data/lib/mongoid/matcher/expression.rb +35 -0
  278. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  279. data/lib/mongoid/matcher/field_expression.rb +62 -0
  280. data/lib/mongoid/matcher/field_operator.rb +54 -0
  281. data/lib/mongoid/matcher/gt.rb +17 -0
  282. data/lib/mongoid/matcher/gte.rb +17 -0
  283. data/lib/mongoid/matcher/in.rb +25 -0
  284. data/lib/mongoid/matcher/lt.rb +17 -0
  285. data/lib/mongoid/matcher/lte.rb +17 -0
  286. data/lib/mongoid/matcher/mod.rb +17 -0
  287. data/lib/mongoid/matcher/ne.rb +16 -0
  288. data/lib/mongoid/matcher/nin.rb +11 -0
  289. data/lib/mongoid/matcher/nor.rb +25 -0
  290. data/lib/mongoid/matcher/not.rb +29 -0
  291. data/lib/mongoid/matcher/or.rb +21 -0
  292. data/lib/mongoid/matcher/regex.rb +41 -0
  293. data/lib/mongoid/matcher/size.rb +26 -0
  294. data/lib/mongoid/matcher/type.rb +99 -0
  295. data/lib/mongoid/matcher.rb +130 -0
  296. data/lib/mongoid/persistable/creatable.rb +20 -29
  297. data/lib/mongoid/persistable/deletable.rb +4 -22
  298. data/lib/mongoid/persistable/destroyable.rb +9 -10
  299. data/lib/mongoid/persistable/incrementable.rb +0 -5
  300. data/lib/mongoid/persistable/logical.rb +0 -5
  301. data/lib/mongoid/persistable/poppable.rb +0 -5
  302. data/lib/mongoid/persistable/pullable.rb +0 -7
  303. data/lib/mongoid/persistable/pushable.rb +4 -8
  304. data/lib/mongoid/persistable/renamable.rb +0 -5
  305. data/lib/mongoid/persistable/savable.rb +13 -8
  306. data/lib/mongoid/persistable/settable.rb +0 -5
  307. data/lib/mongoid/persistable/unsettable.rb +2 -7
  308. data/lib/mongoid/persistable/updatable.rb +96 -29
  309. data/lib/mongoid/persistable/upsertable.rb +20 -8
  310. data/lib/mongoid/persistable.rb +6 -26
  311. data/lib/mongoid/persistence_context.rb +71 -43
  312. data/lib/mongoid/positional.rb +0 -5
  313. data/lib/mongoid/query_cache.rb +16 -236
  314. data/lib/mongoid/railtie.rb +0 -15
  315. data/lib/mongoid/railties/controller_runtime.rb +1 -2
  316. data/lib/mongoid/railties/database.rake +7 -2
  317. data/lib/mongoid/reloadable.rb +17 -20
  318. data/lib/mongoid/scopable.rb +32 -56
  319. data/lib/mongoid/selectable.rb +5 -17
  320. data/lib/mongoid/serializable.rb +11 -22
  321. data/lib/mongoid/shardable.rb +49 -16
  322. data/lib/mongoid/stateful.rb +57 -19
  323. data/lib/mongoid/stringified_symbol.rb +52 -0
  324. data/lib/mongoid/tasks/database.rake +12 -0
  325. data/lib/mongoid/tasks/database.rb +59 -11
  326. data/lib/mongoid/threaded/lifecycle.rb +5 -26
  327. data/lib/mongoid/threaded.rb +42 -67
  328. data/lib/mongoid/timestamps/created/short.rb +0 -1
  329. data/lib/mongoid/timestamps/created.rb +1 -2
  330. data/lib/mongoid/timestamps/short.rb +0 -1
  331. data/lib/mongoid/timestamps/timeless.rb +0 -7
  332. data/lib/mongoid/timestamps/updated/short.rb +0 -1
  333. data/lib/mongoid/timestamps/updated.rb +2 -5
  334. data/lib/mongoid/timestamps.rb +0 -1
  335. data/lib/mongoid/touchable.rb +34 -13
  336. data/lib/mongoid/traversable.rb +181 -59
  337. data/lib/mongoid/utils.rb +22 -0
  338. data/lib/mongoid/validatable/associated.rb +1 -4
  339. data/lib/mongoid/validatable/format.rb +0 -1
  340. data/lib/mongoid/validatable/length.rb +0 -1
  341. data/lib/mongoid/validatable/localizable.rb +1 -4
  342. data/lib/mongoid/validatable/macros.rb +5 -14
  343. data/lib/mongoid/validatable/presence.rb +6 -13
  344. data/lib/mongoid/validatable/queryable.rb +0 -3
  345. data/lib/mongoid/validatable/uniqueness.rb +26 -40
  346. data/lib/mongoid/validatable.rb +9 -27
  347. data/lib/mongoid/version.rb +1 -2
  348. data/lib/mongoid/warnings.rb +44 -0
  349. data/lib/mongoid.rb +42 -18
  350. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -2
  351. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
  352. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  353. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  354. data/lib/rails/generators/mongoid_generator.rb +0 -1
  355. data/lib/rails/mongoid.rb +0 -3
  356. data/spec/README.md +19 -4
  357. data/spec/config/mongoid.yml +16 -0
  358. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  359. data/spec/integration/app_spec.rb +345 -0
  360. data/spec/integration/associations/belongs_to_spec.rb +18 -1
  361. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  362. data/spec/integration/associations/embedded_spec.rb +163 -1
  363. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  364. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  365. data/spec/integration/associations/foreign_key_spec.rb +9 -1
  366. data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
  367. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  368. data/spec/integration/associations/has_many_spec.rb +128 -0
  369. data/spec/integration/associations/has_one_spec.rb +272 -0
  370. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  371. data/spec/integration/associations/reverse_population_spec.rb +0 -1
  372. data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
  373. data/spec/integration/associations/scope_option_spec.rb +101 -0
  374. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  375. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  376. data/spec/integration/callbacks_models.rb +192 -0
  377. data/spec/integration/callbacks_spec.rb +584 -0
  378. data/spec/integration/contextual/empty_spec.rb +141 -0
  379. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  380. data/spec/integration/criteria/date_field_spec.rb +40 -0
  381. data/spec/integration/criteria/default_scope_spec.rb +51 -0
  382. data/spec/integration/criteria/logical_spec.rb +43 -0
  383. data/spec/integration/criteria/range_spec.rb +359 -0
  384. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  385. data/spec/integration/discriminator_key_spec.rb +391 -0
  386. data/spec/integration/discriminator_value_spec.rb +206 -0
  387. data/spec/integration/document_spec.rb +30 -1
  388. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  389. data/spec/integration/i18n_fallbacks_spec.rb +3 -19
  390. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
  391. data/spec/integration/matcher_operator_data/all.yml +140 -0
  392. data/spec/integration/matcher_operator_data/and.yml +93 -0
  393. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  394. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  397. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  398. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  399. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  400. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  401. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  402. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  403. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  404. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  405. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  406. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  407. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  408. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  409. data/spec/integration/matcher_operator_data/in.yml +210 -0
  410. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  411. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  412. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  413. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  414. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  415. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  416. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  417. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  418. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  419. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  420. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  421. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  422. data/spec/integration/matcher_operator_data/not.yml +196 -0
  423. data/spec/integration/matcher_operator_data/or.yml +137 -0
  424. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  425. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  426. data/spec/integration/matcher_operator_data/size.yml +174 -0
  427. data/spec/integration/matcher_operator_data/type.yml +70 -0
  428. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  429. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  430. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  431. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  432. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  434. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  435. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  436. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  437. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  438. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  440. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  442. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  444. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  445. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  446. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  447. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  448. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  449. data/spec/integration/matcher_operator_spec.rb +122 -0
  450. data/spec/integration/matcher_spec.rb +283 -0
  451. data/spec/integration/persistence/range_field_spec.rb +350 -0
  452. data/spec/integration/server_query_spec.rb +141 -0
  453. data/spec/integration/shardable_spec.rb +20 -5
  454. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  455. data/spec/lite_spec_helper.rb +25 -9
  456. data/spec/mongoid/association/accessors_spec.rb +282 -78
  457. data/spec/mongoid/association/auto_save_spec.rb +72 -34
  458. data/spec/mongoid/association/builders_spec.rb +1 -2
  459. data/spec/mongoid/association/constrainable_spec.rb +0 -1
  460. data/spec/mongoid/association/counter_cache_spec.rb +33 -34
  461. data/spec/mongoid/association/depending_spec.rb +429 -339
  462. data/spec/mongoid/association/eager_spec.rb +6 -6
  463. data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
  464. data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
  465. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -2
  466. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -1
  467. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +150 -14
  468. data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
  469. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
  470. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -1
  471. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +704 -198
  472. data/spec/mongoid/association/embedded/embeds_many_models.rb +194 -1
  473. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -1
  474. data/spec/mongoid/association/embedded/embeds_many_spec.rb +78 -1
  475. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
  476. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -1
  477. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +36 -24
  478. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
  479. data/spec/mongoid/association/embedded/embeds_one_models.rb +20 -1
  480. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
  481. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -3
  482. data/spec/mongoid/association/macros_spec.rb +9 -10
  483. data/spec/mongoid/association/nested/many_spec.rb +0 -1
  484. data/spec/mongoid/association/nested/one_spec.rb +16 -13
  485. data/spec/mongoid/association/options_spec.rb +0 -1
  486. data/spec/mongoid/association/polymorphic_spec.rb +0 -1
  487. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -2
  488. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +109 -17
  489. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
  490. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +112 -59
  491. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  492. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +20 -1
  493. data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -22
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -2
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +523 -372
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -1
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +56 -3
  502. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -2
  503. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +130 -1
  504. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
  505. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +413 -130
  506. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
  507. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +857 -503
  508. data/spec/mongoid/association/referenced/has_many_models.rb +59 -2
  509. data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
  510. data/spec/mongoid/association/referenced/has_many_spec.rb +46 -1
  511. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
  512. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -10
  513. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
  514. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +133 -28
  515. data/spec/mongoid/association/referenced/has_one_models.rb +63 -1
  516. data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
  517. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -2
  518. data/spec/mongoid/association/reflections_spec.rb +0 -1
  519. data/spec/mongoid/association/syncable_spec.rb +46 -33
  520. data/spec/mongoid/association_spec.rb +0 -1
  521. data/spec/mongoid/atomic/modifiers_spec.rb +47 -1
  522. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
  523. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
  524. data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
  525. data/spec/mongoid/atomic/paths_spec.rb +91 -13
  526. data/spec/mongoid/atomic_spec.rb +51 -7
  527. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -79
  529. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +22 -23
  534. data/spec/mongoid/attributes_spec.rb +888 -62
  535. data/spec/mongoid/cacheable_spec.rb +4 -5
  536. data/spec/mongoid/changeable_spec.rb +464 -73
  537. data/spec/mongoid/clients/factory_spec.rb +91 -9
  538. data/spec/mongoid/clients/options_spec.rb +27 -19
  539. data/spec/mongoid/clients/sessions_spec.rb +27 -67
  540. data/spec/mongoid/clients/transactions_spec.rb +69 -35
  541. data/spec/mongoid/clients_spec.rb +187 -24
  542. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  543. data/spec/mongoid/composable_spec.rb +0 -1
  544. data/spec/mongoid/config/defaults_spec.rb +160 -0
  545. data/spec/mongoid/config/environment_spec.rb +124 -9
  546. data/spec/mongoid/config/options_spec.rb +0 -1
  547. data/spec/mongoid/config_spec.rb +465 -1
  548. data/spec/mongoid/contextual/aggregable/memory_spec.rb +431 -154
  549. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  550. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  551. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +120 -21
  552. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  553. data/spec/mongoid/contextual/atomic_spec.rb +148 -86
  554. data/spec/mongoid/contextual/geo_near_spec.rb +28 -20
  555. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -20
  556. data/spec/mongoid/contextual/memory_spec.rb +1826 -304
  557. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  558. data/spec/mongoid/contextual/mongo_spec.rb +3501 -1272
  559. data/spec/mongoid/contextual/none_spec.rb +78 -68
  560. data/spec/mongoid/copyable_spec.rb +657 -37
  561. data/spec/mongoid/copyable_spec_models.rb +28 -1
  562. data/spec/mongoid/criteria/findable_spec.rb +109 -234
  563. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  564. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  565. data/spec/mongoid/criteria/inspectable_spec.rb +0 -1
  566. data/spec/mongoid/criteria/marshalable_spec.rb +18 -2
  567. data/spec/mongoid/criteria/modifiable_spec.rb +37 -38
  568. data/spec/mongoid/criteria/options_spec.rb +0 -1
  569. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
  570. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -74
  571. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -20
  572. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -27
  573. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -2
  574. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -1
  575. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -1
  576. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
  577. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -16
  578. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
  579. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
  580. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  581. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
  582. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
  583. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -2
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -8
  585. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
  586. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +5 -71
  587. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -60
  588. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +30 -8
  589. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +39 -2
  590. data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
  591. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +143 -13
  592. data/spec/mongoid/criteria/queryable/optional_spec.rb +16 -486
  593. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -2
  594. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
  595. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
  596. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1186 -195
  597. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  598. data/spec/mongoid/criteria/queryable/selectable_spec.rb +307 -705
  599. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  600. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -4
  601. data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
  602. data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
  603. data/spec/mongoid/criteria/scopable_spec.rb +127 -1
  604. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  605. data/spec/mongoid/criteria_projection_spec.rb +406 -0
  606. data/spec/mongoid/criteria_spec.rb +1267 -1739
  607. data/spec/mongoid/document_fields_spec.rb +179 -5
  608. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  609. data/spec/mongoid/document_query_spec.rb +51 -1
  610. data/spec/mongoid/document_spec.rb +151 -88
  611. data/spec/mongoid/equality_spec.rb +142 -42
  612. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
  613. data/spec/mongoid/errors/callback_spec.rb +0 -1
  614. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -3
  615. data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
  616. data/spec/mongoid/errors/document_not_found_spec.rb +76 -1
  617. data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
  618. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +5 -6
  619. data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
  620. data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
  621. data/spec/mongoid/errors/invalid_field_spec.rb +1 -2
  622. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  623. data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
  624. data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
  625. data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
  626. data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
  627. data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
  628. data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
  629. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
  630. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
  631. data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
  632. data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
  633. data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
  634. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
  635. data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
  636. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -9
  637. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
  638. data/spec/mongoid/errors/no_client_config_spec.rb +2 -3
  639. data/spec/mongoid/errors/no_client_database_spec.rb +3 -4
  640. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -4
  641. data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
  642. data/spec/mongoid/errors/no_environment_spec.rb +3 -4
  643. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
  644. data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
  645. data/spec/mongoid/errors/no_parent_spec.rb +0 -1
  646. data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
  647. data/spec/mongoid/errors/readonly_document_spec.rb +2 -3
  648. data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
  649. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -2
  650. data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
  651. data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
  652. data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
  653. data/spec/mongoid/errors/validations_spec.rb +0 -1
  654. data/spec/mongoid/extensions/array_spec.rb +16 -3
  655. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -213
  656. data/spec/mongoid/extensions/binary_spec.rb +44 -10
  657. data/spec/mongoid/extensions/boolean_spec.rb +68 -83
  658. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -4
  659. data/spec/mongoid/extensions/date_spec.rb +71 -2
  660. data/spec/mongoid/extensions/date_time_spec.rb +15 -10
  661. data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
  662. data/spec/mongoid/extensions/false_class_spec.rb +1 -2
  663. data/spec/mongoid/extensions/float_spec.rb +53 -75
  664. data/spec/mongoid/extensions/hash_spec.rb +30 -1
  665. data/spec/mongoid/extensions/integer_spec.rb +50 -65
  666. data/spec/mongoid/extensions/module_spec.rb +0 -1
  667. data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
  668. data/spec/mongoid/extensions/object_id_spec.rb +0 -1
  669. data/spec/mongoid/extensions/object_spec.rb +0 -1
  670. data/spec/mongoid/extensions/range_spec.rb +255 -55
  671. data/spec/mongoid/extensions/regexp_spec.rb +58 -34
  672. data/spec/mongoid/extensions/set_spec.rb +106 -1
  673. data/spec/mongoid/extensions/string_spec.rb +58 -31
  674. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  675. data/spec/mongoid/extensions/symbol_spec.rb +18 -26
  676. data/spec/mongoid/extensions/time_spec.rb +639 -107
  677. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -84
  678. data/spec/mongoid/extensions/true_class_spec.rb +1 -2
  679. data/spec/mongoid/extensions_spec.rb +14 -3
  680. data/spec/mongoid/factory_spec.rb +323 -30
  681. data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
  682. data/spec/mongoid/fields/localized_spec.rb +84 -42
  683. data/spec/mongoid/fields/standard_spec.rb +0 -1
  684. data/spec/mongoid/fields_spec.rb +855 -118
  685. data/spec/mongoid/findable_spec.rb +518 -65
  686. data/spec/mongoid/indexable/specification_spec.rb +2 -3
  687. data/spec/mongoid/indexable_spec.rb +85 -33
  688. data/spec/mongoid/inspectable_spec.rb +37 -3
  689. data/spec/mongoid/interceptable_spec.rb +702 -104
  690. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  691. data/spec/mongoid/loggable_spec.rb +0 -1
  692. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  693. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  694. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  695. data/spec/mongoid/mongoizable_spec.rb +285 -0
  696. data/spec/mongoid/persistable/creatable_spec.rb +112 -30
  697. data/spec/mongoid/persistable/deletable_spec.rb +298 -19
  698. data/spec/mongoid/persistable/destroyable_spec.rb +226 -19
  699. data/spec/mongoid/persistable/incrementable_spec.rb +45 -9
  700. data/spec/mongoid/persistable/logical_spec.rb +41 -5
  701. data/spec/mongoid/persistable/poppable_spec.rb +40 -5
  702. data/spec/mongoid/persistable/pullable_spec.rb +80 -9
  703. data/spec/mongoid/persistable/pushable_spec.rb +80 -9
  704. data/spec/mongoid/persistable/renamable_spec.rb +39 -4
  705. data/spec/mongoid/persistable/savable_spec.rb +282 -26
  706. data/spec/mongoid/persistable/settable_spec.rb +76 -10
  707. data/spec/mongoid/persistable/unsettable_spec.rb +40 -5
  708. data/spec/mongoid/persistable/updatable_spec.rb +61 -50
  709. data/spec/mongoid/persistable/upsertable_spec.rb +91 -4
  710. data/spec/mongoid/persistable_spec.rb +3 -4
  711. data/spec/mongoid/persistence_context_spec.rb +57 -59
  712. data/spec/mongoid/positional_spec.rb +0 -1
  713. data/spec/mongoid/query_cache_middleware_spec.rb +7 -5
  714. data/spec/mongoid/query_cache_spec.rb +424 -68
  715. data/spec/mongoid/relations/proxy_spec.rb +7 -8
  716. data/spec/mongoid/reloadable_spec.rb +355 -27
  717. data/spec/mongoid/scopable_spec.rb +191 -39
  718. data/spec/mongoid/selectable_spec.rb +6 -7
  719. data/spec/mongoid/serializable_spec.rb +35 -39
  720. data/spec/mongoid/shardable_models.rb +15 -1
  721. data/spec/mongoid/shardable_spec.rb +181 -32
  722. data/spec/mongoid/stateful_spec.rb +151 -10
  723. data/spec/mongoid/tasks/database_rake_spec.rb +87 -14
  724. data/spec/mongoid/tasks/database_spec.rb +128 -2
  725. data/spec/mongoid/threaded_spec.rb +2 -3
  726. data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
  727. data/spec/mongoid/timestamps/created_spec.rb +1 -2
  728. data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
  729. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
  730. data/spec/mongoid/timestamps/updated_spec.rb +3 -4
  731. data/spec/mongoid/timestamps_spec.rb +398 -11
  732. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  733. data/spec/mongoid/touchable_spec.rb +525 -36
  734. data/spec/mongoid/touchable_spec_models.rb +59 -0
  735. data/spec/mongoid/traversable_spec.rb +1143 -2
  736. data/spec/mongoid/validatable/associated_spec.rb +0 -1
  737. data/spec/mongoid/validatable/format_spec.rb +0 -1
  738. data/spec/mongoid/validatable/length_spec.rb +0 -1
  739. data/spec/mongoid/validatable/numericality_spec.rb +0 -1
  740. data/spec/mongoid/validatable/presence_spec.rb +26 -23
  741. data/spec/mongoid/validatable/uniqueness_spec.rb +125 -99
  742. data/spec/mongoid/validatable_spec.rb +3 -4
  743. data/spec/mongoid/warnings_spec.rb +35 -0
  744. data/spec/mongoid_spec.rb +35 -10
  745. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -3
  746. data/spec/rails/mongoid_spec.rb +4 -17
  747. data/spec/shared/LICENSE +20 -0
  748. data/spec/shared/bin/get-mongodb-download-url +17 -0
  749. data/spec/shared/bin/s3-copy +45 -0
  750. data/spec/shared/bin/s3-upload +69 -0
  751. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  752. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  753. data/spec/shared/lib/mrss/constraints.rb +378 -0
  754. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  755. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  756. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  757. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  758. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  759. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  760. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  761. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  762. data/spec/shared/lib/mrss/utils.rb +37 -0
  763. data/spec/shared/share/Dockerfile.erb +321 -0
  764. data/spec/shared/share/haproxy-1.conf +16 -0
  765. data/spec/shared/share/haproxy-2.conf +17 -0
  766. data/spec/shared/shlib/config.sh +27 -0
  767. data/spec/shared/shlib/distro.sh +74 -0
  768. data/spec/shared/shlib/server.sh +416 -0
  769. data/spec/shared/shlib/set_env.sh +169 -0
  770. data/spec/spec_helper.rb +24 -54
  771. data/spec/support/authorization.rb +0 -1
  772. data/spec/support/client_registry.rb +9 -0
  773. data/spec/support/constraints.rb +34 -197
  774. data/spec/support/expectations.rb +0 -1
  775. data/spec/support/helpers.rb +1 -1
  776. data/spec/support/immutable_ids.rb +118 -0
  777. data/spec/support/macros.rb +109 -1
  778. data/spec/{app → support}/models/account.rb +1 -2
  779. data/spec/{app → support}/models/acolyte.rb +0 -1
  780. data/spec/{app → support}/models/actor.rb +1 -2
  781. data/spec/{app → support}/models/actress.rb +0 -1
  782. data/spec/{app → support}/models/address.rb +4 -1
  783. data/spec/{app → support}/models/address_component.rb +0 -1
  784. data/spec/{app → support}/models/address_number.rb +0 -1
  785. data/spec/{app → support}/models/agency.rb +0 -1
  786. data/spec/{app → support}/models/agent.rb +0 -1
  787. data/spec/{app → support}/models/album.rb +0 -1
  788. data/spec/{app → support}/models/alert.rb +0 -1
  789. data/spec/{app → support}/models/animal.rb +0 -1
  790. data/spec/{app → support}/models/answer.rb +0 -1
  791. data/spec/{app → support}/models/appointment.rb +0 -1
  792. data/spec/support/models/armrest.rb +9 -0
  793. data/spec/{app → support}/models/array_field.rb +0 -1
  794. data/spec/{app → support}/models/article.rb +0 -1
  795. data/spec/{app → support}/models/artist.rb +2 -2
  796. data/spec/{app → support}/models/artwork.rb +0 -1
  797. data/spec/support/models/audible_sound.rb +3 -0
  798. data/spec/{app → support}/models/audio.rb +0 -1
  799. data/spec/support/models/augmentation.rb +25 -0
  800. data/spec/{app → support}/models/author.rb +0 -1
  801. data/spec/{app → support}/models/baby.rb +0 -1
  802. data/spec/{app → support}/models/band.rb +8 -1
  803. data/spec/{app → support}/models/bar.rb +0 -1
  804. data/spec/{app → support}/models/basic.rb +0 -1
  805. data/spec/{app → support}/models/bed.rb +0 -1
  806. data/spec/{app → support}/models/big_palette.rb +0 -1
  807. data/spec/{app → support}/models/birthday.rb +0 -1
  808. data/spec/support/models/bolt.rb +7 -0
  809. data/spec/{app → support}/models/bomb.rb +0 -1
  810. data/spec/{app → support}/models/book.rb +1 -1
  811. data/spec/{app → support}/models/breed.rb +0 -1
  812. data/spec/{app → support}/models/browser.rb +1 -2
  813. data/spec/{app → support}/models/building.rb +2 -1
  814. data/spec/{app → support}/models/building_address.rb +0 -1
  815. data/spec/{app → support}/models/bus.rb +0 -1
  816. data/spec/{app → support}/models/business.rb +0 -1
  817. data/spec/{app → support}/models/callback_test.rb +0 -1
  818. data/spec/{app → support}/models/canvas.rb +1 -2
  819. data/spec/{app → support}/models/car.rb +0 -1
  820. data/spec/{app → support}/models/cat.rb +0 -1
  821. data/spec/support/models/catalog.rb +24 -0
  822. data/spec/{app → support}/models/category.rb +0 -1
  823. data/spec/{app → support}/models/child.rb +0 -1
  824. data/spec/{app → support}/models/child_doc.rb +3 -4
  825. data/spec/{app → support}/models/church.rb +0 -1
  826. data/spec/{app → support}/models/circle.rb +0 -1
  827. data/spec/{app → support}/models/circuit.rb +0 -1
  828. data/spec/{app → support}/models/circus.rb +3 -1
  829. data/spec/{app → support}/models/code.rb +2 -1
  830. data/spec/{app → support}/models/coding/pull_request.rb +0 -1
  831. data/spec/support/models/coding.rb +3 -0
  832. data/spec/{app → support}/models/comment.rb +0 -1
  833. data/spec/{app → support}/models/company.rb +0 -1
  834. data/spec/{app → support}/models/consumption_period.rb +0 -1
  835. data/spec/{app → support}/models/contextable_item.rb +0 -1
  836. data/spec/{app → support}/models/contractor.rb +0 -1
  837. data/spec/{app → support}/models/cookie.rb +0 -1
  838. data/spec/{app → support}/models/country_code.rb +2 -1
  839. data/spec/{app → support}/models/courier_job.rb +0 -1
  840. data/spec/support/models/cover.rb +10 -0
  841. data/spec/support/models/crate.rb +12 -0
  842. data/spec/support/models/customer.rb +10 -0
  843. data/spec/support/models/customer_address.rb +11 -0
  844. data/spec/support/models/deed.rb +7 -0
  845. data/spec/{app → support}/models/definition.rb +0 -1
  846. data/spec/{app → support}/models/delegating_patient.rb +0 -1
  847. data/spec/{app → support}/models/description.rb +0 -1
  848. data/spec/{app → support}/models/dictionary.rb +6 -1
  849. data/spec/{app → support}/models/division.rb +0 -1
  850. data/spec/{app → support}/models/doctor.rb +0 -1
  851. data/spec/{app → support}/models/dog.rb +0 -1
  852. data/spec/{app → support}/models/dokument.rb +0 -1
  853. data/spec/{app → support}/models/draft.rb +0 -1
  854. data/spec/{app → support}/models/dragon.rb +0 -1
  855. data/spec/{app → support}/models/driver.rb +1 -2
  856. data/spec/{app → support}/models/drug.rb +0 -1
  857. data/spec/{app → support}/models/dungeon.rb +0 -1
  858. data/spec/{app → support}/models/edit.rb +0 -1
  859. data/spec/{app → support}/models/email.rb +0 -1
  860. data/spec/{app → support}/models/employer.rb +0 -1
  861. data/spec/{app → support}/models/entry.rb +0 -1
  862. data/spec/{app → support}/models/eraser.rb +0 -1
  863. data/spec/{app → support}/models/even.rb +0 -1
  864. data/spec/{app → support}/models/event.rb +0 -1
  865. data/spec/{app → support}/models/exhibition.rb +0 -1
  866. data/spec/{app → support}/models/exhibitor.rb +0 -1
  867. data/spec/{app → support}/models/explosion.rb +0 -1
  868. data/spec/{app → support}/models/eye.rb +0 -1
  869. data/spec/{app → support}/models/eye_bowl.rb +0 -1
  870. data/spec/{app → support}/models/face.rb +0 -1
  871. data/spec/support/models/fanatic.rb +8 -0
  872. data/spec/{app → support}/models/favorite.rb +0 -1
  873. data/spec/{app → support}/models/filesystem.rb +0 -1
  874. data/spec/{app → support}/models/fire_hydrant.rb +0 -1
  875. data/spec/{app → support}/models/firefox.rb +0 -1
  876. data/spec/{app → support}/models/fish.rb +0 -1
  877. data/spec/{app → support}/models/folder.rb +0 -1
  878. data/spec/{app → support}/models/folder_item.rb +0 -1
  879. data/spec/{app → support}/models/fruits.rb +0 -1
  880. data/spec/{app → support}/models/game.rb +0 -1
  881. data/spec/{app → support}/models/ghost.rb +0 -1
  882. data/spec/support/models/guitar.rb +4 -0
  883. data/spec/support/models/hole.rb +12 -0
  884. data/spec/{app → support}/models/home.rb +0 -1
  885. data/spec/{app → support}/models/house.rb +0 -1
  886. data/spec/{app → support}/models/html_writer.rb +0 -1
  887. data/spec/{app → support}/models/id_key.rb +0 -1
  888. data/spec/support/models/idnodef.rb +7 -0
  889. data/spec/{app → support}/models/image.rb +0 -1
  890. data/spec/{app → support}/models/implant.rb +9 -1
  891. data/spec/support/models/instrument.rb +8 -0
  892. data/spec/{app → support}/models/item.rb +1 -2
  893. data/spec/{app → support}/models/jar.rb +0 -1
  894. data/spec/{app → support}/models/kaleidoscope.rb +0 -1
  895. data/spec/{app → support}/models/kangaroo.rb +0 -1
  896. data/spec/{app → support}/models/label.rb +4 -2
  897. data/spec/{app → support}/models/language.rb +0 -1
  898. data/spec/{app → support}/models/lat_lng.rb +0 -1
  899. data/spec/{app → support}/models/league.rb +0 -1
  900. data/spec/{app → support}/models/learner.rb +0 -1
  901. data/spec/{app → support}/models/line_item.rb +0 -1
  902. data/spec/{app → support}/models/location.rb +0 -1
  903. data/spec/{app → support}/models/login.rb +0 -1
  904. data/spec/{app → support}/models/manufacturer.rb +0 -1
  905. data/spec/{app → support}/models/meat.rb +0 -1
  906. data/spec/{app → support}/models/membership.rb +1 -1
  907. data/spec/{app → support}/models/message.rb +0 -1
  908. data/spec/{app → support}/models/minim.rb +0 -1
  909. data/spec/{app → support}/models/mixed_drink.rb +0 -1
  910. data/spec/support/models/mop.rb +24 -0
  911. data/spec/{app → support}/models/movie.rb +0 -1
  912. data/spec/{app → support}/models/my_hash.rb +0 -1
  913. data/spec/{app → support}/models/name.rb +0 -1
  914. data/spec/{app → support}/models/name_only.rb +0 -1
  915. data/spec/{app → support}/models/node.rb +0 -1
  916. data/spec/{app → support}/models/note.rb +0 -1
  917. data/spec/support/models/nut.rb +7 -0
  918. data/spec/{app → support}/models/odd.rb +0 -1
  919. data/spec/support/models/order.rb +12 -0
  920. data/spec/{app → support}/models/ordered_post.rb +1 -2
  921. data/spec/{app → support}/models/ordered_preference.rb +0 -1
  922. data/spec/{app → support}/models/oscar.rb +0 -1
  923. data/spec/{app → support}/models/other_owner_object.rb +0 -1
  924. data/spec/{app → support}/models/override.rb +0 -1
  925. data/spec/{app → support}/models/ownable.rb +0 -1
  926. data/spec/{app → support}/models/owner.rb +2 -1
  927. data/spec/{app → support}/models/pack.rb +0 -1
  928. data/spec/{app → support}/models/page.rb +0 -1
  929. data/spec/{app → support}/models/page_question.rb +0 -1
  930. data/spec/{app → support}/models/palette.rb +1 -2
  931. data/spec/{app → support}/models/parent.rb +0 -1
  932. data/spec/{app → support}/models/parent_doc.rb +0 -1
  933. data/spec/support/models/passport.rb +22 -0
  934. data/spec/{app → support}/models/patient.rb +0 -1
  935. data/spec/{app → support}/models/pdf_writer.rb +0 -1
  936. data/spec/{app → support}/models/pencil.rb +0 -1
  937. data/spec/{app → support}/models/person.rb +20 -2
  938. data/spec/{app → support}/models/pet.rb +0 -1
  939. data/spec/{app → support}/models/pet_owner.rb +0 -1
  940. data/spec/{app → support}/models/phone.rb +3 -2
  941. data/spec/support/models/piano.rb +4 -0
  942. data/spec/{app → support}/models/pizza.rb +0 -1
  943. data/spec/{app → support}/models/player.rb +2 -1
  944. data/spec/{app → support}/models/post.rb +0 -1
  945. data/spec/{app → support}/models/post_genre.rb +0 -1
  946. data/spec/support/models/powerup.rb +25 -0
  947. data/spec/{app → support}/models/preference.rb +0 -1
  948. data/spec/{app → support}/models/princess.rb +0 -1
  949. data/spec/{app → support}/models/product.rb +1 -1
  950. data/spec/support/models/profile.rb +17 -0
  951. data/spec/{app → support}/models/pronunciation.rb +0 -1
  952. data/spec/{app → support}/models/pub.rb +0 -1
  953. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -1
  954. data/spec/{app → support}/models/publication/review.rb +0 -1
  955. data/spec/support/models/publication.rb +4 -0
  956. data/spec/{app → support}/models/purchase.rb +0 -1
  957. data/spec/support/models/purchased_item.rb +10 -0
  958. data/spec/{app → support}/models/question.rb +0 -1
  959. data/spec/{app → support}/models/quiz.rb +0 -1
  960. data/spec/{app → support}/models/rating.rb +0 -1
  961. data/spec/{app → support}/models/record.rb +0 -1
  962. data/spec/{app → support}/models/registry.rb +1 -1
  963. data/spec/{app → support}/models/role.rb +0 -1
  964. data/spec/{app → support}/models/root_category.rb +0 -1
  965. data/spec/{app → support}/models/sandwich.rb +0 -1
  966. data/spec/{app → support}/models/scheduler.rb +0 -1
  967. data/spec/support/models/school.rb +14 -0
  968. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -3
  969. data/spec/support/models/sealer.rb +7 -0
  970. data/spec/support/models/seat.rb +24 -0
  971. data/spec/{app → support}/models/seo.rb +0 -1
  972. data/spec/{app → support}/models/series.rb +1 -1
  973. data/spec/{app → support}/models/server.rb +0 -1
  974. data/spec/{app → support}/models/service.rb +0 -1
  975. data/spec/{app → support}/models/shape.rb +2 -3
  976. data/spec/{app → support}/models/shelf.rb +0 -1
  977. data/spec/support/models/shield.rb +18 -0
  978. data/spec/{app → support}/models/shipment_address.rb +0 -1
  979. data/spec/{app → support}/models/shipping_container.rb +0 -1
  980. data/spec/{app → support}/models/shipping_pack.rb +0 -1
  981. data/spec/support/models/shirt.rb +11 -0
  982. data/spec/{app → support}/models/shop.rb +0 -1
  983. data/spec/{app → support}/models/short_agent.rb +0 -1
  984. data/spec/{app → support}/models/short_quiz.rb +0 -1
  985. data/spec/{app → support}/models/simple.rb +0 -1
  986. data/spec/{app → support}/models/slave.rb +0 -1
  987. data/spec/{app → support}/models/song.rb +0 -1
  988. data/spec/{app → support}/models/sound.rb +0 -1
  989. data/spec/support/models/spacer.rb +7 -0
  990. data/spec/{app → support}/models/square.rb +0 -1
  991. data/spec/{app → support}/models/staff.rb +0 -1
  992. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -1
  993. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -1
  994. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -1
  995. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -1
  996. data/spec/{app → support}/models/strategy.rb +0 -1
  997. data/spec/support/models/student.rb +14 -0
  998. data/spec/{app → support}/models/sub_item.rb +0 -1
  999. data/spec/{app → support}/models/subscription.rb +0 -1
  1000. data/spec/{app → support}/models/survey.rb +0 -1
  1001. data/spec/{app → support}/models/symptom.rb +0 -1
  1002. data/spec/support/models/system_role.rb +7 -0
  1003. data/spec/{app → support}/models/tag.rb +0 -1
  1004. data/spec/{app → support}/models/target.rb +0 -1
  1005. data/spec/{app → support}/models/template.rb +0 -1
  1006. data/spec/{app → support}/models/thing.rb +0 -1
  1007. data/spec/support/models/threadlocker.rb +7 -0
  1008. data/spec/{app → support}/models/title.rb +0 -1
  1009. data/spec/{app → support}/models/tool.rb +2 -3
  1010. data/spec/{app → support}/models/topping.rb +0 -1
  1011. data/spec/support/models/toy.rb +9 -0
  1012. data/spec/{app → support}/models/track.rb +0 -1
  1013. data/spec/{app → support}/models/translation.rb +0 -1
  1014. data/spec/{app → support}/models/tree.rb +0 -1
  1015. data/spec/{app → support}/models/truck.rb +2 -1
  1016. data/spec/{app → support}/models/updatable.rb +0 -1
  1017. data/spec/{app → support}/models/user.rb +0 -1
  1018. data/spec/{app → support}/models/user_account.rb +0 -1
  1019. data/spec/{app → support}/models/validation_callback.rb +0 -1
  1020. data/spec/{app → support}/models/vehicle.rb +7 -3
  1021. data/spec/{app → support}/models/version.rb +0 -1
  1022. data/spec/{app → support}/models/vertex.rb +0 -1
  1023. data/spec/{app → support}/models/vet_visit.rb +0 -1
  1024. data/spec/{app → support}/models/video.rb +0 -1
  1025. data/spec/{app → support}/models/video_game.rb +0 -1
  1026. data/spec/support/models/washer.rb +7 -0
  1027. data/spec/support/models/weapon.rb +25 -0
  1028. data/spec/{app → support}/models/wiki_page.rb +1 -1
  1029. data/spec/{app → support}/models/word.rb +0 -1
  1030. data/spec/{app → support}/models/word_origin.rb +0 -1
  1031. data/spec/{app → support}/models/writer.rb +2 -3
  1032. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1033. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1034. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1035. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1036. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1037. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1038. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1039. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1040. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1041. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1042. data/spec/support/shared/time.rb +0 -1
  1043. data/spec/support/spec_config.rb +28 -6
  1044. data.tar.gz.sig +0 -0
  1045. metadata +1216 -799
  1046. metadata.gz.sig +0 -0
  1047. data/lib/mongoid/errors/eager_load.rb +0 -26
  1048. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1049. data/lib/mongoid/matchable/all.rb +0 -30
  1050. data/lib/mongoid/matchable/and.rb +0 -32
  1051. data/lib/mongoid/matchable/default.rb +0 -121
  1052. data/lib/mongoid/matchable/elem_match.rb +0 -36
  1053. data/lib/mongoid/matchable/eq.rb +0 -23
  1054. data/lib/mongoid/matchable/exists.rb +0 -25
  1055. data/lib/mongoid/matchable/gt.rb +0 -25
  1056. data/lib/mongoid/matchable/gte.rb +0 -25
  1057. data/lib/mongoid/matchable/in.rb +0 -26
  1058. data/lib/mongoid/matchable/lt.rb +0 -25
  1059. data/lib/mongoid/matchable/lte.rb +0 -25
  1060. data/lib/mongoid/matchable/ne.rb +0 -23
  1061. data/lib/mongoid/matchable/nin.rb +0 -24
  1062. data/lib/mongoid/matchable/nor.rb +0 -38
  1063. data/lib/mongoid/matchable/or.rb +0 -35
  1064. data/lib/mongoid/matchable/regexp.rb +0 -30
  1065. data/lib/mongoid/matchable/size.rb +0 -23
  1066. data/lib/support/ruby_version.rb +0 -29
  1067. data/spec/app/models/augmentation.rb +0 -14
  1068. data/spec/app/models/coding.rb +0 -4
  1069. data/spec/app/models/passport.rb +0 -8
  1070. data/spec/app/models/powerup.rb +0 -14
  1071. data/spec/app/models/publication.rb +0 -5
  1072. data/spec/app/models/weapon.rb +0 -14
  1073. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1074. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1075. data/spec/mongoid/matchable/all_spec.rb +0 -34
  1076. data/spec/mongoid/matchable/and_spec.rb +0 -190
  1077. data/spec/mongoid/matchable/default_spec.rb +0 -140
  1078. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  1079. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  1080. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  1081. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  1082. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  1083. data/spec/mongoid/matchable/in_spec.rb +0 -52
  1084. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  1085. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  1086. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  1087. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  1088. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  1089. data/spec/mongoid/matchable/or_spec.rb +0 -134
  1090. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  1091. data/spec/mongoid/matchable/size_spec.rb +0 -28
  1092. data/spec/mongoid/matchable_spec.rb +0 -856
  1093. data/spec/support/cluster_config.rb +0 -158
  1094. data/spec/support/lite_constraints.rb +0 -22
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
3
+ require "mongoid/config/defaults"
4
4
  require "mongoid/config/environment"
5
5
  require "mongoid/config/options"
6
6
  require "mongoid/config/validators"
@@ -12,6 +12,7 @@ module Mongoid
12
12
  module Config
13
13
  extend Forwardable
14
14
  extend Options
15
+ extend Defaults
15
16
  extend self
16
17
 
17
18
  def_delegators ::Mongoid, :logger, :logger=
@@ -24,7 +25,8 @@ module Mongoid
24
25
  # database name is not explicitly defined.
25
26
  option :app_name, default: nil
26
27
 
27
- # Create indexes in background by default.
28
+ # (Deprecated) In MongoDB 4.0 and earlier, set whether to create
29
+ # indexes in the background by default. (default: false)
28
30
  option :background_indexing, default: false
29
31
 
30
32
  # Mark belongs_to associations as required by default, so that saving a
@@ -32,6 +34,9 @@ module Mongoid
32
34
  # error.
33
35
  option :belongs_to_required_by_default, default: true
34
36
 
37
+ # Set the global discriminator key.
38
+ option :discriminator_key, default: "_type"
39
+
35
40
  # Raise an exception when a field is redefined.
36
41
  option :duplicate_fields_exception, default: false
37
42
 
@@ -67,20 +72,116 @@ module Mongoid
67
72
 
68
73
  # Use ActiveSupport's time zone in time operations instead of the
69
74
  # Ruby default time zone.
75
+ # @deprecated
70
76
  option :use_activesupport_time_zone, default: true
71
77
 
72
78
  # Return stored times as UTC.
73
79
  option :use_utc, default: false
74
80
 
81
+ # Store BigDecimals as Decimal128s instead of strings in the db.
82
+ option :map_big_decimal_to_decimal128, default: true
83
+
84
+ # Update embedded documents correctly when setting it, unsetting it
85
+ # and resetting it. See MONGOID-5206 and MONGOID-5240 for more details.
86
+ option :broken_updates, default: false
87
+
88
+ # Maintain legacy behavior of === on Mongoid documents, which returns
89
+ # true in a number of cases where Ruby's === implementation would
90
+ # return false.
91
+ option :legacy_triple_equals, default: false
92
+
93
+ # When exiting a nested `with_scope' block, set the current scope to
94
+ # nil instead of the parent scope for backwards compatibility.
95
+ option :broken_scoping, default: false
96
+
97
+ # Maintain broken behavior of sum over empty result sets for backwards
98
+ # compatibility.
99
+ option :broken_aggregables, default: false
100
+
101
+ # Ignore aliased fields in embedded documents when performing pluck and
102
+ # distinct operations, for backwards compatibility.
103
+ option :broken_alias_handling, default: false
104
+
105
+ # Maintain broken `and' behavior when using the same operator on the same
106
+ # field multiple times for backwards compatibility.
107
+ option :broken_and, default: false
108
+
109
+ # Use millisecond precision when comparing Time objects with the _matches?
110
+ # function.
111
+ option :compare_time_by_ms, default: true
112
+
113
+ # Use bson-ruby's implementation of as_json for BSON::ObjectId instead of
114
+ # the one monkey-patched into Mongoid.
115
+ option :object_id_as_json_oid, default: false
116
+
117
+ # Maintain legacy behavior of pluck and distinct, which does not
118
+ # demongoize the values on returning them.
119
+ option :legacy_pluck_distinct, default: false
120
+
121
+ # Combine chained operators, which use the same field and operator,
122
+ # using and's instead of overwriting them.
123
+ option :overwrite_chained_operators, default: false
124
+
125
+ # When this flag is true, the attributes method on a document will return
126
+ # a BSON::Document when that document is retrieved from the database, and
127
+ # a Hash otherwise. When this flag is false, the attributes method will
128
+ # always return a Hash.
129
+ option :legacy_attributes, default: false
130
+
131
+ # Sets the async_query_executor for the application. By default the thread pool executor
132
+ # is set to `:immediate. Options are:
133
+ #
134
+ # - :immediate - Initializes a single +Concurrent::ImmediateExecutor+
135
+ # - :global_thread_pool - Initializes a single +Concurrent::ThreadPoolExecutor+
136
+ # that uses the +async_query_concurrency+ for the +max_threads+ value.
137
+ option :async_query_executor, default: :immediate
138
+
139
+ # Defines how many asynchronous queries can be executed concurrently.
140
+ # This option should be set only if `async_query_executor` is set
141
+ # to `:global_thread_pool`.
142
+ option :global_executor_concurrency, default: nil
143
+
144
+ # When this flag is false, a document will become read-only only once the
145
+ # #readonly! method is called, and an error will be raised on attempting
146
+ # to save or update such documents, instead of just on delete. When this
147
+ # flag is true, a document is only read-only if it has been projected
148
+ # using #only or #without, and read-only documents will not be
149
+ # deletable/destroyable, but they will be savable/updatable.
150
+ # When this feature flag is turned on, the read-only state will be reset on
151
+ # reload, but when it is turned off, it won't be.
152
+ option :legacy_readonly, default: true
153
+
154
+ # When this flag is true, any attempt to change the _id of a persisted
155
+ # document will raise an exception (`Errors::ImmutableAttribute`).
156
+ # This will be the default in 9.0. When this flag is false (the default
157
+ # in 8.x), changing the _id of a persisted document might be ignored,
158
+ # or it might work, depending on the situation.
159
+ option :immutable_ids, default: false
160
+
161
+ # When this flag is true, callbacks for every embedded document will be
162
+ # called only once, even if the embedded document is embedded in multiple
163
+ # documents in the root document's dependencies graph.
164
+ # This will be the default in 9.0. Setting this flag to false restores the
165
+ # pre-9.0 behavior, where callbacks are called for every occurrence of an
166
+ # embedded document. The pre-9.0 behavior leads to a problem that for multi
167
+ # level nested documents callbacks are called multiple times.
168
+ # See https://jira.mongodb.org/browse/MONGOID-5542
169
+ option :prevent_multiple_calls_of_embedded_callbacks, default: false
170
+
171
+ # Returns the Config singleton, for use in the configure DSL.
172
+ #
173
+ # @return [ self ] The Config singleton.
174
+ def config
175
+ self
176
+ end
177
+
75
178
  # Has Mongoid been configured? This is checking that at least a valid
76
179
  # client config exists.
77
180
  #
78
181
  # @example Is Mongoid configured?
79
182
  # config.configured?
80
183
  #
81
- # @return [ true, false ] If Mongoid is configured.
82
- #
83
- # @since 3.0.9
184
+ # @return [ true | false ] If Mongoid is configured.
84
185
  def configured?
85
186
  clients.key?(:default)
86
187
  end
@@ -93,8 +194,6 @@ module Mongoid
93
194
  # config.connect_to("mongoid_test")
94
195
  #
95
196
  # @param [ String ] name The database name.
96
- #
97
- # @since 3.0.0
98
197
  def connect_to(name, options = { read: { mode: :primary }})
99
198
  self.clients = {
100
199
  default: {
@@ -123,9 +222,7 @@ module Mongoid
123
222
  # Mongoid.load!("/path/to/mongoid.yml")
124
223
  #
125
224
  # @param [ String ] path The path to the file.
126
- # @param [ String, Symbol ] environment The environment to load.
127
- #
128
- # @since 2.0.1
225
+ # @param [ String | Symbol ] environment The environment to load.
129
226
  def load!(path, environment = nil)
130
227
  settings = Environment.load_yaml(path, environment)
131
228
  if settings.present?
@@ -143,8 +240,6 @@ module Mongoid
143
240
  # config.models
144
241
  #
145
242
  # @return [ Array<Class> ] All the models in the application.
146
- #
147
- # @since 3.1.0
148
243
  def models
149
244
  @models ||= []
150
245
  end
@@ -155,26 +250,34 @@ module Mongoid
155
250
  # config.register_model(Band)
156
251
  #
157
252
  # @param [ Class ] klass The model to register.
158
- #
159
- # @since 3.1.0
160
253
  def register_model(klass)
161
254
  LOCK.synchronize do
162
255
  models.push(klass) unless models.include?(klass)
163
256
  end
164
257
  end
165
258
 
259
+ # Deregister a model in the application with Mongoid.
260
+ #
261
+ # @param [ Class ] klass The model to deregister.
262
+ #
263
+ # @api private
264
+ def deregister_model(klass)
265
+ LOCK.synchronize do
266
+ models.delete(klass)
267
+ end
268
+ end
269
+
166
270
  # From a hash of settings, load all the configuration.
167
271
  #
168
272
  # @example Load the configuration.
169
273
  # config.load_configuration(settings)
170
274
  #
171
275
  # @param [ Hash ] settings The configuration settings.
172
- #
173
- # @since 3.1.0
174
276
  def load_configuration(settings)
175
277
  configuration = settings.with_indifferent_access
176
278
  self.options = configuration[:options]
177
279
  self.clients = configuration[:clients]
280
+ Mongo.options = configuration[:driver_options] || {}
178
281
  set_log_levels
179
282
  end
180
283
 
@@ -183,11 +286,9 @@ module Mongoid
183
286
  # @example Override the database globally.
184
287
  # config.override_database(:optional)
185
288
  #
186
- # @param [ String, Symbol ] name The name of the database.
187
- #
188
- # @return [ String, Symbol ] The global override.
289
+ # @param [ String | Symbol ] name The name of the database.
189
290
  #
190
- # @since 3.0.0
291
+ # @return [ String | Symbol ] The global override.
191
292
  def override_database(name)
192
293
  Threaded.database_override = name
193
294
  end
@@ -197,11 +298,9 @@ module Mongoid
197
298
  # @example Override the client globally.
198
299
  # config.override_client(:optional)
199
300
  #
200
- # @param [ String, Symbol ] name The name of the client.
301
+ # @param [ String | Symbol ] name The name of the client.
201
302
  #
202
- # @return [ String, Symbol ] The global override.
203
- #
204
- # @since 3.0.0
303
+ # @return [ String | Symbol ] The global override.
205
304
  def override_client(name)
206
305
  Threaded.client_override = name ? name.to_s : nil
207
306
  end
@@ -214,10 +313,8 @@ module Mongoid
214
313
  # @note This is the fastest way to drop all data.
215
314
  #
216
315
  # @return [ true ] true.
217
- #
218
- # @since 2.0.2
219
316
  def purge!
220
- Clients.default.database.collections.each(&:drop) and true
317
+ global_client.database.collections.each(&:drop) and true
221
318
  end
222
319
 
223
320
  # Truncate all data in all collections, but not the indexes.
@@ -228,10 +325,8 @@ module Mongoid
228
325
  # @note This will be slower than purge!
229
326
  #
230
327
  # @return [ true ] true.
231
- #
232
- # @since 2.0.2
233
328
  def truncate!
234
- Clients.default.database.collections.each do |collection|
329
+ global_client.database.collections.each do |collection|
235
330
  collection.find.delete_many
236
331
  end and true
237
332
  end
@@ -242,10 +337,9 @@ module Mongoid
242
337
  # config.options = { raise_not_found_error: true }
243
338
  #
244
339
  # @param [ Hash ] options The configuration options.
245
- #
246
- # @since 3.0.0
247
340
  def options=(options)
248
341
  if options
342
+ Validators::AsyncQueryExecutor.validate(options)
249
343
  options.each_pair do |option, value|
250
344
  Validators::Option.validate(option)
251
345
  send("#{option}=", value)
@@ -259,8 +353,6 @@ module Mongoid
259
353
  # config.clients
260
354
  #
261
355
  # @return [ Hash ] The clients configuration.
262
- #
263
- # @since 3.0.0
264
356
  def clients
265
357
  @clients ||= {}
266
358
  end
@@ -271,8 +363,6 @@ module Mongoid
271
363
  # Config.time_zone
272
364
  #
273
365
  # @return [ String ] The time zone.
274
- #
275
- # @since 3.0.0
276
366
  def time_zone
277
367
  use_utc? ? "UTC" : ::Time.zone
278
368
  end
@@ -282,9 +372,7 @@ module Mongoid
282
372
  # @example Is the application using passenger?
283
373
  # config.running_with_passenger?
284
374
  #
285
- # @return [ true, false ] If the app is deployed on Passenger.
286
- #
287
- # @since 3.0.11
375
+ # @return [ true | false ] If the app is deployed on Passenger.
288
376
  def running_with_passenger?
289
377
  @running_with_passenger ||= defined?(PhusionPassenger)
290
378
  end
@@ -302,5 +390,61 @@ module Mongoid
302
390
  Validators::Client.validate(c)
303
391
  @clients = c
304
392
  end
393
+
394
+ # Get database client that respects global overrides
395
+ # Config.override_database and Config.override_client.
396
+ #
397
+ # @return [Mongo::Client] Client according to global overrides.
398
+ def global_client
399
+ client = if Threaded.client_override
400
+ Clients.with_name(Threaded.client_override)
401
+ else
402
+ Clients.default
403
+ end
404
+ if Threaded.database_override
405
+ client.use(Threaded.database_override)
406
+ else
407
+ client
408
+ end
409
+ end
410
+
411
+ module DeprecatedOptions
412
+ OPTIONS = %i[ use_activesupport_time_zone
413
+ broken_aggregables
414
+ broken_alias_handling
415
+ broken_and
416
+ broken_scoping
417
+ broken_updates
418
+ compare_time_by_ms
419
+ legacy_attributes
420
+ legacy_pluck_distinct
421
+ legacy_triple_equals
422
+ object_id_as_json_oid
423
+ overwrite_chained_operators ]
424
+
425
+ if RUBY_VERSION < '3.0'
426
+ def self.prepended(klass)
427
+ klass.class_eval do
428
+ OPTIONS.each do |option|
429
+ alias_method :"#{option}_without_deprecation=", :"#{option}="
430
+
431
+ define_method(:"#{option}=") do |value|
432
+ Mongoid::Warnings.send(:"warn_#{option}_deprecated")
433
+ send(:"#{option}_without_deprecation=", value)
434
+ end
435
+ end
436
+ end
437
+ end
438
+ else
439
+ OPTIONS.each do |option|
440
+ define_method(:"#{option}=") do |value|
441
+ Mongoid::Warnings.send(:"warn_#{option}_deprecated")
442
+ super(value)
443
+ end
444
+ end
445
+ end
446
+ end
447
+
448
+ prepend DeprecatedOptions
305
449
  end
306
450
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
4
3
  module Mongoid
5
4
  module Contextual
@@ -7,6 +6,20 @@ module Mongoid
7
6
  # Contains behavior for aggregating values in memory.
8
7
  module Memory
9
8
 
9
+ # Get all the aggregate values for the provided field.
10
+ # Provided for interface consistency with Aggregable::Mongo.
11
+ #
12
+ # @param [ String | Symbol ] field The field name.
13
+ #
14
+ # @return [ Hash ] A Hash containing the aggregate values.
15
+ # If no documents are present, then returned Hash will have
16
+ # count, sum of 0 and max, min, avg of nil.
17
+ def aggregates(field)
18
+ %w(count sum avg min max).each_with_object({}) do |method, hash|
19
+ hash[method] = send(method, field)
20
+ end
21
+ end
22
+
10
23
  # Get the average value of the provided field.
11
24
  #
12
25
  # @example Get the average of a single field.
@@ -14,11 +27,13 @@ module Mongoid
14
27
  #
15
28
  # @param [ Symbol ] field The field to average.
16
29
  #
17
- # @return [ Float ] The average.
18
- #
19
- # @since 3.0.0
30
+ # @return [ Numeric ] The average.
20
31
  def avg(field)
21
- count > 0 ? sum(field).to_f / count.to_f : nil
32
+ total = count { |doc| !doc.send(field).nil? }
33
+ return nil unless total > 0
34
+
35
+ total = total.to_f if total.is_a?(Integer)
36
+ sum(field) / total
22
37
  end
23
38
 
24
39
  # Get the max value of the provided field. If provided a block, will
@@ -35,12 +50,12 @@ module Mongoid
35
50
  #
36
51
  # @param [ Symbol ] field The field to max.
37
52
  #
38
- # @return [ Float, Document ] The max value or document with the max
53
+ # @return [ Numeric | Document ] The max value or document with the max
39
54
  # value.
40
- #
41
- # @since 3.0.0
42
55
  def max(field = nil)
43
- block_given? ? super() : aggregate_by(field, :max_by)
56
+ return super() if block_given?
57
+
58
+ aggregate_by(field, :max)
44
59
  end
45
60
 
46
61
  # Get the min value of the provided field. If provided a block, will
@@ -57,12 +72,12 @@ module Mongoid
57
72
  #
58
73
  # @param [ Symbol ] field The field to min.
59
74
  #
60
- # @return [ Float, Document ] The min value or document with the min
75
+ # @return [ Numeric | Document ] The min value or document with the min
61
76
  # value.
62
- #
63
- # @since 3.0.0
64
77
  def min(field = nil)
65
- block_given? ? super() : aggregate_by(field, :min_by)
78
+ return super() if block_given?
79
+
80
+ aggregate_by(field, :min)
66
81
  end
67
82
 
68
83
  # Get the sum value of the provided field. If provided a block, will
@@ -76,15 +91,11 @@ module Mongoid
76
91
  #
77
92
  # @param [ Symbol ] field The field to sum.
78
93
  #
79
- # @return [ Float ] The sum value.
80
- #
81
- # @since 3.0.0
94
+ # @return [ Numeric ] The sum value.
82
95
  def sum(field = nil)
83
- if block_given?
84
- super()
85
- else
86
- count > 0 ? super(0) { |doc| doc.public_send(field) } : 0
87
- end
96
+ return super() if block_given?
97
+
98
+ aggregate_by(field, :sum) || 0
88
99
  end
89
100
 
90
101
  private
@@ -94,16 +105,16 @@ module Mongoid
94
105
  # @api private
95
106
  #
96
107
  # @example Aggregate by the field and method.
97
- # aggregable.aggregate_by(:name, :min_by)
108
+ # aggregable.aggregate_by(:likes, :min_by)
98
109
  #
99
110
  # @param [ Symbol ] field The field to aggregate on.
100
111
  # @param [ Symbol ] method The method (min_by or max_by).
101
112
  #
102
- # @return [ Integer ] The aggregate.
103
- #
104
- # @since 3.0.0
113
+ # @return [ Numeric | nil ] The aggregate.
105
114
  def aggregate_by(field, method)
106
- count > 0 ? send(method) { |doc| doc.public_send(field) }.public_send(field) : nil
115
+ return nil unless any?
116
+
117
+ map { |doc| doc.public_send(field) }.compact.public_send(method)
107
118
  end
108
119
  end
109
120
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+
3
+ require "mongoid/contextual/aggregable"
3
4
 
4
5
  module Mongoid
5
6
  module Contextual
@@ -11,23 +12,27 @@ module Mongoid
11
12
  #
12
13
  # @example Get all the aggregate values.
13
14
  # aggregable.aggregates(:likes)
14
- #
15
- # @param [ String, Symbol ] field The field name.
16
- #
17
- # @return [ Hash ] count is a number of documents with the provided field. If there're none, then count is 0 and max, min, sum, avg are nil.
18
- # {
19
- # "count" => 2.0,
20
- # "max" => 1000.0,
21
- # "min" => 500.0,
22
- # "sum" => 1500.0,
23
- # "avg" => 750.0
24
- # }
25
- #
26
- # @since 3.0.0
15
+ # # => {
16
+ # # "count" => 2.0,
17
+ # # "max" => 1000.0,
18
+ # # "min" => 500.0,
19
+ # # "sum" => 1500.0,
20
+ # # "avg" => 750.0
21
+ # # }
22
+ #
23
+ # @param [ String | Symbol ] field The field name.
24
+ #
25
+ # @return [ Hash ] A Hash containing the aggregate values.
26
+ # If no documents are found, then returned Hash will have
27
+ # count, sum of 0 and max, min, avg of nil.
27
28
  def aggregates(field)
28
- result = collection.find.aggregate(pipeline(field), session: _session).to_a
29
+ result = collection.aggregate(pipeline(field), session: _session).to_a
29
30
  if result.empty?
30
- { "count" => 0, "sum" => nil, "avg" => nil, "min" => nil, "max" => nil }
31
+ if Mongoid.broken_aggregables
32
+ { "count" => 0, "sum" => nil, "avg" => nil, "min" => nil, "max" => nil }
33
+ else
34
+ Aggregable::EMPTY_RESULT.dup
35
+ end
31
36
  else
32
37
  result.first
33
38
  end
@@ -41,8 +46,6 @@ module Mongoid
41
46
  # @param [ Symbol ] field The field to average.
42
47
  #
43
48
  # @return [ Float ] The average.
44
- #
45
- # @since 3.0.0
46
49
  def avg(field)
47
50
  aggregates(field)["avg"]
48
51
  end
@@ -61,10 +64,8 @@ module Mongoid
61
64
  #
62
65
  # @param [ Symbol ] field The field to max.
63
66
  #
64
- # @return [ Float, Document ] The max value or document with the max
67
+ # @return [ Float | Document ] The max value or document with the max
65
68
  # value.
66
- #
67
- # @since 3.0.0
68
69
  def max(field = nil)
69
70
  block_given? ? super() : aggregates(field)["max"]
70
71
  end
@@ -83,10 +84,8 @@ module Mongoid
83
84
  #
84
85
  # @param [ Symbol ] field The field to min.
85
86
  #
86
- # @return [ Float, Document ] The min value or document with the min
87
+ # @return [ Float | Document ] The min value or document with the min
87
88
  # value.
88
- #
89
- # @since 3.0.0
90
89
  def min(field = nil)
91
90
  block_given? ? super() : aggregates(field)["min"]
92
91
  end
@@ -103,8 +102,6 @@ module Mongoid
103
102
  # @param [ Symbol ] field The field to sum.
104
103
  #
105
104
  # @return [ Float ] The sum value.
106
- #
107
- # @since 3.0.0
108
105
  def sum(field = nil)
109
106
  block_given? ? super() : aggregates(field)["sum"] || 0
110
107
  end
@@ -118,18 +115,18 @@ module Mongoid
118
115
  # @example Get the pipeline.
119
116
  # aggregable.pipeline(:likes)
120
117
  #
121
- # @param [ String, Symbol ] field The name of the field.
118
+ # @param [ String | Symbol ] field The name of the field.
122
119
  #
123
120
  # @return [ Array ] The array of pipeline operators.
124
- #
125
- # @since 3.1.0
126
121
  def pipeline(field)
127
122
  db_field = "$#{database_field_name(field)}"
123
+ sort, skip, limit = criteria.options.values_at(:sort, :skip, :limit)
124
+
128
125
  pipeline = []
129
126
  pipeline << { "$match" => criteria.exists(field => true).selector }
130
- pipeline << { "$sort" => criteria.options[:sort] } if criteria.options[:sort]
131
- pipeline << { "$skip" => criteria.options[:skip] } if criteria.options[:skip]
132
- pipeline << { "$limit" => criteria.options[:limit] } if criteria.options[:limit]
127
+ pipeline << { "$sort" => sort } if sort && (skip || limit)
128
+ pipeline << { "$skip" => skip } if skip
129
+ pipeline << { "$limit" => limit } if limit
133
130
  pipeline << {
134
131
  "$group" => {
135
132
  "_id" => field.to_s,
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mongoid/contextual/aggregable"
4
+
5
+ module Mongoid
6
+ module Contextual
7
+ module Aggregable
8
+ # Contains behavior for aggregating values in null context.
9
+ module None
10
+
11
+ # Get all the aggregate values for the provided field in null context.
12
+ # Provided for interface consistency with Aggregable::Mongo.
13
+ #
14
+ # @param [ String | Symbol ] _field The field name.
15
+ #
16
+ # @return [ Hash ] A Hash with count, sum of 0 and max, min, avg of nil.
17
+ def aggregates(_field)
18
+ Aggregable::EMPTY_RESULT.dup
19
+ end
20
+
21
+ # Always returns zero.
22
+ #
23
+ # @example Get the sum of null context.
24
+ #
25
+ # @param [ Symbol ] _field The field to sum.
26
+ #
27
+ # @return [ Integer ] Always zero.
28
+ def sum(_field = nil)
29
+ 0
30
+ end
31
+
32
+ # Always returns nil.
33
+ #
34
+ # @example Get the avg of null context.
35
+ #
36
+ # @param [ Symbol ] _field The field to avg.
37
+ #
38
+ # @return [ nil ] Always nil.
39
+ def avg(_field)
40
+ nil
41
+ end
42
+
43
+ # Always returns nil.
44
+ #
45
+ # @example Get the min of null context.
46
+ #
47
+ # @param [ Symbol ] _field The field to min.
48
+ #
49
+ # @return [ nil ] Always nil.
50
+ def min(_field = nil)
51
+ nil
52
+ end
53
+
54
+ # Always returns nil.
55
+ #
56
+ # @example Get the max of null context.
57
+ #
58
+ # @param [ Symbol ] _field The field to max.
59
+ #
60
+ # @return [ nil ] Always nil.
61
+ alias :max :min
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Contextual
5
+ module Aggregable
6
+
7
+ # @api private
8
+ EMPTY_RESULT = {
9
+ "count" => 0,
10
+ "sum" => 0,
11
+ "avg" => nil,
12
+ "min" => nil,
13
+ "max" => nil,
14
+ }.freeze
15
+ end
16
+ end
17
+ end