mongoid 7.4.3 → 8.0.7

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 (383) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +25 -0
  5. data/lib/config/locales/en.yml +52 -28
  6. data/lib/mongoid/association/accessors.rb +38 -9
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +33 -10
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  16. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  17. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
  19. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  20. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  21. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  22. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  23. data/lib/mongoid/association/macros.rb +28 -1
  24. data/lib/mongoid/association/many.rb +11 -7
  25. data/lib/mongoid/association/nested/many.rb +5 -4
  26. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  27. data/lib/mongoid/association/nested/one.rb +5 -5
  28. data/lib/mongoid/association/one.rb +2 -2
  29. data/lib/mongoid/association/options.rb +9 -9
  30. data/lib/mongoid/association/proxy.rb +14 -3
  31. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  32. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  33. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  35. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  36. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  37. data/lib/mongoid/association/referenced/eager.rb +2 -2
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  40. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  41. data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
  42. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  43. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  44. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  45. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  46. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  47. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  48. data/lib/mongoid/association/reflections.rb +2 -2
  49. data/lib/mongoid/association/relatable.rb +44 -10
  50. data/lib/mongoid/association.rb +5 -5
  51. data/lib/mongoid/atomic/modifiers.rb +2 -2
  52. data/lib/mongoid/atomic.rb +7 -0
  53. data/lib/mongoid/attributes/dynamic.rb +3 -3
  54. data/lib/mongoid/attributes/nested.rb +5 -5
  55. data/lib/mongoid/attributes/processing.rb +37 -6
  56. data/lib/mongoid/attributes/projector.rb +1 -1
  57. data/lib/mongoid/attributes/readonly.rb +2 -2
  58. data/lib/mongoid/attributes.rb +43 -40
  59. data/lib/mongoid/cacheable.rb +2 -2
  60. data/lib/mongoid/changeable.rb +43 -10
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/validators/storage.rb +3 -3
  64. data/lib/mongoid/config/options.rb +3 -0
  65. data/lib/mongoid/config/validators/client.rb +6 -6
  66. data/lib/mongoid/config.rb +62 -17
  67. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  68. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  69. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  70. data/lib/mongoid/contextual/atomic.rb +1 -1
  71. data/lib/mongoid/contextual/geo_near.rb +7 -7
  72. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  73. data/lib/mongoid/contextual/memory.rb +180 -21
  74. data/lib/mongoid/contextual/mongo.rb +260 -217
  75. data/lib/mongoid/contextual/none.rb +67 -5
  76. data/lib/mongoid/contextual/queryable.rb +1 -1
  77. data/lib/mongoid/contextual.rb +2 -2
  78. data/lib/mongoid/copyable.rb +32 -8
  79. data/lib/mongoid/criteria/findable.rb +7 -4
  80. data/lib/mongoid/criteria/includable.rb +24 -20
  81. data/lib/mongoid/criteria/marshalable.rb +10 -2
  82. data/lib/mongoid/criteria/permission.rb +1 -1
  83. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
  85. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  86. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  87. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  89. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
  90. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  91. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  92. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  93. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  94. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  96. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  97. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  100. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  101. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  102. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  103. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  104. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  105. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  106. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  107. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable.rb +12 -7
  109. data/lib/mongoid/criteria/scopable.rb +2 -2
  110. data/lib/mongoid/criteria/translator.rb +45 -0
  111. data/lib/mongoid/criteria.rb +16 -35
  112. data/lib/mongoid/deprecable.rb +37 -0
  113. data/lib/mongoid/deprecation.rb +25 -0
  114. data/lib/mongoid/document.rb +135 -34
  115. data/lib/mongoid/equality.rb +8 -8
  116. data/lib/mongoid/errors/document_not_found.rb +33 -12
  117. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  119. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  120. data/lib/mongoid/errors/invalid_field.rb +6 -2
  121. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  122. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  123. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  124. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  125. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  126. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  127. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  128. data/lib/mongoid/errors/no_client_database.rb +1 -1
  129. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  130. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  131. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  132. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  133. data/lib/mongoid/errors.rb +2 -2
  134. data/lib/mongoid/extensions/array.rb +9 -7
  135. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  136. data/lib/mongoid/extensions/binary.rb +42 -0
  137. data/lib/mongoid/extensions/boolean.rb +8 -2
  138. data/lib/mongoid/extensions/date.rb +26 -20
  139. data/lib/mongoid/extensions/date_time.rb +1 -1
  140. data/lib/mongoid/extensions/false_class.rb +1 -1
  141. data/lib/mongoid/extensions/float.rb +7 -4
  142. data/lib/mongoid/extensions/hash.rb +37 -8
  143. data/lib/mongoid/extensions/integer.rb +7 -4
  144. data/lib/mongoid/extensions/module.rb +1 -1
  145. data/lib/mongoid/extensions/object.rb +8 -6
  146. data/lib/mongoid/extensions/range.rb +41 -10
  147. data/lib/mongoid/extensions/regexp.rb +11 -4
  148. data/lib/mongoid/extensions/set.rb +11 -4
  149. data/lib/mongoid/extensions/string.rb +11 -22
  150. data/lib/mongoid/extensions/symbol.rb +4 -15
  151. data/lib/mongoid/extensions/time.rb +27 -16
  152. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  153. data/lib/mongoid/extensions/true_class.rb +1 -1
  154. data/lib/mongoid/extensions.rb +1 -0
  155. data/lib/mongoid/factory.rb +55 -7
  156. data/lib/mongoid/fields/foreign_key.rb +11 -4
  157. data/lib/mongoid/fields/localized.rb +9 -4
  158. data/lib/mongoid/fields/standard.rb +7 -7
  159. data/lib/mongoid/fields/validators/macro.rb +3 -9
  160. data/lib/mongoid/fields.rb +233 -40
  161. data/lib/mongoid/findable.rb +34 -13
  162. data/lib/mongoid/indexable/specification.rb +2 -2
  163. data/lib/mongoid/indexable/validators/options.rb +6 -2
  164. data/lib/mongoid/interceptable.rb +185 -16
  165. data/lib/mongoid/matchable.rb +1 -1
  166. data/lib/mongoid/matcher.rb +33 -13
  167. data/lib/mongoid/persistable/creatable.rb +18 -9
  168. data/lib/mongoid/persistable/deletable.rb +1 -1
  169. data/lib/mongoid/persistable/destroyable.rb +1 -1
  170. data/lib/mongoid/persistable/savable.rb +2 -2
  171. data/lib/mongoid/persistable/unsettable.rb +1 -1
  172. data/lib/mongoid/persistable/updatable.rb +19 -12
  173. data/lib/mongoid/persistable/upsertable.rb +1 -1
  174. data/lib/mongoid/persistable.rb +3 -3
  175. data/lib/mongoid/persistence_context.rb +63 -10
  176. data/lib/mongoid/query_cache.rb +8 -260
  177. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  178. data/lib/mongoid/reloadable.rb +10 -8
  179. data/lib/mongoid/scopable.rb +26 -22
  180. data/lib/mongoid/selectable.rb +1 -2
  181. data/lib/mongoid/serializable.rb +10 -6
  182. data/lib/mongoid/shardable.rb +35 -11
  183. data/lib/mongoid/stateful.rb +35 -9
  184. data/lib/mongoid/tasks/database.rb +0 -2
  185. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  186. data/lib/mongoid/threaded.rb +42 -12
  187. data/lib/mongoid/timestamps/created.rb +1 -1
  188. data/lib/mongoid/timestamps/updated.rb +2 -2
  189. data/lib/mongoid/touchable.rb +2 -3
  190. data/lib/mongoid/traversable.rb +5 -4
  191. data/lib/mongoid/validatable/localizable.rb +1 -1
  192. data/lib/mongoid/validatable/macros.rb +0 -2
  193. data/lib/mongoid/validatable/presence.rb +2 -2
  194. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  195. data/lib/mongoid/validatable.rb +6 -6
  196. data/lib/mongoid/version.rb +1 -1
  197. data/lib/mongoid/warnings.rb +28 -0
  198. data/lib/mongoid.rb +2 -0
  199. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  200. data/spec/config/mongoid.yml +16 -0
  201. data/spec/integration/app_spec.rb +8 -12
  202. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  203. data/spec/integration/associations/embedded_spec.rb +15 -0
  204. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  205. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  206. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  207. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  208. data/spec/integration/associations/has_one_spec.rb +97 -1
  209. data/spec/integration/associations/scope_option_spec.rb +1 -1
  210. data/spec/integration/callbacks_models.rb +95 -1
  211. data/spec/integration/callbacks_spec.rb +246 -4
  212. data/spec/integration/criteria/range_spec.rb +95 -1
  213. data/spec/integration/discriminator_key_spec.rb +115 -76
  214. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  215. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  216. data/spec/integration/matcher_examples_spec.rb +20 -13
  217. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  218. data/spec/integration/matcher_operator_spec.rb +3 -5
  219. data/spec/integration/persistence/range_field_spec.rb +350 -0
  220. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  221. data/spec/mongoid/association/depending_spec.rb +9 -9
  222. data/spec/mongoid/association/eager_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  224. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  225. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  226. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  227. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
  228. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  229. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  230. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  231. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  232. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  233. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  234. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  235. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  236. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  237. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  238. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  241. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  242. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  243. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  244. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
  245. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  246. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  247. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  248. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  249. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  250. data/spec/mongoid/association/syncable_spec.rb +14 -0
  251. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  252. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  253. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  254. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  255. data/spec/mongoid/attributes_spec.rb +551 -27
  256. data/spec/mongoid/cacheable_spec.rb +3 -3
  257. data/spec/mongoid/changeable_spec.rb +130 -13
  258. data/spec/mongoid/clients/factory_spec.rb +23 -30
  259. data/spec/mongoid/clients/options_spec.rb +1 -0
  260. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  261. data/spec/mongoid/clients_spec.rb +57 -2
  262. data/spec/mongoid/config_spec.rb +78 -18
  263. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  264. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  265. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  266. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  267. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  268. data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
  269. data/spec/mongoid/contextual/none_spec.rb +38 -0
  270. data/spec/mongoid/copyable_spec.rb +451 -1
  271. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  272. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  273. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  274. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  275. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  276. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  277. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  278. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  280. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  281. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
  282. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  283. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  285. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  286. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  287. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  288. data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
  289. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  290. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  291. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  292. data/spec/mongoid/criteria_spec.rb +475 -1199
  293. data/spec/mongoid/document_fields_spec.rb +173 -24
  294. data/spec/mongoid/document_spec.rb +32 -41
  295. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  296. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  297. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  298. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  299. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  300. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  301. data/spec/mongoid/extensions/array_spec.rb +16 -2
  302. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  303. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  304. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  305. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  306. data/spec/mongoid/extensions/date_spec.rb +71 -1
  307. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  308. data/spec/mongoid/extensions/float_spec.rb +53 -74
  309. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  310. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  311. data/spec/mongoid/extensions/range_spec.rb +255 -54
  312. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  313. data/spec/mongoid/extensions/set_spec.rb +106 -0
  314. data/spec/mongoid/extensions/string_spec.rb +53 -25
  315. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  316. data/spec/mongoid/extensions/time_spec.rb +634 -66
  317. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  318. data/spec/mongoid/factory_spec.rb +61 -1
  319. data/spec/mongoid/fields/localized_spec.rb +37 -12
  320. data/spec/mongoid/fields_spec.rb +364 -50
  321. data/spec/mongoid/findable_spec.rb +80 -15
  322. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  323. data/spec/mongoid/indexable_spec.rb +39 -20
  324. data/spec/mongoid/interceptable_spec.rb +807 -27
  325. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  326. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  327. data/spec/mongoid/mongoizable_spec.rb +285 -0
  328. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  330. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  331. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  332. data/spec/mongoid/persistence_context_spec.rb +50 -1
  333. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  334. data/spec/mongoid/query_cache_spec.rb +0 -154
  335. data/spec/mongoid/reloadable_spec.rb +59 -2
  336. data/spec/mongoid/scopable_spec.rb +54 -16
  337. data/spec/mongoid/shardable_models.rb +14 -0
  338. data/spec/mongoid/shardable_spec.rb +157 -51
  339. data/spec/mongoid/stateful_spec.rb +28 -0
  340. data/spec/mongoid/timestamps_spec.rb +390 -0
  341. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  342. data/spec/mongoid/touchable_spec.rb +116 -0
  343. data/spec/mongoid/touchable_spec_models.rb +12 -8
  344. data/spec/mongoid/traversable_spec.rb +4 -11
  345. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  346. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  347. data/spec/mongoid/warnings_spec.rb +35 -0
  348. data/spec/mongoid_spec.rb +1 -1
  349. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  350. data/spec/rails/mongoid_spec.rb +4 -16
  351. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  352. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  353. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  354. data/spec/shared/lib/mrss/utils.rb +28 -6
  355. data/spec/shared/share/Dockerfile.erb +36 -40
  356. data/spec/shared/shlib/server.sh +32 -8
  357. data/spec/shared/shlib/set_env.sh +4 -4
  358. data/spec/support/constraints.rb +24 -0
  359. data/spec/support/macros.rb +46 -0
  360. data/spec/support/models/augmentation.rb +12 -0
  361. data/spec/support/models/band.rb +3 -0
  362. data/spec/support/models/catalog.rb +24 -0
  363. data/spec/support/models/circus.rb +3 -0
  364. data/spec/support/models/code.rb +2 -0
  365. data/spec/support/models/fanatic.rb +8 -0
  366. data/spec/support/models/implant.rb +9 -0
  367. data/spec/support/models/label.rb +2 -0
  368. data/spec/support/models/passport.rb +9 -0
  369. data/spec/support/models/person.rb +2 -0
  370. data/spec/support/models/player.rb +2 -0
  371. data/spec/support/models/powerup.rb +12 -0
  372. data/spec/support/models/purse.rb +9 -0
  373. data/spec/support/models/registry.rb +1 -0
  374. data/spec/support/models/school.rb +14 -0
  375. data/spec/support/models/shield.rb +18 -0
  376. data/spec/support/models/student.rb +14 -0
  377. data/spec/support/models/weapon.rb +12 -0
  378. data.tar.gz.sig +4 -1
  379. metadata +682 -635
  380. metadata.gz.sig +0 -0
  381. data/lib/mongoid/errors/eager_load.rb +0 -23
  382. data/lib/mongoid/errors/invalid_value.rb +0 -17
  383. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -555,6 +555,56 @@ describe Mongoid::Changeable do
