mongoid 8.1.12 → 9.0.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 (1024) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -0
  3. data/LICENSE +1 -1
  4. data/README.md +4 -9
  5. data/Rakefile +62 -44
  6. data/lib/config/locales/en.yml +66 -5
  7. data/lib/mongoid/association/accessors.rb +16 -20
  8. data/lib/mongoid/association/bindable.rb +27 -8
  9. data/lib/mongoid/association/builders.rb +3 -2
  10. data/lib/mongoid/association/constrainable.rb +1 -0
  11. data/lib/mongoid/association/depending.rb +16 -1
  12. data/lib/mongoid/association/eager.rb +160 -0
  13. data/lib/mongoid/association/eager_loadable.rb +15 -7
  14. data/lib/mongoid/association/embedded/batchable.rb +16 -18
  15. data/lib/mongoid/association/embedded/cyclic.rb +1 -0
  16. data/lib/mongoid/association/embedded/eager.rb +23 -0
  17. data/lib/mongoid/association/embedded/embedded_in/binding.rb +5 -4
  18. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +1 -0
  19. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +21 -7
  20. data/lib/mongoid/association/embedded/embedded_in.rb +7 -0
  21. data/lib/mongoid/association/embedded/embeds_many/binding.rb +3 -2
  22. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -0
  23. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +134 -205
  24. data/lib/mongoid/association/embedded/embeds_many.rb +1 -0
  25. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -2
  26. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -0
  27. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +113 -55
  28. data/lib/mongoid/association/embedded/embeds_one.rb +1 -0
  29. data/lib/mongoid/association/embedded.rb +2 -0
  30. data/lib/mongoid/association/macros.rb +17 -14
  31. data/lib/mongoid/association/many.rb +1 -0
  32. data/lib/mongoid/association/marshalable.rb +4 -0
  33. data/lib/mongoid/association/nested/many.rb +8 -3
  34. data/lib/mongoid/association/nested/nested_buildable.rb +32 -0
  35. data/lib/mongoid/association/nested/one.rb +6 -3
  36. data/lib/mongoid/association/nested.rb +1 -0
  37. data/lib/mongoid/association/one.rb +1 -0
  38. data/lib/mongoid/association/options.rb +9 -2
  39. data/lib/mongoid/association/proxy.rb +30 -18
  40. data/lib/mongoid/association/referenced/auto_save.rb +6 -2
  41. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  42. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -0
  43. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -1
  44. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -14
  45. data/lib/mongoid/association/referenced/belongs_to.rb +2 -1
  46. data/lib/mongoid/association/referenced/counter_cache.rb +7 -2
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -0
  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 +132 -94
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +8 -3
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +43 -27
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +131 -104
  57. data/lib/mongoid/association/referenced/has_many.rb +2 -1
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -3
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +37 -28
  62. data/lib/mongoid/association/referenced/has_one.rb +5 -1
  63. data/lib/mongoid/association/referenced/syncable.rb +7 -6
  64. data/lib/mongoid/association/referenced.rb +1 -0
  65. data/lib/mongoid/association/reflections.rb +5 -4
  66. data/lib/mongoid/association/relatable.rb +10 -4
  67. data/lib/mongoid/association.rb +5 -0
  68. data/lib/mongoid/atomic/modifiers.rb +1 -0
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +2 -1
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -0
  71. data/lib/mongoid/atomic/paths/embedded.rb +1 -0
  72. data/lib/mongoid/atomic/paths/root.rb +1 -0
  73. data/lib/mongoid/atomic/paths.rb +1 -0
  74. data/lib/mongoid/atomic.rb +23 -62
  75. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  76. data/lib/mongoid/attributes/dynamic.rb +1 -0
  77. data/lib/mongoid/attributes/embedded.rb +34 -0
  78. data/lib/mongoid/attributes/nested.rb +3 -2
  79. data/lib/mongoid/attributes/processing.rb +11 -10
  80. data/lib/mongoid/attributes/projector.rb +1 -0
  81. data/lib/mongoid/attributes/readonly.rb +4 -8
  82. data/lib/mongoid/attributes.rb +6 -4
  83. data/lib/mongoid/cacheable.rb +2 -1
  84. data/lib/mongoid/changeable.rb +58 -49
  85. data/lib/mongoid/clients/factory.rb +37 -5
  86. data/lib/mongoid/clients/options.rb +113 -3
  87. data/lib/mongoid/clients/sessions.rb +245 -64
  88. data/lib/mongoid/clients/storage_options.rb +37 -1
  89. data/lib/mongoid/clients/validators/storage.rb +1 -0
  90. data/lib/mongoid/clients/validators.rb +1 -0
  91. data/lib/mongoid/clients.rb +36 -4
  92. data/lib/mongoid/collection_configurable.rb +1 -0
  93. data/lib/mongoid/composable.rb +5 -0
  94. data/lib/mongoid/config/defaults.rb +16 -36
  95. data/lib/mongoid/config/encryption.rb +213 -0
  96. data/lib/mongoid/config/environment.rb +2 -5
  97. data/lib/mongoid/config/introspection.rb +152 -0
  98. data/lib/mongoid/config/options.rb +8 -3
  99. data/lib/mongoid/config/validators/async_query_executor.rb +12 -2
  100. data/lib/mongoid/config/validators/client.rb +1 -0
  101. data/lib/mongoid/config/validators/option.rb +1 -0
  102. data/lib/mongoid/config/validators.rb +1 -0
  103. data/lib/mongoid/config.rb +57 -91
  104. data/lib/mongoid/contextual/aggregable/memory.rb +1 -0
  105. data/lib/mongoid/contextual/aggregable/mongo.rb +2 -5
  106. data/lib/mongoid/contextual/aggregable/none.rb +1 -0
  107. data/lib/mongoid/contextual/aggregable.rb +1 -0
  108. data/lib/mongoid/contextual/atomic.rb +98 -11
  109. data/lib/mongoid/contextual/command.rb +3 -0
  110. data/lib/mongoid/contextual/map_reduce.rb +6 -0
  111. data/lib/mongoid/contextual/memory.rb +45 -42
  112. data/lib/mongoid/contextual/mongo/documents_loader.rb +3 -2
  113. data/lib/mongoid/contextual/mongo.rb +33 -61
  114. data/lib/mongoid/contextual/none.rb +15 -32
  115. data/lib/mongoid/contextual/queryable.rb +4 -0
  116. data/lib/mongoid/contextual.rb +4 -0
  117. data/lib/mongoid/copyable.rb +3 -2
  118. data/lib/mongoid/criteria/findable.rb +44 -4
  119. data/lib/mongoid/criteria/includable.rb +5 -4
  120. data/lib/mongoid/criteria/inspectable.rb +4 -0
  121. data/lib/mongoid/criteria/marshalable.rb +4 -0
  122. data/lib/mongoid/criteria/modifiable.rb +5 -0
  123. data/lib/mongoid/criteria/options.rb +1 -0
  124. data/lib/mongoid/criteria/permission.rb +5 -0
  125. data/lib/mongoid/criteria/queryable/aggregable.rb +1 -0
  126. data/lib/mongoid/criteria/queryable/expandable.rb +1 -0
  127. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -1
  128. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
  129. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -1
  130. data/lib/mongoid/criteria/queryable/extensions/date.rb +4 -3
  131. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +2 -1
  132. data/lib/mongoid/criteria/queryable/extensions/hash.rb +2 -1
  133. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -1
  134. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -16
  135. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -1
  136. data/lib/mongoid/criteria/queryable/extensions/range.rb +2 -1
  137. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +7 -1
  138. data/lib/mongoid/criteria/queryable/extensions/set.rb +2 -1
  139. data/lib/mongoid/criteria/queryable/extensions/string.rb +15 -3
  140. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +2 -1
  141. data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -1
  142. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -1
  143. data/lib/mongoid/criteria/queryable/extensions.rb +1 -0
  144. data/lib/mongoid/criteria/queryable/key.rb +10 -0
  145. data/lib/mongoid/criteria/queryable/macroable.rb +1 -0
  146. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -0
  147. data/lib/mongoid/criteria/queryable/optional.rb +1 -0
  148. data/lib/mongoid/criteria/queryable/options.rb +1 -0
  149. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -0
  150. data/lib/mongoid/criteria/queryable/selectable.rb +12 -27
  151. data/lib/mongoid/criteria/queryable/selector.rb +5 -2
  152. data/lib/mongoid/criteria/queryable/smash.rb +1 -0
  153. data/lib/mongoid/criteria/queryable/storable.rb +4 -3
  154. data/lib/mongoid/criteria/queryable.rb +1 -0
  155. data/lib/mongoid/criteria/scopable.rb +5 -0
  156. data/lib/mongoid/criteria/translator.rb +1 -0
  157. data/lib/mongoid/criteria.rb +37 -10
  158. data/lib/mongoid/deprecable.rb +1 -0
  159. data/lib/mongoid/deprecation.rb +8 -4
  160. data/lib/mongoid/document.rb +171 -125
  161. data/lib/mongoid/encryptable.rb +53 -0
  162. data/lib/mongoid/equality.rb +2 -22
  163. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -0
  164. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  165. data/lib/mongoid/errors/callback.rb +1 -0
  166. data/lib/mongoid/errors/create_collection_failure.rb +1 -0
  167. data/lib/mongoid/errors/criteria_argument_required.rb +1 -0
  168. data/lib/mongoid/errors/delete_restriction.rb +1 -0
  169. data/lib/mongoid/errors/document_not_destroyed.rb +1 -0
  170. data/lib/mongoid/errors/document_not_found.rb +1 -0
  171. data/lib/mongoid/errors/drop_collection_failure.rb +1 -0
  172. data/lib/mongoid/errors/empty_config_file.rb +1 -0
  173. data/lib/mongoid/errors/immutable_attribute.rb +1 -0
  174. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -0
  175. data/lib/mongoid/errors/invalid_async_query_executor.rb +1 -0
  176. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  177. data/lib/mongoid/errors/invalid_collection.rb +1 -0
  178. data/lib/mongoid/errors/invalid_config_file.rb +1 -0
  179. data/lib/mongoid/errors/invalid_config_option.rb +1 -0
  180. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -0
  181. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -0
  182. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -0
  183. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -0
  184. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -4
  185. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  186. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -0
  187. data/lib/mongoid/errors/invalid_field.rb +1 -0
  188. data/lib/mongoid/errors/invalid_field_operator.rb +1 -0
  189. data/lib/mongoid/errors/invalid_field_option.rb +1 -0
  190. data/lib/mongoid/errors/invalid_field_type.rb +1 -0
  191. data/lib/mongoid/errors/invalid_find.rb +1 -0
  192. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -0
  193. data/lib/mongoid/errors/invalid_includes.rb +1 -0
  194. data/lib/mongoid/errors/invalid_index.rb +1 -0
  195. data/lib/mongoid/errors/invalid_options.rb +1 -0
  196. data/lib/mongoid/errors/invalid_path.rb +1 -0
  197. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -0
  198. data/lib/mongoid/errors/invalid_query.rb +1 -0
  199. data/lib/mongoid/errors/invalid_relation.rb +1 -0
  200. data/lib/mongoid/errors/invalid_relation_option.rb +1 -0
  201. data/lib/mongoid/errors/invalid_scope.rb +1 -0
  202. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  203. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -1
  204. data/lib/mongoid/errors/invalid_storage_options.rb +1 -0
  205. data/lib/mongoid/errors/invalid_time.rb +1 -0
  206. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  207. data/lib/mongoid/errors/inverse_not_found.rb +1 -0
  208. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -0
  209. data/lib/mongoid/errors/mixed_relations.rb +1 -0
  210. data/lib/mongoid/errors/mongoid_error.rb +4 -3
  211. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -0
  212. data/lib/mongoid/errors/no_client_config.rb +1 -0
  213. data/lib/mongoid/errors/no_client_database.rb +1 -0
  214. data/lib/mongoid/errors/no_client_hosts.rb +1 -0
  215. data/lib/mongoid/errors/no_clients_config.rb +1 -0
  216. data/lib/mongoid/errors/no_default_client.rb +1 -0
  217. data/lib/mongoid/errors/no_environment.rb +1 -0
  218. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -0
  219. data/lib/mongoid/errors/no_metadata.rb +1 -0
  220. data/lib/mongoid/errors/no_parent.rb +1 -0
  221. data/lib/mongoid/errors/readonly_attribute.rb +1 -0
  222. data/lib/mongoid/errors/readonly_document.rb +1 -0
  223. data/lib/mongoid/errors/rollback.rb +15 -0
  224. data/lib/mongoid/errors/scope_overwrite.rb +1 -0
  225. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  226. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -0
  227. data/lib/mongoid/errors/transaction_error.rb +25 -0
  228. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  229. data/lib/mongoid/errors/unknown_attribute.rb +1 -0
  230. data/lib/mongoid/errors/unknown_model.rb +1 -0
  231. data/lib/mongoid/errors/unsaved_document.rb +1 -0
  232. data/lib/mongoid/errors/unsupported_javascript.rb +1 -0
  233. data/lib/mongoid/errors/validations.rb +1 -0
  234. data/lib/mongoid/errors.rb +10 -1
  235. data/lib/mongoid/evolvable.rb +1 -0
  236. data/lib/mongoid/extensions/array.rb +10 -24
  237. data/lib/mongoid/extensions/big_decimal.rb +14 -6
  238. data/lib/mongoid/extensions/binary.rb +3 -0
  239. data/lib/mongoid/extensions/boolean.rb +3 -0
  240. data/lib/mongoid/extensions/date.rb +7 -2
  241. data/lib/mongoid/extensions/date_time.rb +4 -6
  242. data/lib/mongoid/extensions/decimal128.rb +3 -0
  243. data/lib/mongoid/extensions/false_class.rb +5 -2
  244. data/lib/mongoid/extensions/float.rb +4 -1
  245. data/lib/mongoid/extensions/hash.rb +21 -169
  246. data/lib/mongoid/extensions/integer.rb +6 -1
  247. data/lib/mongoid/extensions/module.rb +4 -1
  248. data/lib/mongoid/extensions/nil_class.rb +5 -2
  249. data/lib/mongoid/extensions/object.rb +23 -35
  250. data/lib/mongoid/extensions/object_id.rb +3 -0
  251. data/lib/mongoid/extensions/range.rb +9 -6
  252. data/lib/mongoid/extensions/raw_value.rb +34 -0
  253. data/lib/mongoid/extensions/regexp.rb +3 -0
  254. data/lib/mongoid/extensions/set.rb +13 -2
  255. data/lib/mongoid/extensions/string.rb +18 -10
  256. data/lib/mongoid/extensions/symbol.rb +5 -0
  257. data/lib/mongoid/extensions/time.rb +7 -19
  258. data/lib/mongoid/extensions/time_with_zone.rb +6 -2
  259. data/lib/mongoid/extensions/true_class.rb +5 -2
  260. data/lib/mongoid/extensions.rb +2 -32
  261. data/lib/mongoid/factory.rb +134 -40
  262. data/lib/mongoid/fields/encrypted.rb +48 -0
  263. data/lib/mongoid/fields/foreign_key.rb +29 -3
  264. data/lib/mongoid/fields/localized.rb +6 -0
  265. data/lib/mongoid/fields/standard.rb +5 -0
  266. data/lib/mongoid/fields/validators/macro.rb +3 -1
  267. data/lib/mongoid/fields/validators.rb +1 -0
  268. data/lib/mongoid/fields.rb +41 -46
  269. data/lib/mongoid/findable.rb +2 -2
  270. data/lib/mongoid/indexable/specification.rb +55 -19
  271. data/lib/mongoid/indexable/validators/options.rb +1 -0
  272. data/lib/mongoid/indexable.rb +1 -0
  273. data/lib/mongoid/inspectable.rb +32 -0
  274. data/lib/mongoid/interceptable.rb +18 -8
  275. data/lib/mongoid/loadable.rb +83 -0
  276. data/lib/mongoid/loggable.rb +1 -0
  277. data/lib/mongoid/matchable.rb +1 -0
  278. data/lib/mongoid/matcher/all.rb +15 -0
  279. data/lib/mongoid/matcher/and.rb +14 -0
  280. data/lib/mongoid/matcher/bits.rb +19 -0
  281. data/lib/mongoid/matcher/bits_all_clear.rb +21 -0
  282. data/lib/mongoid/matcher/bits_all_set.rb +21 -0
  283. data/lib/mongoid/matcher/bits_any_clear.rb +21 -0
  284. data/lib/mongoid/matcher/bits_any_set.rb +21 -0
  285. data/lib/mongoid/matcher/elem_match.rb +15 -0
  286. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  287. data/lib/mongoid/matcher/eq.rb +15 -0
  288. data/lib/mongoid/matcher/eq_impl.rb +33 -16
  289. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +14 -2
  290. data/lib/mongoid/matcher/exists.rb +15 -0
  291. data/lib/mongoid/matcher/expression.rb +13 -0
  292. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  293. data/lib/mongoid/matcher/field_expression.rb +15 -0
  294. data/lib/mongoid/matcher/field_operator.rb +24 -0
  295. data/lib/mongoid/matcher/gt.rb +15 -0
  296. data/lib/mongoid/matcher/gte.rb +15 -0
  297. data/lib/mongoid/matcher/in.rb +15 -0
  298. data/lib/mongoid/matcher/lt.rb +15 -0
  299. data/lib/mongoid/matcher/lte.rb +15 -0
  300. data/lib/mongoid/matcher/mod.rb +16 -0
  301. data/lib/mongoid/matcher/ne.rb +15 -0
  302. data/lib/mongoid/matcher/nin.rb +15 -0
  303. data/lib/mongoid/matcher/nor.rb +14 -0
  304. data/lib/mongoid/matcher/not.rb +16 -0
  305. data/lib/mongoid/matcher/or.rb +14 -0
  306. data/lib/mongoid/matcher/regex.rb +24 -0
  307. data/lib/mongoid/matcher/size.rb +16 -0
  308. data/lib/mongoid/matcher/type.rb +25 -0
  309. data/lib/mongoid/matcher.rb +5 -15
  310. data/lib/mongoid/persistable/creatable.rb +14 -9
  311. data/lib/mongoid/persistable/deletable.rb +7 -2
  312. data/lib/mongoid/persistable/destroyable.rb +34 -7
  313. data/lib/mongoid/persistable/incrementable.rb +2 -1
  314. data/lib/mongoid/persistable/logical.rb +1 -0
  315. data/lib/mongoid/persistable/maxable.rb +37 -0
  316. data/lib/mongoid/persistable/minable.rb +37 -0
  317. data/lib/mongoid/persistable/multipliable.rb +36 -0
  318. data/lib/mongoid/persistable/poppable.rb +1 -0
  319. data/lib/mongoid/persistable/pullable.rb +1 -0
  320. data/lib/mongoid/persistable/pushable.rb +1 -0
  321. data/lib/mongoid/persistable/renamable.rb +1 -0
  322. data/lib/mongoid/persistable/savable.rb +1 -0
  323. data/lib/mongoid/persistable/settable.rb +1 -0
  324. data/lib/mongoid/persistable/unsettable.rb +1 -0
  325. data/lib/mongoid/persistable/updatable.rb +37 -18
  326. data/lib/mongoid/persistable/upsertable.rb +20 -7
  327. data/lib/mongoid/persistable.rb +11 -1
  328. data/lib/mongoid/persistence_context.rb +46 -6
  329. data/lib/mongoid/positional.rb +1 -0
  330. data/lib/mongoid/railtie.rb +24 -1
  331. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  332. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  333. data/lib/mongoid/railties/controller_runtime.rb +20 -4
  334. data/lib/mongoid/railties/database.rake +12 -0
  335. data/lib/mongoid/reloadable.rb +38 -30
  336. data/lib/mongoid/scopable.rb +19 -23
  337. data/lib/mongoid/search_indexable.rb +167 -0
  338. data/lib/mongoid/selectable.rb +1 -0
  339. data/lib/mongoid/serializable.rb +8 -7
  340. data/lib/mongoid/shardable.rb +1 -0
  341. data/lib/mongoid/stateful.rb +9 -3
  342. data/lib/mongoid/stringified_symbol.rb +19 -6
  343. data/lib/mongoid/tasks/database.rake +13 -0
  344. data/lib/mongoid/tasks/database.rb +63 -0
  345. data/lib/mongoid/tasks/encryption.rake +59 -0
  346. data/lib/mongoid/tasks/encryption.rb +108 -0
  347. data/lib/mongoid/threaded/lifecycle.rb +1 -0
  348. data/lib/mongoid/threaded.rb +94 -30
  349. data/lib/mongoid/timestamps/created/short.rb +1 -0
  350. data/lib/mongoid/timestamps/created.rb +5 -11
  351. data/lib/mongoid/timestamps/short.rb +1 -0
  352. data/lib/mongoid/timestamps/timeless.rb +29 -0
  353. data/lib/mongoid/timestamps/updated/short.rb +1 -0
  354. data/lib/mongoid/timestamps/updated.rb +2 -1
  355. data/lib/mongoid/timestamps.rb +1 -0
  356. data/lib/mongoid/touchable.rb +154 -49
  357. data/lib/mongoid/traversable.rb +127 -122
  358. data/lib/mongoid/utils.rb +32 -2
  359. data/lib/mongoid/validatable/associated.rb +3 -5
  360. data/lib/mongoid/validatable/format.rb +1 -0
  361. data/lib/mongoid/validatable/length.rb +1 -0
  362. data/lib/mongoid/validatable/localizable.rb +1 -0
  363. data/lib/mongoid/validatable/macros.rb +5 -15
  364. data/lib/mongoid/validatable/presence.rb +1 -0
  365. data/lib/mongoid/validatable/queryable.rb +9 -0
  366. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  367. data/lib/mongoid/validatable.rb +3 -3
  368. data/lib/mongoid/version.rb +2 -5
  369. data/lib/mongoid/warnings.rb +9 -16
  370. data/lib/mongoid.rb +38 -5
  371. data/lib/rails/generators/mongoid/config/config_generator.rb +17 -3
  372. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +36 -62
  374. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -0
  375. data/lib/rails/generators/mongoid_generator.rb +13 -0
  376. data/lib/rails/mongoid.rb +4 -29
  377. data/spec/config/mongoid.yml +0 -1
  378. data/spec/integration/active_job_spec.rb +32 -0
  379. data/spec/integration/app_spec.rb +72 -58
  380. data/spec/integration/associations/belongs_to_spec.rb +1 -0
  381. data/spec/integration/associations/embedded_dirty_spec.rb +1 -0
  382. data/spec/integration/associations/embedded_spec.rb +75 -6
  383. data/spec/integration/associations/embeds_many_spec.rb +1 -41
  384. data/spec/integration/associations/embeds_one_spec.rb +6 -25
  385. data/spec/integration/associations/foreign_key_spec.rb +1 -0
  386. data/spec/integration/associations/foreign_key_spec_models.rb +1 -0
  387. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +1 -0
  388. data/spec/integration/associations/has_many_spec.rb +1 -0
  389. data/spec/integration/associations/has_one_spec.rb +1 -0
  390. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -0
  391. data/spec/integration/associations/reverse_population_spec.rb +1 -0
  392. data/spec/integration/associations/reverse_population_spec_models.rb +1 -0
  393. data/spec/integration/associations/scope_option_spec.rb +1 -0
  394. data/spec/integration/atomic/modifiers_spec.rb +1 -0
  395. data/spec/integration/bson_regexp_raw_spec.rb +1 -0
  396. data/spec/integration/callbacks_models.rb +3 -2
  397. data/spec/integration/callbacks_spec.rb +2 -1
  398. data/spec/integration/contextual/empty_spec.rb +1 -0
  399. data/spec/integration/criteria/alias_query_spec.rb +25 -88
  400. data/spec/integration/criteria/date_field_spec.rb +1 -0
  401. data/spec/integration/criteria/default_scope_spec.rb +1 -0
  402. data/spec/integration/criteria/logical_spec.rb +10 -28
  403. data/spec/integration/criteria/range_spec.rb +1 -2
  404. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  405. data/spec/integration/criteria/time_with_zone_spec.rb +1 -0
  406. data/spec/integration/discriminator_key_spec.rb +1 -0
  407. data/spec/integration/discriminator_value_spec.rb +1 -0
  408. data/spec/integration/document_spec.rb +1 -0
  409. data/spec/integration/dots_and_dollars_spec.rb +1 -0
  410. data/spec/integration/encryption_spec.rb +100 -0
  411. data/spec/integration/i18n_fallbacks_spec.rb +7 -33
  412. data/spec/integration/matcher_examples_spec.rb +1 -0
  413. data/spec/integration/matcher_operator_data/bits_all_clear.yml +0 -15
  414. data/spec/integration/matcher_operator_data/bits_all_set.yml +0 -15
  415. data/spec/integration/matcher_operator_data/bits_any_clear.yml +0 -15
  416. data/spec/integration/matcher_operator_data/bits_any_set.yml +0 -15
  417. data/spec/integration/matcher_operator_data/size.yml +0 -3
  418. data/spec/integration/matcher_operator_data/type.yml +0 -6
  419. data/spec/integration/matcher_operator_data/type_array.yml +0 -1
  420. data/spec/integration/matcher_operator_data/type_decimal.yml +0 -4
  421. data/spec/integration/matcher_operator_spec.rb +1 -0
  422. data/spec/integration/matcher_spec.rb +21 -66
  423. data/spec/integration/persistence/range_field_spec.rb +1 -0
  424. data/spec/integration/server_query_spec.rb +1 -0
  425. data/spec/integration/shardable_spec.rb +1 -0
  426. data/spec/integration/stringified_symbol_field_spec.rb +1 -0
  427. data/spec/lite_spec_helper.rb +36 -10
  428. data/spec/mongoid/association/accessors_spec.rb +11 -28
  429. data/spec/mongoid/association/auto_save_spec.rb +1 -0
  430. data/spec/mongoid/association/builders_spec.rb +1 -0
  431. data/spec/mongoid/association/constrainable_spec.rb +1 -0
  432. data/spec/mongoid/association/counter_cache_spec.rb +1 -0
  433. data/spec/mongoid/association/depending_spec.rb +1 -0
  434. data/spec/mongoid/association/eager_spec.rb +52 -24
  435. data/spec/mongoid/association/embedded/cyclic_spec.rb +1 -0
  436. data/spec/mongoid/association/embedded/dirty_spec.rb +1 -0
  437. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +1 -0
  438. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +1 -0
  439. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +1 -0
  440. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -7
  441. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -0
  442. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +1 -0
  443. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1 -0
  444. data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -2
  445. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +4 -7
  446. data/spec/mongoid/association/embedded/embeds_many_spec.rb +1 -0
  447. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -0
  448. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +1 -0
  449. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1 -0
  450. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -0
  451. data/spec/mongoid/association/embedded/embeds_one_models.rb +6 -1
  452. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -1
  453. data/spec/mongoid/association/embedded/embeds_one_spec.rb +1 -0
  454. data/spec/mongoid/association/macros_spec.rb +1 -0
  455. data/spec/mongoid/association/nested/many_spec.rb +1 -0
  456. data/spec/mongoid/association/nested/one_spec.rb +1 -0
  457. data/spec/mongoid/association/options_spec.rb +1 -0
  458. data/spec/mongoid/association/polymorphic_spec.rb +1 -0
  459. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +1 -0
  460. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +1 -0
  461. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +1 -0
  462. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1 -4
  463. data/spec/mongoid/association/referenced/belongs_to_models.rb +1 -0
  464. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +2 -1
  465. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1 -0
  466. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +2 -1
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +1 -0
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -0
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -31
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +1 -0
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -1
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1 -0
  474. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -0
  475. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +1 -0
  476. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +1 -0
  477. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -0
  478. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  479. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1085 -2002
  480. data/spec/mongoid/association/referenced/has_many_models.rb +1 -0
  481. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -1
  482. data/spec/mongoid/association/referenced/has_many_spec.rb +1 -0
  483. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -0
  484. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +1 -0
  485. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +1 -0
  486. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1 -0
  487. data/spec/mongoid/association/referenced/has_one_models.rb +1 -0
  488. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -1
  489. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -0
  490. data/spec/mongoid/association/reflections_spec.rb +1 -0
  491. data/spec/mongoid/association/syncable_spec.rb +1 -0
  492. data/spec/mongoid/association_spec.rb +1 -0
  493. data/spec/mongoid/atomic/modifiers_spec.rb +1 -0
  494. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -0
  495. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -0
  496. data/spec/mongoid/atomic/paths/root_spec.rb +1 -0
  497. data/spec/mongoid/atomic/paths_spec.rb +1 -0
  498. data/spec/mongoid/atomic_spec.rb +1 -0
  499. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  500. data/spec/mongoid/attributes/dynamic_spec.rb +1 -0
  501. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  502. data/spec/mongoid/attributes/nested_spec.rb +1 -0
  503. data/spec/mongoid/attributes/nested_spec_models.rb +1 -0
  504. data/spec/mongoid/attributes/projector_spec.rb +1 -0
  505. data/spec/mongoid/attributes/readonly_spec.rb +1 -19
  506. data/spec/mongoid/attributes_spec.rb +18 -35
  507. data/spec/mongoid/cacheable_spec.rb +1 -0
  508. data/spec/mongoid/changeable_spec.rb +4 -3
  509. data/spec/mongoid/clients/factory_spec.rb +77 -30
  510. data/spec/mongoid/clients/options_spec.rb +9 -5
  511. data/spec/mongoid/clients/sessions_spec.rb +27 -10
  512. data/spec/mongoid/clients/transactions_spec.rb +958 -185
  513. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  514. data/spec/mongoid/clients_spec.rb +47 -2
  515. data/spec/mongoid/collection_configurable_spec.rb +1 -0
  516. data/spec/mongoid/composable_spec.rb +1 -0
  517. data/spec/mongoid/config/defaults_spec.rb +31 -92
  518. data/spec/mongoid/config/encryption_spec.rb +152 -0
  519. data/spec/mongoid/config/environment_spec.rb +13 -41
  520. data/spec/mongoid/config/introspection_spec.rb +114 -0
  521. data/spec/mongoid/config/options_spec.rb +1 -0
  522. data/spec/mongoid/config_spec.rb +20 -133
  523. data/spec/mongoid/contextual/aggregable/memory_spec.rb +1 -0
  524. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +1 -0
  525. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +5 -29
  526. data/spec/mongoid/contextual/aggregable/none_spec.rb +3 -14
  527. data/spec/mongoid/contextual/atomic_spec.rb +203 -12
  528. data/spec/mongoid/contextual/map_reduce_spec.rb +1 -0
  529. data/spec/mongoid/contextual/memory_spec.rb +364 -534
  530. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +10 -3
  531. data/spec/mongoid/contextual/mongo_spec.rb +101 -283
  532. data/spec/mongoid/contextual/none_spec.rb +1 -0
  533. data/spec/mongoid/copyable_spec.rb +1 -0
  534. data/spec/mongoid/copyable_spec_models.rb +1 -0
  535. data/spec/mongoid/criteria/findable_spec.rb +191 -0
  536. data/spec/mongoid/criteria/includable_spec.rb +1 -0
  537. data/spec/mongoid/criteria/includable_spec_models.rb +1 -0
  538. data/spec/mongoid/criteria/inspectable_spec.rb +1 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +3 -2
  540. data/spec/mongoid/criteria/modifiable_spec.rb +1 -0
  541. data/spec/mongoid/criteria/options_spec.rb +1 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -0
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +1 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +8 -7
  546. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -0
  547. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +21 -11
  548. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +1 -0
  549. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -0
  550. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -0
  551. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -0
  552. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -0
  553. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +1 -0
  554. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -0
  555. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +1 -0
  556. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -11
  557. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -11
  558. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -0
  559. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -66
  560. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -0
  561. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +1 -0
  562. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +1 -0
  563. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -0
  564. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +1 -0
  565. data/spec/mongoid/criteria/queryable/optional_spec.rb +1 -0
  566. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -0
  567. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -0
  568. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -0
  569. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +4 -3
  570. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +1 -0
  571. data/spec/mongoid/criteria/queryable/selectable_spec.rb +51 -214
  572. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +1 -0
  573. data/spec/mongoid/criteria/queryable/selector_spec.rb +96 -0
  574. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -0
  575. data/spec/mongoid/criteria/queryable/storable_spec.rb +10 -32
  576. data/spec/mongoid/criteria/scopable_spec.rb +1 -0
  577. data/spec/mongoid/criteria/translator_spec.rb +1 -0
  578. data/spec/mongoid/criteria_projection_spec.rb +6 -5
  579. data/spec/mongoid/criteria_spec.rb +221 -359
  580. data/spec/mongoid/document_fields_spec.rb +1 -0
  581. data/spec/mongoid/document_persistence_context_spec.rb +77 -0
  582. data/spec/mongoid/document_query_spec.rb +5 -4
  583. data/spec/mongoid/document_spec.rb +3 -148
  584. data/spec/mongoid/equality_spec.rb +41 -149
  585. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -0
  586. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  587. data/spec/mongoid/errors/callback_spec.rb +1 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -0
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +1 -0
  591. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -0
  592. data/spec/mongoid/errors/invalid_config_file_spec.rb +1 -0
  593. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -0
  594. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -0
  595. data/spec/mongoid/errors/invalid_field_spec.rb +1 -0
  596. data/spec/mongoid/errors/invalid_field_type_spec.rb +1 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +1 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +1 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +1 -0
  601. data/spec/mongoid/errors/invalid_path_spec.rb +1 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -0
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -0
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +1 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -0
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +9 -22
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -0
  612. data/spec/mongoid/errors/no_client_config_spec.rb +1 -0
  613. data/spec/mongoid/errors/no_client_database_spec.rb +1 -0
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -0
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +1 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +1 -0
  619. data/spec/mongoid/errors/no_parent_spec.rb +1 -0
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +1 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +1 -0
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -0
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -0
  627. data/spec/mongoid/errors/validations_spec.rb +1 -0
  628. data/spec/mongoid/extensions/array_spec.rb +3 -262
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +5 -4
  630. data/spec/mongoid/extensions/binary_spec.rb +1 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +1 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +8 -7
  633. data/spec/mongoid/extensions/date_spec.rb +3 -20
  634. data/spec/mongoid/extensions/date_time_spec.rb +3 -9
  635. data/spec/mongoid/extensions/decimal128_spec.rb +1 -0
  636. data/spec/mongoid/extensions/false_class_spec.rb +1 -7
  637. data/spec/mongoid/extensions/float_spec.rb +3 -9
  638. data/spec/mongoid/extensions/hash_spec.rb +19 -458
  639. data/spec/mongoid/extensions/integer_spec.rb +3 -8
  640. data/spec/mongoid/extensions/module_spec.rb +1 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +1 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +1 -0
  643. data/spec/mongoid/extensions/object_spec.rb +1 -176
  644. data/spec/mongoid/extensions/range_spec.rb +1 -11
  645. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  646. data/spec/mongoid/extensions/regexp_spec.rb +1 -0
  647. data/spec/mongoid/extensions/set_spec.rb +2 -3
  648. data/spec/mongoid/extensions/string_spec.rb +3 -113
  649. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -0
  650. data/spec/mongoid/extensions/symbol_spec.rb +1 -31
  651. data/spec/mongoid/extensions/time_spec.rb +32 -350
  652. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -30
  653. data/spec/mongoid/extensions/true_class_spec.rb +1 -7
  654. data/spec/mongoid/factory_spec.rb +1 -0
  655. data/spec/mongoid/fields/foreign_key_spec.rb +282 -119
  656. data/spec/mongoid/fields/localized_spec.rb +1 -0
  657. data/spec/mongoid/fields/standard_spec.rb +1 -0
  658. data/spec/mongoid/fields_spec.rb +60 -66
  659. data/spec/mongoid/findable_spec.rb +2 -61
  660. data/spec/mongoid/indexable/specification_spec.rb +132 -13
  661. data/spec/mongoid/indexable_spec.rb +323 -9
  662. data/spec/mongoid/inspectable_spec.rb +81 -0
  663. data/spec/mongoid/interceptable_spec.rb +3 -82
  664. data/spec/mongoid/interceptable_spec_models.rb +112 -47
  665. data/spec/mongoid/loading_spec.rb +110 -0
  666. data/spec/mongoid/loggable_spec.rb +1 -0
  667. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -0
  668. data/spec/mongoid/mongoizable_spec.rb +1 -0
  669. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  670. data/spec/mongoid/persistable/creatable_spec.rb +1 -0
  671. data/spec/mongoid/persistable/deletable_spec.rb +78 -31
  672. data/spec/mongoid/persistable/destroyable_spec.rb +230 -52
  673. data/spec/mongoid/persistable/incrementable_spec.rb +1 -0
  674. data/spec/mongoid/persistable/logical_spec.rb +1 -0
  675. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  676. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  677. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  678. data/spec/mongoid/persistable/poppable_spec.rb +1 -0
  679. data/spec/mongoid/persistable/pullable_spec.rb +1 -0
  680. data/spec/mongoid/persistable/pushable_spec.rb +1 -0
  681. data/spec/mongoid/persistable/renamable_spec.rb +1 -0
  682. data/spec/mongoid/persistable/savable_spec.rb +2 -6
  683. data/spec/mongoid/persistable/settable_spec.rb +5 -4
  684. data/spec/mongoid/persistable/unsettable_spec.rb +1 -0
  685. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  686. data/spec/mongoid/persistable/upsertable_spec.rb +34 -1
  687. data/spec/mongoid/persistable_spec.rb +1 -0
  688. data/spec/mongoid/persistence_context_spec.rb +1 -0
  689. data/spec/mongoid/positional_spec.rb +1 -0
  690. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  691. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  692. data/spec/mongoid/relations/proxy_spec.rb +1 -0
  693. data/spec/mongoid/reloadable_spec.rb +28 -83
  694. data/spec/mongoid/scopable_spec.rb +39 -50
  695. data/spec/mongoid/search_indexable_spec.rb +147 -0
  696. data/spec/mongoid/selectable_spec.rb +1 -0
  697. data/spec/mongoid/serializable_spec.rb +10 -16
  698. data/spec/mongoid/shardable_models.rb +1 -0
  699. data/spec/mongoid/shardable_spec.rb +1 -0
  700. data/spec/mongoid/stateful_spec.rb +1 -0
  701. data/spec/mongoid/tasks/database_rake_spec.rb +127 -49
  702. data/spec/mongoid/tasks/database_spec.rb +48 -1
  703. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  704. data/spec/mongoid/threaded_spec.rb +38 -0
  705. data/spec/mongoid/timestamps/created/short_spec.rb +1 -0
  706. data/spec/mongoid/timestamps/created_spec.rb +1 -23
  707. data/spec/mongoid/timestamps/timeless_spec.rb +1 -0
  708. data/spec/mongoid/timestamps/updated/short_spec.rb +1 -0
  709. data/spec/mongoid/timestamps/updated_spec.rb +1 -0
  710. data/spec/mongoid/timestamps_spec.rb +1 -0
  711. data/spec/mongoid/timestamps_spec_models.rb +1 -0
  712. data/spec/mongoid/touchable_spec.rb +485 -69
  713. data/spec/mongoid/touchable_spec_models.rb +96 -1
  714. data/spec/mongoid/traversable_spec.rb +1 -0
  715. data/spec/mongoid/validatable/associated_spec.rb +5 -14
  716. data/spec/mongoid/validatable/format_spec.rb +1 -0
  717. data/spec/mongoid/validatable/length_spec.rb +1 -0
  718. data/spec/mongoid/validatable/numericality_spec.rb +1 -16
  719. data/spec/mongoid/validatable/presence_spec.rb +1 -0
  720. data/spec/mongoid/validatable/uniqueness_spec.rb +48 -3
  721. data/spec/mongoid/validatable_spec.rb +1 -0
  722. data/spec/mongoid/warnings_spec.rb +1 -0
  723. data/spec/mongoid_spec.rb +27 -0
  724. data/spec/rails/controller_extension/controller_runtime_spec.rb +1 -0
  725. data/spec/rails/mongoid_spec.rb +26 -117
  726. data/spec/shared/lib/mrss/docker_runner.rb +1 -1
  727. data/spec/shared/lib/mrss/server_version_registry.rb +1 -1
  728. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  729. data/spec/shared/share/Dockerfile.erb +34 -4
  730. data/spec/shared/shlib/distro.sh +0 -10
  731. data/spec/shared/shlib/server.sh +27 -33
  732. data/spec/shared/shlib/set_env.sh +42 -6
  733. data/spec/spec_helper.rb +26 -28
  734. data/spec/support/authorization.rb +1 -0
  735. data/spec/support/client_registry.rb +1 -0
  736. data/spec/support/constraints.rb +1 -0
  737. data/spec/support/crypt/models.rb +50 -0
  738. data/spec/support/crypt.rb +80 -0
  739. data/spec/support/expectations.rb +18 -20
  740. data/spec/support/feature_sandbox.rb +72 -0
  741. data/spec/support/helpers.rb +1 -0
  742. data/spec/support/immutable_ids.rb +22 -21
  743. data/spec/support/macros.rb +4 -6
  744. data/spec/support/models/account.rb +1 -0
  745. data/spec/support/models/acolyte.rb +1 -0
  746. data/spec/support/models/actor.rb +1 -0
  747. data/spec/support/models/actress.rb +1 -0
  748. data/spec/support/models/address.rb +3 -0
  749. data/spec/support/models/address_component.rb +1 -0
  750. data/spec/support/models/address_number.rb +1 -0
  751. data/spec/support/models/agency.rb +1 -0
  752. data/spec/support/models/agent.rb +1 -0
  753. data/spec/support/models/album.rb +1 -0
  754. data/spec/support/models/alert.rb +1 -0
  755. data/spec/support/models/animal.rb +1 -0
  756. data/spec/support/models/answer.rb +1 -0
  757. data/spec/support/models/appointment.rb +1 -0
  758. data/spec/support/models/armrest.rb +1 -0
  759. data/spec/support/models/array_field.rb +1 -0
  760. data/spec/support/models/article.rb +1 -0
  761. data/spec/support/models/artist.rb +1 -0
  762. data/spec/support/models/artwork.rb +1 -0
  763. data/spec/support/models/audible_sound.rb +1 -0
  764. data/spec/support/models/audio.rb +1 -0
  765. data/spec/support/models/augmentation.rb +1 -0
  766. data/spec/support/models/author.rb +1 -0
  767. data/spec/support/models/baby.rb +1 -0
  768. data/spec/support/models/band.rb +5 -1
  769. data/spec/support/models/bar.rb +1 -0
  770. data/spec/support/models/basic.rb +1 -0
  771. data/spec/support/models/bed.rb +1 -0
  772. data/spec/support/models/big_palette.rb +1 -0
  773. data/spec/support/models/birthday.rb +1 -0
  774. data/spec/support/models/bolt.rb +1 -0
  775. data/spec/support/models/bomb.rb +1 -0
  776. data/spec/support/models/book.rb +1 -0
  777. data/spec/support/models/breed.rb +1 -0
  778. data/spec/support/models/browser.rb +1 -0
  779. data/spec/support/models/building.rb +1 -0
  780. data/spec/support/models/building_address.rb +1 -0
  781. data/spec/support/models/bus.rb +1 -0
  782. data/spec/support/models/business.rb +1 -0
  783. data/spec/support/models/callback_test.rb +1 -0
  784. data/spec/support/models/canvas.rb +1 -0
  785. data/spec/support/models/car.rb +1 -0
  786. data/spec/support/models/cat.rb +1 -0
  787. data/spec/support/models/catalog.rb +1 -0
  788. data/spec/support/models/category.rb +1 -0
  789. data/spec/support/models/child.rb +1 -0
  790. data/spec/support/models/child_doc.rb +1 -0
  791. data/spec/support/models/church.rb +1 -0
  792. data/spec/support/models/circle.rb +1 -0
  793. data/spec/support/models/circuit.rb +1 -0
  794. data/spec/support/models/circus.rb +1 -0
  795. data/spec/support/models/code.rb +1 -0
  796. data/spec/support/models/coding/pull_request.rb +1 -0
  797. data/spec/support/models/coding.rb +1 -0
  798. data/spec/support/models/comment.rb +1 -0
  799. data/spec/support/models/company.rb +1 -0
  800. data/spec/support/models/consumption_period.rb +1 -0
  801. data/spec/support/models/contextable_item.rb +1 -0
  802. data/spec/support/models/contractor.rb +1 -0
  803. data/spec/support/models/cookie.rb +1 -0
  804. data/spec/support/models/country_code.rb +1 -0
  805. data/spec/support/models/courier_job.rb +1 -0
  806. data/spec/support/models/cover.rb +1 -0
  807. data/spec/support/models/crate.rb +1 -0
  808. data/spec/support/models/customer.rb +1 -0
  809. data/spec/support/models/customer_address.rb +1 -0
  810. data/spec/support/models/deed.rb +1 -0
  811. data/spec/support/models/definition.rb +1 -0
  812. data/spec/support/models/delegating_patient.rb +1 -0
  813. data/spec/support/models/description.rb +1 -0
  814. data/spec/support/models/dictionary.rb +1 -0
  815. data/spec/support/models/division.rb +1 -0
  816. data/spec/support/models/doctor.rb +1 -0
  817. data/spec/support/models/dog.rb +1 -0
  818. data/spec/support/models/dokument.rb +1 -0
  819. data/spec/support/models/draft.rb +1 -0
  820. data/spec/support/models/dragon.rb +1 -0
  821. data/spec/support/models/driver.rb +1 -0
  822. data/spec/support/models/drug.rb +1 -0
  823. data/spec/support/models/dungeon.rb +1 -0
  824. data/spec/support/models/edit.rb +1 -0
  825. data/spec/support/models/email.rb +1 -0
  826. data/spec/support/models/employer.rb +1 -0
  827. data/spec/support/models/entry.rb +1 -0
  828. data/spec/support/models/eraser.rb +1 -0
  829. data/spec/support/models/even.rb +1 -0
  830. data/spec/support/models/event.rb +1 -0
  831. data/spec/support/models/exhibition.rb +1 -0
  832. data/spec/support/models/exhibitor.rb +1 -0
  833. data/spec/support/models/explosion.rb +1 -0
  834. data/spec/support/models/eye.rb +1 -0
  835. data/spec/support/models/eye_bowl.rb +1 -0
  836. data/spec/support/models/face.rb +1 -0
  837. data/spec/support/models/fanatic.rb +1 -0
  838. data/spec/support/models/favorite.rb +8 -1
  839. data/spec/support/models/filesystem.rb +1 -0
  840. data/spec/support/models/fire_hydrant.rb +1 -0
  841. data/spec/support/models/firefox.rb +1 -0
  842. data/spec/support/models/fish.rb +1 -0
  843. data/spec/support/models/folder.rb +1 -0
  844. data/spec/support/models/folder_item.rb +1 -0
  845. data/spec/support/models/fruits.rb +1 -0
  846. data/spec/support/models/game.rb +1 -0
  847. data/spec/support/models/ghost.rb +1 -0
  848. data/spec/support/models/guitar.rb +1 -0
  849. data/spec/support/models/hole.rb +1 -0
  850. data/spec/support/models/home.rb +1 -0
  851. data/spec/support/models/house.rb +1 -0
  852. data/spec/support/models/html_writer.rb +1 -0
  853. data/spec/support/models/id_key.rb +1 -0
  854. data/spec/support/models/idnodef.rb +1 -0
  855. data/spec/support/models/image.rb +1 -0
  856. data/spec/support/models/implant.rb +1 -0
  857. data/spec/support/models/instrument.rb +1 -0
  858. data/spec/support/models/item.rb +1 -0
  859. data/spec/support/models/jar.rb +1 -0
  860. data/spec/support/models/kaleidoscope.rb +1 -0
  861. data/spec/support/models/kangaroo.rb +1 -0
  862. data/spec/support/models/label.rb +1 -0
  863. data/spec/support/models/language.rb +1 -0
  864. data/spec/support/models/lat_lng.rb +1 -6
  865. data/spec/support/models/league.rb +1 -0
  866. data/spec/support/models/learner.rb +1 -0
  867. data/spec/support/models/line_item.rb +1 -0
  868. data/spec/support/models/location.rb +1 -0
  869. data/spec/support/models/login.rb +1 -0
  870. data/spec/support/models/manufacturer.rb +1 -0
  871. data/spec/support/models/meat.rb +1 -0
  872. data/spec/support/models/membership.rb +1 -0
  873. data/spec/support/models/message.rb +1 -0
  874. data/spec/support/models/minim.rb +1 -0
  875. data/spec/support/models/mixed_drink.rb +1 -0
  876. data/spec/support/models/mop.rb +1 -0
  877. data/spec/support/models/movie.rb +1 -0
  878. data/spec/support/models/my_hash.rb +1 -0
  879. data/spec/support/models/name.rb +1 -0
  880. data/spec/support/models/name_only.rb +1 -0
  881. data/spec/support/models/node.rb +1 -0
  882. data/spec/support/models/note.rb +1 -0
  883. data/spec/support/models/nut.rb +1 -0
  884. data/spec/support/models/odd.rb +1 -0
  885. data/spec/support/models/order.rb +1 -0
  886. data/spec/support/models/ordered_post.rb +1 -0
  887. data/spec/support/models/ordered_preference.rb +1 -0
  888. data/spec/support/models/oscar.rb +1 -0
  889. data/spec/support/models/other_owner_object.rb +1 -0
  890. data/spec/support/models/override.rb +1 -0
  891. data/spec/support/models/ownable.rb +1 -0
  892. data/spec/support/models/owner.rb +1 -0
  893. data/spec/support/models/pack.rb +1 -0
  894. data/spec/support/models/page.rb +1 -0
  895. data/spec/support/models/page_question.rb +1 -0
  896. data/spec/support/models/palette.rb +1 -0
  897. data/spec/support/models/parent.rb +1 -0
  898. data/spec/support/models/parent_doc.rb +1 -0
  899. data/spec/support/models/passport.rb +1 -0
  900. data/spec/support/models/patient.rb +1 -0
  901. data/spec/support/models/pdf_writer.rb +1 -0
  902. data/spec/support/models/pencil.rb +1 -0
  903. data/spec/support/models/person.rb +1 -0
  904. data/spec/support/models/pet.rb +1 -0
  905. data/spec/support/models/pet_owner.rb +1 -0
  906. data/spec/support/models/phone.rb +1 -0
  907. data/spec/support/models/piano.rb +1 -0
  908. data/spec/support/models/pizza.rb +1 -0
  909. data/spec/support/models/player.rb +1 -0
  910. data/spec/support/models/post.rb +1 -0
  911. data/spec/support/models/post_genre.rb +1 -0
  912. data/spec/support/models/powerup.rb +1 -0
  913. data/spec/support/models/preference.rb +1 -0
  914. data/spec/support/models/princess.rb +1 -0
  915. data/spec/support/models/product.rb +1 -0
  916. data/spec/support/models/profile.rb +1 -0
  917. data/spec/support/models/pronunciation.rb +1 -0
  918. data/spec/support/models/pub.rb +1 -0
  919. data/spec/support/models/publication/encyclopedia.rb +1 -0
  920. data/spec/support/models/publication/review.rb +1 -0
  921. data/spec/support/models/publication.rb +1 -0
  922. data/spec/support/models/purchase.rb +1 -0
  923. data/spec/support/models/purchased_item.rb +1 -0
  924. data/spec/support/models/question.rb +1 -0
  925. data/spec/support/models/quiz.rb +1 -0
  926. data/spec/support/models/rating.rb +1 -0
  927. data/spec/support/models/record.rb +1 -0
  928. data/spec/support/models/registry.rb +1 -0
  929. data/spec/support/models/role.rb +1 -0
  930. data/spec/support/models/root_category.rb +1 -0
  931. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  932. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  933. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  934. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  935. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  936. data/spec/support/models/sandwich.rb +1 -0
  937. data/spec/support/models/scheduler.rb +1 -0
  938. data/spec/support/models/school.rb +1 -0
  939. data/spec/support/models/scribe.rb +1 -0
  940. data/spec/support/models/sealer.rb +1 -0
  941. data/spec/support/models/seat.rb +1 -0
  942. data/spec/support/models/seo.rb +1 -0
  943. data/spec/support/models/series.rb +1 -0
  944. data/spec/support/models/server.rb +1 -0
  945. data/spec/support/models/service.rb +1 -0
  946. data/spec/support/models/shape.rb +1 -0
  947. data/spec/support/models/shelf.rb +1 -0
  948. data/spec/support/models/shield.rb +1 -0
  949. data/spec/support/models/shipment_address.rb +1 -0
  950. data/spec/support/models/shipping_container.rb +1 -0
  951. data/spec/support/models/shipping_pack.rb +1 -0
  952. data/spec/support/models/shirt.rb +1 -0
  953. data/spec/support/models/shop.rb +1 -0
  954. data/spec/support/models/short_agent.rb +1 -0
  955. data/spec/support/models/short_quiz.rb +1 -0
  956. data/spec/support/models/simple.rb +1 -0
  957. data/spec/support/models/slave.rb +1 -0
  958. data/spec/support/models/song.rb +1 -0
  959. data/spec/support/models/sound.rb +1 -0
  960. data/spec/support/models/spacer.rb +1 -0
  961. data/spec/support/models/square.rb +1 -0
  962. data/spec/support/models/staff.rb +1 -0
  963. data/spec/support/models/store_as_dup_test1.rb +1 -0
  964. data/spec/support/models/store_as_dup_test2.rb +1 -0
  965. data/spec/support/models/store_as_dup_test3.rb +1 -0
  966. data/spec/support/models/store_as_dup_test4.rb +1 -0
  967. data/spec/support/models/strategy.rb +1 -0
  968. data/spec/support/models/student.rb +1 -0
  969. data/spec/support/models/sub_item.rb +1 -0
  970. data/spec/support/models/subscription.rb +1 -0
  971. data/spec/support/models/survey.rb +1 -0
  972. data/spec/support/models/symptom.rb +1 -0
  973. data/spec/support/models/system_role.rb +1 -0
  974. data/spec/support/models/tag.rb +1 -0
  975. data/spec/support/models/target.rb +1 -0
  976. data/spec/support/models/template.rb +1 -0
  977. data/spec/support/models/thing.rb +1 -0
  978. data/spec/support/models/threadlocker.rb +1 -0
  979. data/spec/support/models/title.rb +1 -0
  980. data/spec/support/models/tool.rb +1 -0
  981. data/spec/support/models/topping.rb +1 -0
  982. data/spec/support/models/toy.rb +1 -0
  983. data/spec/support/models/track.rb +1 -0
  984. data/spec/support/models/translation.rb +1 -0
  985. data/spec/support/models/tree.rb +1 -0
  986. data/spec/support/models/truck.rb +1 -0
  987. data/spec/support/models/updatable.rb +1 -0
  988. data/spec/support/models/user.rb +1 -0
  989. data/spec/support/models/user_account.rb +1 -0
  990. data/spec/support/models/validation_callback.rb +1 -0
  991. data/spec/support/models/vehicle.rb +1 -0
  992. data/spec/support/models/version.rb +1 -0
  993. data/spec/support/models/vertex.rb +1 -0
  994. data/spec/support/models/vet_visit.rb +1 -0
  995. data/spec/support/models/video.rb +1 -0
  996. data/spec/support/models/video_game.rb +1 -0
  997. data/spec/support/models/washer.rb +1 -0
  998. data/spec/support/models/weapon.rb +1 -0
  999. data/spec/support/models/wiki_page.rb +1 -0
  1000. data/spec/support/models/word.rb +1 -0
  1001. data/spec/support/models/word_origin.rb +1 -0
  1002. data/spec/support/models/writer.rb +1 -0
  1003. data/spec/support/rails_mock.rb +32 -0
  1004. data/spec/support/shared/time.rb +3 -21
  1005. data/spec/support/sinatra_mock.rb +7 -0
  1006. data/spec/support/spec_config.rb +30 -9
  1007. data.tar.gz.sig +0 -0
  1008. metadata +127 -48
  1009. metadata.gz.sig +1 -0
  1010. data/lib/mongoid/association/referenced/eager.rb +0 -163
  1011. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -113
  1012. data/lib/mongoid/contextual/geo_near.rb +0 -236
  1013. data/lib/mongoid/errors/invalid_session_use.rb +0 -21
  1014. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -27
  1015. data/lib/mongoid/query_cache.rb +0 -68
  1016. data/lib/mongoid/validatable/numericality.rb +0 -19
  1017. data/spec/mongoid/contextual/geo_near_spec.rb +0 -471
  1018. data/spec/mongoid/extensions_spec.rb +0 -43
  1019. data/spec/mongoid/query_cache_middleware_spec.rb +0 -50
  1020. data/spec/mongoid/query_cache_spec.rb +0 -865
  1021. data/spec/shared/CANDIDATE.md +0 -28
  1022. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  1023. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  1024. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require "spec_helper"
