mongoid 7.0.12 → 7.3.3

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 (1039) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +13 -13
  4. data/README.md +32 -19
  5. data/Rakefile +49 -0
  6. data/lib/config/locales/en.yml +113 -55
  7. data/lib/mongoid/association/accessors.rb +143 -53
  8. data/lib/mongoid/association/bindable.rb +7 -5
  9. data/lib/mongoid/association/builders.rb +4 -3
  10. data/lib/mongoid/association/constrainable.rb +5 -3
  11. data/lib/mongoid/association/depending.rb +10 -12
  12. data/lib/mongoid/association/eager_loadable.rb +2 -0
  13. data/lib/mongoid/association/embedded/batchable.rb +5 -3
  14. data/lib/mongoid/association/embedded/cyclic.rb +8 -6
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +4 -1
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +8 -2
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +15 -12
  18. data/lib/mongoid/association/embedded/embedded_in.rb +7 -4
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -2
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +9 -3
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +60 -50
  22. data/lib/mongoid/association/embedded/embeds_many.rb +7 -4
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +5 -2
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +10 -4
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +17 -14
  26. data/lib/mongoid/association/embedded/embeds_one.rb +7 -4
  27. data/lib/mongoid/association/embedded.rb +3 -0
  28. data/lib/mongoid/association/macros.rb +38 -36
  29. data/lib/mongoid/association/many.rb +16 -13
  30. data/lib/mongoid/association/marshalable.rb +3 -1
  31. data/lib/mongoid/association/nested/many.rb +18 -16
  32. data/lib/mongoid/association/nested/nested_buildable.rb +6 -3
  33. data/lib/mongoid/association/nested/one.rb +15 -11
  34. data/lib/mongoid/association/nested.rb +4 -1
  35. data/lib/mongoid/association/one.rb +3 -1
  36. data/lib/mongoid/association/options.rb +9 -6
  37. data/lib/mongoid/association/proxy.rb +37 -15
  38. data/lib/mongoid/association/referenced/auto_save.rb +6 -3
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +4 -2
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +7 -4
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -2
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +16 -14
  43. data/lib/mongoid/association/referenced/belongs_to.rb +6 -3
  44. data/lib/mongoid/association/referenced/counter_cache.rb +2 -0
  45. data/lib/mongoid/association/referenced/eager.rb +37 -15
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -6
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -2
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +26 -19
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +13 -6
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -1
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -2
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -0
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +493 -457
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +57 -47
  56. data/lib/mongoid/association/referenced/has_many.rb +7 -4
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -2
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +17 -2
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -0
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +13 -11
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +23 -16
  62. data/lib/mongoid/association/referenced/has_one.rb +5 -2
  63. data/lib/mongoid/association/referenced/syncable.rb +7 -5
  64. data/lib/mongoid/association/referenced.rb +3 -0
  65. data/lib/mongoid/association/reflections.rb +7 -5
  66. data/lib/mongoid/association/relatable.rb +19 -14
  67. data/lib/mongoid/association.rb +9 -6
  68. data/lib/mongoid/atomic/modifiers.rb +25 -2
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +4 -2
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -2
  71. data/lib/mongoid/atomic/paths/embedded.rb +2 -0
  72. data/lib/mongoid/atomic/paths/root.rb +4 -2
  73. data/lib/mongoid/atomic/paths.rb +2 -0
  74. data/lib/mongoid/atomic.rb +28 -2
  75. data/lib/mongoid/attributes/dynamic.rb +3 -1
  76. data/lib/mongoid/attributes/nested.rb +7 -5
  77. data/lib/mongoid/attributes/processing.rb +8 -6
  78. data/lib/mongoid/attributes/projector.rb +120 -0
  79. data/lib/mongoid/attributes/readonly.rb +3 -1
  80. data/lib/mongoid/attributes.rb +46 -27
  81. data/lib/mongoid/cacheable.rb +5 -3
  82. data/lib/mongoid/changeable.rb +3 -1
  83. data/lib/mongoid/clients/factory.rb +42 -10
  84. data/lib/mongoid/clients/options.rb +10 -8
  85. data/lib/mongoid/clients/sessions.rb +3 -0
  86. data/lib/mongoid/clients/storage_options.rb +7 -5
  87. data/lib/mongoid/clients/validators/storage.rb +2 -0
  88. data/lib/mongoid/clients/validators.rb +2 -0
  89. data/lib/mongoid/clients.rb +3 -1
  90. data/lib/mongoid/composable.rb +5 -2
  91. data/lib/mongoid/config/environment.rb +11 -1
  92. data/lib/mongoid/config/options.rb +20 -12
  93. data/lib/mongoid/config/validators/client.rb +2 -0
  94. data/lib/mongoid/config/validators/option.rb +2 -0
  95. data/lib/mongoid/config/validators.rb +2 -0
  96. data/lib/mongoid/config.rb +75 -12
  97. data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
  98. data/lib/mongoid/contextual/aggregable/mongo.rb +13 -9
  99. data/lib/mongoid/contextual/atomic.rb +31 -8
  100. data/lib/mongoid/contextual/command.rb +2 -0
  101. data/lib/mongoid/contextual/geo_near.rb +5 -3
  102. data/lib/mongoid/contextual/map_reduce.rb +5 -2
  103. data/lib/mongoid/contextual/memory.rb +4 -2
  104. data/lib/mongoid/contextual/mongo.rb +29 -5
  105. data/lib/mongoid/contextual/none.rb +5 -0
  106. data/lib/mongoid/contextual/queryable.rb +2 -0
  107. data/lib/mongoid/contextual.rb +7 -4
  108. data/lib/mongoid/copyable.rb +11 -5
  109. data/lib/mongoid/criteria/findable.rb +12 -2
  110. data/lib/mongoid/criteria/includable.rb +8 -6
  111. data/lib/mongoid/criteria/inspectable.rb +2 -0
  112. data/lib/mongoid/criteria/marshalable.rb +2 -0
  113. data/lib/mongoid/criteria/modifiable.rb +2 -0
  114. data/lib/mongoid/criteria/options.rb +2 -0
  115. data/lib/mongoid/criteria/permission.rb +2 -0
  116. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
  117. data/lib/mongoid/criteria/queryable/expandable.rb +69 -0
  118. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
  119. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
  120. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -1
  121. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
  122. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
  123. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
  124. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
  125. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -1
  126. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
  127. data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
  128. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -4
  129. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
  130. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -1
  131. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  132. data/lib/mongoid/criteria/queryable/extensions/time.rb +3 -1
  133. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -1
  134. data/lib/mongoid/criteria/queryable/extensions.rb +1 -3
  135. data/lib/mongoid/criteria/queryable/key.rb +35 -7
  136. data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
  137. data/lib/mongoid/criteria/queryable/mergeable.rb +179 -11
  138. data/lib/mongoid/criteria/queryable/optional.rb +5 -3
  139. data/lib/mongoid/criteria/queryable/options.rb +2 -0
  140. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -2
  141. data/lib/mongoid/criteria/queryable/selectable.rb +397 -98
  142. data/lib/mongoid/criteria/queryable/selector.rb +37 -8
  143. data/lib/mongoid/criteria/queryable/smash.rb +2 -0
  144. data/lib/mongoid/criteria/queryable/storable.rb +233 -0
  145. data/lib/mongoid/criteria/queryable.rb +7 -2
  146. data/lib/mongoid/criteria/scopable.rb +2 -0
  147. data/lib/mongoid/criteria.rb +79 -15
  148. data/lib/mongoid/document.rb +21 -20
  149. data/lib/mongoid/equality.rb +3 -2
  150. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
  151. data/lib/mongoid/errors/callback.rb +2 -0
  152. data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
  153. data/lib/mongoid/errors/delete_restriction.rb +10 -10
  154. data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
  155. data/lib/mongoid/errors/document_not_found.rb +2 -0
  156. data/lib/mongoid/errors/eager_load.rb +6 -2
  157. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  158. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
  159. data/lib/mongoid/errors/invalid_collection.rb +2 -0
  160. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  161. data/lib/mongoid/errors/invalid_config_option.rb +2 -0
  162. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -0
  163. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  164. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  165. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  166. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  167. data/lib/mongoid/errors/invalid_field.rb +2 -0
  168. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  169. data/lib/mongoid/errors/invalid_field_option.rb +2 -0
  170. data/lib/mongoid/errors/invalid_find.rb +2 -0
  171. data/lib/mongoid/errors/invalid_includes.rb +2 -0
  172. data/lib/mongoid/errors/invalid_index.rb +2 -0
  173. data/lib/mongoid/errors/invalid_options.rb +4 -2
  174. data/lib/mongoid/errors/invalid_path.rb +2 -0
  175. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
  176. data/lib/mongoid/errors/invalid_query.rb +41 -0
  177. data/lib/mongoid/errors/invalid_relation.rb +4 -2
  178. data/lib/mongoid/errors/invalid_relation_option.rb +4 -2
  179. data/lib/mongoid/errors/invalid_scope.rb +2 -0
  180. data/lib/mongoid/errors/invalid_session_use.rb +2 -0
  181. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
  182. data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
  183. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  184. data/lib/mongoid/errors/invalid_time.rb +2 -0
  185. data/lib/mongoid/errors/invalid_value.rb +2 -0
  186. data/lib/mongoid/errors/inverse_not_found.rb +3 -1
  187. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
  188. data/lib/mongoid/errors/mixed_relations.rb +2 -0
  189. data/lib/mongoid/errors/mongoid_error.rb +3 -1
  190. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
  191. data/lib/mongoid/errors/no_client_config.rb +4 -2
  192. data/lib/mongoid/errors/no_client_database.rb +2 -0
  193. data/lib/mongoid/errors/no_client_hosts.rb +2 -0
  194. data/lib/mongoid/errors/no_clients_config.rb +2 -0
  195. data/lib/mongoid/errors/no_default_client.rb +3 -1
  196. data/lib/mongoid/errors/no_environment.rb +2 -0
  197. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
  198. data/lib/mongoid/errors/no_metadata.rb +2 -0
  199. data/lib/mongoid/errors/no_parent.rb +2 -0
  200. data/lib/mongoid/errors/readonly_attribute.rb +2 -0
  201. data/lib/mongoid/errors/readonly_document.rb +2 -0
  202. data/lib/mongoid/errors/scope_overwrite.rb +2 -0
  203. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
  204. data/lib/mongoid/errors/unknown_attribute.rb +2 -0
  205. data/lib/mongoid/errors/unknown_model.rb +2 -0
  206. data/lib/mongoid/errors/unsaved_document.rb +2 -0
  207. data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
  208. data/lib/mongoid/errors/validations.rb +2 -0
  209. data/lib/mongoid/errors.rb +12 -0
  210. data/lib/mongoid/evolvable.rb +4 -2
  211. data/lib/mongoid/extensions/array.rb +23 -6
  212. data/lib/mongoid/extensions/big_decimal.rb +2 -0
  213. data/lib/mongoid/extensions/boolean.rb +3 -2
  214. data/lib/mongoid/extensions/date.rb +13 -3
  215. data/lib/mongoid/extensions/date_time.rb +4 -3
  216. data/lib/mongoid/extensions/decimal128.rb +2 -0
  217. data/lib/mongoid/extensions/false_class.rb +3 -1
  218. data/lib/mongoid/extensions/float.rb +5 -3
  219. data/lib/mongoid/extensions/hash.rb +49 -9
  220. data/lib/mongoid/extensions/integer.rb +5 -3
  221. data/lib/mongoid/extensions/module.rb +2 -0
  222. data/lib/mongoid/extensions/nil_class.rb +2 -0
  223. data/lib/mongoid/extensions/object.rb +16 -4
  224. data/lib/mongoid/extensions/object_id.rb +2 -0
  225. data/lib/mongoid/extensions/range.rb +2 -0
  226. data/lib/mongoid/extensions/regexp.rb +2 -0
  227. data/lib/mongoid/extensions/set.rb +2 -0
  228. data/lib/mongoid/extensions/string.rb +18 -9
  229. data/lib/mongoid/extensions/symbol.rb +2 -0
  230. data/lib/mongoid/extensions/time.rb +14 -0
  231. data/lib/mongoid/extensions/time_with_zone.rb +14 -0
  232. data/lib/mongoid/extensions/true_class.rb +3 -1
  233. data/lib/mongoid/extensions.rb +3 -0
  234. data/lib/mongoid/factory.rb +52 -12
  235. data/lib/mongoid/fields/foreign_key.rb +3 -1
  236. data/lib/mongoid/fields/localized.rb +2 -0
  237. data/lib/mongoid/fields/standard.rb +6 -3
  238. data/lib/mongoid/fields/validators/macro.rb +38 -11
  239. data/lib/mongoid/fields/validators.rb +2 -0
  240. data/lib/mongoid/fields.rb +49 -6
  241. data/lib/mongoid/findable.rb +59 -18
  242. data/lib/mongoid/indexable/specification.rb +3 -1
  243. data/lib/mongoid/indexable/validators/options.rb +2 -0
  244. data/lib/mongoid/indexable.rb +5 -3
  245. data/lib/mongoid/inspectable.rb +4 -2
  246. data/lib/mongoid/interceptable.rb +10 -4
  247. data/lib/mongoid/loggable.rb +13 -7
  248. data/lib/mongoid/matchable.rb +2 -148
  249. data/lib/mongoid/matcher/all.rb +22 -0
  250. data/lib/mongoid/matcher/and.rb +21 -0
  251. data/lib/mongoid/matcher/bits.rb +41 -0
  252. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  253. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  254. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  255. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  256. data/lib/mongoid/matcher/elem_match.rb +36 -0
  257. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  258. data/lib/mongoid/matcher/eq.rb +11 -0
  259. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  260. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  261. data/lib/mongoid/matcher/exists.rb +15 -0
  262. data/lib/mongoid/matcher/expression.rb +35 -0
  263. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  264. data/lib/mongoid/matcher/field_expression.rb +62 -0
  265. data/lib/mongoid/matcher/field_operator.rb +54 -0
  266. data/lib/mongoid/matcher/gt.rb +17 -0
  267. data/lib/mongoid/matcher/gte.rb +17 -0
  268. data/lib/mongoid/matcher/in.rb +25 -0
  269. data/lib/mongoid/matcher/lt.rb +17 -0
  270. data/lib/mongoid/matcher/lte.rb +17 -0
  271. data/lib/mongoid/matcher/mod.rb +17 -0
  272. data/lib/mongoid/matcher/ne.rb +16 -0
  273. data/lib/mongoid/matcher/nin.rb +11 -0
  274. data/lib/mongoid/matcher/nor.rb +25 -0
  275. data/lib/mongoid/matcher/not.rb +29 -0
  276. data/lib/mongoid/matcher/or.rb +21 -0
  277. data/lib/mongoid/matcher/regex.rb +41 -0
  278. data/lib/mongoid/matcher/size.rb +26 -0
  279. data/lib/mongoid/matcher/type.rb +99 -0
  280. data/lib/mongoid/matcher.rb +110 -0
  281. data/lib/mongoid/persistable/creatable.rb +3 -1
  282. data/lib/mongoid/persistable/deletable.rb +5 -4
  283. data/lib/mongoid/persistable/destroyable.rb +11 -3
  284. data/lib/mongoid/persistable/incrementable.rb +6 -2
  285. data/lib/mongoid/persistable/logical.rb +4 -1
  286. data/lib/mongoid/persistable/poppable.rb +3 -1
  287. data/lib/mongoid/persistable/pullable.rb +3 -1
  288. data/lib/mongoid/persistable/pushable.rb +3 -1
  289. data/lib/mongoid/persistable/renamable.rb +10 -3
  290. data/lib/mongoid/persistable/savable.rb +3 -1
  291. data/lib/mongoid/persistable/settable.rb +3 -1
  292. data/lib/mongoid/persistable/unsettable.rb +8 -3
  293. data/lib/mongoid/persistable/updatable.rb +30 -3
  294. data/lib/mongoid/persistable/upsertable.rb +3 -1
  295. data/lib/mongoid/persistable.rb +133 -15
  296. data/lib/mongoid/persistence_context.rb +24 -10
  297. data/lib/mongoid/positional.rb +2 -0
  298. data/lib/mongoid/query_cache.rb +118 -100
  299. data/lib/mongoid/railtie.rb +3 -1
  300. data/lib/mongoid/railties/controller_runtime.rb +4 -1
  301. data/lib/mongoid/railties/database.rake +9 -0
  302. data/lib/mongoid/reloadable.rb +11 -4
  303. data/lib/mongoid/scopable.rb +2 -1
  304. data/lib/mongoid/selectable.rb +8 -8
  305. data/lib/mongoid/serializable.rb +24 -14
  306. data/lib/mongoid/shardable.rb +80 -10
  307. data/lib/mongoid/stateful.rb +3 -1
  308. data/lib/mongoid/stringified_symbol.rb +53 -0
  309. data/lib/mongoid/tasks/database.rake +12 -5
  310. data/lib/mongoid/tasks/database.rb +85 -0
  311. data/lib/mongoid/threaded/lifecycle.rb +2 -0
  312. data/lib/mongoid/threaded.rb +2 -0
  313. data/lib/mongoid/timestamps/created/short.rb +2 -0
  314. data/lib/mongoid/timestamps/created.rb +3 -1
  315. data/lib/mongoid/timestamps/short.rb +2 -0
  316. data/lib/mongoid/timestamps/timeless.rb +6 -2
  317. data/lib/mongoid/timestamps/updated/short.rb +2 -0
  318. data/lib/mongoid/timestamps/updated.rb +3 -1
  319. data/lib/mongoid/timestamps.rb +3 -1
  320. data/lib/mongoid/touchable.rb +53 -16
  321. data/lib/mongoid/traversable.rb +115 -6
  322. data/lib/mongoid/validatable/associated.rb +5 -3
  323. data/lib/mongoid/validatable/format.rb +2 -0
  324. data/lib/mongoid/validatable/length.rb +2 -0
  325. data/lib/mongoid/validatable/localizable.rb +2 -0
  326. data/lib/mongoid/validatable/macros.rb +2 -0
  327. data/lib/mongoid/validatable/presence.rb +7 -5
  328. data/lib/mongoid/validatable/queryable.rb +2 -0
  329. data/lib/mongoid/validatable/uniqueness.rb +5 -3
  330. data/lib/mongoid/validatable.rb +7 -5
  331. data/lib/mongoid/version.rb +2 -1
  332. data/lib/mongoid.rb +34 -2
  333. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -1
  334. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -30
  335. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
  336. data/lib/rails/generators/mongoid_generator.rb +2 -0
  337. data/lib/rails/mongoid.rb +4 -2
  338. data/lib/support/ruby_version.rb +3 -0
  339. data/spec/README.md +19 -4
  340. data/spec/config/mongoid.yml +1 -0
  341. data/spec/integration/app_spec.rb +246 -94
  342. data/spec/integration/associations/belongs_to_spec.rb +3 -0
  343. data/spec/integration/associations/embedded_spec.rb +207 -0
  344. data/spec/integration/associations/embeds_many_spec.rb +68 -0
  345. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  346. data/spec/integration/associations/foreign_key_spec.rb +99 -0
  347. data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
  348. data/spec/integration/associations/has_many_spec.rb +129 -0
  349. data/spec/integration/associations/has_one_spec.rb +177 -0
  350. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  351. data/spec/integration/associations/reverse_population_spec.rb +35 -0
  352. data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
  353. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  354. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  355. data/spec/integration/contextual/empty_spec.rb +142 -0
  356. data/spec/integration/criteria/date_field_spec.rb +1 -1
  357. data/spec/integration/criteria/default_scope_spec.rb +21 -0
  358. data/spec/integration/criteria/logical_spec.rb +94 -0
  359. data/spec/integration/discriminator_key_spec.rb +354 -0
  360. data/spec/integration/discriminator_value_spec.rb +207 -0
  361. data/spec/integration/document_spec.rb +30 -0
  362. data/spec/integration/i18n_fallbacks_spec.rb +90 -0
  363. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  364. data/spec/integration/matcher_operator_data/all.yml +140 -0
  365. data/spec/integration/matcher_operator_data/and.yml +93 -0
  366. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  367. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  368. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  369. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  370. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  371. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  372. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  373. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  374. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  375. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  376. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  377. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  378. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  379. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  380. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  381. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  382. data/spec/integration/matcher_operator_data/in.yml +210 -0
  383. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  384. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  385. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  386. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  387. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  388. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  389. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  390. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  391. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  392. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  393. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  394. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  395. data/spec/integration/matcher_operator_data/not.yml +196 -0
  396. data/spec/integration/matcher_operator_data/or.yml +137 -0
  397. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  398. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  399. data/spec/integration/matcher_operator_data/size.yml +174 -0
  400. data/spec/integration/matcher_operator_data/type.yml +70 -0
  401. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  402. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  403. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  404. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  405. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  406. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  407. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  408. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  409. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  410. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  411. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  412. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  413. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  414. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  415. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  416. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  417. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  418. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  419. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  420. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  421. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  422. data/spec/integration/matcher_operator_spec.rb +100 -0
  423. data/spec/integration/matcher_spec.rb +189 -0
  424. data/spec/integration/server_query_spec.rb +142 -0
  425. data/spec/integration/shardable_spec.rb +149 -0
  426. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  427. data/spec/lite_spec_helper.rb +15 -5
  428. data/spec/mongoid/association/accessors_spec.rb +241 -63
  429. data/spec/mongoid/association/auto_save_spec.rb +3 -0
  430. data/spec/mongoid/association/builders_spec.rb +3 -0
  431. data/spec/mongoid/association/constrainable_spec.rb +3 -0
  432. data/spec/mongoid/association/counter_cache_spec.rb +3 -0
  433. data/spec/mongoid/association/depending_spec.rb +427 -333
  434. data/spec/mongoid/association/eager_spec.rb +3 -0
  435. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -0
  436. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -0
  437. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -0
  438. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +3 -0
  439. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +3 -0
  440. data/spec/mongoid/association/embedded/embedded_in_spec.rb +4 -1
  441. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +3 -0
  442. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +3 -0
  443. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +53 -4
  444. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  445. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
  446. data/spec/mongoid/association/embedded/embeds_many_spec.rb +4 -1
  447. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +3 -0
  448. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +3 -0
  449. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +3 -0
  450. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +3 -0
  451. data/spec/mongoid/association/embedded/embeds_one_models.rb +4 -0
  452. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
  453. data/spec/mongoid/association/embedded/embeds_one_spec.rb +4 -1
  454. data/spec/mongoid/association/macros_spec.rb +3 -0
  455. data/spec/mongoid/association/nested/many_spec.rb +3 -0
  456. data/spec/mongoid/association/nested/one_spec.rb +19 -12
  457. data/spec/mongoid/association/options_spec.rb +3 -0
  458. data/spec/mongoid/association/polymorphic_spec.rb +3 -0
  459. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -0
  460. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +3 -0
  461. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +205 -10
  462. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +45 -8
  463. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +58 -0
  464. data/spec/mongoid/association/referenced/belongs_to_spec.rb +3 -0
  465. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +4 -1
  466. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +3 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +16 -0
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +26 -5
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +37 -14
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -2
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +26 -2
  473. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +4 -1
  474. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +3 -0
  475. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +18 -3
  476. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +248 -93
  477. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  478. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +463 -186
  479. data/spec/mongoid/association/referenced/has_many_models.rb +41 -0
  480. data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
  481. data/spec/mongoid/association/referenced/has_many_spec.rb +3 -0
  482. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +3 -0
  483. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +3 -0
  484. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -3
  485. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +3 -0
  486. data/spec/mongoid/association/referenced/has_one_models.rb +32 -0
  487. data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
  488. data/spec/mongoid/association/referenced/has_one_spec.rb +4 -1
  489. data/spec/mongoid/association/reflections_spec.rb +3 -0
  490. data/spec/mongoid/association/syncable_spec.rb +3 -0
  491. data/spec/mongoid/association_spec.rb +3 -0
  492. data/spec/mongoid/atomic/modifiers_spec.rb +50 -0
  493. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
  494. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
  495. data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
  496. data/spec/mongoid/atomic/paths_spec.rb +67 -12
  497. data/spec/mongoid/atomic_spec.rb +26 -0
  498. data/spec/mongoid/attributes/nested_spec.rb +4 -1
  499. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  500. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  501. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  502. data/spec/mongoid/attributes/readonly_spec.rb +3 -0
  503. data/spec/mongoid/attributes_spec.rb +336 -0
  504. data/spec/mongoid/cacheable_spec.rb +3 -0
  505. data/spec/mongoid/changeable_spec.rb +26 -0
  506. data/spec/mongoid/clients/factory_spec.rb +137 -28
  507. data/spec/mongoid/clients/options_spec.rb +42 -23
  508. data/spec/mongoid/clients/sessions_spec.rb +4 -6
  509. data/spec/mongoid/clients/transactions_spec.rb +6 -3
  510. data/spec/mongoid/clients_spec.rb +3 -0
  511. data/spec/mongoid/composable_spec.rb +3 -0
  512. data/spec/mongoid/config/environment_spec.rb +89 -8
  513. data/spec/mongoid/config/options_spec.rb +23 -3
  514. data/spec/mongoid/config_spec.rb +172 -0
  515. data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
  516. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
  517. data/spec/mongoid/contextual/atomic_spec.rb +181 -29
  518. data/spec/mongoid/contextual/geo_near_spec.rb +4 -1
  519. data/spec/mongoid/contextual/map_reduce_spec.rb +3 -0
  520. data/spec/mongoid/contextual/memory_spec.rb +3 -0
  521. data/spec/mongoid/contextual/mongo_spec.rb +77 -18
  522. data/spec/mongoid/contextual/none_spec.rb +3 -0
  523. data/spec/mongoid/copyable_spec.rb +200 -18
  524. data/spec/mongoid/copyable_spec_models.rb +31 -0
  525. data/spec/mongoid/criteria/findable_spec.rb +58 -0
  526. data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
  527. data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
  528. data/spec/mongoid/criteria/modifiable_spec.rb +8 -4
  529. data/spec/mongoid/criteria/options_spec.rb +3 -0
  530. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
  531. data/spec/mongoid/criteria/queryable/expandable_spec.rb +62 -0
  532. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
  533. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
  534. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
  535. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +4 -1
  536. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
  537. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
  538. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
  539. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
  540. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
  541. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
  542. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
  543. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
  544. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
  545. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +4 -1
  546. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +3 -0
  547. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
  548. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +3 -0
  549. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
  550. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +24 -16
  551. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +3 -0
  552. data/spec/mongoid/criteria/queryable/key_spec.rb +3 -0
  553. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +146 -12
  554. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
  555. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
  556. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +3 -0
  557. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
  558. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1593 -285
  559. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  560. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1048 -2773
  561. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  562. data/spec/mongoid/criteria/queryable/selector_spec.rb +3 -0
  563. data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
  564. data/spec/mongoid/criteria/queryable/storable_spec.rb +190 -0
  565. data/spec/mongoid/criteria/scopable_spec.rb +3 -0
  566. data/spec/mongoid/criteria_projection_spec.rb +411 -0
  567. data/spec/mongoid/criteria_spec.rb +241 -278
  568. data/spec/mongoid/document_fields_spec.rb +26 -0
  569. data/spec/mongoid/document_query_spec.rb +90 -0
  570. data/spec/mongoid/document_spec.rb +113 -16
  571. data/spec/mongoid/equality_spec.rb +3 -1
  572. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
  573. data/spec/mongoid/errors/callback_spec.rb +3 -0
  574. data/spec/mongoid/errors/delete_restriction_spec.rb +5 -2
  575. data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
  576. data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
  577. data/spec/mongoid/errors/eager_load_spec.rb +3 -0
  578. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
  579. data/spec/mongoid/errors/invalid_config_file_spec.rb +32 -0
  580. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
  581. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
  582. data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
  583. data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
  584. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
  585. data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
  586. data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
  587. data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
  588. data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
  589. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
  590. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
  591. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
  592. data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
  593. data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
  594. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
  595. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
  596. data/spec/mongoid/errors/mongoid_error_spec.rb +23 -8
  597. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
  598. data/spec/mongoid/errors/no_client_config_spec.rb +5 -2
  599. data/spec/mongoid/errors/no_client_database_spec.rb +6 -3
  600. data/spec/mongoid/errors/no_client_hosts_spec.rb +6 -3
  601. data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
  602. data/spec/mongoid/errors/no_environment_spec.rb +3 -0
  603. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
  604. data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
  605. data/spec/mongoid/errors/no_parent_spec.rb +4 -1
  606. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
  607. data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
  608. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
  609. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
  610. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
  611. data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
  612. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
  613. data/spec/mongoid/errors/validations_spec.rb +3 -0
  614. data/spec/mongoid/extensions/array_spec.rb +26 -43
  615. data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
  616. data/spec/mongoid/extensions/binary_spec.rb +3 -0
  617. data/spec/mongoid/extensions/boolean_spec.rb +3 -0
  618. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
  619. data/spec/mongoid/extensions/date_spec.rb +9 -160
  620. data/spec/mongoid/extensions/date_time_spec.rb +18 -60
  621. data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
  622. data/spec/mongoid/extensions/false_class_spec.rb +4 -1
  623. data/spec/mongoid/extensions/float_spec.rb +18 -3
  624. data/spec/mongoid/extensions/hash_spec.rb +106 -0
  625. data/spec/mongoid/extensions/integer_spec.rb +15 -2
  626. data/spec/mongoid/extensions/module_spec.rb +3 -0
  627. data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
  628. data/spec/mongoid/extensions/object_id_spec.rb +3 -0
  629. data/spec/mongoid/extensions/object_spec.rb +14 -24
  630. data/spec/mongoid/extensions/range_spec.rb +3 -0
  631. data/spec/mongoid/extensions/regexp_spec.rb +3 -0
  632. data/spec/mongoid/extensions/set_spec.rb +3 -0
  633. data/spec/mongoid/extensions/string_spec.rb +59 -25
  634. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  635. data/spec/mongoid/extensions/symbol_spec.rb +3 -0
  636. data/spec/mongoid/extensions/time_spec.rb +30 -0
  637. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
  638. data/spec/mongoid/extensions/true_class_spec.rb +4 -1
  639. data/spec/mongoid/extensions_spec.rb +3 -0
  640. data/spec/mongoid/factory_spec.rb +287 -27
  641. data/spec/mongoid/fields/foreign_key_spec.rb +3 -0
  642. data/spec/mongoid/fields/localized_spec.rb +7 -4
  643. data/spec/mongoid/fields/standard_spec.rb +3 -0
  644. data/spec/mongoid/fields_spec.rb +93 -6
  645. data/spec/mongoid/findable_spec.rb +35 -0
  646. data/spec/mongoid/indexable/specification_spec.rb +3 -0
  647. data/spec/mongoid/indexable_spec.rb +31 -2
  648. data/spec/mongoid/inspectable_spec.rb +40 -2
  649. data/spec/mongoid/interceptable_spec.rb +67 -2
  650. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  651. data/spec/mongoid/loggable_spec.rb +3 -0
  652. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  653. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  654. data/spec/mongoid/matcher/extract_attribute_spec.rb +37 -0
  655. data/spec/mongoid/persistable/creatable_spec.rb +111 -25
  656. data/spec/mongoid/persistable/deletable_spec.rb +264 -1
  657. data/spec/mongoid/persistable/destroyable_spec.rb +194 -3
  658. data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
  659. data/spec/mongoid/persistable/logical_spec.rb +17 -0
  660. data/spec/mongoid/persistable/poppable_spec.rb +17 -0
  661. data/spec/mongoid/persistable/pullable_spec.rb +31 -0
  662. data/spec/mongoid/persistable/pushable_spec.rb +31 -0
  663. data/spec/mongoid/persistable/renamable_spec.rb +17 -0
  664. data/spec/mongoid/persistable/savable_spec.rb +175 -16
  665. data/spec/mongoid/persistable/settable_spec.rb +47 -0
  666. data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
  667. data/spec/mongoid/persistable/updatable_spec.rb +5 -0
  668. data/spec/mongoid/persistable/upsertable_spec.rb +4 -1
  669. data/spec/mongoid/persistable_spec.rb +85 -8
  670. data/spec/mongoid/persistence_context_spec.rb +3 -0
  671. data/spec/mongoid/positional_spec.rb +3 -0
  672. data/spec/mongoid/query_cache_middleware_spec.rb +69 -0
  673. data/spec/mongoid/query_cache_spec.rb +466 -82
  674. data/spec/mongoid/relations/proxy_spec.rb +3 -0
  675. data/spec/mongoid/reloadable_spec.rb +93 -1
  676. data/spec/mongoid/scopable_spec.rb +3 -0
  677. data/spec/mongoid/selectable_spec.rb +3 -0
  678. data/spec/mongoid/serializable_spec.rb +152 -20
  679. data/spec/mongoid/shardable_models.rb +61 -0
  680. data/spec/mongoid/shardable_spec.rb +116 -16
  681. data/spec/mongoid/stateful_spec.rb +3 -0
  682. data/spec/mongoid/tasks/database_rake_spec.rb +3 -0
  683. data/spec/mongoid/tasks/database_spec.rb +3 -0
  684. data/spec/mongoid/threaded_spec.rb +3 -0
  685. data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
  686. data/spec/mongoid/timestamps/created_spec.rb +3 -0
  687. data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
  688. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
  689. data/spec/mongoid/timestamps/updated_spec.rb +3 -0
  690. data/spec/mongoid/timestamps_spec.rb +3 -0
  691. data/spec/mongoid/touchable_spec.rb +171 -19
  692. data/spec/mongoid/touchable_spec_models.rb +54 -0
  693. data/spec/mongoid/traversable_spec.rb +1103 -0
  694. data/spec/mongoid/validatable/associated_spec.rb +3 -0
  695. data/spec/mongoid/validatable/format_spec.rb +3 -0
  696. data/spec/mongoid/validatable/length_spec.rb +3 -0
  697. data/spec/mongoid/validatable/numericality_spec.rb +3 -0
  698. data/spec/mongoid/validatable/presence_spec.rb +3 -0
  699. data/spec/mongoid/validatable/uniqueness_spec.rb +3 -0
  700. data/spec/mongoid/validatable_spec.rb +4 -1
  701. data/spec/mongoid_spec.rb +3 -0
  702. data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
  703. data/spec/rails/mongoid_spec.rb +5 -2
  704. data/spec/shared/bin/get-mongodb-download-url +17 -0
  705. data/spec/shared/bin/s3-copy +45 -0
  706. data/spec/shared/bin/s3-upload +69 -0
  707. data/spec/shared/lib/mrss/cluster_config.rb +19 -4
  708. data/spec/shared/lib/mrss/constraints.rb +67 -12
  709. data/spec/shared/lib/mrss/docker_runner.rb +10 -1
  710. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  711. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  712. data/spec/shared/lib/mrss/server_version_registry.rb +84 -33
  713. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  714. data/spec/shared/lib/mrss/utils.rb +15 -0
  715. data/spec/shared/share/Dockerfile.erb +126 -32
  716. data/spec/shared/share/haproxy-1.conf +16 -0
  717. data/spec/shared/share/haproxy-2.conf +17 -0
  718. data/spec/shared/shlib/server.sh +123 -26
  719. data/spec/shared/shlib/set_env.sh +4 -1
  720. data/spec/spec_helper.rb +31 -17
  721. data/spec/support/authorization.rb +3 -0
  722. data/spec/support/client_registry.rb +9 -0
  723. data/spec/support/constraints.rb +15 -233
  724. data/spec/support/expectations.rb +6 -1
  725. data/spec/support/helpers.rb +11 -0
  726. data/spec/support/macros.rb +1 -0
  727. data/spec/{app → support}/models/account.rb +3 -0
  728. data/spec/{app → support}/models/acolyte.rb +3 -0
  729. data/spec/{app → support}/models/actor.rb +4 -1
  730. data/spec/support/models/actress.rb +5 -0
  731. data/spec/{app → support}/models/address.rb +7 -0
  732. data/spec/{app → support}/models/address_component.rb +3 -0
  733. data/spec/{app → support}/models/address_number.rb +3 -0
  734. data/spec/{app → support}/models/agency.rb +3 -0
  735. data/spec/{app → support}/models/agent.rb +3 -0
  736. data/spec/{app → support}/models/album.rb +3 -0
  737. data/spec/{app → support}/models/alert.rb +3 -0
  738. data/spec/{app → support}/models/animal.rb +3 -0
  739. data/spec/{app → support}/models/answer.rb +3 -0
  740. data/spec/{app → support}/models/appointment.rb +3 -0
  741. data/spec/support/models/armrest.rb +10 -0
  742. data/spec/{app → support}/models/array_field.rb +1 -0
  743. data/spec/{app → support}/models/article.rb +3 -0
  744. data/spec/{app → support}/models/artist.rb +3 -0
  745. data/spec/{app → support}/models/artwork.rb +3 -0
  746. data/spec/{app → support}/models/audio.rb +3 -0
  747. data/spec/{app → support}/models/augmentation.rb +3 -0
  748. data/spec/{app → support}/models/author.rb +3 -0
  749. data/spec/{app → support}/models/baby.rb +3 -0
  750. data/spec/{app → support}/models/band.rb +3 -0
  751. data/spec/{app → support}/models/bar.rb +3 -0
  752. data/spec/{app → support}/models/basic.rb +3 -0
  753. data/spec/support/models/bed.rb +4 -0
  754. data/spec/support/models/big_palette.rb +5 -0
  755. data/spec/{app → support}/models/birthday.rb +3 -0
  756. data/spec/support/models/bolt.rb +8 -0
  757. data/spec/{app → support}/models/bomb.rb +3 -0
  758. data/spec/{app → support}/models/book.rb +3 -0
  759. data/spec/{app → support}/models/breed.rb +3 -0
  760. data/spec/support/models/browser.rb +9 -0
  761. data/spec/{app → support}/models/building.rb +3 -0
  762. data/spec/{app → support}/models/building_address.rb +3 -0
  763. data/spec/{app → support}/models/bus.rb +3 -0
  764. data/spec/{app → support}/models/business.rb +3 -0
  765. data/spec/{app → support}/models/callback_test.rb +3 -0
  766. data/spec/{app → support}/models/canvas.rb +4 -1
  767. data/spec/support/models/car.rb +4 -0
  768. data/spec/{app → support}/models/cat.rb +3 -0
  769. data/spec/{app → support}/models/category.rb +3 -0
  770. data/spec/{app → support}/models/child.rb +3 -0
  771. data/spec/{app → support}/models/child_doc.rb +3 -0
  772. data/spec/{app → support}/models/church.rb +3 -0
  773. data/spec/{app → support}/models/circle.rb +3 -0
  774. data/spec/{app → support}/models/circuit.rb +3 -0
  775. data/spec/{app → support}/models/circus.rb +3 -0
  776. data/spec/{app → support}/models/code.rb +3 -0
  777. data/spec/support/models/coding/pull_request.rb +12 -0
  778. data/spec/support/models/coding.rb +4 -0
  779. data/spec/{app → support}/models/comment.rb +3 -0
  780. data/spec/{app → support}/models/company.rb +3 -0
  781. data/spec/{app → support}/models/consumption_period.rb +3 -0
  782. data/spec/{app → support}/models/contextable_item.rb +3 -0
  783. data/spec/{app → support}/models/contractor.rb +3 -0
  784. data/spec/{app → support}/models/cookie.rb +3 -0
  785. data/spec/{app → support}/models/country_code.rb +3 -0
  786. data/spec/{app → support}/models/courier_job.rb +3 -0
  787. data/spec/support/models/crate.rb +13 -0
  788. data/spec/{app → support}/models/customer.rb +0 -0
  789. data/spec/{app → support}/models/customer_address.rb +0 -0
  790. data/spec/support/models/deed.rb +8 -0
  791. data/spec/{app → support}/models/definition.rb +3 -0
  792. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  793. data/spec/{app → support}/models/description.rb +3 -0
  794. data/spec/{app → support}/models/dictionary.rb +9 -0
  795. data/spec/{app → support}/models/division.rb +3 -0
  796. data/spec/{app → support}/models/doctor.rb +3 -0
  797. data/spec/{app → support}/models/dog.rb +3 -0
  798. data/spec/{app → support}/models/dokument.rb +3 -0
  799. data/spec/{app → support}/models/draft.rb +3 -0
  800. data/spec/{app → support}/models/dragon.rb +3 -0
  801. data/spec/{app → support}/models/driver.rb +4 -1
  802. data/spec/{app → support}/models/drug.rb +3 -0
  803. data/spec/{app → support}/models/dungeon.rb +3 -0
  804. data/spec/{app → support}/models/edit.rb +3 -0
  805. data/spec/{app → support}/models/email.rb +3 -0
  806. data/spec/support/models/employer.rb +8 -0
  807. data/spec/{app → support}/models/entry.rb +3 -0
  808. data/spec/support/models/eraser.rb +4 -0
  809. data/spec/{app → support}/models/even.rb +3 -0
  810. data/spec/{app → support}/models/event.rb +3 -0
  811. data/spec/{app → support}/models/exhibition.rb +3 -0
  812. data/spec/{app → support}/models/exhibitor.rb +3 -0
  813. data/spec/{app → support}/models/explosion.rb +3 -0
  814. data/spec/{app → support}/models/eye.rb +3 -0
  815. data/spec/{app → support}/models/eye_bowl.rb +3 -0
  816. data/spec/{app → support}/models/face.rb +3 -0
  817. data/spec/{app → support}/models/favorite.rb +3 -0
  818. data/spec/{app → support}/models/filesystem.rb +3 -0
  819. data/spec/{app → support}/models/fire_hydrant.rb +3 -0
  820. data/spec/{app → support}/models/firefox.rb +3 -0
  821. data/spec/{app → support}/models/fish.rb +3 -0
  822. data/spec/{app → support}/models/folder.rb +3 -0
  823. data/spec/{app → support}/models/folder_item.rb +3 -0
  824. data/spec/{app → support}/models/fruits.rb +3 -0
  825. data/spec/{app → support}/models/game.rb +3 -0
  826. data/spec/{app → support}/models/ghost.rb +3 -0
  827. data/spec/support/models/guitar.rb +5 -0
  828. data/spec/support/models/hole.rb +13 -0
  829. data/spec/{app → support}/models/home.rb +3 -0
  830. data/spec/{app → support}/models/house.rb +3 -0
  831. data/spec/support/models/html_writer.rb +6 -0
  832. data/spec/{app → support}/models/id_key.rb +3 -0
  833. data/spec/support/models/idnodef.rb +8 -0
  834. data/spec/{app → support}/models/image.rb +3 -0
  835. data/spec/{app → support}/models/implant.rb +3 -0
  836. data/spec/support/models/instrument.rb +9 -0
  837. data/spec/{app → support}/models/item.rb +4 -1
  838. data/spec/{app → support}/models/jar.rb +3 -0
  839. data/spec/{app → support}/models/kaleidoscope.rb +3 -0
  840. data/spec/{app → support}/models/kangaroo.rb +4 -1
  841. data/spec/{app → support}/models/label.rb +3 -0
  842. data/spec/{app → support}/models/language.rb +3 -0
  843. data/spec/{app → support}/models/lat_lng.rb +3 -0
  844. data/spec/{app → support}/models/league.rb +3 -0
  845. data/spec/support/models/learner.rb +5 -0
  846. data/spec/{app → support}/models/line_item.rb +3 -0
  847. data/spec/{app → support}/models/location.rb +3 -0
  848. data/spec/{app → support}/models/login.rb +3 -0
  849. data/spec/{app → support}/models/manufacturer.rb +3 -0
  850. data/spec/{app → support}/models/meat.rb +3 -0
  851. data/spec/{app → support}/models/membership.rb +3 -0
  852. data/spec/{app → support}/models/message.rb +3 -0
  853. data/spec/{app → support}/models/minim.rb +1 -1
  854. data/spec/{app → support}/models/mixed_drink.rb +3 -0
  855. data/spec/support/models/mop.rb +25 -0
  856. data/spec/{app → support}/models/movie.rb +3 -0
  857. data/spec/support/models/my_hash.rb +5 -0
  858. data/spec/{app → support}/models/name.rb +3 -0
  859. data/spec/support/models/name_only.rb +9 -0
  860. data/spec/{app → support}/models/node.rb +3 -0
  861. data/spec/{app → support}/models/note.rb +3 -0
  862. data/spec/support/models/nut.rb +8 -0
  863. data/spec/{app → support}/models/odd.rb +3 -0
  864. data/spec/support/models/order.rb +11 -0
  865. data/spec/{app → support}/models/ordered_post.rb +3 -0
  866. data/spec/{app → support}/models/ordered_preference.rb +3 -0
  867. data/spec/{app → support}/models/oscar.rb +3 -0
  868. data/spec/support/models/other_owner_object.rb +5 -0
  869. data/spec/{app → support}/models/override.rb +3 -0
  870. data/spec/{app → support}/models/ownable.rb +3 -0
  871. data/spec/{app → support}/models/owner.rb +5 -0
  872. data/spec/support/models/pack.rb +6 -0
  873. data/spec/{app → support}/models/page.rb +3 -0
  874. data/spec/{app → support}/models/page_question.rb +3 -0
  875. data/spec/{app → support}/models/palette.rb +4 -1
  876. data/spec/{app → support}/models/parent.rb +3 -0
  877. data/spec/{app → support}/models/parent_doc.rb +3 -0
  878. data/spec/{app → support}/models/passport.rb +4 -0
  879. data/spec/{app → support}/models/patient.rb +3 -0
  880. data/spec/support/models/pdf_writer.rb +6 -0
  881. data/spec/support/models/pencil.rb +4 -0
  882. data/spec/{app → support}/models/person.rb +21 -1
  883. data/spec/{app → support}/models/pet.rb +3 -0
  884. data/spec/{app → support}/models/pet_owner.rb +3 -0
  885. data/spec/{app → support}/models/phone.rb +4 -0
  886. data/spec/support/models/piano.rb +5 -0
  887. data/spec/{app → support}/models/pizza.rb +3 -0
  888. data/spec/{app → support}/models/player.rb +3 -0
  889. data/spec/{app → support}/models/post.rb +3 -0
  890. data/spec/{app → support}/models/post_genre.rb +3 -0
  891. data/spec/{app → support}/models/powerup.rb +3 -0
  892. data/spec/{app → support}/models/preference.rb +3 -0
  893. data/spec/{app → support}/models/princess.rb +3 -0
  894. data/spec/{app → support}/models/product.rb +3 -0
  895. data/spec/support/models/profile.rb +18 -0
  896. data/spec/{app → support}/models/pronunciation.rb +3 -0
  897. data/spec/{app → support}/models/pub.rb +3 -0
  898. data/spec/support/models/publication/encyclopedia.rb +12 -0
  899. data/spec/support/models/publication/review.rb +14 -0
  900. data/spec/support/models/publication.rb +5 -0
  901. data/spec/{app → support}/models/purchase.rb +3 -0
  902. data/spec/{app → support}/models/question.rb +3 -0
  903. data/spec/{app → support}/models/quiz.rb +3 -0
  904. data/spec/{app → support}/models/rating.rb +3 -0
  905. data/spec/{app → support}/models/record.rb +3 -0
  906. data/spec/{app → support}/models/registry.rb +3 -0
  907. data/spec/{app → support}/models/role.rb +3 -0
  908. data/spec/{app → support}/models/root_category.rb +3 -0
  909. data/spec/{app → support}/models/sandwich.rb +3 -0
  910. data/spec/{app → support}/models/scheduler.rb +3 -0
  911. data/spec/support/models/scribe.rb +8 -0
  912. data/spec/support/models/sealer.rb +8 -0
  913. data/spec/support/models/seat.rb +25 -0
  914. data/spec/{app → support}/models/seo.rb +3 -0
  915. data/spec/support/models/series.rb +8 -0
  916. data/spec/{app → support}/models/server.rb +3 -0
  917. data/spec/{app → support}/models/service.rb +3 -0
  918. data/spec/{app → support}/models/shape.rb +5 -2
  919. data/spec/{app → support}/models/shelf.rb +3 -0
  920. data/spec/{app → support}/models/shipment_address.rb +3 -0
  921. data/spec/{app → support}/models/shipping_container.rb +3 -0
  922. data/spec/{app → support}/models/shipping_pack.rb +3 -0
  923. data/spec/support/models/shirt.rb +12 -0
  924. data/spec/{app → support}/models/shop.rb +3 -0
  925. data/spec/{app → support}/models/short_agent.rb +3 -0
  926. data/spec/{app → support}/models/short_quiz.rb +3 -0
  927. data/spec/{app → support}/models/simple.rb +3 -0
  928. data/spec/{app → support}/models/slave.rb +3 -0
  929. data/spec/{app → support}/models/song.rb +3 -0
  930. data/spec/{app → support}/models/sound.rb +3 -0
  931. data/spec/support/models/spacer.rb +8 -0
  932. data/spec/{app → support}/models/square.rb +3 -0
  933. data/spec/{app → support}/models/staff.rb +3 -0
  934. data/spec/{app → support}/models/store_as_dup_test1.rb +3 -0
  935. data/spec/{app → support}/models/store_as_dup_test2.rb +3 -0
  936. data/spec/{app → support}/models/store_as_dup_test3.rb +1 -0
  937. data/spec/{app → support}/models/store_as_dup_test4.rb +1 -0
  938. data/spec/support/models/strategy.rb +6 -0
  939. data/spec/support/models/sub_item.rb +6 -0
  940. data/spec/{app → support}/models/subscription.rb +3 -0
  941. data/spec/{app → support}/models/survey.rb +3 -0
  942. data/spec/{app → support}/models/symptom.rb +3 -0
  943. data/spec/support/models/system_role.rb +7 -0
  944. data/spec/{app → support}/models/tag.rb +3 -0
  945. data/spec/{app → support}/models/target.rb +3 -0
  946. data/spec/{app → support}/models/template.rb +3 -0
  947. data/spec/{app → support}/models/thing.rb +3 -0
  948. data/spec/support/models/threadlocker.rb +8 -0
  949. data/spec/support/models/title.rb +6 -0
  950. data/spec/support/models/tool.rb +11 -0
  951. data/spec/{app → support}/models/topping.rb +3 -0
  952. data/spec/support/models/toy.rb +10 -0
  953. data/spec/{app → support}/models/track.rb +3 -0
  954. data/spec/{app → support}/models/translation.rb +3 -0
  955. data/spec/{app → support}/models/tree.rb +3 -0
  956. data/spec/support/models/truck.rb +8 -0
  957. data/spec/{app → support}/models/updatable.rb +1 -0
  958. data/spec/{app → support}/models/user.rb +3 -0
  959. data/spec/{app → support}/models/user_account.rb +3 -0
  960. data/spec/{app → support}/models/validation_callback.rb +3 -0
  961. data/spec/support/models/vehicle.rb +19 -0
  962. data/spec/{app → support}/models/version.rb +3 -0
  963. data/spec/{app → support}/models/vertex.rb +4 -1
  964. data/spec/{app → support}/models/vet_visit.rb +3 -0
  965. data/spec/{app → support}/models/video.rb +3 -0
  966. data/spec/support/models/video_game.rb +4 -0
  967. data/spec/support/models/washer.rb +8 -0
  968. data/spec/{app → support}/models/weapon.rb +3 -0
  969. data/spec/{app → support}/models/wiki_page.rb +4 -0
  970. data/spec/{app → support}/models/word.rb +3 -0
  971. data/spec/{app → support}/models/word_origin.rb +3 -0
  972. data/spec/{app → support}/models/writer.rb +5 -2
  973. data/spec/support/shared/time.rb +54 -0
  974. data/spec/support/spec_config.rb +14 -3
  975. data.tar.gz.sig +0 -0
  976. metadata +1035 -732
  977. metadata.gz.sig +2 -2
  978. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  979. data/lib/mongoid/matchable/all.rb +0 -28
  980. data/lib/mongoid/matchable/and.rb +0 -30
  981. data/lib/mongoid/matchable/default.rb +0 -119
  982. data/lib/mongoid/matchable/elem_match.rb +0 -34
  983. data/lib/mongoid/matchable/eq.rb +0 -22
  984. data/lib/mongoid/matchable/exists.rb +0 -23
  985. data/lib/mongoid/matchable/gt.rb +0 -23
  986. data/lib/mongoid/matchable/gte.rb +0 -23
  987. data/lib/mongoid/matchable/in.rb +0 -24
  988. data/lib/mongoid/matchable/lt.rb +0 -23
  989. data/lib/mongoid/matchable/lte.rb +0 -23
  990. data/lib/mongoid/matchable/ne.rb +0 -21
  991. data/lib/mongoid/matchable/nin.rb +0 -22
  992. data/lib/mongoid/matchable/nor.rb +0 -37
  993. data/lib/mongoid/matchable/or.rb +0 -33
  994. data/lib/mongoid/matchable/regexp.rb +0 -27
  995. data/lib/mongoid/matchable/size.rb +0 -21
  996. data/spec/app/models/actress.rb +0 -2
  997. data/spec/app/models/bed.rb +0 -1
  998. data/spec/app/models/big_palette.rb +0 -2
  999. data/spec/app/models/browser.rb +0 -6
  1000. data/spec/app/models/car.rb +0 -1
  1001. data/spec/app/models/employer.rb +0 -5
  1002. data/spec/app/models/eraser.rb +0 -1
  1003. data/spec/app/models/html_writer.rb +0 -3
  1004. data/spec/app/models/learner.rb +0 -2
  1005. data/spec/app/models/my_hash.rb +0 -2
  1006. data/spec/app/models/other_owner_object.rb +0 -2
  1007. data/spec/app/models/pack.rb +0 -3
  1008. data/spec/app/models/pdf_writer.rb +0 -3
  1009. data/spec/app/models/pencil.rb +0 -1
  1010. data/spec/app/models/profile.rb +0 -5
  1011. data/spec/app/models/series.rb +0 -4
  1012. data/spec/app/models/strategy.rb +0 -3
  1013. data/spec/app/models/sub_item.rb +0 -3
  1014. data/spec/app/models/title.rb +0 -3
  1015. data/spec/app/models/tool.rb +0 -8
  1016. data/spec/app/models/truck.rb +0 -3
  1017. data/spec/app/models/vehicle.rb +0 -11
  1018. data/spec/app/models/video_game.rb +0 -1
  1019. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1020. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1021. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1022. data/spec/mongoid/matchable/default_spec.rb +0 -137
  1023. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1024. data/spec/mongoid/matchable/eq_spec.rb +0 -48
  1025. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1026. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1027. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1028. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1029. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1030. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1031. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1032. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1033. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1034. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1035. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1036. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1037. data/spec/mongoid/matchable_spec.rb +0 -853
  1038. data/spec/support/child_process_helper.rb +0 -76
  1039. data/spec/support/cluster_config.rb +0 -158