555
555
  end
556
556
  end
557
557
 
558
+ describe '#attribute_previously_was' do
559
+ let(:previous_title) do
560
+ "Grand Poobah"
561
+ end
562
+
563
+ let(:age) do
564
+ 10
565
+ end
566
+
567
+ let(:person) do
568
+ Person.create!(title: previous_title, age: age)
569
+ end
570
+
571
+ let(:updated_title) do
572
+ "Captain Obvious"
573
+ end
574
+
575
+ before do
576
+ person.title = updated_title
577
+ person.save!
578
+ end
579
+
580
+ context 'when attribute changed' do
581
+ it "returns the old value" do
582
+ expect(person.send(:attribute_previously_was, "title")).to eq(previous_title)
583
+ end
584
+
585
+ it "allows access via (attribute)_was" do
586
+ expect(person.title_previously_was).to eq(previous_title)
587
+ end
588
+ end
589
+
590
+ context 'when attribute did not change' do
591
+ it "returns the same value" do
592
+ expect(person.send(:attribute_previously_was, "age")).to eq(age)
593
+ end
594
+
595
+ it "allows access via (attribute)_was" do
596
+ expect(person.age_previously_was).to eq(age)
597
+ end
598
+ end
599
+
600
+ it 'clears after reload' do
601
+ person.reload
602
+ expect(person.title_previously_was).to be_nil
603
+ expect(person.age_previously_was).to be_nil
604
+ end
605
+
606
+ end
607
+
558
608
  describe "#attribute_will_change!" do