4
5
  require_relative './touchable_spec_models'
@@ -26,6 +27,11 @@ describe Mongoid::Touchable do
26
27
  updatable.touch
27
28
  expect(updatable.updated_at).to be > updated_at
28
29
  end
30
+
31
+ it 'does not leave model in changed state' do
32
+ updatable.touch
33
+ expect(updatable).not_to be_changed
34
+ end
29
35
  end
30
36
 
31
37
  context 'when the document has a parent association' do
@@ -58,7 +64,7 @@ describe Mongoid::Touchable do
58
64
  update_time
59
65
  entrance.touch
60
66
 
61
- entrance.updated_at.should == update_time
67
+ expect(entrance.updated_at).to eq(update_time)
62
68
  end
63
69
 
64
70
  it "persists the changes" do
@@ -66,7 +72,7 @@ describe Mongoid::Touchable do
66
72
  update_time
67
73
  entrance.touch
68
74
 
69
- entrance.reload.updated_at.should == update_time
75
+ expect(entrance.reload.updated_at).to eq(update_time)
70
76
  end
71
77
  end
72
78
 
@@ -77,7 +83,7 @@ describe Mongoid::Touchable do
77
83
  update_time
78
84
  floor.touch
79
85
 
80
- building.updated_at.should == update_time
86
+ expect(building.updated_at).to eq(update_time)
81
87
  end
