mongoid 7.0.0 → 7.4.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 (1046) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +129 -70
  8. data/lib/mongoid/association/accessors.rb +143 -80
  9. data/lib/mongoid/association/bindable.rb +7 -26
  10. data/lib/mongoid/association/builders.rb +4 -12
  11. data/lib/mongoid/association/constrainable.rb +5 -6
  12. data/lib/mongoid/association/depending.rb +31 -19
  13. data/lib/mongoid/association/eager_loadable.rb +2 -3
  14. data/lib/mongoid/association/embedded/batchable.rb +19 -45
  15. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +3 -7
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
  19. data/lib/mongoid/association/embedded/embedded_in.rb +6 -26
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -8
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +113 -93
  23. data/lib/mongoid/association/embedded/embeds_many.rb +8 -35
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +9 -6
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +45 -30
  27. data/lib/mongoid/association/embedded/embeds_one.rb +8 -31
  28. data/lib/mongoid/association/embedded.rb +2 -0
  29. data/lib/mongoid/association/macros.rb +44 -41
  30. data/lib/mongoid/association/many.rb +18 -32
  31. data/lib/mongoid/association/marshalable.rb +3 -6
  32. data/lib/mongoid/association/nested/many.rb +18 -27
  33. data/lib/mongoid/association/nested/nested_buildable.rb +5 -11
  34. data/lib/mongoid/association/nested/one.rb +16 -27
  35. data/lib/mongoid/association/nested.rb +3 -3
  36. data/lib/mongoid/association/one.rb +4 -11
  37. data/lib/mongoid/association/options.rb +8 -38
  38. data/lib/mongoid/association/proxy.rb +37 -36
  39. data/lib/mongoid/association/referenced/auto_save.rb +5 -11
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +4 -9
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +16 -27
  44. data/lib/mongoid/association/referenced/belongs_to.rb +14 -36
  45. data/lib/mongoid/association/referenced/counter_cache.rb +4 -15
  46. data/lib/mongoid/association/referenced/eager.rb +40 -36
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +38 -56
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -43
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +444 -456
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +78 -111
  57. data/lib/mongoid/association/referenced/has_many.rb +18 -42
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +13 -26
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +23 -25
  63. data/lib/mongoid/association/referenced/has_one.rb +13 -33
  64. data/lib/mongoid/association/referenced/syncable.rb +7 -22
  65. data/lib/mongoid/association/referenced.rb +2 -0
  66. data/lib/mongoid/association/reflections.rb +7 -6
  67. data/lib/mongoid/association/relatable.rb +118 -78
  68. data/lib/mongoid/association.rb +8 -23
  69. data/lib/mongoid/atomic/modifiers.rb +27 -51
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +4 -7
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +42 -47
  76. data/lib/mongoid/attributes/dynamic.rb +18 -32
  77. data/lib/mongoid/attributes/nested.rb +21 -13
  78. data/lib/mongoid/attributes/processing.rb +9 -24
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +3 -6
  81. data/lib/mongoid/attributes.rb +75 -81
  82. data/lib/mongoid/cacheable.rb +6 -9
  83. data/lib/mongoid/changeable.rb +6 -60
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +16 -17
  86. data/lib/mongoid/clients/sessions.rb +24 -12
  87. data/lib/mongoid/clients/storage_options.rb +7 -12
  88. data/lib/mongoid/clients/validators/storage.rb +2 -9
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +3 -10
  91. data/lib/mongoid/composable.rb +5 -9
  92. data/lib/mongoid/config/environment.rb +36 -14
  93. data/lib/mongoid/config/options.rb +20 -23
  94. data/lib/mongoid/config/validators/client.rb +2 -17
  95. data/lib/mongoid/config/validators/option.rb +2 -3
  96. data/lib/mongoid/config/validators.rb +2 -1
  97. data/lib/mongoid/config.rb +112 -41
  98. data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -27
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +29 -31
  103. data/lib/mongoid/contextual/command.rb +2 -5
  104. data/lib/mongoid/contextual/geo_near.rb +6 -37
  105. data/lib/mongoid/contextual/map_reduce.rb +9 -37
  106. data/lib/mongoid/contextual/memory.rb +12 -65
  107. data/lib/mongoid/contextual/mongo.rb +163 -85
  108. data/lib/mongoid/contextual/none.rb +44 -28
  109. data/lib/mongoid/contextual/queryable.rb +2 -3
  110. data/lib/mongoid/contextual.rb +7 -9
  111. data/lib/mongoid/copyable.rb +16 -10
  112. data/lib/mongoid/criteria/findable.rb +12 -15
  113. data/lib/mongoid/criteria/includable.rb +8 -15
  114. data/lib/mongoid/criteria/inspectable.rb +2 -3
  115. data/lib/mongoid/criteria/marshalable.rb +2 -5
  116. data/lib/mongoid/criteria/modifiable.rb +15 -21
  117. data/lib/mongoid/criteria/options.rb +4 -5
  118. data/lib/mongoid/criteria/permission.rb +2 -1
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -13
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -27
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -4
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -4
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -8
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -11
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -26
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -13
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -29
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +41 -17
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -4
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -18
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -10
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -9
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +13 -6
  137. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  138. data/lib/mongoid/criteria/queryable/key.rb +101 -27
  139. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +184 -44
  141. data/lib/mongoid/criteria/queryable/optional.rb +5 -48
  142. data/lib/mongoid/criteria/queryable/options.rb +2 -19
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  144. data/lib/mongoid/criteria/queryable/selectable.rb +436 -158
  145. data/lib/mongoid/criteria/queryable/selector.rb +45 -55
  146. data/lib/mongoid/criteria/queryable/smash.rb +2 -11
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +7 -9
  149. data/lib/mongoid/criteria/scopable.rb +27 -19
  150. data/lib/mongoid/criteria.rb +86 -73
  151. data/lib/mongoid/document.rb +37 -77
  152. data/lib/mongoid/equality.rb +29 -12
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  154. data/lib/mongoid/errors/callback.rb +2 -3
  155. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  156. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  157. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  158. data/lib/mongoid/errors/document_not_found.rb +2 -9
  159. data/lib/mongoid/errors/eager_load.rb +6 -5
  160. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  161. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  162. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  163. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  164. data/lib/mongoid/errors/invalid_config_option.rb +2 -3
  165. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -3
  166. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  167. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  168. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  169. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  170. data/lib/mongoid/errors/invalid_field.rb +2 -5
  171. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  172. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  173. data/lib/mongoid/errors/invalid_find.rb +2 -3
  174. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  175. data/lib/mongoid/errors/invalid_index.rb +2 -3
  176. data/lib/mongoid/errors/invalid_options.rb +4 -5
  177. data/lib/mongoid/errors/invalid_path.rb +2 -3
  178. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  179. data/lib/mongoid/errors/invalid_query.rb +40 -0
  180. data/lib/mongoid/errors/invalid_relation.rb +4 -9
  181. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  182. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  183. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  184. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  185. data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
  186. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  187. data/lib/mongoid/errors/invalid_time.rb +2 -3
  188. data/lib/mongoid/errors/invalid_value.rb +2 -1
  189. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  190. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  191. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  192. data/lib/mongoid/errors/mongoid_error.rb +3 -10
  193. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  194. data/lib/mongoid/errors/no_client_config.rb +4 -5
  195. data/lib/mongoid/errors/no_client_database.rb +2 -3
  196. data/lib/mongoid/errors/no_client_hosts.rb +2 -3
  197. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  198. data/lib/mongoid/errors/no_default_client.rb +3 -4
  199. data/lib/mongoid/errors/no_environment.rb +2 -3
  200. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  201. data/lib/mongoid/errors/no_metadata.rb +2 -3
  202. data/lib/mongoid/errors/no_parent.rb +2 -3
  203. data/lib/mongoid/errors/readonly_attribute.rb +2 -3
  204. data/lib/mongoid/errors/readonly_document.rb +3 -6
  205. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  206. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
  207. data/lib/mongoid/errors/unknown_attribute.rb +2 -3
  208. data/lib/mongoid/errors/unknown_model.rb +2 -3
  209. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  210. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  211. data/lib/mongoid/errors/validations.rb +2 -1
  212. data/lib/mongoid/errors.rb +12 -1
  213. data/lib/mongoid/evolvable.rb +4 -5
  214. data/lib/mongoid/extensions/array.rb +28 -37
  215. data/lib/mongoid/extensions/big_decimal.rb +3 -12
  216. data/lib/mongoid/extensions/boolean.rb +3 -5
  217. data/lib/mongoid/extensions/date.rb +13 -12
  218. data/lib/mongoid/extensions/date_time.rb +4 -12
  219. data/lib/mongoid/extensions/decimal128.rb +2 -5
  220. data/lib/mongoid/extensions/false_class.rb +4 -7
  221. data/lib/mongoid/extensions/float.rb +5 -10
  222. data/lib/mongoid/extensions/hash.rb +51 -36
  223. data/lib/mongoid/extensions/integer.rb +5 -12
  224. data/lib/mongoid/extensions/module.rb +2 -3
  225. data/lib/mongoid/extensions/nil_class.rb +2 -5
  226. data/lib/mongoid/extensions/object.rb +17 -44
  227. data/lib/mongoid/extensions/object_id.rb +2 -7
  228. data/lib/mongoid/extensions/range.rb +2 -11
  229. data/lib/mongoid/extensions/regexp.rb +4 -4
  230. data/lib/mongoid/extensions/set.rb +2 -7
  231. data/lib/mongoid/extensions/string.rb +24 -42
  232. data/lib/mongoid/extensions/symbol.rb +2 -7
  233. data/lib/mongoid/extensions/time.rb +12 -9
  234. data/lib/mongoid/extensions/time_with_zone.rb +25 -7
  235. data/lib/mongoid/extensions/true_class.rb +4 -7
  236. data/lib/mongoid/extensions.rb +18 -3
  237. data/lib/mongoid/factory.rb +52 -13
  238. data/lib/mongoid/fields/foreign_key.rb +3 -22
  239. data/lib/mongoid/fields/localized.rb +2 -11
  240. data/lib/mongoid/fields/standard.rb +6 -36
  241. data/lib/mongoid/fields/validators/macro.rb +36 -18
  242. data/lib/mongoid/fields/validators.rb +2 -1
  243. data/lib/mongoid/fields.rb +115 -64
  244. data/lib/mongoid/findable.rb +59 -23
  245. data/lib/mongoid/indexable/specification.rb +3 -16
  246. data/lib/mongoid/indexable/validators/options.rb +2 -7
  247. data/lib/mongoid/indexable.rb +10 -25
  248. data/lib/mongoid/inspectable.rb +4 -11
  249. data/lib/mongoid/interceptable.rb +13 -30
  250. data/lib/mongoid/loggable.rb +13 -16
  251. data/lib/mongoid/matchable.rb +3 -150
  252. data/lib/mongoid/matcher/all.rb +22 -0
  253. data/lib/mongoid/matcher/and.rb +21 -0
  254. data/lib/mongoid/matcher/bits.rb +41 -0
  255. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  256. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  257. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  258. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  259. data/lib/mongoid/matcher/elem_match.rb +36 -0
  260. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  261. data/lib/mongoid/matcher/eq.rb +11 -0
  262. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  263. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  264. data/lib/mongoid/matcher/exists.rb +15 -0
  265. data/lib/mongoid/matcher/expression.rb +35 -0
  266. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  267. data/lib/mongoid/matcher/field_expression.rb +62 -0
  268. data/lib/mongoid/matcher/field_operator.rb +54 -0
  269. data/lib/mongoid/matcher/gt.rb +17 -0
  270. data/lib/mongoid/matcher/gte.rb +17 -0
  271. data/lib/mongoid/matcher/in.rb +25 -0
  272. data/lib/mongoid/matcher/lt.rb +17 -0
  273. data/lib/mongoid/matcher/lte.rb +17 -0
  274. data/lib/mongoid/matcher/mod.rb +17 -0
  275. data/lib/mongoid/matcher/ne.rb +16 -0
  276. data/lib/mongoid/matcher/nin.rb +11 -0
  277. data/lib/mongoid/matcher/nor.rb +25 -0
  278. data/lib/mongoid/matcher/not.rb +29 -0
  279. data/lib/mongoid/matcher/or.rb +21 -0
  280. data/lib/mongoid/matcher/regex.rb +41 -0
  281. data/lib/mongoid/matcher/size.rb +26 -0
  282. data/lib/mongoid/matcher/type.rb +99 -0
  283. data/lib/mongoid/matcher.rb +110 -0
  284. data/lib/mongoid/persistable/creatable.rb +6 -23
  285. data/lib/mongoid/persistable/deletable.rb +7 -23
  286. data/lib/mongoid/persistable/destroyable.rb +11 -10
  287. data/lib/mongoid/persistable/incrementable.rb +6 -7
  288. data/lib/mongoid/persistable/logical.rb +4 -6
  289. data/lib/mongoid/persistable/poppable.rb +3 -6
  290. data/lib/mongoid/persistable/pullable.rb +3 -8
  291. data/lib/mongoid/persistable/pushable.rb +14 -10
  292. data/lib/mongoid/persistable/renamable.rb +10 -8
  293. data/lib/mongoid/persistable/savable.rb +3 -8
  294. data/lib/mongoid/persistable/settable.rb +61 -19
  295. data/lib/mongoid/persistable/unsettable.rb +8 -8
  296. data/lib/mongoid/persistable/updatable.rb +33 -21
  297. data/lib/mongoid/persistable/upsertable.rb +4 -9
  298. data/lib/mongoid/persistable.rb +134 -39
  299. data/lib/mongoid/persistence_context.rb +51 -45
  300. data/lib/mongoid/positional.rb +3 -6
  301. data/lib/mongoid/query_cache.rb +138 -106
  302. data/lib/mongoid/railtie.rb +20 -16
  303. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  304. data/lib/mongoid/railties/database.rake +9 -0
  305. data/lib/mongoid/reloadable.rb +14 -19
  306. data/lib/mongoid/scopable.rb +11 -38
  307. data/lib/mongoid/selectable.rb +8 -17
  308. data/lib/mongoid/serializable.rb +24 -29
  309. data/lib/mongoid/shardable.rb +80 -17
  310. data/lib/mongoid/stateful.rb +3 -10
  311. data/lib/mongoid/stringified_symbol.rb +52 -0
  312. data/lib/mongoid/tasks/database.rake +12 -5
  313. data/lib/mongoid/tasks/database.rb +87 -7
  314. data/lib/mongoid/threaded/lifecycle.rb +2 -21
  315. data/lib/mongoid/threaded.rb +38 -55
  316. data/lib/mongoid/timestamps/created/short.rb +2 -1
  317. data/lib/mongoid/timestamps/created.rb +3 -2
  318. data/lib/mongoid/timestamps/short.rb +2 -1
  319. data/lib/mongoid/timestamps/timeless.rb +6 -9
  320. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  321. data/lib/mongoid/timestamps/updated.rb +3 -4
  322. data/lib/mongoid/timestamps.rb +3 -2
  323. data/lib/mongoid/touchable.rb +132 -0
  324. data/lib/mongoid/traversable.rb +177 -57
  325. data/lib/mongoid/validatable/associated.rb +5 -6
  326. data/lib/mongoid/validatable/format.rb +2 -1
  327. data/lib/mongoid/validatable/length.rb +2 -1
  328. data/lib/mongoid/validatable/localizable.rb +2 -3
  329. data/lib/mongoid/validatable/macros.rb +3 -8
  330. data/lib/mongoid/validatable/presence.rb +8 -13
  331. data/lib/mongoid/validatable/queryable.rb +2 -3
  332. data/lib/mongoid/validatable/uniqueness.rb +21 -34
  333. data/lib/mongoid/validatable.rb +8 -27
  334. data/lib/mongoid/version.rb +3 -2
  335. data/lib/mongoid.rb +33 -15
  336. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  337. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -30
  338. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  339. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  340. data/lib/rails/generators/mongoid_generator.rb +2 -1
  341. data/lib/rails/mongoid.rb +4 -5
  342. data/spec/README.md +33 -0
  343. data/spec/config/mongoid.yml +13 -3
  344. data/spec/integration/app_spec.rb +343 -0
  345. data/spec/integration/associations/belongs_to_spec.rb +15 -0
  346. data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
  347. data/spec/integration/associations/embedded_spec.rb +268 -0
  348. data/spec/integration/associations/embeds_many_spec.rb +206 -0
  349. data/spec/integration/associations/embeds_one_spec.rb +23 -0
  350. data/spec/integration/associations/foreign_key_spec.rb +98 -0
  351. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  352. data/spec/integration/associations/has_many_spec.rb +128 -0
  353. data/spec/integration/associations/has_one_spec.rb +176 -0
  354. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  355. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  356. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  357. data/spec/integration/associations/scope_option_spec.rb +101 -0
  358. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  359. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  360. data/spec/integration/callbacks_models.rb +61 -0
  361. data/spec/integration/callbacks_spec.rb +228 -0
  362. data/spec/integration/contextual/empty_spec.rb +141 -0
  363. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  364. data/spec/integration/criteria/date_field_spec.rb +40 -0
  365. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  366. data/spec/integration/criteria/logical_spec.rb +124 -0
  367. data/spec/integration/criteria/range_spec.rb +265 -0
  368. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  369. data/spec/integration/discriminator_key_spec.rb +353 -0
  370. data/spec/integration/discriminator_value_spec.rb +206 -0
  371. data/spec/integration/document_spec.rb +51 -0
  372. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  373. data/spec/integration/matcher_examples_spec.rb +758 -0
  374. data/spec/integration/matcher_operator_data/all.yml +140 -0
  375. data/spec/integration/matcher_operator_data/and.yml +93 -0
  376. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  377. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  378. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  379. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  380. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  381. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  382. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  383. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  384. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  385. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  386. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  387. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  388. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  389. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  390. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  391. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  392. data/spec/integration/matcher_operator_data/in.yml +210 -0
  393. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  394. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  395. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  396. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  398. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  399. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  400. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  401. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  402. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  403. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  404. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  405. data/spec/integration/matcher_operator_data/not.yml +196 -0
  406. data/spec/integration/matcher_operator_data/or.yml +137 -0
  407. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  408. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  409. data/spec/integration/matcher_operator_data/size.yml +174 -0
  410. data/spec/integration/matcher_operator_data/type.yml +70 -0
  411. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  412. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  413. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  414. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  415. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  416. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  417. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  418. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  419. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  420. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  421. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  422. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  423. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  424. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  425. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  426. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  427. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  428. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  429. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  430. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  431. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  432. data/spec/integration/matcher_operator_spec.rb +124 -0
  433. data/spec/integration/matcher_spec.rb +283 -0
  434. data/spec/integration/server_query_spec.rb +141 -0
  435. data/spec/integration/shardable_spec.rb +148 -0
  436. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  437. data/spec/lite_spec_helper.rb +83 -0
  438. data/spec/mongoid/association/accessors_spec.rb +323 -77
  439. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  440. data/spec/mongoid/association/builders_spec.rb +3 -1
  441. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  442. data/spec/mongoid/association/counter_cache_spec.rb +34 -32
  443. data/spec/mongoid/association/depending_spec.rb +678 -332
  444. data/spec/mongoid/association/eager_spec.rb +6 -4
  445. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  446. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  447. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -0
  448. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +2 -0
  449. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +65 -13
  450. data/spec/mongoid/association/embedded/embedded_in_spec.rb +61 -1
  451. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  452. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +2 -0
  453. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +672 -144
  454. data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
  455. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
  456. data/spec/mongoid/association/embedded/embeds_many_spec.rb +13 -1
  457. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  458. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +2 -0
  459. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
  460. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  461. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  462. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  463. data/spec/mongoid/association/embedded/embeds_one_spec.rb +49 -1
  464. data/spec/mongoid/association/macros_spec.rb +11 -9
  465. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  466. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  467. data/spec/mongoid/association/options_spec.rb +2 -0
  468. data/spec/mongoid/association/polymorphic_spec.rb +61 -0
  469. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -0
  470. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +57 -16
  471. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +266 -17
  472. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +99 -58
  473. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  474. data/spec/mongoid/association/referenced/belongs_to_spec.rb +95 -12
  475. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  476. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  477. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +67 -4
  478. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  479. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +351 -164
  480. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
  481. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  482. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +49 -5
  483. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  484. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +23 -0
  485. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  486. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +407 -121
  487. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  488. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +681 -340
  489. data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
  490. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  491. data/spec/mongoid/association/referenced/has_many_spec.rb +26 -3
  492. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  493. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -7
  494. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  495. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +28 -26
  496. data/spec/mongoid/association/referenced/has_one_models.rb +97 -0
  497. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  498. data/spec/mongoid/association/referenced/has_one_spec.rb +144 -5
  499. data/spec/mongoid/association/reflections_spec.rb +2 -0
  500. data/spec/mongoid/association/syncable_spec.rb +33 -31
  501. data/spec/mongoid/association_spec.rb +2 -0
  502. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  503. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  504. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  505. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  506. data/spec/mongoid/atomic/paths_spec.rb +107 -12
  507. data/spec/mongoid/atomic_spec.rb +31 -6
  508. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  509. data/spec/mongoid/attributes/nested_spec.rb +87 -69
  510. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  511. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  512. data/spec/mongoid/attributes/projector_spec.rb +44 -0
  513. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  514. data/spec/mongoid/attributes_spec.rb +382 -35
  515. data/spec/mongoid/cacheable_spec.rb +3 -1
  516. data/spec/mongoid/changeable_spec.rb +60 -35
  517. data/spec/mongoid/clients/factory_spec.rb +148 -34
  518. data/spec/mongoid/clients/options_spec.rb +102 -66
  519. data/spec/mongoid/clients/sessions_spec.rb +39 -29
  520. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  521. data/spec/mongoid/clients_spec.rb +78 -16
  522. data/spec/mongoid/composable_spec.rb +2 -0
  523. data/spec/mongoid/config/environment_spec.rb +88 -8
  524. data/spec/mongoid/config/options_spec.rb +22 -3
  525. data/spec/mongoid/config_spec.rb +280 -2
  526. data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
  527. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  528. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  529. data/spec/mongoid/contextual/atomic_spec.rb +242 -81
  530. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  531. data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
  532. data/spec/mongoid/contextual/memory_spec.rb +25 -23
  533. data/spec/mongoid/contextual/mongo_spec.rb +491 -144
  534. data/spec/mongoid/contextual/none_spec.rb +9 -81
  535. data/spec/mongoid/copyable_spec.rb +261 -30
  536. data/spec/mongoid/copyable_spec_models.rb +47 -0
  537. data/spec/mongoid/criteria/findable_spec.rb +77 -20
  538. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
  540. data/spec/mongoid/criteria/modifiable_spec.rb +100 -48
  541. data/spec/mongoid/criteria/options_spec.rb +2 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +2 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +5 -3
  546. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
  547. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  548. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +2 -0
  549. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +35 -17
  550. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
  551. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  552. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -0
  553. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  554. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  555. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +53 -0
  556. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  557. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  558. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  559. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
  560. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  561. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +3 -1
  562. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -0
  563. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +42 -23
  564. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +30 -1
  565. data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
  566. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  567. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -1
  568. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
  569. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  570. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  571. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2069 -0
  572. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  573. data/spec/mongoid/criteria/queryable/selectable_spec.rb +994 -2900
  574. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  575. data/spec/mongoid/criteria/queryable/selector_spec.rb +41 -2
  576. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  577. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  578. data/spec/mongoid/criteria/scopable_spec.rb +210 -0
  579. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  580. data/spec/mongoid/criteria_spec.rb +807 -464
  581. data/spec/mongoid/document_fields_spec.rb +113 -0
  582. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  583. data/spec/mongoid/document_query_spec.rb +89 -0
  584. data/spec/mongoid/document_spec.rb +182 -28
  585. data/spec/mongoid/equality_spec.rb +144 -41
  586. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  587. data/spec/mongoid/errors/callback_spec.rb +2 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +2 -0
  591. data/spec/mongoid/errors/eager_load_spec.rb +2 -0
  592. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  593. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  594. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  595. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  596. data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  601. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -8
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  612. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  613. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +2 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  619. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  627. data/spec/mongoid/errors/validations_spec.rb +2 -0
  628. data/spec/mongoid/extensions/array_spec.rb +25 -43
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -9
  630. data/spec/mongoid/extensions/binary_spec.rb +2 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +2 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
  633. data/spec/mongoid/extensions/date_spec.rb +8 -160
  634. data/spec/mongoid/extensions/date_time_spec.rb +17 -60
  635. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  636. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  637. data/spec/mongoid/extensions/float_spec.rb +17 -3
  638. data/spec/mongoid/extensions/hash_spec.rb +105 -0
  639. data/spec/mongoid/extensions/integer_spec.rb +14 -2
  640. data/spec/mongoid/extensions/module_spec.rb +2 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  643. data/spec/mongoid/extensions/object_spec.rb +13 -24
  644. data/spec/mongoid/extensions/range_spec.rb +2 -0
  645. data/spec/mongoid/extensions/regexp_spec.rb +25 -0
  646. data/spec/mongoid/extensions/set_spec.rb +2 -0
  647. data/spec/mongoid/extensions/string_spec.rb +95 -34
  648. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  649. data/spec/mongoid/extensions/symbol_spec.rb +2 -0
  650. data/spec/mongoid/extensions/time_spec.rb +29 -0
  651. data/spec/mongoid/extensions/time_with_zone_spec.rb +33 -0
  652. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  653. data/spec/mongoid/extensions_spec.rb +16 -2
  654. data/spec/mongoid/factory_spec.rb +287 -27
  655. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  656. data/spec/mongoid/fields/localized_spec.rb +6 -4
  657. data/spec/mongoid/fields/standard_spec.rb +2 -0
  658. data/spec/mongoid/fields_spec.rb +419 -37
  659. data/spec/mongoid/findable_spec.rb +54 -20
  660. data/spec/mongoid/indexable/specification_spec.rb +2 -0
  661. data/spec/mongoid/indexable_spec.rb +36 -6
  662. data/spec/mongoid/inspectable_spec.rb +39 -2
  663. data/spec/mongoid/interceptable_spec.rb +168 -96
  664. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  665. data/spec/mongoid/loggable_spec.rb +2 -0
  666. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  667. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  668. data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
  669. data/spec/mongoid/persistable/creatable_spec.rb +112 -27
  670. data/spec/mongoid/persistable/deletable_spec.rb +273 -11
  671. data/spec/mongoid/persistable/destroyable_spec.rb +201 -11
  672. data/spec/mongoid/persistable/incrementable_spec.rb +29 -13
  673. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  674. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  675. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  676. data/spec/mongoid/persistable/pushable_spec.rb +91 -7
  677. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  678. data/spec/mongoid/persistable/savable_spec.rb +188 -25
  679. data/spec/mongoid/persistable/settable_spec.rb +182 -17
  680. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  681. data/spec/mongoid/persistable/updatable_spec.rb +45 -23
  682. data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
  683. data/spec/mongoid/persistable_spec.rb +85 -9
  684. data/spec/mongoid/persistence_context_spec.rb +3 -1
  685. data/spec/mongoid/positional_spec.rb +2 -0
  686. data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
  687. data/spec/mongoid/query_cache_spec.rb +575 -48
  688. data/spec/mongoid/relations/proxy_spec.rb +9 -7
  689. data/spec/mongoid/reloadable_spec.rb +298 -20
  690. data/spec/mongoid/scopable_spec.rb +82 -22
  691. data/spec/mongoid/selectable_spec.rb +8 -6
  692. data/spec/mongoid/serializable_spec.rb +160 -29
  693. data/spec/mongoid/shardable_models.rb +61 -0
  694. data/spec/mongoid/shardable_spec.rb +116 -17
  695. data/spec/mongoid/stateful_spec.rb +3 -1
  696. data/spec/mongoid/tasks/database_rake_spec.rb +15 -13
  697. data/spec/mongoid/tasks/database_spec.rb +3 -1
  698. data/spec/mongoid/threaded_spec.rb +72 -2
  699. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  700. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  701. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  702. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  703. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  704. data/spec/mongoid/timestamps_spec.rb +8 -6
  705. data/spec/mongoid/{association/touchable_spec.rb → touchable_spec.rb} +206 -38
  706. data/spec/mongoid/touchable_spec_models.rb +53 -0
  707. data/spec/mongoid/traversable_spec.rb +1167 -1
  708. data/spec/mongoid/validatable/associated_spec.rb +2 -0
  709. data/spec/mongoid/validatable/format_spec.rb +2 -0
  710. data/spec/mongoid/validatable/length_spec.rb +2 -0
  711. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  712. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  713. data/spec/mongoid/validatable/uniqueness_spec.rb +102 -73
  714. data/spec/mongoid/validatable_spec.rb +5 -3
  715. data/spec/mongoid_spec.rb +2 -0
  716. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  717. data/spec/rails/mongoid_spec.rb +4 -2
  718. data/spec/shared/LICENSE +20 -0
  719. data/spec/shared/bin/get-mongodb-download-url +17 -0
  720. data/spec/shared/bin/s3-copy +45 -0
  721. data/spec/shared/bin/s3-upload +69 -0
  722. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  723. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  724. data/spec/shared/lib/mrss/constraints.rb +386 -0
  725. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  726. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  727. data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
  728. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  729. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  730. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  731. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  732. data/spec/shared/lib/mrss/utils.rb +15 -0
  733. data/spec/shared/share/Dockerfile.erb +339 -0
  734. data/spec/shared/share/haproxy-1.conf +16 -0
  735. data/spec/shared/share/haproxy-2.conf +17 -0
  736. data/spec/shared/shlib/distro.sh +74 -0
  737. data/spec/shared/shlib/server.sh +379 -0
  738. data/spec/shared/shlib/set_env.sh +132 -0
  739. data/spec/spec_helper.rb +69 -80
  740. data/spec/support/authorization.rb +2 -0
  741. data/spec/support/client_registry.rb +9 -0
  742. data/spec/support/constraints.rb +53 -0
  743. data/spec/support/expectations.rb +21 -3
  744. data/spec/support/helpers.rb +11 -0
  745. data/spec/support/macros.rb +42 -0
  746. data/spec/{app → support}/models/account.rb +3 -1
  747. data/spec/{app → support}/models/acolyte.rb +2 -0
  748. data/spec/{app → support}/models/actor.rb +3 -1
  749. data/spec/support/models/actress.rb +4 -0
  750. data/spec/{app → support}/models/address.rb +6 -0
  751. data/spec/{app → support}/models/address_component.rb +2 -0
  752. data/spec/{app → support}/models/address_number.rb +2 -0
  753. data/spec/{app → support}/models/agency.rb +2 -0
  754. data/spec/{app → support}/models/agent.rb +2 -0
  755. data/spec/{app → support}/models/album.rb +2 -0
  756. data/spec/{app → support}/models/alert.rb +2 -0
  757. data/spec/{app → support}/models/animal.rb +2 -0
  758. data/spec/{app → support}/models/answer.rb +2 -0
  759. data/spec/{app → support}/models/appointment.rb +2 -0
  760. data/spec/support/models/armrest.rb +9 -0
  761. data/spec/support/models/array_field.rb +7 -0
  762. data/spec/{app → support}/models/article.rb +2 -0
  763. data/spec/{app → support}/models/artist.rb +4 -0
  764. data/spec/{app → support}/models/artwork.rb +2 -0
  765. data/spec/support/models/audible_sound.rb +3 -0
  766. data/spec/{app → support}/models/audio.rb +2 -0
  767. data/spec/{app → support}/models/augmentation.rb +2 -0
  768. data/spec/{app → support}/models/author.rb +2 -0
  769. data/spec/{app → support}/models/baby.rb +2 -0
  770. data/spec/{app → support}/models/band.rb +6 -0
  771. data/spec/{app → support}/models/bar.rb +2 -0
  772. data/spec/{app → support}/models/basic.rb +2 -0
  773. data/spec/support/models/bed.rb +3 -0
  774. data/spec/{app → support}/models/big_palette.rb +2 -0
  775. data/spec/{app → support}/models/birthday.rb +2 -0
  776. data/spec/support/models/bolt.rb +7 -0
  777. data/spec/{app → support}/models/bomb.rb +2 -0
  778. data/spec/{app → support}/models/book.rb +2 -0
  779. data/spec/{app → support}/models/breed.rb +2 -0
  780. data/spec/{app → support}/models/browser.rb +3 -1
  781. data/spec/{app → support}/models/building.rb +2 -0
  782. data/spec/{app → support}/models/building_address.rb +2 -0
  783. data/spec/{app → support}/models/bus.rb +2 -0
  784. data/spec/{app → support}/models/business.rb +2 -0
  785. data/spec/{app → support}/models/callback_test.rb +2 -0
  786. data/spec/{app → support}/models/canvas.rb +3 -1
  787. data/spec/support/models/car.rb +3 -0
  788. data/spec/{app → support}/models/cat.rb +2 -0
  789. data/spec/{app → support}/models/category.rb +2 -0
  790. data/spec/{app → support}/models/child.rb +2 -0
  791. data/spec/{app → support}/models/child_doc.rb +5 -3
  792. data/spec/{app → support}/models/church.rb +2 -0
  793. data/spec/{app → support}/models/circle.rb +2 -0
  794. data/spec/{app → support}/models/circuit.rb +2 -0
  795. data/spec/{app → support}/models/circus.rb +2 -0
  796. data/spec/{app → support}/models/code.rb +2 -0
  797. data/spec/support/models/coding/pull_request.rb +11 -0
  798. data/spec/support/models/coding.rb +3 -0
  799. data/spec/{app → support}/models/comment.rb +2 -0
  800. data/spec/{app → support}/models/company.rb +2 -0
  801. data/spec/{app → support}/models/consumption_period.rb +2 -0
  802. data/spec/{app → support}/models/contextable_item.rb +2 -0
  803. data/spec/{app → support}/models/contractor.rb +2 -0
  804. data/spec/{app → support}/models/cookie.rb +2 -0
  805. data/spec/{app → support}/models/country_code.rb +4 -0
  806. data/spec/{app → support}/models/courier_job.rb +2 -0
  807. data/spec/support/models/crate.rb +12 -0
  808. data/spec/support/models/customer.rb +10 -0
  809. data/spec/support/models/customer_address.rb +11 -0
  810. data/spec/support/models/deed.rb +7 -0
  811. data/spec/{app → support}/models/definition.rb +2 -0
  812. data/spec/support/models/delegating_patient.rb +15 -0
  813. data/spec/{app → support}/models/description.rb +2 -0
  814. data/spec/{app → support}/models/dictionary.rb +8 -0
  815. data/spec/{app → support}/models/division.rb +2 -0
  816. data/spec/{app → support}/models/doctor.rb +2 -0
  817. data/spec/{app → support}/models/dog.rb +2 -0
  818. data/spec/{app → support}/models/dokument.rb +2 -0
  819. data/spec/{app → support}/models/draft.rb +2 -0
  820. data/spec/{app → support}/models/dragon.rb +2 -0
  821. data/spec/{app → support}/models/driver.rb +3 -1
  822. data/spec/{app → support}/models/drug.rb +2 -0
  823. data/spec/{app → support}/models/dungeon.rb +2 -0
  824. data/spec/{app → support}/models/edit.rb +2 -0
  825. data/spec/{app → support}/models/email.rb +2 -0
  826. data/spec/{app → support}/models/employer.rb +2 -0
  827. data/spec/{app → support}/models/entry.rb +2 -0
  828. data/spec/support/models/eraser.rb +3 -0
  829. data/spec/{app → support}/models/even.rb +2 -0
  830. data/spec/{app → support}/models/event.rb +2 -0
  831. data/spec/{app → support}/models/exhibition.rb +2 -0
  832. data/spec/{app → support}/models/exhibitor.rb +2 -0
  833. data/spec/{app → support}/models/explosion.rb +2 -0
  834. data/spec/{app → support}/models/eye.rb +2 -0
  835. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  836. data/spec/{app → support}/models/face.rb +2 -0
  837. data/spec/{app → support}/models/favorite.rb +2 -0
  838. data/spec/{app → support}/models/filesystem.rb +2 -0
  839. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  840. data/spec/{app → support}/models/firefox.rb +2 -0
  841. data/spec/{app → support}/models/fish.rb +2 -0
  842. data/spec/{app → support}/models/folder.rb +2 -0
  843. data/spec/{app → support}/models/folder_item.rb +2 -0
  844. data/spec/{app → support}/models/fruits.rb +2 -0
  845. data/spec/{app → support}/models/game.rb +2 -0
  846. data/spec/{app → support}/models/ghost.rb +2 -0
  847. data/spec/support/models/guitar.rb +4 -0
  848. data/spec/support/models/hole.rb +12 -0
  849. data/spec/{app → support}/models/home.rb +2 -0
  850. data/spec/{app → support}/models/house.rb +2 -0
  851. data/spec/{app → support}/models/html_writer.rb +2 -0
  852. data/spec/{app → support}/models/id_key.rb +2 -0
  853. data/spec/support/models/idnodef.rb +7 -0
  854. data/spec/{app → support}/models/image.rb +2 -0
  855. data/spec/{app → support}/models/implant.rb +2 -0
  856. data/spec/support/models/instrument.rb +8 -0
  857. data/spec/{app → support}/models/item.rb +3 -1
  858. data/spec/{app → support}/models/jar.rb +2 -0
  859. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  860. data/spec/{app → support}/models/kangaroo.rb +3 -1
  861. data/spec/{app → support}/models/label.rb +4 -1
  862. data/spec/{app → support}/models/language.rb +2 -0
  863. data/spec/{app → support}/models/lat_lng.rb +2 -0
  864. data/spec/{app → support}/models/league.rb +2 -0
  865. data/spec/support/models/learner.rb +4 -0
  866. data/spec/{app → support}/models/line_item.rb +2 -0
  867. data/spec/{app → support}/models/location.rb +2 -0
  868. data/spec/{app → support}/models/login.rb +2 -0
  869. data/spec/{app → support}/models/manufacturer.rb +2 -0
  870. data/spec/{app → support}/models/meat.rb +2 -0
  871. data/spec/{app → support}/models/membership.rb +2 -0
  872. data/spec/{app → support}/models/message.rb +2 -0
  873. data/spec/support/models/minim.rb +6 -0
  874. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  875. data/spec/support/models/mop.rb +24 -0
  876. data/spec/{app → support}/models/movie.rb +2 -0
  877. data/spec/support/models/my_hash.rb +4 -0
  878. data/spec/{app → support}/models/name.rb +2 -0
  879. data/spec/support/models/name_only.rb +8 -0
  880. data/spec/{app → support}/models/node.rb +2 -0
  881. data/spec/{app → support}/models/note.rb +2 -0
  882. data/spec/support/models/nut.rb +7 -0
  883. data/spec/{app → support}/models/odd.rb +2 -0
  884. data/spec/support/models/order.rb +12 -0
  885. data/spec/{app → support}/models/ordered_post.rb +3 -1
  886. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  887. data/spec/{app → support}/models/oscar.rb +2 -0
  888. data/spec/support/models/other_owner_object.rb +4 -0
  889. data/spec/{app → support}/models/override.rb +2 -0
  890. data/spec/{app → support}/models/ownable.rb +2 -0
  891. data/spec/{app → support}/models/owner.rb +4 -0
  892. data/spec/{app → support}/models/pack.rb +2 -0
  893. data/spec/{app → support}/models/page.rb +2 -0
  894. data/spec/{app → support}/models/page_question.rb +2 -0
  895. data/spec/{app → support}/models/palette.rb +3 -1
  896. data/spec/{app → support}/models/parent.rb +2 -0
  897. data/spec/{app → support}/models/parent_doc.rb +2 -0
  898. data/spec/support/models/passport.rb +13 -0
  899. data/spec/{app → support}/models/patient.rb +2 -0
  900. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  901. data/spec/support/models/pencil.rb +3 -0
  902. data/spec/{app → support}/models/person.rb +21 -1
  903. data/spec/{app → support}/models/pet.rb +2 -0
  904. data/spec/{app → support}/models/pet_owner.rb +2 -0
  905. data/spec/{app → support}/models/phone.rb +5 -1
  906. data/spec/support/models/piano.rb +4 -0
  907. data/spec/{app → support}/models/pizza.rb +2 -0
  908. data/spec/{app → support}/models/player.rb +2 -0
  909. data/spec/{app → support}/models/post.rb +2 -0
  910. data/spec/{app → support}/models/post_genre.rb +2 -0
  911. data/spec/{app → support}/models/powerup.rb +2 -0
  912. data/spec/{app → support}/models/preference.rb +2 -0
  913. data/spec/{app → support}/models/princess.rb +2 -0
  914. data/spec/{app → support}/models/product.rb +2 -0
  915. data/spec/support/models/profile.rb +17 -0
  916. data/spec/{app → support}/models/pronunciation.rb +2 -0
  917. data/spec/{app → support}/models/pub.rb +2 -0
  918. data/spec/support/models/publication/encyclopedia.rb +11 -0
  919. data/spec/support/models/publication/review.rb +13 -0
  920. data/spec/support/models/publication.rb +4 -0
  921. data/spec/{app → support}/models/purchase.rb +2 -0
  922. data/spec/support/models/purchased_item.rb +10 -0
  923. data/spec/{app → support}/models/question.rb +2 -0
  924. data/spec/{app → support}/models/quiz.rb +2 -0
  925. data/spec/{app → support}/models/rating.rb +2 -0
  926. data/spec/{app → support}/models/record.rb +2 -0
  927. data/spec/{app → support}/models/registry.rb +2 -0
  928. data/spec/{app → support}/models/role.rb +2 -0
  929. data/spec/{app → support}/models/root_category.rb +2 -0
  930. data/spec/{app → support}/models/sandwich.rb +2 -0
  931. data/spec/{app → support}/models/scheduler.rb +2 -0
  932. data/spec/support/models/scribe.rb +7 -0
  933. data/spec/support/models/sealer.rb +7 -0
  934. data/spec/support/models/seat.rb +24 -0
  935. data/spec/{app → support}/models/seo.rb +2 -0
  936. data/spec/support/models/series.rb +7 -0
  937. data/spec/{app → support}/models/server.rb +2 -0
  938. data/spec/{app → support}/models/service.rb +2 -0
  939. data/spec/{app → support}/models/shape.rb +4 -2
  940. data/spec/{app → support}/models/shelf.rb +2 -0
  941. data/spec/{app → support}/models/shipment_address.rb +2 -0
  942. data/spec/{app → support}/models/shipping_container.rb +2 -0
  943. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  944. data/spec/support/models/shirt.rb +11 -0
  945. data/spec/{app → support}/models/shop.rb +2 -0
  946. data/spec/{app → support}/models/short_agent.rb +2 -0
  947. data/spec/{app → support}/models/short_quiz.rb +2 -0
  948. data/spec/{app → support}/models/simple.rb +2 -0
  949. data/spec/{app → support}/models/slave.rb +2 -0
  950. data/spec/{app → support}/models/song.rb +2 -0
  951. data/spec/{app → support}/models/sound.rb +2 -0
  952. data/spec/support/models/spacer.rb +7 -0
  953. data/spec/{app → support}/models/square.rb +2 -0
  954. data/spec/{app → support}/models/staff.rb +2 -0
  955. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  956. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  957. data/spec/support/models/store_as_dup_test3.rb +7 -0
  958. data/spec/support/models/store_as_dup_test4.rb +7 -0
  959. data/spec/{app → support}/models/strategy.rb +2 -0
  960. data/spec/{app → support}/models/sub_item.rb +2 -0
  961. data/spec/{app → support}/models/subscription.rb +2 -0
  962. data/spec/{app → support}/models/survey.rb +2 -0
  963. data/spec/{app → support}/models/symptom.rb +2 -0
  964. data/spec/support/models/system_role.rb +7 -0
  965. data/spec/{app → support}/models/tag.rb +2 -0
  966. data/spec/{app → support}/models/target.rb +2 -0
  967. data/spec/{app → support}/models/template.rb +2 -0
  968. data/spec/{app → support}/models/thing.rb +2 -0
  969. data/spec/support/models/threadlocker.rb +7 -0
  970. data/spec/{app → support}/models/title.rb +2 -0
  971. data/spec/{app → support}/models/tool.rb +4 -2
  972. data/spec/{app → support}/models/topping.rb +2 -0
  973. data/spec/support/models/toy.rb +9 -0
  974. data/spec/{app → support}/models/track.rb +2 -0
  975. data/spec/{app → support}/models/translation.rb +2 -0
  976. data/spec/{app → support}/models/tree.rb +2 -0
  977. data/spec/support/models/truck.rb +7 -0
  978. data/spec/support/models/updatable.rb +7 -0
  979. data/spec/{app → support}/models/user.rb +2 -0
  980. data/spec/{app → support}/models/user_account.rb +2 -0
  981. data/spec/{app → support}/models/validation_callback.rb +2 -0
  982. data/spec/support/models/vehicle.rb +18 -0
  983. data/spec/{app → support}/models/version.rb +2 -0
  984. data/spec/{app → support}/models/vertex.rb +3 -1
  985. data/spec/{app → support}/models/vet_visit.rb +2 -0
  986. data/spec/{app → support}/models/video.rb +2 -0
  987. data/spec/support/models/video_game.rb +3 -0
  988. data/spec/support/models/washer.rb +7 -0
  989. data/spec/{app → support}/models/weapon.rb +2 -0
  990. data/spec/{app → support}/models/wiki_page.rb +3 -0
  991. data/spec/{app → support}/models/word.rb +2 -0
  992. data/spec/{app → support}/models/word_origin.rb +2 -0
  993. data/spec/{app → support}/models/writer.rb +4 -2
  994. data/spec/support/shared/time.rb +53 -0
  995. data/spec/support/spec_config.rb +60 -0
  996. data.tar.gz.sig +0 -0
  997. metadata +1131 -686
  998. metadata.gz.sig +0 -0
  999. data/lib/mongoid/association/touchable.rb +0 -97
  1000. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1001. data/lib/mongoid/matchable/all.rb +0 -27
  1002. data/lib/mongoid/matchable/and.rb +0 -30
  1003. data/lib/mongoid/matchable/default.rb +0 -72
  1004. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1005. data/lib/mongoid/matchable/exists.rb +0 -23
  1006. data/lib/mongoid/matchable/gt.rb +0 -23
  1007. data/lib/mongoid/matchable/gte.rb +0 -23
  1008. data/lib/mongoid/matchable/in.rb +0 -24
  1009. data/lib/mongoid/matchable/lt.rb +0 -23
  1010. data/lib/mongoid/matchable/lte.rb +0 -23
  1011. data/lib/mongoid/matchable/ne.rb +0 -21
  1012. data/lib/mongoid/matchable/nin.rb +0 -22
  1013. data/lib/mongoid/matchable/or.rb +0 -33
  1014. data/lib/mongoid/matchable/regexp.rb +0 -27
  1015. data/lib/mongoid/matchable/size.rb +0 -21
  1016. data/lib/support/ruby_version.rb +0 -26
  1017. data/spec/app/models/actress.rb +0 -2
  1018. data/spec/app/models/bed.rb +0 -1
  1019. data/spec/app/models/car.rb +0 -1
  1020. data/spec/app/models/eraser.rb +0 -1
  1021. data/spec/app/models/learner.rb +0 -2
  1022. data/spec/app/models/my_hash.rb +0 -2
  1023. data/spec/app/models/passport.rb +0 -5
  1024. data/spec/app/models/pencil.rb +0 -1
  1025. data/spec/app/models/profile.rb +0 -5
  1026. data/spec/app/models/series.rb +0 -4
  1027. data/spec/app/models/truck.rb +0 -3
  1028. data/spec/app/models/vehicle.rb +0 -11
  1029. data/spec/app/models/video_game.rb +0 -1
  1030. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1031. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1032. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1033. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1034. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1035. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1036. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1037. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1038. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1039. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1040. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1041. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1042. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1043. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1044. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1045. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1046. data/spec/mongoid/matchable_spec.rb +0 -828
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Mongoid::Contextual::Mongo do
@@ -7,7 +9,7 @@ describe Mongoid::Contextual::Mongo do
7
9
  describe "##{method}" do