559
609
 
560
610
  let(:aliases) do
@@ -962,12 +1012,69 @@ describe Mongoid::Changeable do
962
1012
  person.user_accounts << user_account
963
1013
  end
964
1014
 
965
- it 'returns a hash of changes' do
966
- pending 'https://jira.mongodb.org/browse/MONGOID-4843'
1015
+ it 'should not add to the changes or changed_attributes hash' do
1016
+ person.changes.should == {}
1017
+ person.changed_attributes.should == {}
1018
+ end
1019
+ end
1020
+
1021
+ context 'when habtm association _ids changes' do
967
1022
 
968
- person.changes.should == {
969
- user_account_ids: [[], [user_account.id]]
970
- }
1023
+ let(:person) do
1024
+ Person.create!(title: "Grand Poobah")
1025
+ end
1026
+
1027
+ let(:user_account) do
1028
+ UserAccount.create!
1029
+ end
1030
+
1031
+ before do
1032
+ person.user_account_ids << user_account._id
1033
+ end
1034
+
1035
+ it 'should add to the changes or changed_attributes hash' do
1036
+ person.changes.should == { "user_account_ids" => [ nil, [ user_account._id ] ] }
1037
+ person.changed_attributes.should == { "user_account_ids" => nil }
1038
+ end
1039
+ end
1040
+
1041
+ context 'when assigning empty list to habtm association' do
1042
+
1043
+ let(:person) do
1044
+ Person.create!(title: "Grand Poobah", user_accounts: [user_account])
1045
+ end
1046
+
1047
+ let(:user_account) do
1048
+ UserAccount.create!
1049
+ end
1050
+
1051
+ before do
1052
+ person.user_accounts = []
1053
+ end
1054
+
1055
+ it 'should not add to the changes or changed_attributes hash' do
1056
+ person.changes.should == {}
1057
+ person.changed_attributes.should == {}
1058
+ end
1059
+ end
1060
+
1061
+ context 'when assigning empty list to habtm association _ids' do
1062
+
1063
+ let(:person) do
1064
+ Person.create!(title: "Grand Poobah", user_accounts: [user_account])
1065
+ end
1066
+
1067
+ let(:user_account) do
1068
+ UserAccount.create!
1069
+ end
1070
+
1071
+ before do
1072
+ person.user_account_ids = []
1073
+ end
1074
+
1075
+ it 'should not add to the changes or changed_attributes hash' do
1076
+ person.changes.should == { "user_account_ids" => [ [ user_account._id ], [] ] }
1077
+ person.changed_attributes.should == { "user_account_ids" => [ user_account._id ] }
971
1078
  end