82
88
 
83
89
  it 'persists updated updated_at on parent' do
@@ -85,17 +91,17 @@ describe Mongoid::Touchable do
85
91
  update_time
86
92
  floor.touch
87
93
 
88
- building.reload.updated_at.should == update_time
94
+ expect(building.reload.updated_at).to eq(update_time)
89
95
  end
90
96
  end
91
97
 
92
- shared_examples 'updates the parent when :touch is false' do
98
+ shared_examples 'does not update the parent when :touch is false' do
93
99
  it 'does not update updated_at on parent' do
94
100
  entrance
95
101
  update_time
96
102
  entrance.touch
97
103
 
98
- building.updated_at.should == update_time
104
+ expect(building.updated_at).to eq(start_time)
99
105
  end
100
106
 
101
107
  it 'does not persist updated updated_at on parent' do
@@ -103,26 +109,12 @@ describe Mongoid::Touchable do
103
109
  update_time
104
110
  entrance.touch
105
111
 
106
- building.reload.updated_at.should == update_time
112
+ expect(building.reload.updated_at).to eq(start_time)
107
113
  end
108
114
  end
109
115
 
110
116
  shared_examples 'does not update the parent when :touch is not set' do
111
- it 'does not update updated_at on parent' do
112
- entrance
113
- update_time
114
- entrance.touch
115
-
116
- building.updated_at.should == start_time
117
- end
118
-
119
- it 'does not persist updated updated_at on parent' do
120
- entrance
121
- update_time
122
- entrance.touch
123
-
124
- building.reload.updated_at.should == start_time
125
- end
117
+ it_behaves_like 'does not update the parent when :touch is false'
126
118
  end
