mongoid 8.1.9 → 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 (1035) 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 +63 -45
  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 +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 +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 -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 +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 -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 +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 +4 -6
  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 +72 -48
  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 +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 +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 -60
  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 -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 +101 -277
  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 -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 -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 +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 +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 -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/LICENSE +20 -0
  727. data/spec/shared/bin/get-mongodb-download-url +17 -0
  728. data/spec/shared/bin/s3-copy +45 -0
  729. data/spec/shared/bin/s3-upload +69 -0
  730. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  731. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  732. data/spec/shared/lib/mrss/constraints.rb +378 -0
  733. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  734. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  735. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  736. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  737. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  738. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  739. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  740. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  741. data/spec/shared/lib/mrss/utils.rb +37 -0
  742. data/spec/shared/share/Dockerfile.erb +281 -0
  743. data/spec/shared/share/haproxy-1.conf +16 -0
  744. data/spec/shared/share/haproxy-2.conf +17 -0
  745. data/spec/shared/shlib/config.sh +27 -0
  746. data/spec/shared/shlib/distro.sh +74 -0
  747. data/spec/shared/shlib/server.sh +417 -0
  748. data/spec/shared/shlib/set_env.sh +146 -0
  749. data/spec/spec_helper.rb +26 -28
  750. data/spec/support/authorization.rb +1 -0
  751. data/spec/support/client_registry.rb +1 -0
  752. data/spec/support/constraints.rb +1 -0
  753. data/spec/support/crypt/models.rb +50 -0
  754. data/spec/support/crypt.rb +80 -0
  755. data/spec/support/expectations.rb +1 -0
  756. data/spec/support/feature_sandbox.rb +72 -0
  757. data/spec/support/helpers.rb +1 -0
  758. data/spec/support/immutable_ids.rb +22 -21
  759. data/spec/support/macros.rb +4 -6
  760. data/spec/support/models/account.rb +1 -0
  761. data/spec/support/models/acolyte.rb +1 -0
  762. data/spec/support/models/actor.rb +1 -0
  763. data/spec/support/models/actress.rb +1 -0
  764. data/spec/support/models/address.rb +3 -0
  765. data/spec/support/models/address_component.rb +1 -0
  766. data/spec/support/models/address_number.rb +1 -0
  767. data/spec/support/models/agency.rb +1 -0
  768. data/spec/support/models/agent.rb +1 -0
  769. data/spec/support/models/album.rb +1 -0
  770. data/spec/support/models/alert.rb +1 -0
  771. data/spec/support/models/animal.rb +1 -0
  772. data/spec/support/models/answer.rb +1 -0
  773. data/spec/support/models/appointment.rb +1 -0
  774. data/spec/support/models/armrest.rb +1 -0
  775. data/spec/support/models/array_field.rb +1 -0
  776. data/spec/support/models/article.rb +1 -0
  777. data/spec/support/models/artist.rb +1 -0
  778. data/spec/support/models/artwork.rb +1 -0
  779. data/spec/support/models/audible_sound.rb +1 -0
  780. data/spec/support/models/audio.rb +1 -0
  781. data/spec/support/models/augmentation.rb +1 -0
  782. data/spec/support/models/author.rb +1 -0
  783. data/spec/support/models/baby.rb +1 -0
  784. data/spec/support/models/band.rb +5 -1
  785. data/spec/support/models/bar.rb +1 -0
  786. data/spec/support/models/basic.rb +1 -0
  787. data/spec/support/models/bed.rb +1 -0
  788. data/spec/support/models/big_palette.rb +1 -0
  789. data/spec/support/models/birthday.rb +1 -0
  790. data/spec/support/models/bolt.rb +1 -0
  791. data/spec/support/models/bomb.rb +1 -0
  792. data/spec/support/models/book.rb +1 -0
  793. data/spec/support/models/breed.rb +1 -0
  794. data/spec/support/models/browser.rb +1 -0
  795. data/spec/support/models/building.rb +1 -0
  796. data/spec/support/models/building_address.rb +1 -0
  797. data/spec/support/models/bus.rb +1 -0
  798. data/spec/support/models/business.rb +1 -0
  799. data/spec/support/models/callback_test.rb +1 -0
  800. data/spec/support/models/canvas.rb +1 -0
  801. data/spec/support/models/car.rb +1 -0
  802. data/spec/support/models/cat.rb +1 -0
  803. data/spec/support/models/catalog.rb +1 -0
  804. data/spec/support/models/category.rb +1 -0
  805. data/spec/support/models/child.rb +1 -0
  806. data/spec/support/models/child_doc.rb +1 -0
  807. data/spec/support/models/church.rb +1 -0
  808. data/spec/support/models/circle.rb +1 -0
  809. data/spec/support/models/circuit.rb +1 -0
  810. data/spec/support/models/circus.rb +1 -0
  811. data/spec/support/models/code.rb +1 -0
  812. data/spec/support/models/coding/pull_request.rb +1 -0
  813. data/spec/support/models/coding.rb +1 -0
  814. data/spec/support/models/comment.rb +1 -0
  815. data/spec/support/models/company.rb +1 -0
  816. data/spec/support/models/consumption_period.rb +1 -0
  817. data/spec/support/models/contextable_item.rb +1 -0
  818. data/spec/support/models/contractor.rb +1 -0
  819. data/spec/support/models/cookie.rb +1 -0
  820. data/spec/support/models/country_code.rb +1 -0
  821. data/spec/support/models/courier_job.rb +1 -0
  822. data/spec/support/models/cover.rb +1 -0
  823. data/spec/support/models/crate.rb +1 -0
  824. data/spec/support/models/customer.rb +1 -0
  825. data/spec/support/models/customer_address.rb +1 -0
  826. data/spec/support/models/deed.rb +1 -0
  827. data/spec/support/models/definition.rb +1 -0
  828. data/spec/support/models/delegating_patient.rb +1 -0
  829. data/spec/support/models/description.rb +1 -0
  830. data/spec/support/models/dictionary.rb +1 -0
  831. data/spec/support/models/division.rb +1 -0
  832. data/spec/support/models/doctor.rb +1 -0
  833. data/spec/support/models/dog.rb +1 -0
  834. data/spec/support/models/dokument.rb +1 -0
  835. data/spec/support/models/draft.rb +1 -0
  836. data/spec/support/models/dragon.rb +1 -0
  837. data/spec/support/models/driver.rb +1 -0
  838. data/spec/support/models/drug.rb +1 -0
  839. data/spec/support/models/dungeon.rb +1 -0
  840. data/spec/support/models/edit.rb +1 -0
  841. data/spec/support/models/email.rb +1 -0
  842. data/spec/support/models/employer.rb +1 -0
  843. data/spec/support/models/entry.rb +1 -0
  844. data/spec/support/models/eraser.rb +1 -0
  845. data/spec/support/models/even.rb +1 -0
  846. data/spec/support/models/event.rb +1 -0
  847. data/spec/support/models/exhibition.rb +1 -0
  848. data/spec/support/models/exhibitor.rb +1 -0
  849. data/spec/support/models/explosion.rb +1 -0
  850. data/spec/support/models/eye.rb +1 -0
  851. data/spec/support/models/eye_bowl.rb +1 -0
  852. data/spec/support/models/face.rb +1 -0
  853. data/spec/support/models/fanatic.rb +1 -0
  854. data/spec/support/models/favorite.rb +8 -1
  855. data/spec/support/models/filesystem.rb +1 -0
  856. data/spec/support/models/fire_hydrant.rb +1 -0
  857. data/spec/support/models/firefox.rb +1 -0
  858. data/spec/support/models/fish.rb +1 -0
  859. data/spec/support/models/folder.rb +1 -0
  860. data/spec/support/models/folder_item.rb +1 -0
  861. data/spec/support/models/fruits.rb +1 -0
  862. data/spec/support/models/game.rb +1 -0
  863. data/spec/support/models/ghost.rb +1 -0
  864. data/spec/support/models/guitar.rb +1 -0
  865. data/spec/support/models/hole.rb +1 -0
  866. data/spec/support/models/home.rb +1 -0
  867. data/spec/support/models/house.rb +1 -0
  868. data/spec/support/models/html_writer.rb +1 -0
  869. data/spec/support/models/id_key.rb +1 -0
  870. data/spec/support/models/idnodef.rb +1 -0
  871. data/spec/support/models/image.rb +1 -0
  872. data/spec/support/models/implant.rb +1 -0
  873. data/spec/support/models/instrument.rb +1 -0
  874. data/spec/support/models/item.rb +1 -0
  875. data/spec/support/models/jar.rb +1 -0
  876. data/spec/support/models/kaleidoscope.rb +1 -0
  877. data/spec/support/models/kangaroo.rb +1 -0
  878. data/spec/support/models/label.rb +1 -0
  879. data/spec/support/models/language.rb +1 -0
  880. data/spec/support/models/lat_lng.rb +1 -6
  881. data/spec/support/models/league.rb +1 -0
  882. data/spec/support/models/learner.rb +1 -0
  883. data/spec/support/models/line_item.rb +1 -0
  884. data/spec/support/models/location.rb +1 -0
  885. data/spec/support/models/login.rb +1 -0
  886. data/spec/support/models/manufacturer.rb +1 -0
  887. data/spec/support/models/meat.rb +1 -0
  888. data/spec/support/models/membership.rb +1 -0
  889. data/spec/support/models/message.rb +1 -0
  890. data/spec/support/models/minim.rb +1 -0
  891. data/spec/support/models/mixed_drink.rb +1 -0
  892. data/spec/support/models/mop.rb +1 -0
  893. data/spec/support/models/movie.rb +1 -0
  894. data/spec/support/models/my_hash.rb +1 -0
  895. data/spec/support/models/name.rb +1 -0
  896. data/spec/support/models/name_only.rb +1 -0
  897. data/spec/support/models/node.rb +1 -0
  898. data/spec/support/models/note.rb +1 -0
  899. data/spec/support/models/nut.rb +1 -0
  900. data/spec/support/models/odd.rb +1 -0
  901. data/spec/support/models/order.rb +1 -0
  902. data/spec/support/models/ordered_post.rb +1 -0
  903. data/spec/support/models/ordered_preference.rb +1 -0
  904. data/spec/support/models/oscar.rb +1 -0
  905. data/spec/support/models/other_owner_object.rb +1 -0
  906. data/spec/support/models/override.rb +1 -0
  907. data/spec/support/models/ownable.rb +1 -0
  908. data/spec/support/models/owner.rb +1 -0
  909. data/spec/support/models/pack.rb +1 -0
  910. data/spec/support/models/page.rb +1 -0
  911. data/spec/support/models/page_question.rb +1 -0
  912. data/spec/support/models/palette.rb +1 -0
  913. data/spec/support/models/parent.rb +1 -0
  914. data/spec/support/models/parent_doc.rb +1 -0
  915. data/spec/support/models/passport.rb +1 -0
  916. data/spec/support/models/patient.rb +1 -0
  917. data/spec/support/models/pdf_writer.rb +1 -0
  918. data/spec/support/models/pencil.rb +1 -0
  919. data/spec/support/models/person.rb +1 -0
  920. data/spec/support/models/pet.rb +1 -0
  921. data/spec/support/models/pet_owner.rb +1 -0
  922. data/spec/support/models/phone.rb +1 -0
  923. data/spec/support/models/piano.rb +1 -0
  924. data/spec/support/models/pizza.rb +1 -0
  925. data/spec/support/models/player.rb +1 -0
  926. data/spec/support/models/post.rb +1 -0
  927. data/spec/support/models/post_genre.rb +1 -0
  928. data/spec/support/models/powerup.rb +1 -0
  929. data/spec/support/models/preference.rb +1 -0
  930. data/spec/support/models/princess.rb +1 -0
  931. data/spec/support/models/product.rb +1 -0
  932. data/spec/support/models/profile.rb +1 -0
  933. data/spec/support/models/pronunciation.rb +1 -0
  934. data/spec/support/models/pub.rb +1 -0
  935. data/spec/support/models/publication/encyclopedia.rb +1 -0
  936. data/spec/support/models/publication/review.rb +1 -0
  937. data/spec/support/models/publication.rb +1 -0
  938. data/spec/support/models/purchase.rb +1 -0
  939. data/spec/support/models/purchased_item.rb +1 -0
  940. data/spec/support/models/question.rb +1 -0
  941. data/spec/support/models/quiz.rb +1 -0
  942. data/spec/support/models/rating.rb +1 -0
  943. data/spec/support/models/record.rb +1 -0
  944. data/spec/support/models/registry.rb +1 -0
  945. data/spec/support/models/role.rb +1 -0
  946. data/spec/support/models/root_category.rb +1 -0
  947. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  948. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  949. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  950. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  951. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  952. data/spec/support/models/sandwich.rb +1 -0
  953. data/spec/support/models/scheduler.rb +1 -0
  954. data/spec/support/models/school.rb +1 -0
  955. data/spec/support/models/scribe.rb +1 -0
  956. data/spec/support/models/sealer.rb +1 -0
  957. data/spec/support/models/seat.rb +1 -0
  958. data/spec/support/models/seo.rb +1 -0
  959. data/spec/support/models/series.rb +1 -0
  960. data/spec/support/models/server.rb +1 -0
  961. data/spec/support/models/service.rb +1 -0
  962. data/spec/support/models/shape.rb +1 -0
  963. data/spec/support/models/shelf.rb +1 -0
  964. data/spec/support/models/shield.rb +1 -0
  965. data/spec/support/models/shipment_address.rb +1 -0
  966. data/spec/support/models/shipping_container.rb +1 -0
  967. data/spec/support/models/shipping_pack.rb +1 -0
  968. data/spec/support/models/shirt.rb +1 -0
  969. data/spec/support/models/shop.rb +1 -0
  970. data/spec/support/models/short_agent.rb +1 -0
  971. data/spec/support/models/short_quiz.rb +1 -0
  972. data/spec/support/models/simple.rb +1 -0
  973. data/spec/support/models/slave.rb +1 -0
  974. data/spec/support/models/song.rb +1 -0
  975. data/spec/support/models/sound.rb +1 -0
  976. data/spec/support/models/spacer.rb +1 -0
  977. data/spec/support/models/square.rb +1 -0
  978. data/spec/support/models/staff.rb +1 -0
  979. data/spec/support/models/store_as_dup_test1.rb +1 -0
  980. data/spec/support/models/store_as_dup_test2.rb +1 -0
  981. data/spec/support/models/store_as_dup_test3.rb +1 -0
  982. data/spec/support/models/store_as_dup_test4.rb +1 -0
  983. data/spec/support/models/strategy.rb +1 -0
  984. data/spec/support/models/student.rb +1 -0
  985. data/spec/support/models/sub_item.rb +1 -0
  986. data/spec/support/models/subscription.rb +1 -0
  987. data/spec/support/models/survey.rb +1 -0
  988. data/spec/support/models/symptom.rb +1 -0
  989. data/spec/support/models/system_role.rb +1 -0
  990. data/spec/support/models/tag.rb +1 -0
  991. data/spec/support/models/target.rb +1 -0
  992. data/spec/support/models/template.rb +1 -0
  993. data/spec/support/models/thing.rb +1 -0
  994. data/spec/support/models/threadlocker.rb +1 -0
  995. data/spec/support/models/title.rb +1 -0
  996. data/spec/support/models/tool.rb +1 -0
  997. data/spec/support/models/topping.rb +1 -0
  998. data/spec/support/models/toy.rb +1 -0
  999. data/spec/support/models/track.rb +1 -0
  1000. data/spec/support/models/translation.rb +1 -0
  1001. data/spec/support/models/tree.rb +1 -0
  1002. data/spec/support/models/truck.rb +1 -0
  1003. data/spec/support/models/updatable.rb +1 -0
  1004. data/spec/support/models/user.rb +1 -0
  1005. data/spec/support/models/user_account.rb +1 -0
  1006. data/spec/support/models/validation_callback.rb +1 -0
  1007. data/spec/support/models/vehicle.rb +1 -0
  1008. data/spec/support/models/version.rb +1 -0
  1009. data/spec/support/models/vertex.rb +1 -0
  1010. data/spec/support/models/vet_visit.rb +1 -0
  1011. data/spec/support/models/video.rb +1 -0
  1012. data/spec/support/models/video_game.rb +1 -0
  1013. data/spec/support/models/washer.rb +1 -0
  1014. data/spec/support/models/weapon.rb +1 -0
  1015. data/spec/support/models/wiki_page.rb +1 -0
  1016. data/spec/support/models/word.rb +1 -0
  1017. data/spec/support/models/word_origin.rb +1 -0
  1018. data/spec/support/models/writer.rb +1 -0
  1019. data/spec/support/rails_mock.rb +32 -0
  1020. data/spec/support/shared/time.rb +3 -21
  1021. data/spec/support/sinatra_mock.rb +7 -0
  1022. data/spec/support/spec_config.rb +30 -9
  1023. data.tar.gz.sig +0 -0
  1024. metadata +171 -37
  1025. metadata.gz.sig +1 -0
  1026. data/lib/mongoid/association/referenced/eager.rb +0 -163
  1027. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -113
  1028. data/lib/mongoid/contextual/geo_near.rb +0 -236
  1029. data/lib/mongoid/errors/invalid_session_use.rb +0 -21
  1030. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -27
  1031. data/lib/mongoid/query_cache.rb +0 -68
  1032. data/spec/mongoid/contextual/geo_near_spec.rb +0 -471
  1033. data/spec/mongoid/extensions_spec.rb +0 -43
  1034. data/spec/mongoid/query_cache_middleware_spec.rb +0 -50
  1035. data/spec/mongoid/query_cache_spec.rb +0 -865
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ autoload :ChildProcess, 'childprocess'
5
+ autoload :Tempfile, 'tempfile'
6
+
7
+ module Mrss
8
+ module ChildProcessHelper
9
+ class SpawnError < StandardError; end
10
+
11
+ module_function def call(cmd, env: nil, cwd: nil)
12
+ process = ChildProcess.new(*cmd)
13
+ process.io.inherit!
14
+ if cwd
15
+ process.cwd = cwd
16
+ end
17
+ if env
18
+ env.each do |k, v|
19
+ process.environment[k.to_s] = v
20
+ end
21
+ end
22
+ process.start
23
+ process.wait
24
+ process
25
+ end
26
+
27
+ module_function def check_call(cmd, env: nil, cwd: nil)
28
+ process = call(cmd, env: env, cwd: cwd)
29
+ unless process.exit_code == 0
30
+ raise SpawnError, "Failed to execute: #{cmd}"
31
+ end
32
+ end
33
+
34
+ module_function def get_output(cmd, env: nil, cwd: nil)
35
+ process = ChildProcess.new(*cmd)
36
+ process.io.inherit!
37
+ if cwd
38
+ process.cwd = cwd
39
+ end
40
+ if env
41
+ env.each do |k, v|
42
+ process.environment[k.to_s] = v
43
+ end
44
+ end
45
+
46
+ output = ''
47
+ r, w = IO.pipe
48
+
49
+ begin
50
+ process.io.stdout = w
51
+ process.start
52
+ w.close
53
+
54
+ thread = Thread.new do
55
+ begin
56
+ loop do
57
+ output << r.readpartial(16384)
58
+ end
59
+ rescue EOFError
60
+ end
61
+ end
62
+
63
+ process.wait
64
+ thread.join
65
+ ensure
66
+ r.close
67
+ end
68
+
69
+ [process, output]
70
+ end
71
+
72
+ module_function def check_output(*args)
73
+ process, output = get_output(*args)
74
+ unless process.exit_code == 0
75
+ raise SpawnError,"Failed to execute: #{args}"
76
+ end
77
+ output
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,231 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # ClusterConfig requires ClientRegistry class provided by the host project.
5
+
6
+ require 'singleton'
7
+
8
+ module Mrss
9
+ class ClusterConfig
10
+ include Singleton
11
+ include RSpec::Core::Pending
12
+
13
+ def single_server?
14
+ determine_cluster_config
15
+ @single_server
16
+ end
17
+
18
+ def sharded_ish?
19
+ determine_cluster_config
20
+ @topology == :sharded || @topology == :load_balanced
21
+ end
22
+
23
+ def replica_set_name
24
+ determine_cluster_config
25
+ @replica_set_name
26
+ end
27
+
28
+ def server_version
29
+ determine_cluster_config
30
+ @server_version
31
+ end
32
+
33
+ def enterprise?
34
+ determine_cluster_config
35
+ @enterprise
36
+ end
37
+
38
+ def short_server_version
39
+ server_version.split('.')[0..1].join('.')
40
+ end
41
+
42
+ def fcv
43
+ determine_cluster_config
44
+ @fcv
45
+ end
46
+
47
+ # Per https://jira.mongodb.org/browse/SERVER-39052, working with FCV
48
+ # in sharded topologies is annoying. Also, FCV doesn't exist in servers
49
+ # less than 3.4. This method returns FCV on 3.4+ servers when in single
50
+ # or RS topologies, and otherwise returns the major.minor server version.
51
+ def fcv_ish
52
+ if server_version.nil?
53
+ raise "Deployment server version not known - check that connection to deployment succeeded"
54
+ end
55
+
56
+ if server_version >= '3.4' && !sharded_ish?
57
+ fcv
58
+ else
59
+ if short_server_version == '4.1'
60
+ '4.2'
61
+ else
62
+ short_server_version
63
+ end
64
+ end
65
+ end
66
+
67
+ # @return [ Mongo::Address ] The address of the primary in the deployment.
68
+ def primary_address
69
+ determine_cluster_config
70
+ @primary_address
71
+ end
72
+
73
+ def primary_address_str
74
+ determine_cluster_config
75
+ @primary_address.seed
76
+ end
77
+
78
+ def primary_address_host
79
+ both = primary_address_str
80
+ both.split(':').first
81
+ end
82
+
83
+ def primary_address_port
84
+ both = primary_address_str
85
+ both.split(':')[1] || 27017
86
+ end
87
+
88
+ def primary_description
89
+ determine_cluster_config
90
+ @primary_description
91
+ end
92
+
93
+ def server_parameters
94
+ determine_cluster_config
95
+ @server_parameters
96
+ end
97
+
98
+ # Try running a command on the admin database to see if the mongod was
99
+ # started with auth.
100
+ def auth_enabled?
101
+ if @auth_enabled.nil?
102
+ @auth_enabled = begin
103
+ basic_client.use(:admin).command(getCmdLineOpts: 1).first["argv"].include?("--auth")
104
+ rescue => e
105
+ e.message =~ /(not authorized)|(unauthorized)|(no users authenticated)|(requires authentication)/
106
+ end
107
+ end
108
+ @auth_enabled
109
+ end
110
+
111
+ def topology
112
+ determine_cluster_config
113
+ @topology
114
+ end
115
+
116
+ def storage_engine
117
+ @storage_engine ||= begin
118
+ # 2.6 does not have wired tiger
119
+ if short_server_version == '2.6'
120
+ :mmapv1
121
+ else
122
+ client = ClientRegistry.instance.global_client('root_authorized')
123
+ if sharded_ish?
124
+ shards = client.use(:admin).command(listShards: 1).first
125
+ if shards['shards'].empty?
126
+ raise 'Shards are empty'
127
+ end
128
+ shard = shards['shards'].first
129
+ address_str = shard['host'].sub(/^.*\//, '').sub(/,.*/, '')
130
+ client = ClusterTools.instance.direct_client(address_str,
131
+ SpecConfig.instance.test_options.merge(SpecConfig.instance.auth_options).merge(connect: :direct))
132
+ end
133
+ rv = client.use(:admin).command(serverStatus: 1).first
134
+ rv = rv['storageEngine']['name']
135
+ rv_map = {
136
+ 'wiredTiger' => :wired_tiger,
137
+ 'mmapv1' => :mmapv1,
138
+ }
139
+ rv_map[rv] || rv
140
+ end
141
+ end
142
+ end
143
+
144
+ # This method returns an alternate address for connecting to the configured
145
+ # deployment. For example, if the replica set is configured with nodes at
146
+ # of localhost:27017 and so on, this method will return 127.0.0.:27017.
147
+ #
148
+ # Note that the "alternate" refers to replica set configuration, not the
149
+ # addresses specified in test suite configuration. If the deployment topology
150
+ # is not a replica set, "alternate" refers to test suite configuration as
151
+ # this is the only configuration available.
152
+ def alternate_address
153
+ @alternate_address ||= begin
154
+ address = primary_address_host
155
+ str = case address
156
+ when '127.0.0.1'
157
+ 'localhost'
158
+ when /^(\d+\.){3}\d+$/
159
+ skip 'This test requires a hostname or 127.0.0.1 as address'
160
+ else
161
+ # We don't know if mongod is listening on ipv4 or ipv6, in principle.
162
+ # Our tests use ipv4, so hardcode that for now.
163
+ # To support both we need to try both addresses which will make this
164
+ # test more complicated.
165
+ #
166
+ # JRuby chokes on primary_address_port as the port (e.g. 27017).
167
+ # Since the port does not actually matter, use a common port like 80.
168
+ resolved_address = Addrinfo.getaddrinfo(address, 80, Socket::PF_INET).first.ip_address
169
+ if resolved_address.include?(':')
170
+ "[#{resolved_address}]"
171
+ else
172
+ resolved_address
173
+ end
174
+ end + ":#{primary_address_port}"
175
+ Mongo::Address.new(str)
176
+ end
177
+ end
178
+
179
+ private
180
+
181
+ def determine_cluster_config
182
+ return if @primary_address
183
+
184
+ # Run all commands to figure out the cluster configuration from the same
185
+ # client. This is somewhat wasteful when running a single test, but reduces
186
+ # test runtime for the suite overall because all commands are sent on the
187
+ # same connection rather than each command connecting to the cluster by
188
+ # itself.
189
+ client = ClientRegistry.instance.global_client('root_authorized')
190
+
191
+ primary = client.cluster.next_primary
192
+ @primary_address = primary.address
193
+ @primary_description = primary.description
194
+ @replica_set_name = client.cluster.topology.replica_set_name
195
+
196
+ @topology ||= begin
197
+ topology = client.cluster.topology.class.name.sub(/.*::/, '')
198
+ topology = topology.gsub(/([A-Z])/) { |match| '_' + match.downcase }.sub(/^_/, '')
199
+ if topology =~ /^replica_set/
200
+ topology = 'replica_set'
201
+ end
202
+ topology.to_sym
203
+ end
204
+
205
+ @single_server = client.cluster.servers_list.length == 1
206
+
207
+ build_info = client.database.command(buildInfo: 1).first
208
+
209
+ @server_version = build_info['version']
210
+ @enterprise = build_info['modules'] && build_info['modules'].include?('enterprise')
211
+
212
+ @server_parameters = begin
213
+ client.use(:admin).command(getParameter: '*').first
214
+ rescue => e
215
+ STDERR.puts("WARNING: Failed to obtain server parameters: #{e.class}: #{e.message}")
216
+ {}
217
+ end
218
+
219
+ if !sharded_ish? && short_server_version >= '3.4'
220
+ rv = @server_parameters['featureCompatibilityVersion']
221
+ @fcv = rv['version'] || rv
222
+ end
223
+ end
224
+
225
+ def basic_client
226
+ # Do not cache the result here so that if the client gets closed,
227
+ # client registry reconnects it in subsequent tests
228
+ ClientRegistry.instance.global_client('basic')
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,378 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mrss
5
+ module Constraints
6
+ def min_server_version(version)
7
+ parsed_version = Gem::Version.new(version)
8
+
9
+ before(:all) do
10
+ if parsed_version > Gem::Version.new(ClusterConfig.instance.server_version)
11
+ skip "Server version #{version} or higher required, we have #{ClusterConfig.instance.server_version}"
12
+ end
13
+ end
14
+ end
15
+
16
+ def max_server_version(version)
17
+ parsed_version = Gem::Version.new(version)
18
+
19
+ before(:all) do
20
+ if parsed_version < Gem::Version.new(ClusterConfig.instance.server_version)
21
+ skip "Server version #{version} or lower required, we have #{ClusterConfig.instance.server_version}"
22
+ end
23
+ end
24
+ end
25
+
26
+ def min_server_fcv(version)
27
+ parsed_version = Gem::Version.new(version)
28
+
29
+ before(:all) do
30
+ unless Gem::Version.new(ClusterConfig.instance.fcv_ish) >= parsed_version
31
+ skip "FCV #{version} or higher required, we have #{ClusterConfig.instance.fcv_ish} (server #{ClusterConfig.instance.server_version})"
32
+ end
33
+ end
34
+ end
35
+
36
+ def max_server_fcv(version)
37
+ parsed_version = Gem::Version.new(version)
38
+
39
+ before(:all) do
40
+ if parsed_version < Gem::Version.new(ClusterConfig.instance.fcv_ish)
41
+ skip "FCV #{version} or lower required, we have #{ClusterConfig.instance.fcv_ish} (server #{ClusterConfig.instance.server_version})"
42
+ end
43
+ end
44
+ end
45
+
46
+ def require_topology(*topologies)
47
+ invalid_topologies = topologies - [:single, :replica_set, :sharded, :load_balanced]
48
+
49
+ unless invalid_topologies.empty?
50
+ raise ArgumentError, "Invalid topologies requested: #{invalid_topologies.join(', ')}"
51
+ end
52
+
53
+ before(:all) do
54
+ unless topologies.include?(topology = ClusterConfig.instance.topology)
55
+ skip "Topology #{topologies.join(' or ')} required, we have #{topology}"
56
+ end
57
+ end
58
+ end
59
+
60
+ def max_example_run_time(timeout)
61
+ around do |example|
62
+ TimeoutInterrupt.timeout(timeout, TimeoutInterrupt::Error.new("Test execution terminated after #{timeout} seconds")) do
63
+ example.run
64
+ end
65
+ end
66
+ end
67
+
68
+ def require_transaction_support
69
+ before(:all) do
70
+ case ClusterConfig.instance.topology
71
+ when :single
72
+ skip 'Transactions tests require a replica set (4.0+) or a sharded cluster (4.2+)'
73
+ when :replica_set
74
+ unless ClusterConfig.instance.server_version >= '4.0'
75
+ skip 'Transactions tests in a replica set topology require server 4.0+'
76
+ end
77
+ when :sharded, :load_balanced
78
+ unless ClusterConfig.instance.server_version >= '4.2'
79
+ skip 'Transactions tests in a sharded cluster topology require server 4.2+'
80
+ end
81
+ else
82
+ raise NotImplementedError
83
+ end
84
+ end
85
+ end
86
+
87
+ # Fail command fail point was added to mongod in 4.0 and to mongos in 4.2.
88
+ def require_fail_command
89
+ require_transaction_support
90
+ end
91
+
92
+ def require_tls
93
+ before(:all) do
94
+ unless SpecConfig.instance.ssl?
95
+ skip "SSL not enabled"
96
+ end
97
+ end
98
+ end
99
+
100
+ def require_no_tls
101
+ before(:all) do
102
+ if SpecConfig.instance.ssl?
103
+ skip "SSL enabled"
104
+ end
105
+ end
106
+ end
107
+
108
+ def require_retry_writes
109
+ before(:all) do
110
+ unless SpecConfig.instance.retry_writes?
111
+ skip "Retry writes is disabled"
112
+ end
113
+ end
114
+ end
115
+
116
+ def require_no_retry_writes
117
+ before(:all) do
118
+ if SpecConfig.instance.retry_writes?
119
+ skip "Retry writes is enabled"
120
+ end
121
+ end
122
+ end
123
+
124
+ def require_compression
125
+ before(:all) do
126
+ if SpecConfig.instance.compressors.nil?
127
+ skip "Compression is not enabled"
128
+ end
129
+ end
130
+ end
131
+
132
+ def require_zlib_compression
133
+ before(:all) do
134
+ compressors = SpecConfig.instance.compressors
135
+ unless compressors && compressors.include?('zlib')
136
+ skip "Zlib compression is not enabled"
137
+ end
138
+ end
139
+ end
140
+
141
+ def require_snappy_compression
142
+ before(:all) do
143
+ compressors = SpecConfig.instance.compressors
144
+ unless compressors && compressors.include?('snappy')
145
+ skip "Snappy compression is not enabled"
146
+ end
147
+ end
148
+ end
149
+
150
+ def require_no_snappy_compression
151
+ before(:all) do
152
+ compressors = SpecConfig.instance.compressors
153
+ if compressors && compressors.include?('snappy')
154
+ skip "Snappy compression is enabled"
155
+ end
156
+ end
157
+ end
158
+
159
+ def require_zstd_compression
160
+ before(:all) do
161
+ compressors = SpecConfig.instance.compressors
162
+ unless compressors && compressors.include?('zstd')
163
+ skip "Zstd compression is not enabled"
164
+ end
165
+ end
166
+ end
167
+
168
+ def require_no_zstd_compression
169
+ before(:all) do
170
+ compressors = SpecConfig.instance.compressors
171
+ if compressors && compressors.include?('zstd')
172
+ skip "Zstd compression is enabled"
173
+ end
174
+ end
175
+ end
176
+
177
+ def require_no_compression
178
+ before(:all) do
179
+ if SpecConfig.instance.compressors
180
+ skip "Compression is enabled"
181
+ end
182
+ end
183
+ end
184
+
185
+ def ruby_version_gte(version)
186
+ before(:all) do
187
+ if RUBY_VERSION < version
188
+ skip "Ruby version #{version} or higher required"
189
+ end
190
+ end
191
+ end
192
+
193
+ def ruby_version_lt(version)
194
+ before(:all) do
195
+ if RUBY_VERSION >= version
196
+ skip "Ruby version less than #{version} required"
197
+ end
198
+ end
199
+ end
200
+
201
+ def require_auth(*values)
202
+ before(:all) do
203
+ if values.any?
204
+ unless values.include?(ENV['AUTH'])
205
+ msg = values.map { |v| "AUTH=#{v}" }.join(' or ')
206
+ skip "This test requires #{msg}"
207
+ end
208
+ else
209
+ unless ENV['AUTH'] == 'auth' || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
210
+ skip "Auth required"
211
+ end
212
+ end
213
+ end
214
+ end
215
+
216
+ def require_no_auth
217
+ before(:all) do
218
+ auth = ENV.fetch('AUTH', '')
219
+ if (!auth.empty? && auth != 'noauth') || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
220
+ skip "Auth not allowed"
221
+ end
222
+ end
223
+ end
224
+
225
+ def require_x509_auth
226
+ before(:all) do
227
+ unless SpecConfig.instance.x509_auth?
228
+ skip "X.509 auth required"
229
+ end
230
+ end
231
+ end
232
+
233
+ def require_no_external_user
234
+ before(:all) do
235
+ if SpecConfig.instance.external_user?
236
+ skip "External user configurations are not compatible with this test"
237
+ end
238
+ end
239
+ end
240
+
241
+ # Can the driver specify a write concern that won't be overridden?
242
+ # (mongos 4.0+ overrides the write concern)
243
+ def require_set_write_concern
244
+ before(:all) do
245
+ if %i(sharded load_balanced).include?(ClusterConfig.instance.topology) &&
246
+ ClusterConfig.instance.short_server_version >= '4.0'
247
+ then
248
+ skip "mongos 4.0+ overrides write concern"
249
+ end
250
+ end
251
+ end
252
+
253
+ def require_multi_mongos
254
+ before(:all) do
255
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length == 1
256
+ skip 'Test requires a minimum of two mongoses if run in sharded topology'
257
+ end
258
+
259
+ if ClusterConfig.instance.topology == :load_balanced && SpecConfig.instance.single_mongos?
260
+ skip 'Test requires a minimum of two mongoses if run in load-balanced topology'
261
+ end
262
+ end
263
+ end
264
+
265
+ # In sharded topology operations are distributed to the mongoses.
266
+ # When we set fail points, the fail point may be set on one mongos and
267
+ # operation may be executed on another mongos, causing failures.
268
+ # Tests that are not setting targeted fail points should utilize this
269
+ # method to restrict themselves to single mongos.
270
+ #
271
+ # In load-balanced topology, the same problem can happen when there is
272
+ # more than one mongos behind the load balancer.
273
+ def require_no_multi_mongos
274
+ before(:all) do
275
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length > 1
276
+ skip 'Test requires a single mongos if run in sharded topology'
277
+ end
278
+ if ClusterConfig.instance.topology == :load_balanced && !SpecConfig.instance.single_mongos?
279
+ skip 'Test requires a single mongos, as indicated by SINGLE_MONGOS=1 environment variable, if run in load-balanced topology'
280
+ end
281
+ end
282
+ end
283
+
284
+ alias :require_no_multi_shard :require_no_multi_mongos
285
+
286
+ def require_wired_tiger
287
+ before(:all) do
288
+ # Storage detection fails for serverless instances. However, it is safe to
289
+ # assume that a serverless instance uses WiredTiger Storage Engine.
290
+ if !SpecConfig.instance.serverless? && ClusterConfig.instance.storage_engine != :wired_tiger
291
+ skip 'Test requires WiredTiger storage engine'
292
+ end
293
+ end
294
+ end
295
+
296
+ def require_wired_tiger_on_36
297
+ before(:all) do
298
+ if ClusterConfig.instance.short_server_version >= '3.6'
299
+ # Storage detection fails for serverless instances. However, it is safe to
300
+ # assume that a serverless instance uses WiredTiger Storage Engine.
301
+ if !SpecConfig.instance.serverless? && ClusterConfig.instance.storage_engine != :wired_tiger
302
+ skip 'Test requires WiredTiger storage engine on 3.6+ servers'
303
+ end
304
+ end
305
+ end
306
+ end
307
+
308
+ def require_mmapv1
309
+ before(:all) do
310
+ if SpecConfig.instance.serverless? || ClusterConfig.instance.storage_engine != :mmapv1
311
+ skip 'Test requires MMAPv1 storage engine'
312
+ end
313
+ end
314
+ end
315
+
316
+ def require_enterprise
317
+ before(:all) do
318
+ unless ClusterConfig.instance.enterprise?
319
+ skip 'Test requires enterprise build of MongoDB'
320
+ end
321
+ end
322
+ end
323
+
324
+ # Integration tests for SRV polling require internet connectivity to
325
+ # look up SRV records and a sharded cluster configured on default port on
326
+ # localhost (localhost:27017, localhost:27018).
327
+ def require_default_port_deployment
328
+ # Because the DNS records at test1.test.build.10gen.cc point to
329
+ # localhost:27017 & localhost:27018, the test suite must have been
330
+ # configured to use these addresses
331
+ before(:all) do
332
+ have_default_port = SpecConfig.instance.addresses.any? do |address|
333
+ %w(127.0.0.1 127.0.0.1:27017 localhost localhost:27017).include?(address)
334
+ end
335
+ unless have_default_port
336
+ skip 'This test requires the test suite to be configured for localhost:27017'
337
+ end
338
+ end
339
+ end
340
+
341
+ # Some tests perform assertions on what the driver is logging.
342
+ # Some test configurations, for example OCSP with unknown response,
343
+ # produce warnings due to optional checks failing.
344
+ # This constraint skips tests that issue logging assertions on configurations
345
+ # that may produce non-test-originated log entries.
346
+ def require_warning_clean
347
+ before(:all) do
348
+ if ENV['OCSP_STATUS'] == 'unknown'
349
+ skip 'Unknown OCSP status is not global warning-clean'
350
+ end
351
+ end
352
+ end
353
+
354
+ def require_required_api_version
355
+ before(:all) do
356
+ unless ENV['API_VERSION_REQUIRED'] == '1'
357
+ skip 'Set API_VERSION_REQUIRED=1 to run this test'
358
+ end
359
+ end
360
+ end
361
+
362
+ def require_no_required_api_version
363
+ before(:all) do
364
+ if ENV['API_VERSION_REQUIRED'] == '1'
365
+ skip 'Cannot have API_VERSION_REQUIRED=1 to run this test'
366
+ end
367
+ end
368
+ end
369
+
370
+ def require_unix_socket
371
+ before(:all) do
372
+ if ENV['TOPOLOGY'] == 'load-balanced'
373
+ skip 'Load balancer does not listen on Unix sockets'
374
+ end
375
+ end
376
+ end
377
+ end
378
+ end