972
1079
  end
973
1080
 
@@ -1649,21 +1756,26 @@ describe Mongoid::Changeable do
1649
1756
 
1650
1757
  before do
1651
1758
  Acolyte.set_callback(:save, :after, if: :callback_test?) do |doc|
1652
- doc[:changed_in_callback] = doc.changes.dup
1759
+ doc[:changed_in_after_callback] = doc.changes.dup
1760
+ end
1761
+
1762
+ Acolyte.set_callback(:save, :before, if: :callback_test?) do |doc|
1763
+ doc[:changed_in_before_callback] = doc.changes.dup
1653
1764
  end
1654
1765
  end
1655
1766
 
1656
1767
  after do
1657
1768
  Acolyte._save_callbacks.select do |callback|
1658
- callback.kind == :after
1769
+ [:before, :after].include?(callback.kind)
1659
1770
  end.each do |callback|
1660
1771
  Acolyte._save_callbacks.delete(callback)
1661
1772
  end
1662
1773
  end
1663
1774
 
1664
- it "retains the changes until after all callbacks" do
1775
+ it "does not retain the changes until after all callbacks" do
1665
1776
  acolyte.update_attribute(:status, "testing")
1666
- expect(acolyte.changed_in_callback).to eq({ "status" => [ nil, "testing" ] })
1777
+ expect(acolyte.changed_in_before_callback).to eq({"status"=>[nil, "testing"]})
1778
+ expect(acolyte.changed_in_after_callback).to eq({ })
1667
1779
  end