127
119
 
128
120
  context "when the document is embedded" do
@@ -130,9 +122,9 @@ describe Mongoid::Touchable do
130
122
 
131
123
  include_examples 'updates the child'
132
124
  include_examples 'updates the parent when :touch is true'
133
- include_examples 'updates the parent when :touch is false'
125
+ include_examples 'does not update the parent when :touch is not set'
134
126
 
135
- context 'when also updating an additional field' do
127
+ context 'when also updating an additional field when :touch is true' do
136
128
  it 'persists the update to the additional field' do
137
129
  entrance
138
130
  update_time
@@ -142,23 +134,29 @@ describe Mongoid::Touchable do
142
134
  building.reload
143
135
 
144
136
  # This is the assertion we want.
145
- entrance.last_used_at.should == update_time
137
+ expect(entrance.last_used_at).to eq(update_time)
146
138
 
147
139
  # Check other timestamps for good measure.
148
- entrance.updated_at.should == update_time
149
- building.updated_at.should == update_time
140
+ expect(entrance.updated_at).to eq(update_time)
141
+ expect(building.updated_at).to eq(start_time)
150
142
  end
151
143
  end
152
144
 
153
- context 'when not updating an additional field' do
154
- it 'does not call set_field_atomic_updates' do
155
- # Regression test for MONGOID-5833
156
- entrance
145
+ context 'when also updating an additional field when :touch is not set' do
146
+ it 'persists the update to the additional field' do
147
+ floor
157
148
  update_time