8
10
 
9
11
  before do
10
- Band.create(name: "Depeche Mode")
12
+ Band.create!(name: "Depeche Mode")
11
13
  end
12
14
 
13
15
  context "when the count is zero" do
@@ -78,11 +80,11 @@ describe Mongoid::Contextual::Mongo do
78
80
  describe "#count" do
79
81
 
80
82
  let!(:depeche) do
81
- Band.create(name: "Depeche Mode")
83
+ Band.create!(name: "Depeche Mode")
82
84
  end
83
85
 
84
86
  let!(:new_order) do
85
- Band.create(name: "New Order")
87
+ Band.create!(name: "New Order")
86
88
  end
87
89
 
88
90
  let(:criteria) do
@@ -106,11 +108,8 @@ describe Mongoid::Contextual::Mongo do
106
108
  described_class.new(criteria.cache)
107
109
  end
108
110
 
109
- before do
110
- expect(context.view).to receive(:count).once.and_return(1)
111
- end
112
-
113
111
  it "returns the count cached value after first call" do
112
+ expect(context.view).to receive(:count_documents).once.and_return(1)
114
113
  2.times { expect(context.count).to eq(1) }
115
114
  end
116
115
  end
@@ -134,7 +133,7 @@ describe Mongoid::Contextual::Mongo do
134
133
  context "and a limit true" do
