mongoid 8.1.5 → 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 (1015) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE +1 -1
  4. data/README.md +4 -9
  5. data/Rakefile +42 -26
  6. data/lib/config/locales/en.yml +66 -5
  7. data/lib/mongoid/association/accessors.rb +16 -16
  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 -4
  14. data/lib/mongoid/association/embedded/batchable.rb +6 -7
  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 -144
  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 +112 -54
  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 +39 -6
  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 +1 -0
  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 -1
  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 +32 -60
  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 +2 -1
  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 +11 -26
  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 +170 -117
  161. data/lib/mongoid/encryptable.rb +53 -0
  162. data/lib/mongoid/equality.rb +2 -21
  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 -143
  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 +35 -35
  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 +13 -2
  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 +4 -0
  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 +1 -0
  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 +4 -3
  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 +128 -88
  358. data/lib/mongoid/utils.rb +32 -2
  359. data/lib/mongoid/validatable/associated.rb +1 -0
  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 -0
  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 -2
  368. data/lib/mongoid/version.rb +2 -1
  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 +69 -36
  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 -0
  384. data/spec/integration/associations/embeds_one_spec.rb +1 -0
  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 +50 -0
  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 -3
  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 -0
  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 +1 -3
  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 -0
  506. data/spec/mongoid/attributes_spec.rb +18 -19
  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 -0
  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 +98 -205
  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 -185
  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 -121
  584. data/spec/mongoid/equality_spec.rb +41 -143
  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 -222
  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 -2
  664. data/spec/mongoid/interceptable_spec_models.rb +1 -0
  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 +1 -0
  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 -0
  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 +490 -62
  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 +1 -0
  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 -0
  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/share/Dockerfile.erb +12 -52
  727. data/spec/shared/shlib/server.sh +1 -0
  728. data/spec/shared/shlib/set_env.sh +5 -28
  729. data/spec/spec_helper.rb +26 -28
  730. data/spec/support/authorization.rb +1 -0
  731. data/spec/support/client_registry.rb +1 -0
  732. data/spec/support/constraints.rb +1 -0
  733. data/spec/support/crypt/models.rb +50 -0
  734. data/spec/support/crypt.rb +80 -0
  735. data/spec/support/expectations.rb +1 -0
  736. data/spec/support/feature_sandbox.rb +72 -0
  737. data/spec/support/helpers.rb +1 -0
  738. data/spec/support/immutable_ids.rb +22 -21
  739. data/spec/support/macros.rb +4 -6
  740. data/spec/support/models/account.rb +1 -0
  741. data/spec/support/models/acolyte.rb +1 -0
  742. data/spec/support/models/actor.rb +1 -0
  743. data/spec/support/models/actress.rb +1 -0
  744. data/spec/support/models/address.rb +3 -0
  745. data/spec/support/models/address_component.rb +1 -0
  746. data/spec/support/models/address_number.rb +1 -0
  747. data/spec/support/models/agency.rb +1 -0
  748. data/spec/support/models/agent.rb +1 -0
  749. data/spec/support/models/album.rb +1 -0
  750. data/spec/support/models/alert.rb +1 -0
  751. data/spec/support/models/animal.rb +1 -0
  752. data/spec/support/models/answer.rb +1 -0
  753. data/spec/support/models/appointment.rb +1 -0
  754. data/spec/support/models/armrest.rb +1 -0
  755. data/spec/support/models/array_field.rb +1 -0
  756. data/spec/support/models/article.rb +1 -0
  757. data/spec/support/models/artist.rb +1 -0
  758. data/spec/support/models/artwork.rb +1 -0
  759. data/spec/support/models/audible_sound.rb +1 -0
  760. data/spec/support/models/audio.rb +1 -0
  761. data/spec/support/models/augmentation.rb +1 -0
  762. data/spec/support/models/author.rb +1 -0
  763. data/spec/support/models/baby.rb +1 -0
  764. data/spec/support/models/band.rb +5 -0
  765. data/spec/support/models/bar.rb +1 -0
  766. data/spec/support/models/basic.rb +1 -0
  767. data/spec/support/models/bed.rb +1 -0
  768. data/spec/support/models/big_palette.rb +1 -0
  769. data/spec/support/models/birthday.rb +1 -0
  770. data/spec/support/models/bolt.rb +1 -0
  771. data/spec/support/models/bomb.rb +1 -0
  772. data/spec/support/models/book.rb +1 -0
  773. data/spec/support/models/breed.rb +1 -0
  774. data/spec/support/models/browser.rb +1 -0
  775. data/spec/support/models/building.rb +1 -0
  776. data/spec/support/models/building_address.rb +1 -0
  777. data/spec/support/models/bus.rb +1 -0
  778. data/spec/support/models/business.rb +1 -0
  779. data/spec/support/models/callback_test.rb +1 -0
  780. data/spec/support/models/canvas.rb +1 -0
  781. data/spec/support/models/car.rb +1 -0
  782. data/spec/support/models/cat.rb +1 -0
  783. data/spec/support/models/catalog.rb +1 -0
  784. data/spec/support/models/category.rb +1 -0
  785. data/spec/support/models/child.rb +1 -0
  786. data/spec/support/models/child_doc.rb +1 -0
  787. data/spec/support/models/church.rb +1 -0
  788. data/spec/support/models/circle.rb +1 -0
  789. data/spec/support/models/circuit.rb +1 -0
  790. data/spec/support/models/circus.rb +1 -0
  791. data/spec/support/models/code.rb +1 -0
  792. data/spec/support/models/coding/pull_request.rb +1 -0
  793. data/spec/support/models/coding.rb +1 -0
  794. data/spec/support/models/comment.rb +1 -0
  795. data/spec/support/models/company.rb +1 -0
  796. data/spec/support/models/consumption_period.rb +1 -0
  797. data/spec/support/models/contextable_item.rb +1 -0
  798. data/spec/support/models/contractor.rb +1 -0
  799. data/spec/support/models/cookie.rb +1 -0
  800. data/spec/support/models/country_code.rb +1 -0
  801. data/spec/support/models/courier_job.rb +1 -0
  802. data/spec/support/models/cover.rb +1 -0
  803. data/spec/support/models/crate.rb +1 -0
  804. data/spec/support/models/customer.rb +1 -0
  805. data/spec/support/models/customer_address.rb +1 -0
  806. data/spec/support/models/deed.rb +1 -0
  807. data/spec/support/models/definition.rb +1 -0
  808. data/spec/support/models/delegating_patient.rb +1 -0
  809. data/spec/support/models/description.rb +1 -0
  810. data/spec/support/models/dictionary.rb +1 -0
  811. data/spec/support/models/division.rb +1 -0
  812. data/spec/support/models/doctor.rb +1 -0
  813. data/spec/support/models/dog.rb +1 -0
  814. data/spec/support/models/dokument.rb +1 -0
  815. data/spec/support/models/draft.rb +1 -0
  816. data/spec/support/models/dragon.rb +1 -0
  817. data/spec/support/models/driver.rb +1 -0
  818. data/spec/support/models/drug.rb +1 -0
  819. data/spec/support/models/dungeon.rb +1 -0
  820. data/spec/support/models/edit.rb +1 -0
  821. data/spec/support/models/email.rb +1 -0
  822. data/spec/support/models/employer.rb +1 -0
  823. data/spec/support/models/entry.rb +1 -0
  824. data/spec/support/models/eraser.rb +1 -0
  825. data/spec/support/models/even.rb +1 -0
  826. data/spec/support/models/event.rb +1 -0
  827. data/spec/support/models/exhibition.rb +1 -0
  828. data/spec/support/models/exhibitor.rb +1 -0
  829. data/spec/support/models/explosion.rb +1 -0
  830. data/spec/support/models/eye.rb +1 -0
  831. data/spec/support/models/eye_bowl.rb +1 -0
  832. data/spec/support/models/face.rb +1 -0
  833. data/spec/support/models/fanatic.rb +1 -0
  834. data/spec/support/models/favorite.rb +8 -1
  835. data/spec/support/models/filesystem.rb +1 -0
  836. data/spec/support/models/fire_hydrant.rb +1 -0
  837. data/spec/support/models/firefox.rb +1 -0
  838. data/spec/support/models/fish.rb +1 -0
  839. data/spec/support/models/folder.rb +1 -0
  840. data/spec/support/models/folder_item.rb +1 -0
  841. data/spec/support/models/fruits.rb +1 -0
  842. data/spec/support/models/game.rb +1 -0
  843. data/spec/support/models/ghost.rb +1 -0
  844. data/spec/support/models/guitar.rb +1 -0
  845. data/spec/support/models/hole.rb +1 -0
  846. data/spec/support/models/home.rb +1 -0
  847. data/spec/support/models/house.rb +1 -0
  848. data/spec/support/models/html_writer.rb +1 -0
  849. data/spec/support/models/id_key.rb +1 -0
  850. data/spec/support/models/idnodef.rb +1 -0
  851. data/spec/support/models/image.rb +1 -0
  852. data/spec/support/models/implant.rb +1 -0
  853. data/spec/support/models/instrument.rb +1 -0
  854. data/spec/support/models/item.rb +1 -0
  855. data/spec/support/models/jar.rb +1 -0
  856. data/spec/support/models/kaleidoscope.rb +1 -0
  857. data/spec/support/models/kangaroo.rb +1 -0
  858. data/spec/support/models/label.rb +1 -0
  859. data/spec/support/models/language.rb +1 -0
  860. data/spec/support/models/lat_lng.rb +1 -0
  861. data/spec/support/models/league.rb +1 -0
  862. data/spec/support/models/learner.rb +1 -0
  863. data/spec/support/models/line_item.rb +1 -0
  864. data/spec/support/models/location.rb +1 -0
  865. data/spec/support/models/login.rb +1 -0
  866. data/spec/support/models/manufacturer.rb +1 -0
  867. data/spec/support/models/meat.rb +1 -0
  868. data/spec/support/models/membership.rb +1 -0
  869. data/spec/support/models/message.rb +1 -0
  870. data/spec/support/models/minim.rb +1 -0
  871. data/spec/support/models/mixed_drink.rb +1 -0
  872. data/spec/support/models/mop.rb +1 -0
  873. data/spec/support/models/movie.rb +1 -0
  874. data/spec/support/models/my_hash.rb +1 -0
  875. data/spec/support/models/name.rb +1 -0
  876. data/spec/support/models/name_only.rb +1 -0
  877. data/spec/support/models/node.rb +1 -0
  878. data/spec/support/models/note.rb +1 -0
  879. data/spec/support/models/nut.rb +1 -0
  880. data/spec/support/models/odd.rb +1 -0
  881. data/spec/support/models/order.rb +1 -0
  882. data/spec/support/models/ordered_post.rb +1 -0
  883. data/spec/support/models/ordered_preference.rb +1 -0
  884. data/spec/support/models/oscar.rb +1 -0
  885. data/spec/support/models/other_owner_object.rb +1 -0
  886. data/spec/support/models/override.rb +1 -0
  887. data/spec/support/models/ownable.rb +1 -0
  888. data/spec/support/models/owner.rb +1 -0
  889. data/spec/support/models/pack.rb +1 -0
  890. data/spec/support/models/page.rb +1 -0
  891. data/spec/support/models/page_question.rb +1 -0
  892. data/spec/support/models/palette.rb +1 -0
  893. data/spec/support/models/parent.rb +1 -0
  894. data/spec/support/models/parent_doc.rb +1 -0
  895. data/spec/support/models/passport.rb +1 -0
  896. data/spec/support/models/patient.rb +1 -0
  897. data/spec/support/models/pdf_writer.rb +1 -0
  898. data/spec/support/models/pencil.rb +1 -0
  899. data/spec/support/models/person.rb +1 -0
  900. data/spec/support/models/pet.rb +1 -0
  901. data/spec/support/models/pet_owner.rb +1 -0
  902. data/spec/support/models/phone.rb +1 -0
  903. data/spec/support/models/piano.rb +1 -0
  904. data/spec/support/models/pizza.rb +1 -0
  905. data/spec/support/models/player.rb +1 -0
  906. data/spec/support/models/post.rb +1 -0
  907. data/spec/support/models/post_genre.rb +1 -0
  908. data/spec/support/models/powerup.rb +1 -0
  909. data/spec/support/models/preference.rb +1 -0
  910. data/spec/support/models/princess.rb +1 -0
  911. data/spec/support/models/product.rb +1 -0
  912. data/spec/support/models/profile.rb +1 -0
  913. data/spec/support/models/pronunciation.rb +1 -0
  914. data/spec/support/models/pub.rb +1 -0
  915. data/spec/support/models/publication/encyclopedia.rb +1 -0
  916. data/spec/support/models/publication/review.rb +1 -0
  917. data/spec/support/models/publication.rb +1 -0
  918. data/spec/support/models/purchase.rb +1 -0
  919. data/spec/support/models/purchased_item.rb +1 -0
  920. data/spec/support/models/question.rb +1 -0
  921. data/spec/support/models/quiz.rb +1 -0
  922. data/spec/support/models/rating.rb +1 -0
  923. data/spec/support/models/record.rb +1 -0
  924. data/spec/support/models/registry.rb +1 -0
  925. data/spec/support/models/role.rb +1 -0
  926. data/spec/support/models/root_category.rb +1 -0
  927. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  928. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  929. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  930. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  931. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  932. data/spec/support/models/sandwich.rb +1 -0
  933. data/spec/support/models/scheduler.rb +1 -0
  934. data/spec/support/models/school.rb +1 -0
  935. data/spec/support/models/scribe.rb +1 -0
  936. data/spec/support/models/sealer.rb +1 -0
  937. data/spec/support/models/seat.rb +1 -0
  938. data/spec/support/models/seo.rb +1 -0
  939. data/spec/support/models/series.rb +1 -0
  940. data/spec/support/models/server.rb +1 -0
  941. data/spec/support/models/service.rb +1 -0
  942. data/spec/support/models/shape.rb +1 -0
  943. data/spec/support/models/shelf.rb +1 -0
  944. data/spec/support/models/shield.rb +1 -0
  945. data/spec/support/models/shipment_address.rb +1 -0
  946. data/spec/support/models/shipping_container.rb +1 -0
  947. data/spec/support/models/shipping_pack.rb +1 -0
  948. data/spec/support/models/shirt.rb +1 -0
  949. data/spec/support/models/shop.rb +1 -0
  950. data/spec/support/models/short_agent.rb +1 -0
  951. data/spec/support/models/short_quiz.rb +1 -0
  952. data/spec/support/models/simple.rb +1 -0
  953. data/spec/support/models/slave.rb +1 -0
  954. data/spec/support/models/song.rb +1 -0
  955. data/spec/support/models/sound.rb +1 -0
  956. data/spec/support/models/spacer.rb +1 -0
  957. data/spec/support/models/square.rb +1 -0
  958. data/spec/support/models/staff.rb +1 -0
  959. data/spec/support/models/store_as_dup_test1.rb +1 -0
  960. data/spec/support/models/store_as_dup_test2.rb +1 -0
  961. data/spec/support/models/store_as_dup_test3.rb +1 -0
  962. data/spec/support/models/store_as_dup_test4.rb +1 -0
  963. data/spec/support/models/strategy.rb +1 -0
  964. data/spec/support/models/student.rb +1 -0
  965. data/spec/support/models/sub_item.rb +1 -0
  966. data/spec/support/models/subscription.rb +1 -0
  967. data/spec/support/models/survey.rb +1 -0
  968. data/spec/support/models/symptom.rb +1 -0
  969. data/spec/support/models/system_role.rb +1 -0
  970. data/spec/support/models/tag.rb +1 -0
  971. data/spec/support/models/target.rb +1 -0
  972. data/spec/support/models/template.rb +1 -0
  973. data/spec/support/models/thing.rb +1 -0
  974. data/spec/support/models/threadlocker.rb +1 -0
  975. data/spec/support/models/title.rb +1 -0
  976. data/spec/support/models/tool.rb +1 -0
  977. data/spec/support/models/topping.rb +1 -0
  978. data/spec/support/models/toy.rb +1 -0
  979. data/spec/support/models/track.rb +1 -0
  980. data/spec/support/models/translation.rb +1 -0
  981. data/spec/support/models/tree.rb +1 -0
  982. data/spec/support/models/truck.rb +1 -0
  983. data/spec/support/models/updatable.rb +1 -0
  984. data/spec/support/models/user.rb +1 -0
  985. data/spec/support/models/user_account.rb +1 -0
  986. data/spec/support/models/validation_callback.rb +1 -0
  987. data/spec/support/models/vehicle.rb +1 -0
  988. data/spec/support/models/version.rb +1 -0
  989. data/spec/support/models/vertex.rb +1 -0
  990. data/spec/support/models/vet_visit.rb +1 -0
  991. data/spec/support/models/video.rb +1 -0
  992. data/spec/support/models/video_game.rb +1 -0
  993. data/spec/support/models/washer.rb +1 -0
  994. data/spec/support/models/weapon.rb +1 -0
  995. data/spec/support/models/wiki_page.rb +1 -0
  996. data/spec/support/models/word.rb +1 -0
  997. data/spec/support/models/word_origin.rb +1 -0
  998. data/spec/support/models/writer.rb +1 -0
  999. data/spec/support/rails_mock.rb +32 -0
  1000. data/spec/support/shared/time.rb +3 -21
  1001. data/spec/support/sinatra_mock.rb +7 -0
  1002. data/spec/support/spec_config.rb +30 -9
  1003. data.tar.gz.sig +0 -0
  1004. metadata +92 -34
  1005. metadata.gz.sig +0 -0
  1006. data/lib/mongoid/association/referenced/eager.rb +0 -163
  1007. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -113
  1008. data/lib/mongoid/contextual/geo_near.rb +0 -236
  1009. data/lib/mongoid/errors/invalid_session_use.rb +0 -21
  1010. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -27
  1011. data/lib/mongoid/query_cache.rb +0 -68
  1012. data/spec/mongoid/contextual/geo_near_spec.rb +0 -471
  1013. data/spec/mongoid/extensions_spec.rb +0 -43
  1014. data/spec/mongoid/query_cache_middleware_spec.rb +0 -50
  1015. data/spec/mongoid/query_cache_spec.rb +0 -865
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+ # rubocop:todo all
3
+
4
+ require 'mongoid/extensions/boolean'
5
+ require 'mongoid/stringified_symbol'
6
+
7
+ module Mongoid
8
+ module Config
9
+ # This module contains the logic for configuring Client Side
10
+ # Field Level automatic encryption.
11
+ #
12
+ # @api private
13
+ module Encryption
14
+ extend self
15
+
16
+ # Generate the encryption schema map for the provided models.
17
+ #
18
+ # @param [ String ] default_database The default database name.
19
+ # @param [ Array<Mongoid::Document> ] models The models to generate the schema map for.
20
+ # Defaults to all models in the application.
21
+ #
22
+ # @return [ Hash ] The encryption schema map.
23
+ def encryption_schema_map(default_database, models = ::Mongoid.models)
24
+ visited = Set.new
25
+ models.each_with_object({}) do |model, map|
26
+ next if visited.include?(model)
27
+ visited << model
28
+ next if model.embedded?
29
+ next unless model.encrypted?
30
+
31
+ database = model.storage_options.fetch(:database) { default_database }
32
+ key = "#{database}.#{model.collection_name}"
33
+ props = metadata_for(model).merge(properties_for(model, visited))
34
+ map[key] = props unless props.empty?
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ # The algorithm to use for the deterministic encryption.
41
+ DETERMINISTIC_ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'
42
+
43
+ # The algorithm to use for the non-deterministic encryption.
44
+ RANDOM_ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_512-Random'
45
+
46
+ # The mapping of Mongoid field types to BSON type identifiers.
47
+ TYPE_MAPPINGS = {
48
+ Hash => 'object',
49
+ Integer => 'int',
50
+ BSON::Int32 => 'int',
51
+ BSON::Int64 => 'long',
52
+ BSON::ObjectId => 'objectId',
53
+ Time => 'date',
54
+ Date => 'date',
55
+ DateTime => 'date',
56
+ Float => 'double',
57
+ String => 'string',
58
+ BSON::Binary => 'binData',
59
+ Array => 'array',
60
+ Mongoid::Boolean => 'bool',
61
+ BigDecimal => 'decimal',
62
+ Range => 'object',
63
+ Regexp => 'regex',
64
+ Set => 'array',
65
+ Mongoid::StringifiedSymbol => 'string',
66
+ ActiveSupport::TimeWithZone => 'date'
67
+ }.freeze
68
+
69
+ # Generate the encryptMetadata object for the provided model.
70
+ #
71
+ # @param [ Mongoid::Document ] model The model to generate the metadata for.
72
+ #
73
+ # @return [ Hash ] The encryptMetadata object.
74
+ def metadata_for(model)
75
+ metadata = {}.tap do |metadata|
76
+ if (key_id = key_id_for(model.encrypt_metadata[:key_id], model.encrypt_metadata[:key_name_field]))
77
+ metadata['keyId'] = key_id
78
+ end
79
+ if model.encrypt_metadata.key?(:deterministic)
80
+ metadata['algorithm'] = if model.encrypt_metadata[:deterministic]
81
+ DETERMINISTIC_ALGORITHM
82
+ else
83
+ RANDOM_ALGORITHM
84
+ end
85
+ end
86
+ end
87
+ if metadata.empty?
88
+ {}
89
+ else
90
+ {
91
+ 'bsonType' => 'object',
92
+ 'encryptMetadata' => metadata
93
+ }
94
+ end
95
+ end
96
+
97
+ # Generate encryption properties for the provided model.
98
+ #
99
+ # This method generates the properties for the fields and relations that
100
+ # are marked as encrypted.
101
+ #
102
+ # @param [ Mongoid::Document ] model The model to generate the properties for.
103
+ # @param [ Set<Mongoid::Document> ] visited The set of models that have already been visited.
104
+ #
105
+ # @return [ Hash ] The encryption properties.
106
+ def properties_for(model, visited)
107
+ result = properties_for_fields(model).merge(properties_for_relations(model, visited))
108
+ if result.empty?
109
+ {}
110
+ else
111
+ { 'properties' => result }
112
+ end
113
+ end
114
+
115
+ # Generate encryption properties for the fields of the provided model.
116
+ #
117
+ # @param [ Mongoid::Document ] model The model to generate the properties for.
118
+ #
119
+ # @return [ Hash ] The encryption properties.
120
+ def properties_for_fields(model)
121
+ model.fields.each_with_object({}) do |(name, field), props|
122
+ next unless field.is_a?(Mongoid::Fields::Encrypted)
123
+
124
+ props[name] = {
125
+ 'encrypt' => {
126
+ 'bsonType' => bson_type_for(field)
127
+ }
128
+ }
129
+ if (algorithm = algorithm_for(field))
130
+ props[name]['encrypt']['algorithm'] = algorithm
131
+ end
132
+ if (key_id = key_id_for(field.key_id, field.key_name_field))
133
+ props[name]['encrypt']['keyId'] = key_id
134
+ end
135
+ end
136
+ end
137
+
138
+ # Generate encryption properties for the relations of the provided model.
139
+ #
140
+ # This method generates the properties for the embedded relations that
141
+ # are configured to be encrypted.
142
+ #
143
+ # @param [ Mongoid::Document ] model The model to generate the properties for.
144
+ # @param [ Set<Mongoid::Document> ] visited The set of models that have already been visited.
145
+ #
146
+ # @return [ Hash ] The encryption properties.
147
+ def properties_for_relations(model, visited)
148
+ model.relations.each_with_object({}) do |(name, relation), props|
149
+ next if visited.include?(relation.relation_class)
150
+ next unless relation.is_a?(Association::Embedded::EmbedsOne)
151
+ next unless relation.relation_class.encrypted?
152
+
153
+ visited << relation.relation_class
154
+ metadata_for(
155
+ relation.relation_class
156
+ ).merge(
157
+ properties_for(relation.relation_class, visited)
158
+ ).tap do |properties|
159
+ props[name] = { 'bsonType' => 'object' }.merge(properties) unless properties.empty?
160
+ end
161
+ end
162
+ end
163
+
164
+ # Get the BSON type identifier for the provided field according to the
165
+ # https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-bson-types
166
+ #
167
+ # @param [ Mongoid::Field ] field The field to get the BSON type identifier for.
168
+ #
169
+ # @return [ String ] The BSON type identifier.
170
+ def bson_type_for(field)
171
+ TYPE_MAPPINGS[field.type]
172
+ end
173
+
174
+ # Get the encryption algorithm to use for the provided field.
175
+ #
176
+ # @param [ Mongoid::Field ] field The field to get the algorithm for.
177
+ #
178
+ # @return [ String ] The algorithm.
179
+ def algorithm_for(field)
180
+ case field.deterministic?
181
+ when true
182
+ DETERMINISTIC_ALGORITHM
183
+ when false
184
+ RANDOM_ALGORITHM
185
+ else
186
+ nil
187
+ end
188
+ end
189
+
190
+ # Get the keyId encryption schema field for the base64 encrypted
191
+ # key id.
192
+ #
193
+ # @param [ String | nil ] key_id_base64 The base64 encoded key id.
194
+ # @param [ String | nil ] key_name_field The name of the key name field.
195
+ #
196
+ # @return [ Array<BSON::Binary> | String | nil ] The keyId encryption schema field,
197
+ # JSON pointer to the field that contains keyAltName,
198
+ # or nil if both key_id_base64 and key_name_field are nil.
199
+ def key_id_for(key_id_base64, key_name_field)
200
+ return nil if key_id_base64.nil? && key_name_field.nil?
201
+ if !key_id_base64.nil? && !key_name_field.nil?
202
+ raise ArgumentError, 'Specifying both key_id and key_name_field is not allowed'
203
+ end
204
+
205
+ if key_id_base64.nil?
206
+ "/#{key_name_field}"
207
+ else
208
+ [ BSON::Binary.new(Base64.decode64(key_id_base64), :uuid) ]
209
+ end
210
+ end
211
+ end
212
+ end
213
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Config
@@ -65,11 +66,7 @@ module Mongoid
65
66
  ]