@@ -1,506 +1,542 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
5
7
  class HasMany
6
- module Targets
7
-
8
- # This class is the wrapper for all relational associations that have a
9
- # target that can be a criteria or array of _loaded documents. This
10
- # handles both cases or a combination of the two.
11
- class Enumerable
12
- include ::Enumerable
13
-
14
- # The three main instance variables are collections of documents.
15
- #
16
- # @attribute [rw] _added Documents that have been appended.
17
- # @attribute [rw] _loaded Persisted documents that have been _loaded.
18
- # @attribute [rw] _unloaded A criteria representing persisted docs.
19
- attr_accessor :_added, :_loaded, :_unloaded
20
-
21
- delegate :is_a?, :kind_of?, to: []
22
-
23
- # Check if the enumerable is equal to the other object.
24
- #
25
- # @example Check equality.
26
- # enumerable == []
27
- #
28
- # @param [ Enumerable ] other The other enumerable.
29
- #
30
- # @return [ true, false ] If the objects are equal.
31
- #
32
- # @since 2.1.0
33
- def ==(other)
34
- return false unless other.respond_to?(:entries)
35
- entries == other.entries
36
- end
37
8
 
38
- # Check equality of the enumerable against the provided object for case
39
- # statements.
40
- #
41
- # @example Check case equality.
42
- # enumerable === Array
43
- #
44
- # @param [ Object ] other The object to check.
45
- #
46
- # @return [ true, false ] If the objects are equal in a case.
47
- #
48
- # @since 3.1.4
49
- def ===(other)
50
- other.class == Class ? (Array == other || Enumerable == other) : self == other
51
- end
9
+ # This class is the wrapper for all referenced associations that have a
10
+ # target that can be a criteria or array of _loaded documents. This
11
+ # handles both cases or a combination of the two.
12
+ class Enumerable
13
+ extend Forwardable
14
+ include ::Enumerable
15
+
16
+ # The three main instance variables are collections of documents.
17
+ #
18
+ # @attribute [rw] _added Documents that have been appended.
19
+ # @attribute [rw] _loaded Persisted documents that have been _loaded.
20
+ # @attribute [rw] _unloaded A criteria representing persisted docs.
21
+ attr_accessor :_added, :_loaded, :_unloaded
22
+
23
+ def_delegators [], :is_a?, :kind_of?
24
+
25
+ # Check if the enumerable is equal to the other object.
26
+ #
27
+ # @example Check equality.
28
+ # enumerable == []
29
+ #
30
+ # @param [ Enumerable ] other The other enumerable.
31
+ #
32
+ # @return [ true, false ] If the objects are equal.
33
+ #
34
+ # @since 2.1.0
35
+ def ==(other)
36
+ return false unless other.respond_to?(:entries)
37
+ entries == other.entries
38
+ end
52
39
 