158
- expect(entrance).not_to receive(:set_field_atomic_updates)
159
- entrance.touch
149
+ floor.touch(:last_used_at)
150
+
151
+ floor.reload
152
+ building.reload
153
+
154
+ # This is the assertion we want.
155
+ expect(floor.last_used_at).to eq(update_time)
160
156
 
161
- entrance.updated_at.should == update_time
157
+ # Check other timestamps for good measure.
158
+ expect(floor.updated_at).to eq(update_time)
159
+ expect(building.updated_at).to eq(update_time)
162
160
  end
163
161
  end
164
162
  end
@@ -168,17 +166,12 @@ describe Mongoid::Touchable do
168
166
 
169
167
  include_examples 'updates the child'
170
168
  include_examples 'updates the parent when :touch is true'
171
- include_examples 'does not update the parent when :touch is not set'
169
+ include_examples 'does not update the parent when :touch is false'
172
170
  end
173
171
  end
174
172
 
175
173
  context "when no relations have touch options" do
176
174
 
177
- before do
178
- Person.send(:include, Mongoid::Touchable::InstanceMethods)
179
- Agent.send(:include, Mongoid::Touchable::InstanceMethods)
180
- end
181
-
182
175
  context "when no updated at is defined" do
183
176
 
184
177
  let(:person) do