135
134
 
136
135
  before do
137
- 2.times { Band.create(name: "Depeche Mode", likes: 1) }
136
+ 2.times { Band.create!(name: "Depeche Mode", likes: 1) }
138
137
  end
139
138
 
140
139
  let(:count) do
@@ -152,7 +151,7 @@ describe Mongoid::Contextual::Mongo do
152
151
  context "when provided limit" do
153
152
 
154
153
  before do
155
- 2.times { Band.create(name: "Depeche Mode") }
154
+ 2.times { Band.create!(name: "Depeche Mode") }
156
155
  end
157
156
 
158
157
  let(:context) do
@@ -168,7 +167,8 @@ describe Mongoid::Contextual::Mongo do
168
167
  end
169
168
  end
170
169
 
171
- context 'when a collation is specified', if: collation_supported? do
170
+ context 'when a collation is specified' do
171
+ min_server_version '3.4'
172
172
 
173
173
  let(:context) do
174
174
  described_class.new(criteria)
@@ -191,16 +191,81 @@ describe Mongoid::Contextual::Mongo do
191
191
  end
192
192
  end
193
193
 
194
+ describe "#estimated_count" do
195
+
196
+ let!(:depeche) do
197
+ Band.create!(name: "Depeche Mode")
198
+ end
199
+
200
+ let!(:new_order) do
201
+ Band.create!(name: "New Order")
202
+ end
203
+
204
+ let(:criteria) do
205
+ Band.where
206
+ end
207
+
208
+ context "when not providing options" do
209
+ it 'returns the correct count' do
210
+ expect(criteria.estimated_count).to eq(2)
211
+ end
212
+ end
213
+
214
+ context "when providing options" do
215
+ it 'returns the correct count' do
216
+ expect(criteria.estimated_count(maxTimeMS: 1000)).to eq(2)
217
+ end
218
+ end
219
+
220
+ context "when context is cached" do
221
+
222
+ let(:context) do
223
+ described_class.new(criteria.cache)
224
+ end
225
+
226
+ it "returns the count cached value after first call" do
227
+ expect(context.view).to receive(:estimated_document_count).once.and_return(1)
228
+ 2.times do
229
+ context.estimated_count
230
+ end
231
+ end
232
+ end
233
+
234
+ context "when the criteria contains a selector", :focus do
235
+ let(:criteria) do
236
+ Band.where(name: "New Order")
237
+ end
238
+
239
+ context "when not providing options" do
240
+ it 'raises an error' do
241
+ expect do
242
+ criteria.estimated_count
243
+ end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
244
+ end
245
+ end
246
+
247
+ context "when providing options" do
248
+ it 'raises an error' do
249
+ expect do
250
+ criteria.estimated_count(maxTimeMS: 1000)
251
+ end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
252
+ end
253
+ end
254
+ end
255
+ end
256
+
257
+
258
+
194
259
  [ :delete, :delete_all ].each do |method|