53
- # Append a document to the enumerable.
54
- #
55
- # @example Append the document.
56
- # enumerable << document
57
- #
58
- # @param [ Document ] document The document to append.
59
- #
60
- # @return [ Document ] The document.
61
- #
62
- # @since 2.1.0
63
- def <<(document)
64
- _added[document._id] = document
65
- self
66
- end
40
+ # Check equality of the enumerable against the provided object for case
41
+ # statements.
42
+ #
43
+ # @example Check case equality.
44
+ # enumerable === Array
45
+ #
46
+ # @param [ Object ] other The object to check.
47
+ #
48
+ # @return [ true, false ] If the objects are equal in a case.
49
+ #
50
+ # @since 3.1.4
51
+ def ===(other)
52
+ other.class == Class ? (Array == other || Enumerable == other) : self == other
53
+ end
67
54
 
68
- alias :push :<<
69
-
70
- # Clears out all the documents in this enumerable. If passed a block it
71
- # will yield to each document that is in memory.
72
- #
73
- # @example Clear out the enumerable.
74
- # enumerable.clear
75
- #
76
- # @example Clear out the enumerable with a block.
77
- # enumerable.clear do |doc|
78
- # doc.unbind
79
- # end
80
- #
81
- # @return [ Array<Document> ] The cleared out _added docs.
82
- #
83
- # @since 2.1.0
84
- def clear
85
- if block_given?
86
- in_memory { |doc| yield(doc) }
87
- end
88
- _loaded.clear and _added.clear
89
- end
55
+ # Append a document to the enumerable.
56
+ #
57
+ # @example Append the document.
58
+ # enumerable << document
59
+ #
60
+ # @param [ Document ] document The document to append.
61
+ #
62
+ # @return [ Document ] The document.
63
+ #
64
+ # @since 2.1.0
65
+ def <<(document)
66
+ _added[document._id] = document
67
+ self
68
+ end
90
69
 