@@ -263,8 +256,8 @@ describe Mongoid::Touchable do
263
256
  expect(touched).to be true
264
257
  end
265
258
 
266
- it "keeps changes for next callback" do
267
- expect(agent.changes).to_not be_empty
259
+ it "clears changes" do
260
+ expect(agent.changes).to be_empty
268
261
  end
269
262
  end
270
263
 
@@ -298,8 +291,8 @@ describe Mongoid::Touchable do
298
291
  expect(touched).to be true
299
292
  end
300
293
 
301
- it "keeps changes for next callback" do
302
- expect(agent.changes).to_not be_empty
294
+ it "clears changes" do
295
+ expect(agent.changes).to be_empty
303
296
  end
304
297
  end
305
298
  end
@@ -398,11 +391,6 @@ describe Mongoid::Touchable do
398
391
 
399
392
  context "when the relation is a parent of an embedded doc" do
400
393
 
401
- before do
402
- Page.send(:include, Mongoid::Touchable::InstanceMethods)
403
- Edit.send(:include, Mongoid::Touchable::InstanceMethods)
404
- end
405
-
406
394
  let(:page) do
407
395
  WikiPage.create!(title: "test")
408
396
  end
@@ -423,10 +411,6 @@ describe Mongoid::Touchable do
423
411
 