195
260
 
196
261
  describe "##{method}" do
197
262
 
198
263
  let!(:depeche_mode) do
199
- Band.create(name: "Depeche Mode")
264
+ Band.create!(name: "Depeche Mode")
200
265
  end
201
266
 
202
267
  let!(:new_order) do
203
- Band.create(name: "New Order")
268
+ Band.create!(name: "New Order")
204
269
  end
205
270
 
206
271
  context "when the selector is contraining" do
@@ -229,7 +294,8 @@ describe Mongoid::Contextual::Mongo do
229
294
  expect(deleted).to eq(1)
230
295
  end
231
296
 
232
- context 'when the criteria has a collation', if: collation_supported? do
297
+ context 'when the criteria has a collation' do
298
+ min_server_version '3.4'
233
299
 
234
300
  let(:criteria) do
235
301
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -300,11 +366,11 @@ describe Mongoid::Contextual::Mongo do
300
366
  describe "##{method}" do
301
367
 
302
368
  let!(:depeche_mode) do
303
- Band.create(name: "Depeche Mode")
369
+ Band.create!(name: "Depeche Mode")
304
370
  end
305
371
 
306
372
  let!(:new_order) do
307
- Band.create(name: "New Order")
373
+ Band.create!(name: "New Order")
308
374
  end