91
- # Clones each document in the enumerable.
92
- #
93
- # @note This loads all documents into memory.
94
- #
95
- # @example Clone the enumerable.
96
- # enumerable.clone
97
- #
98
- # @return [ Array<Document> ] An array clone of the enumerable.
99
- #
100
- # @since 2.1.6
101
- def clone
102
- collect { |doc| doc.clone }
70
+ alias :push :<<
71
+
72
+ # Clears out all the documents in this enumerable. If passed a block it
73
+ # will yield to each document that is in memory.
74
+ #
75
+ # @example Clear out the enumerable.
76
+ # enumerable.clear
77
+ #
78
+ # @example Clear out the enumerable with a block.
79
+ # enumerable.clear do |doc|
80
+ # doc.unbind
81
+ # end
82
+ #
83
+ # @return [ Array<Document> ] The cleared out _added docs.
84
+ #
85
+ # @since 2.1.0
86
+ def clear
87
+ if block_given?
88
+ in_memory { |doc| yield(doc) }
103
89
  end
90
+ _loaded.clear and _added.clear
91
+ end
92
+
93
+ # Clones each document in the enumerable.
94
+ #
95
+ # @note This loads all documents into memory.
96
+ #
97
+ # @example Clone the enumerable.
98
+ # enumerable.clone
99
+ #
100
+ # @return [ Array<Document> ] An array clone of the enumerable.
101
+ #
102
+ # @since 2.1.6
103
+ def clone
104
+ collect { |doc| doc.clone }
105
+ end
104
106
 