66
67
 
67
68
  result = ERB.new(contents).result
68
- data = if RUBY_VERSION < '2.6'
69
- YAML.safe_load(result, permitted_classes, [], true)
70
- else
71
- YAML.safe_load(result, permitted_classes: permitted_classes, aliases: true)
72
- end
69
+ data = YAML.safe_load(result, permitted_classes: permitted_classes, aliases: true)
73
70
 
74
71
  unless data.is_a?(Hash)
75
72
  raise Mongoid::Errors::InvalidConfigFile.new(path)
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+ # rubocop:todo all
3
+
4
+ module Mongoid
5
+ module Config
6
+
7
+ # This module provides a way to inspect not only the defined configuration
8
+ # settings and their defaults (which are available via
9
+ # `Mongoid::Config.settings`), but also the documentation about them. It
10
+ # does this by scraping the `mongoid/config.rb` file with a regular
11
+ # expression to match comments with options.
12
+ #
13
+ # @api private
14
+ module Introspection
15
+ extend self
16
+
17
+ # A helper class to represent an individual option, its name, its
18
+ # default value, and the comment that documents it.
19
+ class Option
20
+ # The name of this option.
21
+ #
22
+ # @return [ String ] The name of the option
23
+ attr_reader :name
24
+
25
+ # The default value of this option.
26
+ #
27
+ # @return [ Object ] The default value of the option, typically a
28
+ # String, Symbol, nil, true, or false.
29
+ attr_reader :default
30
+
31
+ # The comment that describes this option, as scraped from
32
+ # mongoid/config.rb.
33
+ #
34
+ # @return [ String ] The (possibly multi-line) comment. Each line is
35
+ # prefixed with the Ruby comment character ("#").
36
+ attr_reader :comment
37
+
38
+ # Instantiate an option from an array of Regex captures.
39
+ #
40
+ # @param [ Array<String> ] captures The array with the Regex captures
41
+ # to use to instantiate the option. The element at index 1 must be
42
+ # the comment, at index 2 must be the name, and at index 3 must be
43
+ # the default value.
44
+ #
45
+ # @return [ Option ] The newly instantiated Option object.
46
+ def self.from_captures(captures)
47
+ new(captures[2], captures[3], captures[1])
48
+ end
49
+
50
+ # Create a new Option instance with the given name, default value,
51
+ # and comment.
52
+ #
53
+ # @param [ String ] name The option's name.
54
+ # @param [ String ] default The option's default value, as a String
55
+ # representing the actual Ruby value.
56
+ # @param [ String ] comment The multi-line comment describing the
57
+ # option.
58
+ def initialize(name, default, comment)
59
+ @name, @default, @comment = name, default, unindent(comment)
60
+ end
61
+
62
+ # Indent the comment by the requested amount, optionally indenting the
63
+ # first line, as well.
64
+ #
65
+ # param [ Integer ] indent The number of spaces to indent each line
66
+ # (Default: 2)
67
+ # param [ true | false ] indent_first_line Whether or not to indent
68
+ # the first line of the comment (Default: false)
69
+ #
70
+ # @return [ String ] the reformatted comment
71
+ def indented_comment(indent: 2, indent_first_line: false)
72
+ comment.gsub(/^/, " " * indent).tap do |result|
73
+ result.strip! unless indent_first_line
74
+ end
75
+ end
76
+
77
+ # Reports whether or not the text "(Deprecated)" is present in the
78
+ # option's comment.
79
+ #
80
+ # @return [ true | false ] whether the option is deprecated or not.
81
+ def deprecated?
82
+ comment.include?("(Deprecated)")
83
+ end
84
+
85
+ # Compare self with the given option.
86
+ #
87
+ # @return [ true | false ] If name, default, and comment are all the
88
+ # same, return true. Otherwise, false.
89
+ def ==(option)
90
+ name == option.name &&
91
+ default == option.default &&
92
+ comment == option.comment
93
+ end
94
+
95
+ private
96
+
97
+ # Removes any existing whitespace from the beginning of each line in
98
+ # the text.
99
+ #
100
+ # @param [ String ] text The text to unindent.
101
+ #
102
+ # @return [ String ] the unindented text.
103
+ def unindent(text)
104
+ text.strip.gsub(/^\s+/, "")
105
+ end
106
+ end
107
+
108
+ # A regular expression that looks for option declarations of the format:
109
+ #
110
+ # # one or more lines of comments,
111
+ # # followed immediately by an option
112
+ # # declaration with a default value:
113
+ # option :option_name, default: "something"
114
+ #
115
+ # The regex produces three captures:
116
+ #
117
+ # 1: the (potentially multiline) comment
118
+ # 2: the option's name
119
+ # 3: the option's default value
120
+ OPTION_PATTERN = %r{
121
+ (
122
+ ((?:^\s*\#.*\n)+) # match one or more lines of comments
123
+ ^\s+option\s+ # followed immediately by a line declaring an option
124
+ :(\w+),\s+ # match the option's name, followed by a comma
125
+ default:\s+(.*?) # match the default value for the option
126
+ (?:,.*?)? # skip any other configuration
127
+ \n) # end with a newline
128
+ }x
129
+
130
+ # The full path to the source file of the Mongoid::Config module.
131
+ CONFIG_RB_PATH = File.absolute_path(File.join(
132
+ File.dirname(__FILE__), "../config.rb"))
133
+
134
+ # Extracts the available configuration options from the Mongoid::Config
135
+ # source file, and returns them as an array of hashes.
136
+ #
137
+ # @param [ true | false ] include_deprecated Whether deprecated options
138
+ # should be included in the list. (Default: false)
139
+ #
140
+ # @return [ Array<Introspection::Option>> ] the array of option objects
141
+ # representing each defined option, in alphabetical order by name.
142
+ def options(include_deprecated: false)
143
+ src = File.read(CONFIG_RB_PATH)
144
+ src.scan(OPTION_PATTERN)
145
+ .map { |opt| Option.from_captures(opt) }
146
+ .reject { |opt| !include_deprecated && opt.deprecated? }
147
+ .sort_by { |opt| opt.name }
148
+ end
149
+ end
150
+
151
+ end
152
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Config
@@ -56,7 +57,11 @@ module Mongoid
56
57
  #
57
58
  # @return [ Hash ] The defaults.
58
59
  def reset
59
- settings.replace(defaults)
60
+ # do this via the setter for each option, so that any defined on_change
61
+ # handlers can be invoked.
62
+ defaults.each do |setting, default|
63
+ send(:"#{setting}=", default)
64
+ end
60
65
  end
61
66
 
62
67
  # Get the settings or initialize a new empty hash.
@@ -78,8 +83,8 @@ module Mongoid
78
83
  def log_level
79
84
  if level = settings[:log_level]
80
85
  unless level.is_a?(Integer)
81
- level = level.upcase.to_s
82
- level = "Logger::#{level}".constantize
86
+ # JRuby String#constantize does not work here.
87
+ level = Logger.const_get(level.upcase.to_s)
83
88
  end
84
89
  level
85
90
  end
@@ -1,16 +1,26 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Config
5
6
  module Validators
6
7
 
7
- # Validator for async query executor configuration.
8
+ # Validates the async query executor options in the Mongoid
9
+ # configuration. Used during application bootstrapping.
8
10
  #
9
11
  # @api private
10
12
  module AsyncQueryExecutor
11
13
  extend self
12
14
 
13
-
15
+ # Validate the Mongoid configuration options related to
16
+ # the async query executor.
17
+ #
18
+ # @param [ Hash ] options The configuration options.
19
+ #
20
+ # @raises [ Mongoid::Errors::InvalidGlobalExecutorConcurrency ]
21
+ # Raised if the options are invalid.
22
+ #
23
+ # @api private
14
24
  def validate(options)
15
25
  if options.key?(:async_query_executor)
16
26
  if options[:async_query_executor].to_sym == :immediate && !options[:global_executor_concurrency].nil?
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Config
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Config
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require "mongoid/config/validators/async_query_executor"
4
5
  require "mongoid/config/validators/option"