424
412
  context "when the parent of embedded doc has cascade callbacks" do
425
413
 
426
- before do
427
- Band.send(:include, Mongoid::Touchable::InstanceMethods)
428
- end
429
-
430
414
  let!(:book) do
431
415
  Book.new
432
416
  end
@@ -631,8 +615,8 @@ describe Mongoid::Touchable do
631
615
  end
632
616
 
633
617
  it "updates the parent's timestamp" do
634
- building.updated_at.should == update_time
635
- building.reload.updated_at.should == update_time
618
+ expect(building.updated_at).to eq(update_time)
619
+ expect(building.reload.updated_at).to eq(update_time)
636
620
  end
637
621
  end
638
622
 
@@ -695,12 +679,8 @@ describe Mongoid::Touchable do
695
679
  context "when the touch option is false" do
696
680
 
697
681
  shared_examples "does not update the parent" do
698
-
699
682
  let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
700
-
701
- let(:update_time) do
702
- Timecop.freeze(Time.at(Time.now.to_i) + 2)
703
- end
683
+ let(:update_time) { Timecop.freeze(Time.at(Time.now.to_i) + 2) }
704
684
 
705
685
  after do
706
686
  Timecop.return
@@ -717,17 +697,22 @@ describe Mongoid::Touchable do
717
697
  before do
718
698
  entrance
719
699
  update_time
720
- entrance.touch
700
+ entrance.level = 1
701
+ entrance.send(meth)
721
702
  end
722
703
 
723
704
  it "updates the child's timestamp" do
724
- entrance.updated_at.should == update_time
725
- entrance.reload.updated_at.should == update_time
705
+ if entrance.destroyed?
706
+ expect(entrance.updated_at).to eq(start_time)
707
+ else
708
+ expect(entrance.updated_at).to eq(update_time)
709
+ expect(entrance.reload.updated_at).to eq(update_time)
710
+ end
726
711
  end
727
712
 
728
713
  it "does not update the parent's timestamp" do
729
- building.updated_at.should == start_time
730
- building.reload.updated_at.should == start_time
714
+ expect(building.updated_at).to eq(start_time)
715
+ expect(building.reload.updated_at).to eq(start_time)
731
716
  end
732
717
  end
733
718
 
@@ -743,11 +728,353 @@ describe Mongoid::Touchable do
743
728
  let(:meth) { meth }
744
729
  let(:parent_cls) { TouchableSpec::Embedded::Building }
745
730
 
746
- before do
747
- skip "MONGOID-5274"
731
+ include_examples "does not update the parent"
732
+ end
733
+ end
734
+ end
735
+
736
+ context 'multi-level' do
737
+
738
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
739
+
740
+ let(:update_time) { Timecop.freeze(Time.at(Time.now.to_i) + 2) }
741
+
742
+ let(:child_name) do
743
+ child_cls.name.demodulize.underscore
744
+ end
745
+
746
+ let(:grandchild_name) do
747
+ grandchild_cls.name.demodulize.underscore
748
+ end
749
+
750
+ let(:parent) do
751
+ parent_cls.create!
752
+ end
753
+
754
+ let(:child) do
755
+ parent.send(child_name.pluralize).create!
756
+ end
757
+
758
+ let(:grandchild) do
759
+ grandchild = child.send(grandchild_name.pluralize).create!
760
+ grandchild.created_at = Time.now + 1.day # arbitrary change so save! works
761
+ grandchild
762
+ end
763
+
764
+ shared_examples "updates the parent" do
765
+ it "updates the parent's timestamp" do
766
+ expect(parent.updated_at).to eq(update_time)
767
+ expect(parent.reload.updated_at).to eq(update_time)
768
+ end
769
+ end
770
+
771
+ shared_examples "does not update the parent" do
772
+ it "does not update the parent's timestamp" do
773
+ expect(parent.updated_at).to eq(start_time)
774
+ expect(parent.reload.updated_at).to eq(start_time)
775
+ end
776
+ end
777
+
778
+ shared_examples "updates the child" do
779
+ it "updates the child's timestamp" do
780
+ expect(child.updated_at).to eq(update_time)
781
+ expect(child.reload.updated_at).to eq(update_time)
782
+ end
783
+ end
784
+
785
+ shared_examples "does not update the child" do
786
+ it "does not update the child's timestamp" do
787
+ expect(child.updated_at).to eq(start_time)
788
+ expect(child.reload.updated_at).to eq(start_time)
789
+ end
790
+ end
791
+
792
+ shared_examples "updates the grandchild" do
793
+ it "updates the grandchild's timestamp" do
794
+ if grandchild.destroyed?
795
+ expect(grandchild.updated_at).to eq(start_time)
796
+ else
797
+ expect(grandchild.updated_at).to eq(update_time)
798
+ expect(grandchild.reload.updated_at).to eq(update_time)
748
799
  end
800
+ end
801
+ end
749
802
 