105
- # Delete the supplied document from the enumerable.
106
- #
107
- # @example Delete the document.
108
- # enumerable.delete(document)
109
- #
110
- # @param [ Document ] document The document to delete.
111
- #
112
- # @return [ Document ] The deleted document.
113
- #
114
- # @since 2.1.0
115
- def delete(document)
116
- doc = (_loaded.delete(document._id) || _added.delete(document._id))
117
- unless doc
118
- if _unloaded && _unloaded.where(_id: document._id).exists?
119
- yield(document) if block_given?
120
- return document
121
- end
107
+ # Delete the supplied document from the enumerable.
108
+ #
109
+ # @example Delete the document.
110
+ # enumerable.delete(document)
111
+ #
112
+ # @param [ Document ] document The document to delete.
113
+ #
114
+ # @return [ Document ] The deleted document.
115
+ #
116
+ # @since 2.1.0
117
+ def delete(document)
118
+ doc = (_loaded.delete(document._id) || _added.delete(document._id))
119
+ unless doc
120
+ if _unloaded && _unloaded.where(_id: document._id).exists?
121
+ yield(document) if block_given?
122
+ return document
122
123
  end
123
- yield(doc) if block_given?
124
- doc
125
124
  end
125
+ yield(doc) if block_given?
126
+ doc
127
+ end
126
128
 