309
375
 
310
376
  context "when the selector is contraining" do
@@ -333,7 +399,8 @@ describe Mongoid::Contextual::Mongo do
333
399
  expect(destroyed).to eq(1)
334
400
  end
335
401
 
336
- context 'when the criteria has a collation', if: collation_supported? do
402
+ context 'when the criteria has a collation' do
403
+ min_server_version '3.4'
337
404
 
338
405
  let(:criteria) do
339
406
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -384,7 +451,7 @@ describe Mongoid::Contextual::Mongo do
384
451
  context 'when the write concern is unacknowledged' do
385
452
 
386
453
  before do
387
- 2.times { Band.create }
454
+ 2.times { Band.create! }
388
455
  end
389
456
 
390
457
  let(:criteria) do
@@ -406,27 +473,83 @@ describe Mongoid::Contextual::Mongo do
406
473
  describe "#distinct" do
407
474
 
408
475
  before do
409
- Band.create(name: "Depeche Mode", years: 30)
410
- Band.create(name: "New Order", years: 25)
476
+ Band.create!(name: "Depeche Mode", years: 30, sales: "1E2")
477
+ Band.create!(name: "New Order", years: 25, sales: "2E3")
478
+ Band.create!(name: "10,000 Maniacs", years: 20, sales: "1E2")
411
479
  end