1668
1780
  end
1669
1781
 
@@ -1675,21 +1787,26 @@ describe Mongoid::Changeable do
1675
1787
 
1676
1788
  before do
1677
1789
  Acolyte.set_callback(:save, :after, if: :callback_test?) do |doc|
1678
- doc[:changed_in_callback] = doc.changes.dup
1790
+ doc[:changed_after_in_callback] = doc.changes.dup
1791
+ end
1792
+
1793
+ Acolyte.set_callback(:save, :before, if: :callback_test?) do |doc|
1794
+ doc[:changed_before_in_callback] = doc.changes.dup
1679
1795
  end
1680
1796
  end
1681
1797
 
1682
1798
  after do
1683
1799
  Acolyte._save_callbacks.select do |callback|
1684
- callback.kind == :after
1800
+ [:before, :after].include?(callback.kind)
1685
1801
  end.each do |callback|
1686
1802
  Acolyte._save_callbacks.delete(callback)
1687
1803
  end
1688
1804
  end
1689
1805
 
1690
- it "retains the changes until after all callbacks" do
1806
+ it "does not retain the changes until after all callbacks" do
1691
1807
  acolyte.save!
1692
- expect(acolyte.changed_in_callback["name"]).to eq([ nil, "callback-test" ])
1808
+ expect(acolyte.changed_before_in_callback["name"]).to eq([ nil, "callback-test" ])
1809
+ expect(acolyte.changed_after_in_callback["name"]).to be_nil
1693
1810
  end
1694
1811
  end
1695
1812
  end
@@ -65,10 +65,7 @@ describe Mongoid::Clients::Factory do
65
65
  expect(client).to be_a(Mongo::Client)
66
66
  end
67
67
 
68
- context 'not JRuby' do
69
- # Run this test on JRuby when driver 2.16.0 is released -
70
- # see RUBY-2771.
71
- fails_on_jruby
68
+ context 'on driver versions that do not report spurious EOF errors' do
72
69
 
73
70
  it 'does not produce driver warnings' do
74
71
  Mongo::Logger.logger.should_not receive(:warn)