127
- # Deletes every document in the enumerable for where the block returns
128
- # true.
129
- #
130
- # @note This operation loads all documents from the database.
131
- #
132
- # @example Delete all matching documents.
133
- # enumerable.delete_if do |doc|
134
- # dod._id == _id
135
- # end
136
- #
137
- # @return [ Array<Document> ] The remaining docs.
138
- #
139
- # @since 2.1.0
140
- def delete_if(&block)
141
- load_all!
142
- deleted = in_memory.select(&block)
143
- deleted.each do |doc|
144
- _loaded.delete(doc._id)
145
- _added.delete(doc._id)
146
- end
147
- self
129
+ # Deletes every document in the enumerable for where the block returns
130
+ # true.
131
+ #
132
+ # @note This operation loads all documents from the database.
133
+ #
134
+ # @example Delete all matching documents.
135
+ # enumerable.delete_if do |doc|
136
+ # dod._id == _id
137
+ # end
138
+ #
139
+ # @return [ Array<Document> ] The remaining docs.
140
+ #
141
+ # @since 2.1.0
142
+ def delete_if(&block)
143
+ load_all!
144
+ deleted = in_memory.select(&block)
145
+ deleted.each do |doc|
146
+ _loaded.delete(doc._id)
147
+ _added.delete(doc._id)
148
148
  end
149
+ self
150
+ end
149
151
 
150
- # Iterating over this enumerable has to handle a few different
151
- # scenarios.
152
- #
153
- # If the enumerable has its criteria _loaded into memory then it yields
154
- # to all the _loaded docs and all the _added docs.
155
- #
156
- # If the enumerable has not _loaded the criteria then it iterates over
157
- # the cursor while loading the documents and then iterates over the
158
- # _added docs.
159
- #
160
- # If no block is passed then it returns an enumerator containing all
161
- # docs.
162
- #
163
- # @example Iterate over the enumerable.
164
- # enumerable.each do |doc|
165
- # puts doc
166
- # end
167
- #
168
- # @example return an enumerator containing all the docs
169
- #
170
- # a = enumerable.each
171
- #
172
- # @return [ true ] That the enumerable is now _loaded.
173
- #
174
- # @since 2.1.0
175
- def each
176
- unless block_given?
177
- return to_enum
178
- end
179
- if _loaded?
180
- _loaded.each_pair do |id, doc|
181
- document = _added.delete(doc._id) || doc
182
- set_base(document)
183
- yield(document)
184
- end
185
- else
186
- unloaded_documents.each do |doc|
187
- document = _added.delete(doc._id) || _loaded.delete(doc._id) || doc
188
- _loaded[document._id] = document
189
- set_base(document)
190
- yield(document)
191
- end
152
+ # Iterating over this enumerable has to handle a few different
153
+ # scenarios.
154
+ #
155
+ # If the enumerable has its criteria _loaded into memory then it yields
156
+ # to all the _loaded docs and all the _added docs.
157
+ #
158
+ # If the enumerable has not _loaded the criteria then it iterates over
159
+ # the cursor while loading the documents and then iterates over the
160
+ # _added docs.
161
+ #
162
+ # If no block is passed then it returns an enumerator containing all
163
+ # docs.
164
+ #
165
+ # @example Iterate over the enumerable.
166
+ # enumerable.each do |doc|
167
+ # puts doc
168
+ # end
169
+ #
170
+ # @example return an enumerator containing all the docs
171
+ #
172
+ # a = enumerable.each
173
+ #
174
+ # @return [ true ] That the enumerable is now _loaded.
175
+ #
176
+ # @since 2.1.0
177
+ def each
178
+ unless block_given?
179
+ return to_enum
180
+ end
181
+ if _loaded?
182
+ _loaded.each_pair do |id, doc|
183
+ document = _added.delete(doc._id) || doc
184
+ set_base(document)
185
+ yield(document)
192
186
  end