412
480
 
413
- context "when limiting the result set" do
481
+ with_config_values :legacy_pluck_distinct, true, false do
482
+ context "when limiting the result set" do
414
483
 
415
- let(:criteria) do
416
- Band.where(name: "Depeche Mode")
484
+ let(:criteria) do
485
+ Band.where(name: "Depeche Mode")
486
+ end
487
+
488
+ let(:context) do
489
+ described_class.new(criteria)
490
+ end
491
+
492
+ it "returns the distinct matching fields" do
493
+ expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
494
+ end
417
495
  end
418
496
 
419
- let(:context) do
420
- described_class.new(criteria)
497
+ context "when not limiting the result set" do
498
+
499
+ let(:criteria) do
500
+ Band.criteria
501
+ end
502
+
503
+ let(:context) do
504
+ described_class.new(criteria)
505
+ end
506
+
507
+ it "returns the distinct field values" do
508
+ expect(context.distinct(:name).sort).to eq([ "10,000 Maniacs", "Depeche Mode", "New Order" ].sort)
509
+ end
421
510
  end
422
511
 
423
- it "returns the distinct matching fields" do
424
- expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
512
+ context "when providing an aliased field" do
513
+
514
+ let(:criteria) do
515
+ Band.criteria
516
+ end
517
+
518
+ let(:context) do
519
+ described_class.new(criteria)
520
+ end
521
+
522
+ it "returns the distinct field values" do
523
+ expect(context.distinct(:years).sort).to eq([ 20, 25, 30 ])
524
+ end
425
525
  end
426
- end
427
526
 
428
- context "when not limiting the result set" do
527
+ context 'when a collation is specified' do
528
+ min_server_version '3.4'
529
+
530
+ before do
531
+ Band.create!(name: 'DEPECHE MODE')
532
+ end
533
+
534
+ let(:context) do
535
+ described_class.new(criteria)
536
+ end
537
+
538
+ let(:expected_results) do
539
+ ["10,000 Maniacs", "Depeche Mode", "New Order"]
540
+ end
541
+
542
+ let(:criteria) do
543
+ Band.where({}).collation(locale: 'en_US', strength: 2)
544
+ end
429
545
 
546
+ it 'applies the collation' do
547
+ expect(context.distinct(:name).sort).to eq(expected_results.sort)
548
+ end
549
+ end
550
+ end
551
+
552
+ context "when providing a demongoizable field" do
430
553
  let(:criteria) do
431
554
  Band.criteria
432
555
  end
@@ -435,46 +558,241 @@ describe Mongoid::Contextual::Mongo do
435
558
  described_class.new(criteria)
436
559
  end
437
560
 
438
- it "returns the distinct field values" do
439
- expect(context.distinct(:name)).to eq([ "Depeche Mode", "New Order" ])
561
+ context "when legacy_pluck_distinct is set" do
562
+ config_override :legacy_pluck_distinct, true
563
+
564
+ it "returns the non-demongoized distinct field values" do
565
+ expect(context.distinct(:sales).sort).to eq([ "1E2", "2E3" ])
566
+ end
567
+ end
568
+
569
+ context "when legacy_pluck_distinct is not set" do
570
+ config_override :legacy_pluck_distinct, false
571
+
572
+ it "returns the non-demongoized distinct field values" do
573
+ expect(context.distinct(:sales).sort).to eq([ BigDecimal("1E2"), BigDecimal("2E3") ])
574
+ end
440
575
  end
441
576
  end
442
577
 
443
- context "when providing an aliased field" do
578
+ context "when getting a localized field" do
579
+ before do
580
+ I18n.locale = :en
581
+ d = Dictionary.create!(description: 'english-text')
582
+ I18n.locale = :de
583
+ d.description = 'deutsch-text'
584
+ d.save!
585
+ end
444
586
 
445
587
  let(:criteria) do
446
- Band.criteria
588
+ Dictionary.criteria
447
589
  end
448
590
 
449
591
  let(:context) do
450
592
  described_class.new(criteria)
451
593
  end
452
594
 
453
- it "returns the distinct field values" do
454
- expect(context.distinct(:years)).to eq([ 30, 25 ])
595
+ context "when getting the field without _translations" do
596
+ context "when legacy_pluck_distinct is set" do
597
+ config_override :legacy_pluck_distinct, true
598
+
599
+ it "gets the full hash" do
600
+ expect(context.distinct(:description)).to eq([{ "de" => "deutsch-text", "en" => "english-text" }])
601
+ end
602
+ end
603
+
604
+ context "when legacy_pluck_distinct is not set" do
605
+ config_override :legacy_pluck_distinct, false
606
+
607
+ it "gets the demongoized localized field" do
608
+ expect(context.distinct(:description)).to eq([ 'deutsch-text' ])
609
+ end
610
+ end
455
611
  end
456
- end
457
612
 
458
- context 'when a collation is specified', if: collation_supported? do
613
+ context "when getting the field with _translations" do
614
+ context "when legacy_pluck_distinct is set" do
615
+ config_override :legacy_pluck_distinct, true
459
616
 
460
- before do
461
- Band.create(name: 'DEPECHE MODE')
617
+ it "gets an empty list" do
618
+ expect(context.distinct(:description_translations)).to eq([])
619
+ end
620
+ end
621
+
622
+ context "when legacy_pluck_distinct is not set" do
623
+ config_override :legacy_pluck_distinct, false
624
+
625
+ it "gets the full hash" do
626
+ expect(context.distinct(:description_translations)).to eq([ { "de" => "deutsch-text", "en" => "english-text" } ])
627
+ end
628
+ end
462
629
  end
463
630
 
464
- let(:context) do
465
- described_class.new(criteria)
631
+ context 'when plucking a specific locale' do
632
+
633
+ let(:distinct) do
634
+ context.distinct(:'description.de')
635
+ end
636
+
637
+ context "when legacy_pluck_distinct is set" do
638
+ config_override :legacy_pluck_distinct, true
639
+
640
+ it 'returns the specific translation' do
641
+ expect(distinct).to eq([ 'deutsch-text' ])
642
+ end
643
+ end
644
+
645
+ context "when legacy_pluck_distinct is not set" do
646
+ config_override :legacy_pluck_distinct, false
647
+
648
+ it 'returns the specific translation' do
649
+ expect(distinct).to eq([ "deutsch-text" ])
650
+ end
651
+ end
466
652
  end
467
653
 
468
- let(:expected_results) do
469
- ["Depeche Mode", "New Order"]
654
+ context 'when plucking a specific locale from _translations field' do
655
+
656
+ let(:distinct) do
657
+ context.distinct(:'description_translations.de')
658
+ end
659
+
660
+ context "when legacy_pluck_distinct is set" do
661
+ config_override :legacy_pluck_distinct, true
662
+
663
+ it 'returns the empty list' do
664
+ expect(distinct).to eq([])
665
+ end
666
+ end
667
+
668
+ context "when legacy_pluck_distinct is not set" do
669
+ config_override :legacy_pluck_distinct, false
670
+
671
+ it 'returns the specific translations' do
672
+ expect(distinct).to eq(['deutsch-text'])
673
+ end
674
+ end
470
675
  end
471
676
 