750
- include_examples "does not update the parent"
803
+ shared_examples "does not update the grandchild" do
804
+ it "does not update the grandchild's timestamp" do
805
+ expect(grandchild.updated_at).to eq(start_time)
806
+ expect(grandchild.reload.updated_at).to eq(start_time) unless grandchild.destroyed?
807
+ end
808
+ end
809
+
810
+ before do
811
+ grandchild
812
+ update_time
813
+ grandchild.send(meth)
814
+ end
815
+
816
+ after do
817
+ Timecop.return
818
+ end
819
+
820
+ context 'parent > embedded child > embedded grandchild' do
821
+
822
+ let(:parent_cls) { TouchableSpec::Embedded::Building }
823
+
824
+ context 'child touch: true' do
825
+
826
+ let(:child_cls) do
827
+ TouchableSpec::Embedded::Floor
828
+ end
829
+
830
+ context 'grandchild touch: true' do
831
+
832
+ let(:grandchild_cls) do
833
+ TouchableSpec::Embedded::Sofa
834
+ end
835
+
836
+ [ :save!, :destroy, :touch ].each do |meth|
837
+ context "when calling #{meth} method" do
838
+ let(:meth) { meth }
839
+
840
+ it_behaves_like "updates the parent"
841
+ it_behaves_like "updates the child"
842
+ it_behaves_like "updates the grandchild"
843
+ end
844
+ end
845
+ end
846
+
847
+ context 'grandchild touch: false' do
848
+
849
+ let(:grandchild_cls) do
850
+ TouchableSpec::Embedded::Chair
851
+ end
852
+
853
+ [ :save!, :destroy, :touch ].each do |meth|
854
+ context "when calling #{meth} method" do
855
+ let(:meth) { meth }
856
+
857
+ it_behaves_like "does not update the parent"
858
+ it_behaves_like "does not update the child"
859
+ it_behaves_like "updates the grandchild"
860
+ end
861
+ end
862
+ end
863
+ end
864
+
865
+ context 'child touch: false' do
866
+
867
+ let(:child_cls) do
868
+ TouchableSpec::Embedded::Entrance
869
+ end
870
+
871
+ context 'grandchild touch: true' do
872
+
873
+ let(:grandchild_cls) do
874
+ TouchableSpec::Embedded::Camera
875
+ end
876
+
877
+ [ :save!, :destroy, :touch ].each do |meth|
878
+ context "when calling #{meth} method" do
879
+ let(:meth) { meth }
880
+
881
+ it_behaves_like "does not update the parent"
882
+ it_behaves_like "updates the child"
883
+ it_behaves_like "updates the grandchild"
884
+ end
885
+ end
886
+ end
887
+
888
+ context 'grandchild touch: false' do
889
+
890
+ let(:grandchild_cls) do
891
+ TouchableSpec::Embedded::Keypad
892
+ end
893
+
894
+ [ :save!, :destroy, :touch ].each do |meth|
895
+ context "when calling #{meth} method" do
896
+ let(:meth) { meth }
897
+
898
+ it_behaves_like "does not update the parent"
899
+ it_behaves_like "does not update the child"
900
+ it_behaves_like "updates the grandchild"
901
+ end
902
+ end
903
+ end
904
+ end
905
+ end
906
+
907
+ context 'parent > referenced child > embedded grandchild' do
908
+
909
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
910
+
911
+ context 'child touch: true' do
912
+
913
+ let(:child_cls) do
914
+ TouchableSpec::Referenced::Floor
915
+ end
916
+
917
+ context 'grandchild touch: true' do
918
+
919
+ let(:grandchild_cls) do
920
+ TouchableSpec::Referenced::Sofa
921
+ end
922
+
923
+ [ :save!, :destroy, :touch ].each do |meth|
924
+ context "when calling #{meth} method" do
925
+ let(:meth) { meth }
926
+
927
+ it_behaves_like "updates the parent"
928
+ it_behaves_like "updates the child"
929
+ it_behaves_like "updates the grandchild"
930
+ end
931
+ end
932
+ end
933
+
934
+ context 'grandchild touch: false' do
935
+
936
+ let(:grandchild_cls) do
937
+ TouchableSpec::Referenced::Chair
938
+ end
939
+
940
+ [ :save!, :destroy, :touch ].each do |meth|
941
+ context "when calling #{meth} method" do
942
+ let(:meth) { meth }
943
+
944
+ it_behaves_like "does not update the parent"
945
+ it_behaves_like "does not update the child"
946
+ it_behaves_like "updates the grandchild"
947
+ end
948
+ end
949
+ end
950
+ end
951
+
952
+ context 'child touch: false' do
953
+
954
+ let(:child_cls) do
955
+ TouchableSpec::Referenced::Entrance
956
+ end
957
+
958
+ context 'grandchild touch: true' do
959
+
960
+ let(:grandchild_cls) do
961
+ TouchableSpec::Referenced::Camera
962
+ end
963
+
964
+ [ :save!, :destroy, :touch ].each do |meth|
965
+ context "when calling #{meth} method" do
966
+ let(:meth) { meth }
967
+
968
+ it_behaves_like "does not update the parent"
969
+ it_behaves_like "updates the child"
970
+ it_behaves_like "updates the grandchild"
971
+ end
972
+ end
973
+ end
974
+
975
+ context 'grandchild touch: false' do
976
+
977
+ let(:grandchild_cls) do
978
+ TouchableSpec::Referenced::Keypad
979
+ end
980
+
981
+ [ :save!, :destroy, :touch ].each do |meth|
982
+ context "when calling #{meth} method" do
983
+ let(:meth) { meth }
984
+
985
+ it_behaves_like "does not update the parent"
986
+ it_behaves_like "does not update the child"
987
+ it_behaves_like "updates the grandchild"
988
+ end
989
+ end
990
+ end
991
+ end
992
+ end
993
+
994
+ context 'parent > referenced child > referenced grandchild' do
995
+
996
+ let(:parent_cls) { TouchableSpec::Referenced::Building }
997
+
998
+ context 'child touch: true' do
999
+
1000
+ let(:child_cls) do
1001
+ TouchableSpec::Referenced::Floor
1002
+ end
1003
+
1004
+ context 'grandchild touch: true' do
1005
+
1006
+ let(:grandchild_cls) do
1007
+ TouchableSpec::Referenced::Window
1008
+ end
1009
+
1010
+ [ :save!, :destroy, :touch ].each do |meth|
1011
+ context "when calling #{meth} method" do
1012
+ let(:meth) { meth }
1013
+
1014
+ it_behaves_like "updates the parent"
1015
+ it_behaves_like "updates the child"
1016
+ it_behaves_like "updates the grandchild"
1017
+ end
1018
+ end
1019
+ end
1020
+
1021
+ context 'grandchild touch: false' do
1022
+
1023
+ let(:grandchild_cls) do
1024
+ TouchableSpec::Referenced::Plant
1025
+ end
1026
+
1027
+ [ :save!, :destroy, :touch ].each do |meth|
1028
+ context "when calling #{meth} method" do
1029
+ let(:meth) { meth }
1030
+
1031
+ it_behaves_like "does not update the parent"
1032
+ it_behaves_like "does not update the child"
1033
+ it_behaves_like "updates the grandchild"
1034
+ end
1035
+ end
1036
+ end
1037
+ end
1038
+
1039
+ context 'child touch: false' do
1040
+
1041
+ let(:child_cls) do
1042
+ TouchableSpec::Referenced::Entrance
1043
+ end
1044
+
1045
+ context 'grandchild touch: true' do
1046
+
1047
+ let(:grandchild_cls) do
1048
+ TouchableSpec::Referenced::Window
1049
+ end
1050
+
1051
+ [ :save!, :destroy, :touch ].each do |meth|
1052
+ context "when calling #{meth} method" do
1053
+ let(:meth) { meth }
1054
+
1055
+ it_behaves_like "does not update the parent"
1056
+ it_behaves_like "updates the child"
1057
+ it_behaves_like "updates the grandchild"
1058
+ end
1059
+ end
1060
+ end
1061
+
1062
+ context 'grandchild touch: false' do
1063
+
1064
+ let(:grandchild_cls) do
1065
+ TouchableSpec::Referenced::Plant
1066
+ end
1067
+
1068
+ [ :save!, :destroy, :touch ].each do |meth|
1069
+ context "when calling #{meth} method" do
1070
+ let(:meth) { meth }
1071
+
1072
+ it_behaves_like "does not update the parent"
1073
+ it_behaves_like "does not update the child"
1074
+ it_behaves_like "updates the grandchild"
1075
+ end
1076
+ end
1077
+ end
751
1078
  end
752
1079
  end
753
1080
  end
@@ -861,7 +1188,7 @@ describe Mongoid::Touchable do
861
1188
  end
862
1189
  end
863
1190
 
864
- context "when saving embedded associations with cascadable callbacks" do
1191
+ context "when saving embedded associations with cascading callbacks" do
865
1192
 
866
1193
  shared_examples "timeless is cleared" do
867
1194
  it "clears the timeless option" do
@@ -985,4 +1312,93 @@ describe Mongoid::Touchable do
985
1312
  end
986
1313
  end
987
1314
  end
1315
+
1316
+ context 'when updated after touch' do
1317
+ let(:touch_time) { Timecop.freeze(Time.at(Time.now.to_i) + 2) }
1318
+
1319
+ let(:update_time) { Timecop.freeze(Time.at(Time.now.to_i) + 4) }
1320
+
1321
+ let!(:book) { Book.create! }
1322
+
1323
+ after do
1324
+ Timecop.return
1325
+ end
1326
+
1327
+ it 'updates updated_at' do
1328
+ touch_time
1329
+ book.touch
1330
+ update_time
1331
+ book.title = 'This book has no name'
1332
+ book.save!
1333
+ expect(book.updated_at).to eq(update_time)
1334
+ end
1335
+ end
1336
+
1337
+ context 'callbacks' do
1338
+ class TouchableParent
1339
+ include Mongoid::Document
1340
+ include Mongoid::Timestamps
1341
+
1342
+ attr_reader :before_touch_called, :after_touch_called
1343
+
1344
+ set_callback(:touch, :before) do
1345
+ @before_touch_called = true
1346
+ end
1347
+
1348
+ set_callback(:touch, :after) do
1349
+ @after_touch_called = true
1350
+ end
1351
+
1352
+ embeds_one :child, inverse_of: :parent, class_name: 'TouchableChild'
1353
+ end
1354
+
1355
+ class TouchableChild
1356
+ include Mongoid::Document
1357
+ include Mongoid::Timestamps
1358
+
1359
+ attr_reader :before_touch_called, :after_touch_called
1360
+
1361
+ set_callback(:touch, :before) do
1362
+ @before_touch_called = true
1363
+ end
1364
+
1365
+ set_callback(:touch, :after) do
1366
+ @after_touch_called = true
1367
+ end
1368
+
1369
+ embedded_in :parent, inverse_of: :child, class_name: 'TouchableParent', touch: true
1370
+ end
1371
+
1372
+ let(:parent) do
1373
+ TouchableParent.create!.tap do |parent|
1374
+ parent.child = TouchableChild.create!(parent: parent)
1375
+ end
1376
+ end
1377
+
1378
+ let(:child) do
1379
+ parent.child
1380
+ end
1381
+
1382
+ it 'calls touch callbacks on parent' do
1383
+ parent.touch
1384
+ expect(parent.before_touch_called).to eq(true)
1385
+ expect(parent.after_touch_called).to eq(true)
1386
+ end
1387
+
1388
+ context 'when touch is calles on a child' do
1389
+ before do
1390
+ child.touch
1391
+ end
1392
+
1393
+ it 'calls touch callbacks on parent' do
1394
+ expect(parent.before_touch_called).to eq(true)
1395
+ expect(parent.after_touch_called).to eq(true)
1396
+ end
1397
+
1398
+ it 'calls touch callbacks on child' do
1399
+ expect(child.before_touch_called).to eq(true)
1400
+ expect(child.after_touch_called).to eq(true)
1401
+ end
1402
+ end
1403
+ end
988
1404
  end