193
- _added.each_pair do |id, doc|
194
- yield(doc)
187
+ else
188
+ unloaded_documents.each do |doc|
189
+ document = _added.delete(doc._id) || _loaded.delete(doc._id) || doc
190
+ _loaded[document._id] = document
191
+ set_base(document)
192
+ yield(document)
195
193
  end
196
- @executed = true
197
194
  end
198
-
199
- # Is the enumerable empty? Will determine if the count is zero based on
200
- # whether or not it is _loaded.
201
- #
202
- # @example Is the enumerable empty?
203
- # enumerable.empty?
204
- #
205
- # @return [ true, false ] If the enumerable is empty.
206
- #
207
- # @since 2.1.0
208
- def empty?
209
- if _loaded?
210
- in_memory.count == 0
211
- else
212
- _unloaded.count + _added.count == 0
213
- end
195
+ _added.each_pair do |id, doc|
196
+ yield(doc)
214
197
  end
198
+ @executed = true
199
+ end
215
200
 
216
- # Get the first document in the enumerable. Will check the persisted
217
- # documents first. Does not load the entire enumerable.
218
- #
219
- # @example Get the first document.
220
- # enumerable.first
221
- #
222
- # @note Automatically adding a sort on _id when no other sort is
223
- # defined on the criteria has the potential to cause bad performance issues.
224
- # If you experience unexpected poor performance when using #first or #last,
225
- # use the option { id_sort: :none }.
226
- # Be aware that #first/#last won't guarantee order in this case.
227
- #
228
- # @param [ Hash ] opts The options for the query returning the first document.
229
- #
230
- # @option opts [ :none ] :id_sort Don't apply a sort on _id.
231
- #
232
- # @return [ Document ] The first document found.
233
- #
234
- # @since 2.1.0
235
- def first(opts = {})
236
- _loaded.try(:values).try(:first) ||
237
- _added[(ul = _unloaded.try(:first, opts)).try(:id)] ||
238
- ul ||
239
- _added.values.try(:first)
201
+ # Is the enumerable empty? Will determine if the count is zero based on
202
+ # whether or not it is _loaded.
203
+ #
204
+ # @example Is the enumerable empty?
205
+ # enumerable.empty?
206
+ #
207
+ # @return [ true, false ] If the enumerable is empty.
208
+ #
209
+ # @since 2.1.0
210
+ def empty?
211
+ if _loaded?
212
+ in_memory.empty?
213
+ else
214
+ _added.empty? && !_unloaded.exists?
240
215
  end
216
+ end
241
217
 
242
- # Initialize the new enumerable either with a criteria or an array.
243
- #
244
- # @example Initialize the enumerable with a criteria.
245
- # Enumberable.new(Post.where(:person_id => id))
246
- #
247
- # @example Initialize the enumerable with an array.
248
- # Enumerable.new([ post ])
249
- #
250
- # @param [ Criteria, Array<Document> ] target The wrapped object.
251
- #
252
- # @since 2.1.0
253
- def initialize(target, base = nil, association = nil)
254
- @_base = base
255
- @_association = association
256
- if target.is_a?(Criteria)
257
- @_added, @executed, @_loaded, @_unloaded = {}, false, {}, target
258
- else
259
- @_added, @executed = {}, true
260
- @_loaded = target.inject({}) do |_target, doc|
261
- _target[doc._id] = doc if doc
262
- _target
263
- end
218
+ # Returns whether the association has any documents, optionally
219
+ # subject to the provided filters.
220
+ #
221
+ # This method returns true if the association has any persisted
222
+ # documents and if it has any not yet persisted documents.
223
+ #
224
+ # If the association is already loaded, this method inspects the
225
+ # loaded documents and does not query the database. If the
226
+ # association is not loaded, the argument-less and block-less
227
+ # version does not load the association; the other versions
228
+ # (that delegate to Enumerable) may or may not load the association
229
+ # completely depending on whether it is iterated to completion.
230
+ #
231
+ # This method can take a parameter and a block. The behavior with
232
+ # either the paramater or the block is delegated to the standard
233
+ # library Enumerable module.
234
+ #
235
+ # Note that when Enumerable's any? method is invoked with both
236
+ # a block and a pattern, it only uses the pattern.
237
+ #
238
+ # @param [ Object ] condition The condition that documents
239
+ # must satisfy. See Enumerable documentation for details.
240
+ #
241
+ # @return [ true, false ] If the association has any documents.
242
+ def any?(*args)
243
+ return super if args.any? || block_given?
244
+
245
+ !empty?
246
+ end
247
+
248
+ # Get the first document in the enumerable. Will check the persisted
249
+ # documents first. Does not load the entire enumerable.
250
+ #
251
+ # @example Get the first document.
252
+ # enumerable.first
253
+ #
254
+ # @note Automatically adding a sort on _id when no other sort is
255
+ # defined on the criteria has the potential to cause bad performance issues.
256
+ # If you experience unexpected poor performance when using #first or #last,
257
+ # use the option { id_sort: :none }.
258
+ # Be aware that #first/#last won't guarantee order in this case.
259
+ #
260
+ # @param [ Hash ] opts The options for the query returning the first document.
261
+ #
262
+ # @option opts [ :none ] :id_sort Don't apply a sort on _id.
263
+ #
264
+ # @return [ Document ] The first document found.
265
+ #
266
+ # @since 2.1.0
267
+ def first(opts = {})
268
+ _loaded.try(:values).try(:first) ||
269
+ _added[(ul = _unloaded.try(:first, opts)).try(:_id)] ||
270
+ ul ||
271
+ _added.values.try(:first)
272
+ end
273
+
274
+ # Initialize the new enumerable either with a criteria or an array.
275
+ #
276
+ # @example Initialize the enumerable with a criteria.
277
+ # Enumberable.new(Post.where(:person_id => id))
278
+ #
279
+ # @example Initialize the enumerable with an array.
280
+ # Enumerable.new([ post ])
281
+ #
282
+ # @param [ Criteria, Array<Document> ] target The wrapped object.
283
+ #
284
+ # @since 2.1.0
285
+ def initialize(target, base = nil, association = nil)
286
+ @_base = base
287
+ @_association = association
288
+ if target.is_a?(Criteria)
289
+ @_added, @executed, @_loaded, @_unloaded = {}, false, {}, target
290
+ else
291
+ @_added, @executed = {}, true
292
+ @_loaded = target.inject({}) do |_target, doc|
293
+ _target[doc._id] = doc if doc
294
+ _target
264
295
  end
265
296
  end
297
+ end
266
298
 
267
- # Does the target include the provided document?
268
- #
269
- # @example Does the target include the document?
270
- # enumerable.include?(document)
271
- #
272
- # @param [ Document ] doc The document to check.
273
- #
274
- # @return [ true, false ] If the document is in the target.
275
- #
276
- # @since 3.0.0
277
- def include?(doc)
278
- return super unless _unloaded
279
- _unloaded.where(_id: doc._id).exists? || _added.has_key?(doc._id)
280
- end
299
+ # Does the target include the provided document?
300
+ #
301
+ # @example Does the target include the document?
302
+ # enumerable.include?(document)
303
+ #
304
+ # @param [ Document ] doc The document to check.
305
+ #
306
+ # @return [ true, false ] If the document is in the target.
307
+ #
308
+ # @since 3.0.0
309
+ def include?(doc)
310
+ return super unless _unloaded
311
+ _unloaded.where(_id: doc._id).exists? || _added.has_key?(doc._id)
312
+ end
281
313
 
282
- # Inspection will just inspect the entries for nice array-style
283
- # printing.
284
- #
285
- # @example Inspect the enumerable.
286
- # enumerable.inspect
287
- #
288
- # @return [ String ] The inspected enum.
289
- #
290
- # @since 2.1.0
291
- def inspect
292
- entries.inspect
293
- end
314
+ # Inspection will just inspect the entries for nice array-style
315
+ # printing.
316
+ #
317
+ # @example Inspect the enumerable.
318
+ # enumerable.inspect
319
+ #
320
+ # @return [ String ] The inspected enum.
321
+ #
322
+ # @since 2.1.0
323
+ def inspect
324
+ entries.inspect
325
+ end
294
326
 
295
- # Return all the documents in the enumerable that have been _loaded or
296
- # _added.
297
- #
298
- # @note When passed a block it yields to each document.
299
- #
300
- # @example Get the in memory docs.
301
- # enumerable.in_memory
302
- #
303
- # @return [ Array<Document> ] The in memory docs.
304
- #
305
- # @since 2.1.0
306
- def in_memory
307
- docs = (_loaded.values + _added.values)
308
- docs.each do |doc|
309
- yield(doc) if block_given?
310
- end
327
+ # Return all the documents in the enumerable that have been _loaded or
328
+ # _added.
329
+ #
330
+ # @note When passed a block it yields to each document.
331
+ #
332
+ # @example Get the in memory docs.
333
+ # enumerable.in_memory
334
+ #
335
+ # @return [ Array<Document> ] The in memory docs.
336
+ #
337
+ # @since 2.1.0
338
+ def in_memory
339
+ docs = (_loaded.values + _added.values)
340
+ docs.each do |doc|
341
+ yield(doc) if block_given?
311
342
  end
343
+ end
312
344
 
313
- # Get the last document in the enumerable. Will check the new
314
- # documents first. Does not load the entire enumerable.
315
- #
316
- # @example Get the last document.
317
- # enumerable.last
318
- #
319
- # @note Automatically adding a sort on _id when no other sort is
320
- # defined on the criteria has the potential to cause bad performance issues.
321
- # If you experience unexpected poor performance when using #first or #last,
322
- # use the option { id_sort: :none }.
323
- # Be aware that #first/#last won't guarantee order in this case.
324
- #
325
- # @param [ Hash ] opts The options for the query returning the first document.
326
- #
327
- # @option opts [ :none ] :id_sort Don't apply a sort on _id.
328
- #
329
- # @return [ Document ] The last document found.
330
- #
331
- # @since 2.1.0
332
- def last(opts = {})
333
- _added.values.try(:last) ||
334
- _loaded.try(:values).try(:last) ||
335
- _added[(ul = _unloaded.try(:last, opts)).try(:id)] ||
336
- ul
337
- end
345
+ # Get the last document in the enumerable. Will check the new
346
+ # documents first. Does not load the entire enumerable.
347
+ #
348
+ # @example Get the last document.
349
+ # enumerable.last
350
+ #
351
+ # @note Automatically adding a sort on _id when no other sort is
352
+ # defined on the criteria has the potential to cause bad performance issues.
353
+ # If you experience unexpected poor performance when using #first or #last,
354
+ # use the option { id_sort: :none }.
355
+ # Be aware that #first/#last won't guarantee order in this case.
356
+ #
357
+ # @param [ Hash ] opts The options for the query returning the first document.
358
+ #
359
+ # @option opts [ :none ] :id_sort Don't apply a sort on _id.
360
+ #
361
+ # @return [ Document ] The last document found.
362
+ #
363
+ # @since 2.1.0
364
+ def last(opts = {})
365
+ _added.values.try(:last) ||
366
+ _loaded.try(:values).try(:last) ||
367
+ _added[(ul = _unloaded.try(:last, opts)).try(:_id)] ||
368
+ ul
369
+ end
338
370
 