472
- let(:criteria) do
473
- Band.where({}).collation(locale: 'en_US', strength: 2)
677
+ context 'when fallbacks are enabled with a locale list' do
678
+ require_fallbacks
679
+
680
+ around(:all) do |example|
681
+ prev_fallbacks = I18n.fallbacks.dup
682
+ I18n.fallbacks[:he] = [ :en ]
683
+ example.run
684
+ I18n.fallbacks = prev_fallbacks
685
+ end
686
+
687
+ let(:distinct) do
688
+ context.distinct(:description).first
689
+ end
690
+
691
+ context "when legacy_pluck_distinct is set" do
692
+ config_override :legacy_pluck_distinct, true
693
+
694
+ it "does not correctly use the fallback" do
695
+ distinct.should == {"de"=>"deutsch-text", "en"=>"english-text"}
696
+ end
697
+ end
698
+
699
+ context "when legacy_pluck_distinct is not set" do
700
+ config_override :legacy_pluck_distinct, false
701
+
702
+ it "correctly uses the fallback" do
703
+ I18n.locale = :en
704
+ d = Dictionary.create!(description: 'english-text')
705
+ I18n.locale = :he
706
+ distinct.should == "english-text"
707
+ end
708
+ end
709
+ end
710
+
711
+ context "when the localized field is embedded" do
712
+ before do
713
+ p = Passport.new
714
+ I18n.locale = :en
715
+ p.name = "Neil"
716
+ I18n.locale = :he
717
+ p.name = "Nissim"
718
+
719
+ Person.create!(passport: p, employer_id: 12345)
720
+ end
721
+
722
+ let(:criteria) do
723
+ Person.where(employer_id: 12345)
724
+ end
725
+
726
+ let(:context) do
727
+ described_class.new(criteria)
728
+ end
729
+
730
+ let(:distinct) do
731
+ context.distinct("pass.name").first
732
+ end
733
+
734
+ let(:distinct_translations) do
735
+ context.distinct("pass.name_translations").first
736
+ end
737
+
738
+ let(:distinct_translations_field) do
739
+ context.distinct("pass.name_translations.en").first
740
+ end
741
+
742
+ context "when legacy_pluck_distinct is set" do
743
+ config_override :legacy_pluck_distinct, true
744
+
745
+ it "returns the full hash" do
746
+ expect(distinct).to eq({ "en" => "Neil", "he" => "Nissim" })
747
+ end
748
+
749
+ it "returns the empty hash" do
750
+ expect(distinct_translations).to eq(nil)
751
+ end
752
+
753
+ it "returns the empty hash" do
754
+ expect(distinct_translations_field).to eq(nil)
755
+ end
756
+ end
757
+
758
+ context "when legacy_pluck_distinct is not set" do
759
+ config_override :legacy_pluck_distinct, false
760
+
761
+ it "returns the translation for the current locale" do
762
+ expect(distinct).to eq("Nissim")
763
+ end
764
+
765
+ it "returns the full _translation hash" do
766
+ expect(distinct_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
767
+ end
768
+
769
+ it "returns the translation for the requested locale" do
770
+ expect(distinct_translations_field).to eq("Neil")
771
+ end
772
+ end
773
+ end
774
+ end
775
+
776
+ context "when getting an embedded field" do
777
+
778
+ let(:label) { Label.new(sales: "1E2") }
779
+ let!(:band) { Band.create!(label: label) }
780
+ let(:criteria) { Band.where(_id: band.id) }
781
+ let(:context) { described_class.new(criteria) }
782
+
783
+ context "when legacy_pluck_distinct is set" do
784
+ config_override :legacy_pluck_distinct, true
785
+
786
+ it "returns the distinct matching fields" do
787
+ expect(context.distinct("label.sales")).to eq([ "1E2" ])
788
+ end
474
789
  end
475
790
 
476
- it 'applies the collation' do
477
- expect(context.distinct(:name)).to eq(expected_results)
791
+ context "when legacy_pluck_distinct is not set" do
792
+ config_override :legacy_pluck_distinct, false
793
+ it "returns the distinct matching fields" do
794
+ expect(context.distinct("label.sales")).to eq([ BigDecimal("1E2") ])
795
+ end
478
796
  end
479
797
  end
480
798
  end
@@ -482,7 +800,7 @@ describe Mongoid::Contextual::Mongo do
482
800
  describe "#each" do
483
801
 
484
802
  before do
485
- Band.create(name: "Depeche Mode")
803
+ Band.create!(name: "Depeche Mode")
486
804
  end
487
805
 
488
806
  let(:criteria) do
@@ -493,7 +811,8 @@ describe Mongoid::Contextual::Mongo do
493
811
  described_class.new(criteria)
494
812
  end
495
813
 
496
- context 'when the criteria has a collation', if: collation_supported? do
814
+ context 'when the criteria has a collation' do
815
+ min_server_version '3.4'
497
816
 
498
817
  let(:criteria) do
499
818
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -559,7 +878,7 @@ describe Mongoid::Contextual::Mongo do
559
878
  context "when iterating with next" do
560
879
 
561
880
  before do
562
- 10.times { |i| Band.create(name: "Test #{i}") }
881
+ 10.times { |i| Band.create!(name: "Test #{i}") }
563
882
  end
564
883
 
565
884
  let(:criteria) do
@@ -571,8 +890,21 @@ describe Mongoid::Contextual::Mongo do
571
890
  end
572
891
 
573
892
  it "does not load all documents" do
574
- expect(Mongo::Logger.logger).to receive(:debug?).exactly(2).times.and_call_original
893
+ subscriber = Mrss::EventSubscriber.new
894
+ context.view.client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
895
+
575
896
  enum.next
897
+
898
+ find_events = subscriber.all_events.select do |evt|
899
+ evt.command_name == 'find'
900
+ end
901
+ expect(find_events.length).to be(2)
902
+ get_more_events = subscriber.all_events.select do |evt|
903
+ evt.command_name == 'getMore'
904
+ end
905
+ expect(get_more_events.length).to be(0)
906
+ ensure
907
+ context.view.client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
576
908
  end
577
909
  end
578
910
  end
@@ -581,9 +913,9 @@ describe Mongoid::Contextual::Mongo do
581
913
  context 'when the criteria has a parent document' do
582
914
 
583
915
  before do
584
- Post.create(person: person)
585
- Post.create(person: person)
586
- Post.create(person: person)
916
+ Post.create!(person: person)
917
+ Post.create!(person: person)
918
+ Post.create!(person: person)
587
919
  end
588
920
 
589
921
  let(:person) do
@@ -630,7 +962,7 @@ describe Mongoid::Contextual::Mongo do
630
962
  describe "#exists?" do
631
963
 
632
964
  before do
633
- Band.create(name: "Depeche Mode")
965
+ Band.create!(name: "Depeche Mode")
634
966
  end
635
967
 
636
968
  context "when the count is zero" do
@@ -743,11 +1075,11 @@ describe Mongoid::Contextual::Mongo do
743
1075
  describe "#find_one_and_replace" do
744
1076
 
745
1077
  let!(:depeche) do
746
- Band.create(name: "Depeche Mode")
1078
+ Band.create!(name: "Depeche Mode")
747
1079
  end
748
1080
 
749
1081
  let!(:tool) do
750
- Band.create(name: "Tool")
1082
+ Band.create!(name: "Tool")
751
1083
  end
752
1084
 
753
1085
  context "when the selector matches" do
@@ -850,7 +1182,8 @@ describe Mongoid::Contextual::Mongo do
850
1182
  end
851
1183
  end
852
1184
 
853
- context 'when a collation is specified on the criteria', if: collation_supported? do
1185
+ context 'when a collation is specified on the criteria' do
1186
+ min_server_version '3.4'
854
1187
 
855
1188
  let(:criteria) do
856
1189
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -898,11 +1231,11 @@ describe Mongoid::Contextual::Mongo do
898
1231
  describe "#find_one_and_update" do
899
1232
 
900
1233
  let!(:depeche) do
901
- Band.create(name: "Depeche Mode")
1234
+ Band.create!(name: "Depeche Mode")
902
1235
  end
903
1236
 
904
1237
  let!(:tool) do
905
- Band.create(name: "Tool")
1238
+ Band.create!(name: "Tool")
906
1239
  end
907
1240
 
908
1241
  context "when the selector matches" do
@@ -1003,7 +1336,8 @@ describe Mongoid::Contextual::Mongo do
1003
1336
  end
1004
1337
  end
1005
1338
 
1006
- context 'when a collation is specified on the criteria', if: collation_supported? do
1339
+ context 'when a collation is specified on the criteria' do
1340
+ min_server_version '3.4'
1007
1341
 
1008
1342
  let(:criteria) do
1009
1343
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1050,7 +1384,7 @@ describe Mongoid::Contextual::Mongo do
1050
1384
  describe "#find_one_and_delete" do
1051
1385
 
1052
1386
  let!(:depeche) do
1053
- Band.create(name: "Depeche Mode")
1387
+ Band.create!(name: "Depeche Mode")
1054
1388
  end
1055
1389
 
1056
1390
  let(:criteria) do
@@ -1077,7 +1411,8 @@ describe Mongoid::Contextual::Mongo do
1077
1411
  }.to raise_error(Mongoid::Errors::DocumentNotFound)
1078
1412
  end
1079
1413
 
1080
- context 'when a collation is specified on the criteria', if: collation_supported? do
1414
+ context 'when a collation is specified on the criteria' do
1415
+ min_server_version '3.4'
1081
1416
 
1082
1417
  let(:criteria) do
1083
1418
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1128,11 +1463,11 @@ describe Mongoid::Contextual::Mongo do
1128
1463
  describe "##{method}" do
1129
1464
 
1130
1465
  let!(:depeche_mode) do
1131
- Band.create(name: "Depeche Mode")
1466
+ Band.create!(name: "Depeche Mode")
1132
1467
  end
1133
1468
 
1134
1469
  let!(:new_order) do
1135
- Band.create(name: "New Order")
1470
+ Band.create!(name: "New Order")
1136
1471
  end
1137
1472
 
1138
1473
  context "when the context is not cached" do
@@ -1149,7 +1484,8 @@ describe Mongoid::Contextual::Mongo do
1149
1484
  expect(context.send(method)).to eq(depeche_mode)
1150
1485
  end
1151
1486
 
1152
- context 'when the criteria has a collation', if: collation_supported? do
1487
+ context 'when the criteria has a collation' do
1488
+ min_server_version '3.4'
1153
1489
 
1154
1490
  let(:criteria) do
1155
1491
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1368,8 +1704,8 @@ describe Mongoid::Contextual::Mongo do
1368
1704
  describe "##{method}" do
1369
1705
 
1370
1706
  before do
1371
- Band.create(name: "Depeche Mode")
1372
- Band.create(name: "New Order")
1707
+ Band.create!(name: "Depeche Mode")
1708
+ Band.create!(name: "New Order")
1373
1709
  end
1374
1710
 
1375
1711
  context "when the criteria has a limit" do
@@ -1387,12 +1723,8 @@ describe Mongoid::Contextual::Mongo do
1387
1723
  end
1388
1724
 
1389
1725
  context "when calling more than once" do
1390
-
1391
- before do
1392
- expect(context.view).to receive(:count).once.and_return(2)
1393
- end
1394
-
1395
1726
  it "returns the cached value for subsequent calls" do
1727
+ expect(context.view).to receive(:count_documents).once.and_return(2)
1396
1728
  2.times { expect(context.send(method)).to eq(2) }
1397
1729
  end
1398
1730
  end
@@ -1401,10 +1733,10 @@ describe Mongoid::Contextual::Mongo do
1401
1733
 
1402
1734
  before do
1403
1735
  context.entries
1404
- expect(context.view).to receive(:count).once.and_return(2)
1405
1736
  end
1406
1737
 
1407
1738
  it "returns the cached value for all calls" do
1739
+ expect(context.view).to receive(:count_documents).once.and_return(2)
1408
1740
  expect(context.send(method)).to eq(2)
1409
1741
  end
1410
1742
 
@@ -1436,12 +1768,8 @@ describe Mongoid::Contextual::Mongo do
1436
1768
  end
1437
1769
 
1438
1770
  context "when calling more than once" do
1439
-
1440
- before do
1441
- expect(context.view).to receive(:count).once.and_return(1)
1442
- end
1443
-
1444
1771
  it "returns the cached value for subsequent calls" do
1772
+ expect(context.view).to receive(:count_documents).once.and_return(1)
1445
1773
  2.times { expect(context.send(method)).to eq(1) }
1446
1774
  end
1447
1775
  end
@@ -1450,10 +1778,10 @@ describe Mongoid::Contextual::Mongo do
1450
1778
 
1451
1779
  before do
1452
1780
  context.entries
1453
- expect(context.view).to receive(:count).once.and_return(1)
1454
1781
  end
1455
1782
 
1456
1783
  it "returns the cached value for all calls" do
1784
+ expect(context.view).to receive(:count_documents).once.and_return(1)
1457
1785
  expect(context.send(method)).to eq(1)
1458
1786
  end
1459
1787
 
@@ -1475,11 +1803,11 @@ describe Mongoid::Contextual::Mongo do
1475
1803
  describe "#limit" do
1476
1804
 
1477
1805
  let!(:depeche_mode) do
1478
- Band.create(name: "Depeche Mode")
1806
+ Band.create!(name: "Depeche Mode")
1479
1807
  end
1480
1808
 
1481
1809
  let!(:new_order) do
1482
- Band.create(name: "New Order")
1810
+ Band.create!(name: "New Order")
1483
1811
  end
1484
1812
 
1485
1813
  let(:criteria) do
@@ -1498,8 +1826,8 @@ describe Mongoid::Contextual::Mongo do
1498
1826
  describe "#map" do
1499
1827
 
1500
1828
  before do
1501
- Band.create(name: "Depeche Mode")
1502
- Band.create(name: "New Order")
1829
+ Band.create!(name: "Depeche Mode")
1830
+ Band.create!(name: "New Order")
1503
1831
  end
1504
1832
 
1505
1833
  let(:criteria) do
@@ -1528,11 +1856,11 @@ describe Mongoid::Contextual::Mongo do
1528
1856
  describe "#map_reduce" do
1529
1857
 
1530
1858
  let!(:depeche_mode) do
1531
- Band.create(name: "Depeche Mode", likes: 200)
1859
+ Band.create!(name: "Depeche Mode", likes: 200)
1532
1860
  end
1533
1861
 
1534
1862
  let!(:tool) do
1535
- Band.create(name: "Tool", likes: 100)
1863
+ Band.create!(name: "Tool", likes: 100)
1536
1864
  end
1537
1865
 
1538
1866
  let(:map) do