@@ -86,35 +83,31 @@ describe Mongoid::Clients::Factory do
86
83
  expect(client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
87
84
  end
88
85
 
89
- context 'driver 2.13+' do
90
- min_driver_version '2.13'
86
+ it 'sets Mongoid as a wrapping library' do
87
+ client.options[:wrapping_libraries].should == [BSON::Document.new(
88
+ Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY)]
89
+ end
91
90
 
92
- it 'sets Mongoid as a wrapping library' do
93
- client.options[:wrapping_libraries].should == [BSON::Document.new(
94
- Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY)]
95
- end
91
+ context 'when configuration specifies a wrapping library' do
96
92
 
97
- context 'when configuration specifies a wrapping library' do
98
-
99
- let(:config) do
100
- {
101
- default: { hosts: SpecConfig.instance.addresses, database: database_id },
102
- analytics: {
103
- hosts: SpecConfig.instance.addresses,
104
- database: database_id,
105
- options: {
106
- wrapping_libraries: [{name: 'Foo'}],
107
- },
108
- }
93
+ let(:config) do
94
+ {
95
+ default: { hosts: SpecConfig.instance.addresses, database: database_id },
96
+ analytics: {
97
+ hosts: SpecConfig.instance.addresses,
98
+ database: database_id,
99
+ options: {
100
+ wrapping_libraries: [{name: 'Foo'}],
101
+ },
109
102
  }
110
- end
111
-
112
- it 'adds Mongoid as another wrapping library' do
113
- client.options[:wrapping_libraries].should == [
114
- BSON::Document.new(Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY),
115
- {'name' => 'Foo'},
116
- ]
117
- end
103
+ }
104
+ end
105
+
106
+ it 'adds Mongoid as another wrapping library' do
107
+ client.options[:wrapping_libraries].should == [
108
+ BSON::Document.new(Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY),
109
+ {'name' => 'Foo'},
110
+ ]
118
111
  end
119
112
  end
120
113
  end
@@ -413,6 +413,7 @@ describe Mongoid::Clients::Options, retry: 3 do
413
413
  end
414
414
 
415
415
  context 'when the options create a new cluster' do
416
+ retry_test
416
417
  # This test fails on sharded topologies in Evergreen but not locally
417
418
  require_topology :single, :replica_set
418
419
 
@@ -166,25 +166,6 @@ describe Mongoid::Clients::Sessions do
166
166
  end
167
167
  end
168
168
  end
169
-
170
- context 'when sessions are not supported' do
171
- max_server_version '3.4'
172
-
173
- let!(:error) do
174
- e = nil
175
- begin
176
- Person.with_session {}
177
- rescue => ex
178
- e = ex
179
- end
180
- e
181
- end
182
-
183
- it 'raises a sessions not supported error' do
184
- expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
185
- expect(error.message).to include('not supported')
186
- end
187
- end
188
169
  end
189
170
 
190
171
  context 'when a session is used on a model instance' do
@@ -312,24 +293,5 @@ describe Mongoid::Clients::Sessions do
312
293
  end
313
294
  end
314
295
  end
315
-
316
- context 'when sessions are not supported' do
317
- max_server_version '3.4'
318
-
319
- let!(:error) do
320
- e = nil
321
- begin
322
- person.with_session {}
323
- rescue => ex
324
- e = ex
325
- end
326
- e
327
- end
328
-
329
- it 'raises a sessions not supported error' do
330
- expect(error).to be_a(Mongoid::Errors::InvalidSessionUse)
331
- expect(error.message).to include('not supported')
332
- end
333
- end
334
296
  end
335
297
  end
@@ -802,7 +802,7 @@ describe Mongoid::Clients do
802
802
  it "does not persist to the default database" do
803
803
  expect {
804
804
  Band.find(band.id)
805
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
805
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Band with id\(s\)/)
806
806
  end
807
807
 
808
808
  let(:from_db) do
@@ -840,7 +840,7 @@ describe Mongoid::Clients do
840
840
  it "does not persist to the default database" do
841
841
  expect {
842
842
  Band.find(band.id)
843
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
843
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Band with id\(s\)/)
844
844
  end
845
845
 
846
846
  let(:from_db) do
@@ -1012,6 +1012,61 @@ describe Mongoid::Clients do
1012
1012
  end
1013
1013
  end
1014
1014
  end
1015
+
1016
+ context 'when requesting named client' do
1017
+ let(:secondary_client) do
1018
+ double(Mongo::Client).tap do |client|
1019
+ allow(client).to receive(:cluster).and_return(double("cluster"))
1020
+ end
1021
+ end
1022
+
1023
+ before do
1024
+ expect(Mongoid::Clients::Factory).to receive(:create)
1025
+ .with(:secondary)
1026
+ .and_return(secondary_client)
1027
+ end
1028
+
1029
+ after do
1030
+ Mongoid::Clients.clients.delete(:secondary)
1031
+ end
1032
+
1033
+ it 'does not close the client' do
1034
+ expect(secondary_client).not_to receive(:close)
1035
+
1036
+ Band.with(client: :default) do |klass|
1037
+ klass.mongo_client
1038
+ end
1039
+
1040
+ Band.with(client: :secondary) do |klass|
1041
+ klass.mongo_client
1042
+ end
1043
+ end
1044
+ end
1045
+
1046
+ context 'when using on different objects' do
1047
+ require_mri
1048
+
1049
+ let(:first_band) do
1050
+ Band.create!(name: "The Beatles")
1051
+ end
1052
+
1053
+ let(:second_band) do
1054
+ Band.create!(name: 'Led Zeppelin')
1055
+ end
1056
+
1057
+ it 'does not create extra symbols symbols' do
1058
+ first_band.with(write: { w: 0, j: false }) do |band|
1059
+ band.set(active: false)
1060
+ end
1061
+ initial_symbols_count = Symbol.all_symbols.size
1062
+ second_band.with(write: { w: 0, j: false }) do |band|
1063
+ band.set(active: false)
1064
+ end
1065
+ expect(Symbol.all_symbols.size).to eq(initial_symbols_count)
1066
+ end
1067
+
1068
+ end
1069
+
1015
1070
  end
1016
1071
 
1017
1072
  context "when overriding the default database" do
@@ -204,7 +204,7 @@ describe Mongoid::Config do
204
204
 
205
205
  Mongoid.configure { |config| config.load_configuration(configuration) }
206
206
 
207
- expect(Mongoid::Config.discriminator_key).to be("_type")
207
+ expect(Mongoid::Config.discriminator_key).to eq("_type")
208
208
  end
209
209
  end
210
210
 
@@ -215,11 +215,11 @@ describe Mongoid::Config do
215
215
 
216
216
  Mongoid.configure { |config| config.load_configuration(configuration) }
217
217
 
218
- expect(Mongoid::Config.discriminator_key).to be("test")
218
+ expect(Mongoid::Config.discriminator_key).to eq("test")
219
219
  end
220
220
 
221
221
  it 'is set globally' do
222
- expect(Mongoid.discriminator_key).to be("test")
222
+ expect(Mongoid.discriminator_key).to eq("test")
223
223
  end
224
224
  end
225
225
  end
@@ -260,74 +260,103 @@ describe Mongoid::Config do
260
260
  let(:conf) { CONFIG }
261
261
 
262
262
  it "it is set to its default" do
263
- expect(Mongoid.send(option)).to be(default)
263
+ expect(Mongoid.send(option)).to eq(default)
264
264
  end
265
265
  end
266
266
  end
267
267
 
268
+ context 'when setting the map_big_decimal_to_decimal128 option in the config' do
269
+ let(:option) { :map_big_decimal_to_decimal128 }
270
+ let(:default) { true }
271
+
272
+ it_behaves_like "a config option"
273
+ end
274
+
275
+ context 'when setting the allow_bson5_decimal128 option in the config' do
276
+ min_bson_version '5.0'
277
+
278
+ let(:option) { :allow_bson5_decimal128 }
279
+ let(:default) { false }
280
+
281
+ it_behaves_like "a config option"
282
+ end
283
+
268
284
  context 'when setting the broken_updates option in the config' do
269
285
  let(:option) { :broken_updates }
270
- let(:default) { true }
286
+ let(:default) { false }
271
287
 
272
288
  it_behaves_like "a config option"
273
289
  end
274
290
 
275
291
  context 'when setting the legacy_triple_equals option in the config' do
276
292
  let(:option) { :legacy_triple_equals }
277
- let(:default) { true }
293
+ let(:default) { false }
278
294
 
279
295
  it_behaves_like "a config option"
280
296
  end
281
297
 
282
298
  context 'when setting the broken_scoping option in the config' do
283
299
  let(:option) { :broken_scoping }
284
- let(:default) { true }
300
+ let(:default) { false }
285
301
 
286
302
  it_behaves_like "a config option"
287
303
  end
288
304
 
289
305
  context 'when setting the broken_aggregables option in the config' do
290
306
  let(:option) { :broken_aggregables }
291
- let(:default) { true }
307
+ let(:default) { false }
292
308
 
293
309
  it_behaves_like "a config option"
294
310
  end
295
311
 
296
312
  context 'when setting the broken_alias_handling option in the config' do
297
313
  let(:option) { :broken_alias_handling }
298
- let(:default) { true }
314
+ let(:default) { false }
299
315
 
300
316
  it_behaves_like "a config option"
301
317
  end
302
318
 
303
319
  context 'when setting the broken_and option in the config' do
304
320
  let(:option) { :broken_and }
305
- let(:default) { true }
321
+ let(:default) { false }
306
322
 
307
323
  it_behaves_like "a config option"
308
324
  end
309
325
 
310
326
  context 'when setting the compare_time_by_ms option in the config' do
311
327
  let(:option) { :compare_time_by_ms }
312
- let(:default) { false }
328
+ let(:default) { true }
313
329
 
314
330
  it_behaves_like "a config option"
315
331
  end
316
332
 
317
333
  context 'when setting the object_id_as_json_oid option in the config' do
318
334
  let(:option) { :object_id_as_json_oid }
319
- let(:default) { true }
335
+ let(:default) { false }
320
336
 
321
337
  it_behaves_like "a config option"
322
338
  end
323
339
 
324
340
  context 'when setting the legacy_pluck_distinct option in the config' do
325
341
  let(:option) { :legacy_pluck_distinct }
326
- let(:default) { true }
342
+ let(:default) { false }
343
+
344
+ it_behaves_like "a config option"
345
+ end
346
+
347
+ context 'when setting the overwrite_chained_operators option in the config' do
348
+ let(:option) { :overwrite_chained_operators }
349
+ let(:default) { false }
327
350
 
328
351
  it_behaves_like "a config option"
329
352
  end
330
353
 
354
+ context 'when setting the legacy_attributes option in the config' do
355
+ let(:option) { :legacy_attributes }
356
+ let(:default) { false }
357
+
358
+ it_behaves_like "a config option"
359
+ end
331
360
 
332
361
  describe "#load!" do
333
362
 
@@ -449,6 +478,40 @@ describe Mongoid::Config do
449
478
  end
450
479
  end
451
480
 
481
+ context "when provided an environment with driver options" do
482
+
483
+ before do
484
+ described_class.load!(file, :test)
485
+ end
486
+
487
+ after do
488
+ described_class.reset
489
+ end
490
+
491
+ it "sets the Mongo.broken_view_options option" do
492
+ expect(Mongo.broken_view_options).to eq(false)
493
+ end
494
+
495
+ it "does not override the unset Mongo.validate_update_replace option" do
496
+ expect(Mongo.validate_update_replace).to eq(false)
497
+ end
498
+ end
499
+
500
+ context "when provided an environment with a nil driver option" do
501
+
502
+ before do
503
+ described_class.load!(file, :test_nil)
504
+ end
505
+
506
+ after do
507
+ described_class.reset
508
+ end
509
+
510
+ it "sets the Mongo.broken_view_options option to nil" do
511
+ expect(Mongo.broken_view_options).to be_nil
512
+ end
513
+ end
514
+
452
515
  context "when the rack environment is set" do
453
516
 
454
517
  before do
@@ -543,12 +606,9 @@ describe Mongoid::Config do
543
606
 
544
607
  let(:client) { Mongoid.default_client }
545
608
 
546
- # Wrapping libraries are only recognized by driver 2.13.0+.
547
- min_driver_version '2.13'
548
-
549
609
  it 'passes uuid to driver' do
550
610
  Mongo::Client.should receive(:new).with(SpecConfig.instance.addresses,
551
- auto_encryption_options: {
611
+ { auto_encryption_options: {
552
612
  'key_vault_namespace' => 'admin.datakeys',
553
613
  'kms_providers' => {'local' => {'key' => 'z7iYiYKLuYymEWtk4kfny1ESBwwFdA58qMqff96A8ghiOcIK75lJGPUIocku8LOFjQuEgeIP4xlln3s7r93FV9J5sAE7zg8U'}},
554
614
  'schema_map' => {'blog_development.comments' => {
@@ -565,7 +625,7 @@ describe Mongoid::Config do
565
625
  platform: "mongoid-#{Mongoid::VERSION}",
566
626
  wrapping_libraries: [
567
627
  {'name' => 'Mongoid', 'version' => Mongoid::VERSION},
568
- ],
628
+ ]},
569
629
  )
570
630
 
571
631
  client