339
- # Loads all the documents in the enumerable from the database.
340
- #
341
- # @example Load all the documents.
342
- # enumerable.load_all!
343
- #
344
- # @return [ true ] That the enumerable is _loaded.
345
- #
346
- # @since 2.1.0
347
- alias :load_all! :entries
348
-
349
- # Has the enumerable been _loaded? This will be true if the criteria has
350
- # been executed or we manually load the entire thing.
351
- #
352
- # @example Is the enumerable _loaded?
353
- # enumerable._loaded?
354
- #
355
- # @return [ true, false ] If the enumerable has been _loaded.
356
- #
357
- # @since 2.1.0
358
- def _loaded?
359
- !!@executed
360
- end
371
+ # Loads all the documents in the enumerable from the database.
372
+ #
373
+ # @example Load all the documents.
374
+ # enumerable.load_all!
375
+ #
376
+ # @return [ true ] That the enumerable is _loaded.
377
+ #
378
+ # @since 2.1.0
379
+ alias :load_all! :entries
380
+
381
+ # Has the enumerable been _loaded? This will be true if the criteria has
382
+ # been executed or we manually load the entire thing.
383
+ #
384
+ # @example Is the enumerable _loaded?
385
+ # enumerable._loaded?
386
+ #
387
+ # @return [ true, false ] If the enumerable has been _loaded.
388
+ #
389
+ # @since 2.1.0
390
+ def _loaded?
391
+ !!@executed
392
+ end
361
393
 
362
- # Provides the data needed to Marshal.dump an enumerable proxy.
363
- #
364
- # @example Dump the proxy.
365
- # Marshal.dump(proxy)
366
- #
367
- # @return [ Array<Object> ] The dumped data.
368
- #
369
- # @since 3.0.15
370
- def marshal_dump
371
- [_added, _loaded, _unloaded, @executed]
372
- end
394
+ # Provides the data needed to Marshal.dump an enumerable proxy.
395
+ #
396
+ # @example Dump the proxy.
397
+ # Marshal.dump(proxy)
398
+ #
399
+ # @return [ Array<Object> ] The dumped data.
400
+ #
401
+ # @since 3.0.15
402
+ def marshal_dump
403
+ [_added, _loaded, _unloaded, @executed]
404
+ end
373
405
 
374
- # Loads the data needed to Marshal.load an enumerable proxy.
375
- #
376
- # @example Load the proxy.
377
- # Marshal.load(proxy)
378
- #
379
- # @return [ Array<Object> ] The dumped data.
380
- #
381
- # @since 3.0.15
382
- def marshal_load(data)
383
- @_added, @_loaded, @_unloaded, @executed = data
384
- end
406
+ # Loads the data needed to Marshal.load an enumerable proxy.
407
+ #
408
+ # @example Load the proxy.
409
+ # Marshal.load(proxy)
410
+ #
411
+ # @return [ Array<Object> ] The dumped data.
412
+ #
413
+ # @since 3.0.15
414
+ def marshal_load(data)
415
+ @_added, @_loaded, @_unloaded, @executed = data
416
+ end
385
417
 
386
- # Reset the enumerable back to its persisted state.
387
- #
388
- # @example Reset the enumerable.
389
- # enumerable.reset
390
- #
391
- # @return [ false ] Always false.
392
- #
393
- # @since 2.1.0
394
- def reset
395
- _loaded.clear and _added.clear
396
- @executed = false
397
- end
418
+ # Reset the enumerable back to its persisted state.
419
+ #
420
+ # @example Reset the enumerable.
421
+ # enumerable.reset
422
+ #
423
+ # @return [ false ] Always false.
424
+ #
425
+ # @since 2.1.0
426
+ def reset
427
+ _loaded.clear
428
+ _added.clear
429
+ @executed = false
430
+ end
398
431
 
399
- # Resets the underlying unloaded criteria object with a new one. Used
400
- # my HABTM relations to keep the underlying array in sync.
401
- #
402
- # @example Reset the unloaded documents.
403
- # enumerable.reset_unloaded(criteria)
404
- #
405
- # @param [ Criteria ] criteria The criteria to replace with.
406
- #
407
- # @since 3.0.14
408
- def reset_unloaded(criteria)
409
- @_unloaded = criteria if _unloaded.is_a?(Criteria)
410
- end
432
+ # Resets the underlying unloaded criteria object with a new one. Used
433
+ # my HABTM associations to keep the underlying array in sync.
434
+ #
435
+ # @example Reset the unloaded documents.
436
+ # enumerable.reset_unloaded(criteria)
437
+ #
438
+ # @param [ Criteria ] criteria The criteria to replace with.
439
+ #
440
+ # @since 3.0.14
441
+ def reset_unloaded(criteria)
442
+ @_unloaded = criteria if _unloaded.is_a?(Criteria)
443
+ end
411
444
 
412
- # Does this enumerable respond to the provided method?
413
- #
414
- # @example Does the enumerable respond to the method?
415
- # enumerable.respond_to?(:sum)
416
- #
417
- # @param [ String, Symbol ] name The name of the method.
418
- # @param [ true, false ] include_private Whether to include private
419
- # methods.
420
- #
421
- # @return [ true, false ] Whether the enumerable responds.
422
- #
423
- # @since 2.1.0
424
- def respond_to?(name, include_private = false)
425
- [].respond_to?(name, include_private) || super
426
- end
445
+ # Does this enumerable respond to the provided method?
446
+ #
447
+ # @example Does the enumerable respond to the method?
448
+ # enumerable.respond_to?(:sum)
449
+ #
450
+ # @param [ String, Symbol ] name The name of the method.
451
+ # @param [ true, false ] include_private Whether to include private
452
+ # methods.
453
+ #
454
+ # @return [ true, false ] Whether the enumerable responds.
455
+ #
456
+ # @since 2.1.0
457
+ def respond_to?(name, include_private = false)
458
+ [].respond_to?(name, include_private) || super
459
+ end
427
460
 
428
- # Gets the total size of this enumerable. This is a combination of all
429
- # the persisted and unpersisted documents.
430
- #
431
- # @example Get the size.
432
- # enumerable.size
433
- #
434
- # @return [ Integer ] The size of the enumerable.
435
- #
436
- # @since 2.1.0
437
- def size
438
- count = (_unloaded ? _unloaded.count : _loaded.count)
439
- if count.zero?
440
- count + _added.count
441
- else
442
- count + _added.values.count { |d| d.new_record? }
443
- end
461
+ # Gets the total size of this enumerable. This is a combination of all
462
+ # the persisted and unpersisted documents.
463
+ #
464
+ # @example Get the size.
465
+ # enumerable.size
466
+ #
467
+ # @return [ Integer ] The size of the enumerable.
468
+ #
469
+ # @since 2.1.0
470
+ def size
471
+ count = (_unloaded ? _unloaded.count : _loaded.count)
472
+ if count.zero?
473
+ count + _added.count
474
+ else
475
+ count + _added.values.count { |d| d.new_record? }
444
476
  end
477
+ end
445
478
 
446
- alias :length :size
447
-
448
- # Send #to_json to the entries.
449
- #
450
- # @example Get the enumerable as json.
451
- # enumerable.to_json
452
- #
453
- # @param [ Hash ] options Optional parameters.
454
- #
455
- # @return [ String ] The entries all _loaded as a string.
456
- #
457
- # @since 2.2.0
458
- def to_json(options = {})
459
- entries.to_json(options)
460
- end
479
+ alias :length :size
480
+
481
+ # Send #to_json to the entries.
482
+ #
483
+ # @example Get the enumerable as json.
484
+ # enumerable.to_json
485
+ #
486
+ # @param [ Hash ] options Optional parameters.
487
+ #
488
+ # @return [ String ] The entries all _loaded as a string.
489
+ #
490
+ # @since 2.2.0
491
+ def to_json(options = {})
492
+ entries.to_json(options)
493
+ end
461
494
 
462
- # Send #as_json to the entries, without encoding.
463
- #
464
- # @example Get the enumerable as json.
465
- # enumerable.as_json
466
- #
467
- # @param [ Hash ] options Optional parameters.
468
- #
469
- # @return [ Hash ] The entries all _loaded as a hash.
470
- #
471
- # @since 2.2.0
472
- def as_json(options = {})
473
- entries.as_json(options)
474
- end
495
+ # Send #as_json to the entries, without encoding.
496
+ #
497
+ # @example Get the enumerable as json.
498
+ # enumerable.as_json
499
+ #
500
+ # @param [ Hash ] options Optional parameters.
501
+ #
502
+ # @return [ Hash ] The entries all _loaded as a hash.
503
+ #
504
+ # @since 2.2.0
505
+ def as_json(options = {})
506
+ entries.as_json(options)
507
+ end
475
508
 
476
- # Return all the unique documents in the enumerable.
477
- #
478
- # @note This operation loads all documents from the database.
479
- #
480
- # @example Get all the unique documents.
481
- # enumerable.uniq
482
- #
483
- # @return [ Array<Document> ] The unique documents.
484
- #
485
- # @since 2.1.0
486
- def uniq
487
- entries.uniq
488
- end
509
+ # Return all the unique documents in the enumerable.
510
+ #
511
+ # @note This operation loads all documents from the database.
512
+ #
513
+ # @example Get all the unique documents.
514
+ # enumerable.uniq
515
+ #
516
+ # @return [ Array<Document> ] The unique documents.
517
+ #
518
+ # @since 2.1.0
519
+ def uniq
520
+ entries.uniq
521
+ end
489
522
 
490
- private
523
+ private
491
524
 
492
- def set_base(document)
493
- if @_association.is_a?(Referenced::HasMany)
494
- document.set_relation(@_association.inverse, @_base) if @_association
495
- end
525
+ def set_base(document)
526
+ if @_association.is_a?(Referenced::HasMany)
527
+ document.set_relation(@_association.inverse, @_base) if @_association
496
528
  end
529
+ end
497
530
 
498
- def method_missing(name, *args, &block)
499
- entries.send(name, *args, &block)
500
- end
531
+ ruby2_keywords def method_missing(name, *args, &block)
532
+ entries.send(name, *args, &block)
533
+ end
501
534
 
502
- def unloaded_documents
503
- _unloaded.selector.values.any?(&:blank_criteria?) ? [] : _unloaded
535
+ def unloaded_documents
536
+ if _unloaded.selector._mongoid_unsatisfiable_criteria?
537
+ []
538
+ else
539
+ _unloaded
504
540
  end
505
541
  end
506
542
  end