@@ -1553,6 +1881,10 @@ describe Mongoid::Contextual::Mongo do
1553
1881
  }}
1554
1882
  end
1555
1883
 
1884
+ let(:ordered_results) do
1885
+ results['results'].sort_by { |doc| doc['_id'] }
1886
+ end
1887
+
1556
1888
  context "when no selection is provided" do
1557
1889
 
1558
1890
  let(:criteria) do
@@ -1584,36 +1916,40 @@ describe Mongoid::Contextual::Mongo do
1584
1916
  end
1585
1917
 
1586
1918
  it "contains the entire raw results" do
1587
- expect(results["results"]).to eq([
1919
+ expect(ordered_results).to eq([
1588
1920
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1589
1921
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1590
1922
  ])
1591
1923
  end
1592
1924
 
1593
- it "contains the execution time" do
1594
- expect(results.time).to_not be_nil
1595
- end
1925
+ context 'when statistics are available' do
1926
+ max_server_version '4.2'
1596
1927
 
1597
- it "contains the count statistics" do
1598
- expect(results["counts"]).to eq({
1599
- "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1600
- })
1601
- end
1928
+ it "contains the execution time" do
1929
+ expect(results.time).to_not be_nil
1930
+ end
1602
1931
 
1603
- it "contains the input count" do
1604
- expect(results.input).to eq(2)
1605
- end
1932
+ it "contains the count statistics" do
1933
+ expect(results["counts"]).to eq({
1934
+ "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1935
+ })
1936
+ end
1606
1937
 
1607
- it "contains the emitted count" do
1608
- expect(results.emitted).to eq(2)
1609
- end
1938
+ it "contains the input count" do
1939
+ expect(results.input).to eq(2)
1940
+ end
1610
1941
 
1611
- it "contains the reduced count" do
1612
- expect(results.reduced).to eq(0)
1613
- end
1942
+ it "contains the emitted count" do
1943
+ expect(results.emitted).to eq(2)
1944
+ end
1614
1945
 
1615
- it "contains the output count" do
1616
- expect(results.output).to eq(2)
1946
+ it "contains the reduced count" do
1947
+ expect(results.reduced).to eq(0)
1948
+ end
1949
+
1950
+ it "contains the output count" do
1951
+ expect(results.output).to eq(2)
1952
+ end
1617
1953
  end
1618
1954
  end
1619
1955
 
@@ -1642,35 +1978,39 @@ describe Mongoid::Contextual::Mongo do
1642
1978
  end
1643
1979
 
1644
1980
  it "contains the entire raw results" do
1645
- expect(results["results"]).to eq([
1981
+ expect(ordered_results).to eq([
1646
1982
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1647
1983
  ])
1648
1984
  end
1649
1985
 
1650
- it "contains the execution time" do
1651
- expect(results.time).to_not be_nil
1652
- end
1986
+ context 'when statistics are available' do
1987
+ max_server_version '4.2'
1653
1988
 
1654
- it "contains the count statistics" do
1655
- expect(results["counts"]).to eq({
1656
- "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1657
- })
1658
- end
1989
+ it "contains the execution time" do
1990
+ expect(results.time).to_not be_nil
1991
+ end
1659
1992
 
1660
- it "contains the input count" do
1661
- expect(results.input).to eq(1)
1662
- end
1993
+ it "contains the count statistics" do
1994
+ expect(results["counts"]).to eq({
1995
+ "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1996
+ })
1997
+ end
1663
1998
 
1664
- it "contains the emitted count" do
1665
- expect(results.emitted).to eq(1)
1666
- end
1999
+ it "contains the input count" do
2000
+ expect(results.input).to eq(1)
2001
+ end
1667
2002
 
1668
- it "contains the reduced count" do
1669
- expect(results.reduced).to eq(0)
1670
- end
2003
+ it "contains the emitted count" do
2004
+ expect(results.emitted).to eq(1)
2005
+ end
1671
2006
 
1672
- it "contains the output count" do
1673
- expect(results.output).to eq(1)
2007
+ it "contains the reduced count" do
2008
+ expect(results.reduced).to eq(0)
2009
+ end
2010
+
2011
+ it "contains the output count" do
2012
+ expect(results.output).to eq(1)
2013
+ end
1674
2014
  end
1675
2015
  end
1676
2016
 
@@ -1710,7 +2050,7 @@ describe Mongoid::Contextual::Mongo do
1710
2050
  end
1711
2051
 
1712
2052
  it "contains the entire raw results" do
1713
- expect(results["results"]).to eq([
2053
+ expect(ordered_results).to eq([
1714
2054
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1715
2055
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1716
2056
  ])
@@ -1718,6 +2058,9 @@ describe Mongoid::Contextual::Mongo do
1718
2058
  end
1719
2059
 
1720
2060
  context "when limiting is provided" do
2061
+ # map/reduce with limit is not supported on sharded clusters:
2062
+ # https://jira.mongodb.org/browse/SERVER-2099
2063
+ require_topology :single, :replica_set
1721
2064
 
1722
2065
  let(:criteria) do
1723
2066
  Band.limit(1)
@@ -1824,6 +2167,8 @@ describe Mongoid::Contextual::Mongo do
1824
2167
  end
1825
2168
 
1826
2169
  context "when the output specifies a different db" do
2170
+ # Limit is not supported in sharded clusters
2171
+ require_topology :single, :replica_set
1827
2172
 
1828
2173
  let(:criteria) do
1829
2174
  Band.limit(1)
@@ -1940,11 +2285,11 @@ describe Mongoid::Contextual::Mongo do
1940
2285
  describe "#skip" do
1941
2286
 
1942
2287
  let!(:depeche_mode) do
1943
- Band.create(name: "Depeche Mode")
2288
+ Band.create!(name: "Depeche Mode")
1944
2289
  end
1945
2290
 
1946
2291
  let!(:new_order) do
1947
- Band.create(name: "New Order")
2292
+ Band.create!(name: "New Order")
1948
2293
  end
1949
2294
 
1950
2295
  let(:criteria) do
@@ -1963,11 +2308,11 @@ describe Mongoid::Contextual::Mongo do
1963
2308
  describe "#sort" do
1964
2309
 
1965
2310
  let!(:depeche_mode) do
1966
- Band.create(name: "Depeche Mode")
2311
+ Band.create!(name: "Depeche Mode")
1967
2312
  end
1968
2313
 
1969
2314
  let!(:new_order) do
1970
- Band.create(name: "New Order")
2315
+ Band.create!(name: "New Order")
1971
2316
  end
1972
2317
 
1973
2318
  let(:criteria) do
@@ -2006,11 +2351,11 @@ describe Mongoid::Contextual::Mongo do
2006
2351
  describe "#update" do
2007
2352
 
2008
2353
  let!(:depeche_mode) do
2009
- Band.create(name: "Depeche Mode")
2354
+ Band.create!(name: "Depeche Mode")
2010
2355
  end
2011
2356
 
2012
2357
  let!(:new_order) do
2013
- Band.create(name: "New Order")
2358
+ Band.create!(name: "New Order")
2014
2359
  end
2015
2360
 
2016
2361
  let(:criteria) do
@@ -2024,11 +2369,11 @@ describe Mongoid::Contextual::Mongo do
2024
2369
  context "when adding an element to a HABTM set" do
2025
2370
 
2026
2371
  let(:person) do
2027
- Person.create
2372
+ Person.create!
2028
2373
  end
2029
2374
 
2030
2375
  let(:preference) do
2031
- Preference.create
2376
+ Preference.create!
2032
2377
  end
2033
2378
 
2034
2379
  before do
@@ -2158,7 +2503,8 @@ describe Mongoid::Contextual::Mongo do
2158
2503
  end
2159
2504
  end
2160
2505
 
2161
- context 'when provided array filters', if: array_filters_supported? do
2506
+ context 'when provided array filters' do
2507
+ min_server_version '3.6'
2162
2508
 
2163
2509
  before do
2164
2510
  Band.delete_all
@@ -2166,12 +2512,12 @@ describe Mongoid::Contextual::Mongo do
2166
2512
  b.labels << Label.new(name: 'Warner')
2167
2513
  b.labels << Label.new(name: 'Sony')
2168
2514
  b.labels << Label.new(name: 'Cbs')
2169
- b.save
2515
+ b.save!
2170
2516
 
2171
2517
  b = Band.new(name: 'FKA Twigs')
2172
2518
  b.labels << Label.new(name: 'Warner')
2173
2519
  b.labels << Label.new(name: 'Cbs')
2174
- b.save
2520
+ b.save!
2175
2521
  end
2176
2522
 
2177
2523
 
@@ -2197,11 +2543,11 @@ describe Mongoid::Contextual::Mongo do
2197
2543
  describe "#update_all" do
2198
2544
 
2199
2545
  let!(:depeche_mode) do
2200
- Band.create(name: "Depeche Mode", origin: "Essex")
2546
+ Band.create!(name: "Depeche Mode", origin: "Essex")
2201
2547
  end
2202
2548
 
2203
2549
  let!(:new_order) do
2204
- Band.create(name: "New Order")
2550
+ Band.create!(name: "New Order")
2205
2551
  end
2206
2552
 
2207
2553
  let(:criteria) do
@@ -2330,7 +2676,8 @@ describe Mongoid::Contextual::Mongo do
2330
2676
  end
2331
2677
  end
2332
2678
 
2333
- context 'when provided array filters', if: array_filters_supported? do
2679
+ context 'when provided array filters' do
2680
+ min_server_version '3.6'
2334
2681
 
2335
2682
  before do
2336
2683
  Band.delete_all
@@ -2338,12 +2685,12 @@ describe Mongoid::Contextual::Mongo do
2338
2685
  b.labels << Label.new(name: 'Warner')
2339
2686
  b.labels << Label.new(name: 'Sony')
2340
2687
  b.labels << Label.new(name: 'Cbs')
2341
- b.save
2688
+ b.save!
2342
2689
 
2343
2690
  b = Band.new(name: 'FKA Twigs')
2344
2691
  b.labels << Label.new(name: 'Warner')
2345
2692
  b.labels << Label.new(name: 'Cbs')
2346
- b.save
2693
+ b.save!
2347
2694
  end
2348
2695
 
2349
2696
 
@@ -2368,7 +2715,7 @@ describe Mongoid::Contextual::Mongo do
2368
2715
 
2369
2716
  describe '#pipeline' do
2370
2717
 
2371
- context 'when the criteria has a selector', if: non_legacy_server? do
2718
+ context 'when the criteria has a selector' do
2372
2719
 
2373
2720
  before do
2374
2721
  Artist.index(name: "text")
@@ -2388,7 +2735,7 @@ describe Mongoid::Contextual::Mongo do
2388
2735
  end
2389
2736
 
2390
2737
  it 'creates a pipeline with the selector as one of the $match criteria' do
2391
- expect(pipeline_match).to include({ :'$text' => { :'$search' => "New Order" } })
2738
+ expect(pipeline_match).to include({ '$text' => { '$search' => "New Order" } })
2392
2739
  end
2393
2740
 
2394
2741
  it 'creates a pipeline with the $exists operator as one of the $match criteria' do