mongoid 3.1.5 → 8.0.2

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 (1501) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +636 -33
  4. data/LICENSE +2 -1
  5. data/README.md +32 -24
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +301 -132
  8. data/lib/mongoid/association/accessors.rb +431 -0
  9. data/lib/mongoid/association/bindable.rb +227 -0
  10. data/lib/mongoid/association/builders.rb +86 -0
  11. data/lib/mongoid/association/constrainable.rb +42 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +57 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +398 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +74 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +135 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +42 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +571 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +53 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +164 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -0
  29. data/lib/mongoid/association/macros.rb +228 -0
  30. data/lib/mongoid/association/many.rb +202 -0
  31. data/lib/mongoid/association/marshalable.rb +31 -0
  32. data/lib/mongoid/association/nested/many.rb +192 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
  34. data/lib/mongoid/association/nested/one.rb +116 -0
  35. data/lib/mongoid/association/nested.rb +15 -0
  36. data/lib/mongoid/association/one.rb +53 -0
  37. data/lib/mongoid/association/options.rb +122 -0
  38. data/lib/mongoid/association/proxy.rb +200 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +74 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +83 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +124 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
  46. data/lib/mongoid/association/referenced/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +345 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +273 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +494 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +551 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +108 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +489 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +41 -61
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +24 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -34
  73. data/lib/mongoid/atomic/paths/root.rb +4 -20
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +52 -69
  76. data/lib/mongoid/attributes/dynamic.rb +141 -0
  77. data/lib/mongoid/attributes/nested.rb +93 -0
  78. data/lib/mongoid/attributes/processing.rb +35 -97
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +27 -10
  81. data/lib/mongoid/attributes.rb +159 -181
  82. data/lib/mongoid/cacheable.rb +33 -0
  83. data/lib/mongoid/changeable.rb +420 -0
  84. data/lib/mongoid/clients/factory.rb +105 -0
  85. data/lib/mongoid/clients/options.rb +111 -0
  86. data/lib/mongoid/clients/sessions.rb +113 -0
  87. data/lib/mongoid/clients/storage_options.rb +79 -0
  88. data/lib/mongoid/clients/validators/storage.rb +58 -0
  89. data/lib/mongoid/clients/validators.rb +3 -0
  90. data/lib/mongoid/clients.rb +79 -0
  91. data/lib/mongoid/composable.rb +128 -0
  92. data/lib/mongoid/config/environment.rb +51 -13
  93. data/lib/mongoid/config/options.rb +30 -18
  94. data/lib/mongoid/config/validators/client.rb +128 -0
  95. data/lib/mongoid/config/validators/option.rb +3 -4
  96. data/lib/mongoid/config/validators.rb +3 -2
  97. data/lib/mongoid/config.rb +170 -89
  98. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +33 -36
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +80 -79
  103. data/lib/mongoid/contextual/command.rb +8 -11
  104. data/lib/mongoid/contextual/geo_near.rb +42 -44
  105. data/lib/mongoid/contextual/map_reduce.rb +33 -127
  106. data/lib/mongoid/contextual/memory.rb +226 -88
  107. data/lib/mongoid/contextual/mongo.rb +466 -293
  108. data/lib/mongoid/contextual/none.rb +193 -0
  109. data/lib/mongoid/contextual/queryable.rb +3 -4
  110. data/lib/mongoid/contextual.rb +11 -11
  111. data/lib/mongoid/copyable.rb +68 -20
  112. data/lib/mongoid/criteria/findable.rb +143 -0
  113. data/lib/mongoid/criteria/includable.rb +92 -0
  114. data/lib/mongoid/criteria/inspectable.rb +24 -0
  115. data/lib/mongoid/criteria/marshalable.rb +55 -0
  116. data/lib/mongoid/criteria/modifiable.rb +235 -0
  117. data/lib/mongoid/criteria/options.rb +24 -0
  118. data/lib/mongoid/criteria/permission.rb +71 -0
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +109 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +151 -0
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +57 -0
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +33 -0
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +52 -0
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +163 -0
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +75 -0
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +81 -0
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +182 -0
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +102 -0
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +72 -0
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +33 -0
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +122 -0
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +74 -0
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +66 -0
  137. data/lib/mongoid/criteria/queryable/extensions.rb +25 -0
  138. data/lib/mongoid/criteria/queryable/key.rb +177 -0
  139. data/lib/mongoid/criteria/queryable/macroable.rb +26 -0
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +434 -0
  141. data/lib/mongoid/criteria/queryable/optional.rb +380 -0
  142. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +106 -0
  144. data/lib/mongoid/criteria/queryable/selectable.rb +937 -0
  145. data/lib/mongoid/criteria/queryable/selector.rb +287 -0
  146. data/lib/mongoid/criteria/queryable/smash.rb +128 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +90 -0
  149. data/lib/mongoid/criteria/scopable.rb +166 -0
  150. data/lib/mongoid/criteria.rb +177 -189
  151. data/lib/mongoid/deprecable.rb +36 -0
  152. data/lib/mongoid/deprecation.rb +25 -0
  153. data/lib/mongoid/document.rb +193 -139
  154. data/lib/mongoid/equality.rb +35 -18
  155. data/lib/mongoid/errors/ambiguous_relationship.rb +5 -6
  156. data/lib/mongoid/errors/callback.rb +2 -3
  157. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  158. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  159. data/lib/mongoid/errors/document_not_destroyed.rb +22 -0
  160. data/lib/mongoid/errors/document_not_found.rb +36 -21
  161. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  162. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +19 -0
  163. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  164. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  165. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  166. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  167. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  168. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  169. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  170. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  171. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  172. data/lib/mongoid/errors/invalid_field.rb +10 -9
  173. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  174. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  175. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  176. data/lib/mongoid/errors/invalid_find.rb +2 -3
  177. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  178. data/lib/mongoid/errors/invalid_index.rb +2 -3
  179. data/lib/mongoid/errors/invalid_options.rb +4 -5
  180. data/lib/mongoid/errors/invalid_path.rb +2 -3
  181. data/lib/mongoid/errors/invalid_persistence_option.rb +26 -0
  182. data/lib/mongoid/errors/invalid_query.rb +40 -0
  183. data/lib/mongoid/errors/invalid_relation.rb +61 -0
  184. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  185. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  186. data/lib/mongoid/errors/invalid_session_use.rb +21 -0
  187. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  188. data/lib/mongoid/errors/invalid_storage_options.rb +4 -5
  189. data/lib/mongoid/errors/invalid_storage_parent.rb +25 -0
  190. data/lib/mongoid/errors/invalid_time.rb +2 -3
  191. data/lib/mongoid/errors/inverse_not_found.rb +4 -5
  192. data/lib/mongoid/errors/mixed_client_configuration.rb +27 -0
  193. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  194. data/lib/mongoid/errors/mongoid_error.rb +22 -23
  195. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  196. data/lib/mongoid/errors/no_client_config.rb +21 -0
  197. data/lib/mongoid/errors/no_client_database.rb +26 -0
  198. data/lib/mongoid/errors/no_client_hosts.rb +26 -0
  199. data/lib/mongoid/errors/no_clients_config.rb +19 -0
  200. data/lib/mongoid/errors/no_default_client.rb +22 -0
  201. data/lib/mongoid/errors/no_environment.rb +2 -3
  202. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  203. data/lib/mongoid/errors/no_metadata.rb +2 -3
  204. data/lib/mongoid/errors/no_parent.rb +2 -3
  205. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  206. data/lib/mongoid/errors/readonly_document.rb +21 -0
  207. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  208. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  209. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  210. data/lib/mongoid/errors/unknown_model.rb +24 -0
  211. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  212. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  213. data/lib/mongoid/errors/validations.rb +2 -1
  214. data/lib/mongoid/errors.rb +30 -9
  215. data/lib/mongoid/evolvable.rb +4 -5
  216. data/lib/mongoid/extensions/array.rb +45 -52
  217. data/lib/mongoid/extensions/big_decimal.rb +41 -22
  218. data/lib/mongoid/extensions/binary.rb +42 -0
  219. data/lib/mongoid/extensions/boolean.rb +19 -17
  220. data/lib/mongoid/extensions/date.rb +33 -23
  221. data/lib/mongoid/extensions/date_time.rb +5 -13
  222. data/lib/mongoid/extensions/decimal128.rb +36 -0
  223. data/lib/mongoid/extensions/false_class.rb +5 -8
  224. data/lib/mongoid/extensions/float.rb +11 -16
  225. data/lib/mongoid/extensions/hash.rb +88 -49
  226. data/lib/mongoid/extensions/integer.rb +10 -18
  227. data/lib/mongoid/extensions/module.rb +3 -4
  228. data/lib/mongoid/extensions/nil_class.rb +2 -5
  229. data/lib/mongoid/extensions/object.rb +38 -62
  230. data/lib/mongoid/extensions/object_id.rb +7 -12
  231. data/lib/mongoid/extensions/range.rb +46 -17
  232. data/lib/mongoid/extensions/regexp.rb +15 -8
  233. data/lib/mongoid/extensions/set.rb +17 -15
  234. data/lib/mongoid/extensions/string.rb +40 -80
  235. data/lib/mongoid/extensions/symbol.rb +7 -23
  236. data/lib/mongoid/extensions/time.rb +42 -25
  237. data/lib/mongoid/extensions/time_with_zone.rb +27 -10
  238. data/lib/mongoid/extensions/true_class.rb +5 -8
  239. data/lib/mongoid/extensions.rb +31 -13
  240. data/lib/mongoid/factory.rb +99 -11
  241. data/lib/mongoid/fields/foreign_key.rb +26 -34
  242. data/lib/mongoid/fields/localized.rb +24 -13
  243. data/lib/mongoid/fields/standard.rb +19 -73
  244. data/lib/mongoid/fields/validators/macro.rb +56 -15
  245. data/lib/mongoid/fields/validators.rb +2 -1
  246. data/lib/mongoid/fields.rb +342 -87
  247. data/lib/mongoid/findable.rb +219 -0
  248. data/lib/mongoid/indexable/specification.rb +103 -0
  249. data/lib/mongoid/indexable/validators/options.rb +110 -0
  250. data/lib/mongoid/indexable.rb +148 -0
  251. data/lib/mongoid/inspectable.rb +52 -0
  252. data/lib/mongoid/interceptable.rb +312 -0
  253. data/lib/mongoid/loggable.rb +15 -18
  254. data/lib/mongoid/matchable.rb +23 -0
  255. data/lib/mongoid/matcher/all.rb +22 -0
  256. data/lib/mongoid/matcher/and.rb +21 -0
  257. data/lib/mongoid/matcher/bits.rb +41 -0
  258. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  259. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  260. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  261. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  262. data/lib/mongoid/matcher/elem_match.rb +36 -0
  263. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  264. data/lib/mongoid/matcher/eq.rb +11 -0
  265. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  266. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  267. data/lib/mongoid/matcher/exists.rb +15 -0
  268. data/lib/mongoid/matcher/expression.rb +35 -0
  269. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  270. data/lib/mongoid/matcher/field_expression.rb +62 -0
  271. data/lib/mongoid/matcher/field_operator.rb +54 -0
  272. data/lib/mongoid/matcher/gt.rb +17 -0
  273. data/lib/mongoid/matcher/gte.rb +17 -0
  274. data/lib/mongoid/matcher/in.rb +25 -0
  275. data/lib/mongoid/matcher/lt.rb +17 -0
  276. data/lib/mongoid/matcher/lte.rb +17 -0
  277. data/lib/mongoid/matcher/mod.rb +17 -0
  278. data/lib/mongoid/matcher/ne.rb +16 -0
  279. data/lib/mongoid/matcher/nin.rb +11 -0
  280. data/lib/mongoid/matcher/nor.rb +25 -0
  281. data/lib/mongoid/matcher/not.rb +29 -0
  282. data/lib/mongoid/matcher/or.rb +21 -0
  283. data/lib/mongoid/matcher/regex.rb +41 -0
  284. data/lib/mongoid/matcher/size.rb +26 -0
  285. data/lib/mongoid/matcher/type.rb +99 -0
  286. data/lib/mongoid/matcher.rb +115 -0
  287. data/lib/mongoid/persistable/creatable.rb +181 -0
  288. data/lib/mongoid/persistable/deletable.rb +132 -0
  289. data/lib/mongoid/persistable/destroyable.rb +57 -0
  290. data/lib/mongoid/persistable/incrementable.rb +35 -0
  291. data/lib/mongoid/persistable/logical.rb +36 -0
  292. data/lib/mongoid/persistable/poppable.rb +36 -0
  293. data/lib/mongoid/persistable/pullable.rb +50 -0
  294. data/lib/mongoid/persistable/pushable.rb +66 -0
  295. data/lib/mongoid/persistable/renamable.rb +37 -0
  296. data/lib/mongoid/persistable/savable.rb +47 -0
  297. data/lib/mongoid/persistable/settable.rb +93 -0
  298. data/lib/mongoid/persistable/unsettable.rb +36 -0
  299. data/lib/mongoid/persistable/updatable.rb +165 -0
  300. data/lib/mongoid/persistable/upsertable.rb +51 -0
  301. data/lib/mongoid/persistable.rb +305 -0
  302. data/lib/mongoid/persistence_context.rb +239 -0
  303. data/lib/mongoid/positional.rb +72 -0
  304. data/lib/mongoid/query_cache.rb +64 -0
  305. data/lib/mongoid/railtie.rb +35 -78
  306. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  307. data/lib/mongoid/railties/database.rake +18 -25
  308. data/lib/mongoid/reloadable.rb +94 -0
  309. data/lib/mongoid/scopable.rb +324 -0
  310. data/lib/mongoid/selectable.rb +49 -0
  311. data/lib/mongoid/serializable.rb +170 -0
  312. data/lib/mongoid/shardable.rb +130 -0
  313. data/lib/mongoid/stateful.rb +134 -0
  314. data/lib/mongoid/stringified_symbol.rb +52 -0
  315. data/lib/mongoid/tasks/database.rake +38 -0
  316. data/lib/mongoid/tasks/database.rb +194 -0
  317. data/lib/mongoid/threaded/lifecycle.rb +28 -70
  318. data/lib/mongoid/threaded.rb +142 -219
  319. data/lib/mongoid/timestamps/created/short.rb +2 -1
  320. data/lib/mongoid/timestamps/created.rb +9 -5
  321. data/lib/mongoid/timestamps/short.rb +2 -1
  322. data/lib/mongoid/timestamps/timeless.rb +52 -16
  323. data/lib/mongoid/timestamps/updated/short.rb +4 -3
  324. data/lib/mongoid/timestamps/updated.rb +14 -9
  325. data/lib/mongoid/timestamps.rb +4 -3
  326. data/lib/mongoid/touchable.rb +131 -0
  327. data/lib/mongoid/traversable.rb +337 -0
  328. data/lib/mongoid/validatable/associated.rb +47 -0
  329. data/lib/mongoid/validatable/format.rb +21 -0
  330. data/lib/mongoid/validatable/length.rb +21 -0
  331. data/lib/mongoid/validatable/localizable.rb +29 -0
  332. data/lib/mongoid/validatable/macros.rb +89 -0
  333. data/lib/mongoid/validatable/presence.rb +81 -0
  334. data/lib/mongoid/validatable/queryable.rb +29 -0
  335. data/lib/mongoid/validatable/uniqueness.rb +304 -0
  336. data/lib/mongoid/validatable.rb +160 -0
  337. data/lib/mongoid/version.rb +3 -2
  338. data/lib/mongoid/warnings.rb +28 -0
  339. data/lib/mongoid.rb +68 -109
  340. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  341. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +150 -45
  342. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -3
  343. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -4
  344. data/lib/rails/generators/mongoid_generator.rb +5 -41
  345. data/lib/rails/mongoid.rb +6 -129
  346. data/spec/README.md +33 -0
  347. data/spec/config/mongoid.yml +56 -25
  348. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  349. data/spec/integration/app_spec.rb +345 -0
  350. data/spec/integration/associations/belongs_to_spec.rb +33 -0
  351. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  352. data/spec/integration/associations/embedded_spec.rb +283 -0
  353. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  354. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  355. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  356. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  357. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  358. data/spec/integration/associations/has_many_spec.rb +128 -0
  359. data/spec/integration/associations/has_one_spec.rb +272 -0
  360. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  361. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  362. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  363. data/spec/integration/associations/scope_option_spec.rb +101 -0
  364. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  365. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  366. data/spec/integration/callbacks_models.rb +155 -0
  367. data/spec/integration/callbacks_spec.rb +450 -0
  368. data/spec/integration/contextual/empty_spec.rb +141 -0
  369. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  370. data/spec/integration/criteria/date_field_spec.rb +40 -0
  371. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  372. data/spec/integration/criteria/logical_spec.rb +124 -0
  373. data/spec/integration/criteria/range_spec.rb +359 -0
  374. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  375. data/spec/integration/discriminator_key_spec.rb +392 -0
  376. data/spec/integration/discriminator_value_spec.rb +206 -0
  377. data/spec/integration/document_spec.rb +51 -0
  378. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  379. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  380. data/spec/integration/matcher_examples_spec.rb +765 -0
  381. data/spec/integration/matcher_operator_data/all.yml +140 -0
  382. data/spec/integration/matcher_operator_data/and.yml +93 -0
  383. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  384. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  385. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  386. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  387. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  388. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  389. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  390. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  391. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  392. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  393. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  394. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  395. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  396. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  398. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  399. data/spec/integration/matcher_operator_data/in.yml +210 -0
  400. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  401. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  402. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  403. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  404. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  405. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  406. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  407. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  408. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  409. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  410. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  411. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  412. data/spec/integration/matcher_operator_data/not.yml +196 -0
  413. data/spec/integration/matcher_operator_data/or.yml +137 -0
  414. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  415. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  416. data/spec/integration/matcher_operator_data/size.yml +174 -0
  417. data/spec/integration/matcher_operator_data/type.yml +70 -0
  418. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  419. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  420. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  421. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  422. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  423. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  424. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  425. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  426. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  428. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  429. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  430. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  431. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  432. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  433. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  434. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  435. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  436. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  437. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  438. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  439. data/spec/integration/matcher_operator_spec.rb +122 -0
  440. data/spec/integration/matcher_spec.rb +283 -0
  441. data/spec/integration/persistence/range_field_spec.rb +350 -0
  442. data/spec/integration/server_query_spec.rb +141 -0
  443. data/spec/integration/shardable_spec.rb +148 -0
  444. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  445. data/spec/lite_spec_helper.rb +83 -0
  446. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  447. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  448. data/spec/mongoid/association/builders_spec.rb +255 -0
  449. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  450. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  451. data/spec/mongoid/association/depending_spec.rb +959 -0
  452. data/spec/mongoid/association/eager_spec.rb +282 -0
  453. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  454. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  455. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +174 -0
  456. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +90 -0
  457. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +619 -0
  458. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  459. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  460. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +218 -0
  461. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4863 -0
  462. data/spec/mongoid/association/embedded/embeds_many_models.rb +226 -0
  463. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  464. data/spec/mongoid/association/embedded/embeds_many_spec.rb +932 -0
  465. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  466. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +106 -0
  467. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  468. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  469. data/spec/mongoid/association/embedded/embeds_one_models.rb +73 -0
  470. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  471. data/spec/mongoid/association/embedded/embeds_one_spec.rb +984 -0
  472. data/spec/mongoid/association/macros_spec.rb +1116 -0
  473. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  474. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  475. data/spec/mongoid/association/options_spec.rb +1323 -0
  476. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  477. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +244 -0
  478. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +292 -0
  479. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  480. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1388 -0
  481. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  482. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  483. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  484. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  485. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  486. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  487. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  488. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3836 -0
  489. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +92 -0
  490. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  491. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1104 -0
  492. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  493. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +251 -0
  494. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  495. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2232 -0
  496. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  497. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4161 -0
  498. data/spec/mongoid/association/referenced/has_many_models.rb +97 -0
  499. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  500. data/spec/mongoid/association/referenced/has_many_spec.rb +1273 -0
  501. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  502. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  503. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  504. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1248 -0
  505. data/spec/mongoid/association/referenced/has_one_models.rb +113 -0
  506. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  507. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  508. data/spec/mongoid/association/reflections_spec.rb +92 -0
  509. data/spec/mongoid/association/syncable_spec.rb +513 -0
  510. data/spec/mongoid/association_spec.rb +191 -0
  511. data/spec/mongoid/atomic/modifiers_spec.rb +88 -39
  512. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +10 -49
  513. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +9 -49
  514. data/spec/mongoid/atomic/paths/root_spec.rb +5 -61
  515. data/spec/mongoid/atomic/paths_spec.rb +115 -35
  516. data/spec/mongoid/atomic_spec.rb +89 -42
  517. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  518. data/spec/mongoid/attributes/nested_spec.rb +5000 -0
  519. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  520. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  521. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  522. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  523. data/spec/mongoid/attributes/readonly_spec.rb +166 -64
  524. data/spec/mongoid/attributes_spec.rb +1418 -409
  525. data/spec/mongoid/cacheable_spec.rb +114 -0
  526. data/spec/mongoid/changeable_spec.rb +1914 -0
  527. data/spec/mongoid/clients/factory_spec.rb +426 -0
  528. data/spec/mongoid/clients/options_spec.rb +521 -0
  529. data/spec/mongoid/clients/sessions_spec.rb +297 -0
  530. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  531. data/spec/mongoid/clients_spec.rb +1084 -0
  532. data/spec/mongoid/composable_spec.rb +33 -0
  533. data/spec/mongoid/config/environment_spec.rb +138 -17
  534. data/spec/mongoid/config/options_spec.rb +26 -7
  535. data/spec/mongoid/config_spec.rb +607 -93
  536. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  537. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  538. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  539. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +221 -56
  540. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  541. data/spec/mongoid/contextual/atomic_spec.rb +577 -162
  542. data/spec/mongoid/contextual/geo_near_spec.rb +104 -38
  543. data/spec/mongoid/contextual/map_reduce_spec.rb +137 -142
  544. data/spec/mongoid/contextual/memory_spec.rb +1880 -269
  545. data/spec/mongoid/contextual/mongo_spec.rb +2523 -601
  546. data/spec/mongoid/contextual/none_spec.rb +123 -0
  547. data/spec/mongoid/copyable_spec.rb +833 -76
  548. data/spec/mongoid/copyable_spec_models.rb +47 -0
  549. data/spec/mongoid/criteria/findable_spec.rb +1132 -0
  550. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  551. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  552. data/spec/mongoid/criteria/inspectable_spec.rb +29 -0
  553. data/spec/mongoid/criteria/marshalable_spec.rb +47 -0
  554. data/spec/mongoid/criteria/modifiable_spec.rb +1812 -0
  555. data/spec/mongoid/criteria/options_spec.rb +31 -0
  556. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +372 -0
  557. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  558. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +513 -0
  559. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +169 -0
  560. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +60 -0
  561. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +215 -0
  562. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +343 -0
  563. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +434 -0
  564. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +60 -0
  565. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +67 -0
  566. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +314 -0
  567. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +67 -0
  568. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +79 -0
  569. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +119 -0
  570. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +110 -0
  571. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +370 -0
  572. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +91 -0
  573. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +92 -0
  574. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +41 -0
  575. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +347 -0
  576. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +169 -0
  577. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +406 -0
  578. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +387 -0
  579. data/spec/mongoid/criteria/queryable/key_spec.rb +96 -0
  580. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +182 -0
  581. data/spec/mongoid/criteria/queryable/optional_spec.rb +1317 -0
  582. data/spec/mongoid/criteria/queryable/options_spec.rb +362 -0
  583. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +214 -0
  584. data/spec/mongoid/criteria/queryable/queryable_spec.rb +139 -0
  585. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2119 -0
  586. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  587. data/spec/mongoid/criteria/queryable/selectable_spec.rb +2462 -0
  588. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  589. data/spec/mongoid/criteria/queryable/selector_spec.rb +895 -0
  590. data/spec/mongoid/criteria/queryable/smash_spec.rb +32 -0
  591. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  592. data/spec/mongoid/criteria/scopable_spec.rb +601 -0
  593. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  594. data/spec/mongoid/criteria_spec.rb +1828 -3572
  595. data/spec/mongoid/document_fields_spec.rb +262 -0
  596. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  597. data/spec/mongoid/document_query_spec.rb +89 -0
  598. data/spec/mongoid/document_spec.rb +452 -221
  599. data/spec/mongoid/equality_spec.rb +155 -52
  600. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -6
  601. data/spec/mongoid/errors/callback_spec.rb +5 -3
  602. data/spec/mongoid/errors/delete_restriction_spec.rb +7 -5
  603. data/spec/mongoid/errors/document_not_destroyed_spec.rb +35 -0
  604. data/spec/mongoid/errors/document_not_found_spec.rb +89 -11
  605. data/spec/mongoid/errors/invalid_collection_spec.rb +5 -3
  606. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  607. data/spec/mongoid/errors/invalid_config_option_spec.rb +5 -3
  608. data/spec/mongoid/errors/invalid_field_option_spec.rb +5 -3
  609. data/spec/mongoid/errors/invalid_field_spec.rb +6 -4
  610. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  611. data/spec/mongoid/errors/invalid_find_spec.rb +5 -3
  612. data/spec/mongoid/errors/invalid_includes_spec.rb +5 -3
  613. data/spec/mongoid/errors/invalid_index_spec.rb +5 -3
  614. data/spec/mongoid/errors/invalid_options_spec.rb +7 -5
  615. data/spec/mongoid/errors/invalid_path_spec.rb +5 -3
  616. data/spec/mongoid/errors/invalid_relation_spec.rb +39 -0
  617. data/spec/mongoid/errors/invalid_scope_spec.rb +7 -5
  618. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +5 -3
  619. data/spec/mongoid/errors/invalid_storage_options_spec.rb +5 -3
  620. data/spec/mongoid/errors/invalid_time_spec.rb +5 -3
  621. data/spec/mongoid/errors/inverse_not_found_spec.rb +6 -4
  622. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +31 -0
  623. data/spec/mongoid/errors/mixed_relations_spec.rb +5 -3
  624. data/spec/mongoid/errors/mongoid_error_spec.rb +45 -10
  625. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +8 -6
  626. data/spec/mongoid/errors/no_client_config_spec.rb +31 -0
  627. data/spec/mongoid/errors/no_client_database_spec.rb +31 -0
  628. data/spec/mongoid/errors/no_client_hosts_spec.rb +31 -0
  629. data/spec/mongoid/errors/no_clients_config_spec.rb +31 -0
  630. data/spec/mongoid/errors/no_environment_spec.rb +8 -6
  631. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +5 -3
  632. data/spec/mongoid/errors/no_metadata_spec.rb +5 -3
  633. data/spec/mongoid/errors/no_parent_spec.rb +6 -4
  634. data/spec/mongoid/errors/readonly_attribute_spec.rb +5 -3
  635. data/spec/mongoid/errors/readonly_document_spec.rb +31 -0
  636. data/spec/mongoid/errors/scope_overwrite_spec.rb +5 -3
  637. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +6 -4
  638. data/spec/mongoid/errors/unknown_attribute_spec.rb +7 -5
  639. data/spec/mongoid/errors/unsaved_document_spec.rb +6 -4
  640. data/spec/mongoid/errors/unsupported_javascript_spec.rb +5 -3
  641. data/spec/mongoid/errors/validations_spec.rb +9 -7
  642. data/spec/mongoid/extensions/array_spec.rb +108 -116
  643. data/spec/mongoid/extensions/big_decimal_spec.rb +838 -49
  644. data/spec/mongoid/extensions/binary_spec.rb +55 -18
  645. data/spec/mongoid/extensions/boolean_spec.rb +76 -74
  646. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  647. data/spec/mongoid/extensions/date_spec.rb +59 -145
  648. data/spec/mongoid/extensions/date_time_spec.rb +35 -76
  649. data/spec/mongoid/extensions/decimal128_spec.rb +46 -0
  650. data/spec/mongoid/extensions/false_class_spec.rb +7 -5
  651. data/spec/mongoid/extensions/float_spec.rb +69 -62
  652. data/spec/mongoid/extensions/hash_spec.rb +197 -30
  653. data/spec/mongoid/extensions/integer_spec.rb +63 -65
  654. data/spec/mongoid/extensions/module_spec.rb +4 -2
  655. data/spec/mongoid/extensions/nil_class_spec.rb +3 -1
  656. data/spec/mongoid/extensions/object_id_spec.rb +136 -134
  657. data/spec/mongoid/extensions/object_spec.rb +53 -57
  658. data/spec/mongoid/extensions/range_spec.rb +287 -28
  659. data/spec/mongoid/extensions/regexp_spec.rb +71 -21
  660. data/spec/mongoid/extensions/set_spec.rb +112 -4
  661. data/spec/mongoid/extensions/string_spec.rb +188 -89
  662. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  663. data/spec/mongoid/extensions/symbol_spec.rb +25 -30
  664. data/spec/mongoid/extensions/time_spec.rb +703 -110
  665. data/spec/mongoid/extensions/time_with_zone_spec.rb +82 -67
  666. data/spec/mongoid/extensions/true_class_spec.rb +7 -5
  667. data/spec/mongoid/extensions_spec.rb +43 -0
  668. data/spec/mongoid/factory_spec.rb +374 -25
  669. data/spec/mongoid/fields/foreign_key_spec.rb +116 -92
  670. data/spec/mongoid/fields/localized_spec.rb +177 -35
  671. data/spec/mongoid/fields/standard_spec.rb +15 -13
  672. data/spec/mongoid/fields_spec.rb +952 -238
  673. data/spec/mongoid/findable_spec.rb +632 -0
  674. data/spec/mongoid/indexable/specification_spec.rb +129 -0
  675. data/spec/mongoid/indexable_spec.rb +643 -0
  676. data/spec/mongoid/inspectable_spec.rb +86 -0
  677. data/spec/mongoid/interceptable_spec.rb +2373 -0
  678. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  679. data/spec/mongoid/loggable_spec.rb +3 -1
  680. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  681. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  682. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  683. data/spec/mongoid/mongoizable_spec.rb +285 -0
  684. data/spec/mongoid/persistable/creatable_spec.rb +662 -0
  685. data/spec/mongoid/persistable/deletable_spec.rb +514 -0
  686. data/spec/mongoid/persistable/destroyable_spec.rb +455 -0
  687. data/spec/mongoid/persistable/incrementable_spec.rb +241 -0
  688. data/spec/mongoid/persistable/logical_spec.rb +159 -0
  689. data/spec/mongoid/persistable/poppable_spec.rb +131 -0
  690. data/spec/mongoid/persistable/pullable_spec.rb +258 -0
  691. data/spec/mongoid/persistable/pushable_spec.rb +353 -0
  692. data/spec/mongoid/persistable/renamable_spec.rb +151 -0
  693. data/spec/mongoid/persistable/savable_spec.rb +684 -0
  694. data/spec/mongoid/persistable/settable_spec.rb +544 -0
  695. data/spec/mongoid/persistable/unsettable_spec.rb +171 -0
  696. data/spec/mongoid/persistable/updatable_spec.rb +760 -0
  697. data/spec/mongoid/persistable/upsertable_spec.rb +122 -0
  698. data/spec/mongoid/persistable_spec.rb +321 -0
  699. data/spec/mongoid/persistence_context_spec.rb +745 -0
  700. data/spec/mongoid/positional_spec.rb +223 -0
  701. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  702. data/spec/mongoid/query_cache_spec.rb +870 -0
  703. data/spec/mongoid/relations/proxy_spec.rb +125 -47
  704. data/spec/mongoid/reloadable_spec.rb +665 -0
  705. data/spec/mongoid/scopable_spec.rb +1234 -0
  706. data/spec/mongoid/selectable_spec.rb +136 -0
  707. data/spec/mongoid/serializable_spec.rb +963 -0
  708. data/spec/mongoid/shardable_models.rb +61 -0
  709. data/spec/mongoid/shardable_spec.rb +204 -0
  710. data/spec/mongoid/stateful_spec.rb +157 -0
  711. data/spec/mongoid/tasks/database_rake_spec.rb +287 -0
  712. data/spec/mongoid/tasks/database_spec.rb +181 -0
  713. data/spec/mongoid/threaded_spec.rb +88 -78
  714. data/spec/mongoid/timestamps/created/short_spec.rb +9 -7
  715. data/spec/mongoid/timestamps/created_spec.rb +8 -6
  716. data/spec/mongoid/timestamps/timeless_spec.rb +29 -10
  717. data/spec/mongoid/timestamps/updated/short_spec.rb +16 -14
  718. data/spec/mongoid/timestamps/updated_spec.rb +14 -16
  719. data/spec/mongoid/timestamps_spec.rb +406 -18
  720. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  721. data/spec/mongoid/touchable_spec.rb +704 -0
  722. data/spec/mongoid/touchable_spec_models.rb +57 -0
  723. data/spec/mongoid/traversable_spec.rb +1410 -0
  724. data/spec/mongoid/validatable/associated_spec.rb +208 -0
  725. data/spec/mongoid/validatable/format_spec.rb +85 -0
  726. data/spec/mongoid/validatable/length_spec.rb +225 -0
  727. data/spec/mongoid/validatable/numericality_spec.rb +32 -0
  728. data/spec/mongoid/validatable/presence_spec.rb +592 -0
  729. data/spec/mongoid/validatable/uniqueness_spec.rb +2504 -0
  730. data/spec/mongoid/validatable_spec.rb +327 -0
  731. data/spec/mongoid/warnings_spec.rb +35 -0
  732. data/spec/mongoid_spec.rb +20 -20
  733. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  734. data/spec/rails/mongoid_spec.rb +37 -354
  735. data/spec/shared/LICENSE +20 -0
  736. data/spec/shared/bin/get-mongodb-download-url +17 -0
  737. data/spec/shared/bin/s3-copy +45 -0
  738. data/spec/shared/bin/s3-upload +69 -0
  739. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  740. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  741. data/spec/shared/lib/mrss/constraints.rb +378 -0
  742. data/spec/shared/lib/mrss/docker_runner.rb +291 -0
  743. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  744. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  745. data/spec/shared/lib/mrss/lite_constraints.rb +230 -0
  746. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  747. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  748. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  749. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  750. data/spec/shared/lib/mrss/utils.rb +15 -0
  751. data/spec/shared/share/Dockerfile.erb +325 -0
  752. data/spec/shared/share/haproxy-1.conf +16 -0
  753. data/spec/shared/share/haproxy-2.conf +17 -0
  754. data/spec/shared/shlib/config.sh +27 -0
  755. data/spec/shared/shlib/distro.sh +74 -0
  756. data/spec/shared/shlib/server.sh +392 -0
  757. data/spec/shared/shlib/set_env.sh +169 -0
  758. data/spec/spec_helper.rb +163 -42
  759. data/spec/support/authorization.rb +15 -0
  760. data/spec/support/client_registry.rb +9 -0
  761. data/spec/support/constraints.rb +77 -0
  762. data/spec/support/expectations.rb +32 -0
  763. data/spec/support/helpers.rb +11 -0
  764. data/spec/support/macros.rb +81 -0
  765. data/spec/support/models/account.rb +38 -0
  766. data/spec/support/models/acolyte.rb +19 -0
  767. data/spec/support/models/actor.rb +20 -0
  768. data/spec/support/models/actress.rb +4 -0
  769. data/spec/support/models/address.rb +85 -0
  770. data/spec/support/models/address_component.rb +7 -0
  771. data/spec/support/models/address_number.rb +8 -0
  772. data/spec/support/models/agency.rb +7 -0
  773. data/spec/support/models/agent.rb +18 -0
  774. data/spec/support/models/album.rb +20 -0
  775. data/spec/support/models/alert.rb +9 -0
  776. data/spec/support/models/animal.rb +28 -0
  777. data/spec/support/models/answer.rb +8 -0
  778. data/spec/support/models/appointment.rb +9 -0
  779. data/spec/support/models/armrest.rb +9 -0
  780. data/spec/support/models/array_field.rb +7 -0
  781. data/spec/support/models/article.rb +14 -0
  782. data/spec/support/models/artist.rb +91 -0
  783. data/spec/support/models/artwork.rb +6 -0
  784. data/spec/support/models/audible_sound.rb +3 -0
  785. data/spec/support/models/audio.rb +7 -0
  786. data/spec/support/models/augmentation.rb +25 -0
  787. data/spec/support/models/author.rb +8 -0
  788. data/spec/support/models/baby.rb +6 -0
  789. data/spec/support/models/band.rb +40 -0
  790. data/spec/support/models/bar.rb +12 -0
  791. data/spec/support/models/basic.rb +8 -0
  792. data/spec/support/models/bed.rb +3 -0
  793. data/spec/support/models/big_palette.rb +4 -0
  794. data/spec/support/models/birthday.rb +15 -0
  795. data/spec/support/models/bolt.rb +7 -0
  796. data/spec/support/models/bomb.rb +6 -0
  797. data/spec/support/models/book.rb +18 -0
  798. data/spec/support/models/breed.rb +6 -0
  799. data/spec/support/models/browser.rb +8 -0
  800. data/spec/support/models/building.rb +8 -0
  801. data/spec/support/models/building_address.rb +9 -0
  802. data/spec/support/models/bus.rb +9 -0
  803. data/spec/support/models/business.rb +7 -0
  804. data/spec/support/models/callback_test.rb +11 -0
  805. data/spec/support/models/canvas.rb +27 -0
  806. data/spec/support/models/car.rb +3 -0
  807. data/spec/support/models/cat.rb +10 -0
  808. data/spec/support/models/catalog.rb +24 -0
  809. data/spec/support/models/category.rb +10 -0
  810. data/spec/support/models/child.rb +6 -0
  811. data/spec/support/models/child_doc.rb +24 -0
  812. data/spec/support/models/church.rb +8 -0
  813. data/spec/support/models/circle.rb +5 -0
  814. data/spec/support/models/circuit.rb +6 -0
  815. data/spec/support/models/circus.rb +12 -0
  816. data/spec/support/models/code.rb +15 -0
  817. data/spec/support/models/coding/pull_request.rb +11 -0
  818. data/spec/support/models/coding.rb +3 -0
  819. data/spec/support/models/comment.rb +18 -0
  820. data/spec/support/models/company.rb +7 -0
  821. data/spec/support/models/consumption_period.rb +9 -0
  822. data/spec/support/models/contextable_item.rb +7 -0
  823. data/spec/support/models/contractor.rb +7 -0
  824. data/spec/support/models/cookie.rb +8 -0
  825. data/spec/support/models/country_code.rb +12 -0
  826. data/spec/support/models/courier_job.rb +6 -0
  827. data/spec/support/models/crate.rb +12 -0
  828. data/spec/support/models/customer.rb +10 -0
  829. data/spec/support/models/customer_address.rb +11 -0
  830. data/spec/support/models/deed.rb +7 -0
  831. data/spec/support/models/definition.rb +11 -0
  832. data/spec/support/models/delegating_patient.rb +15 -0
  833. data/spec/support/models/description.rb +13 -0
  834. data/spec/support/models/dictionary.rb +18 -0
  835. data/spec/support/models/division.rb +12 -0
  836. data/spec/support/models/doctor.rb +14 -0
  837. data/spec/support/models/dog.rb +9 -0
  838. data/spec/support/models/dokument.rb +8 -0
  839. data/spec/support/models/draft.rb +11 -0
  840. data/spec/support/models/dragon.rb +6 -0
  841. data/spec/support/models/driver.rb +9 -0
  842. data/spec/support/models/drug.rb +8 -0
  843. data/spec/support/models/dungeon.rb +6 -0
  844. data/spec/support/models/edit.rb +7 -0
  845. data/spec/support/models/email.rb +8 -0
  846. data/spec/support/models/employer.rb +7 -0
  847. data/spec/support/models/entry.rb +8 -0
  848. data/spec/support/models/eraser.rb +3 -0
  849. data/spec/support/models/even.rb +9 -0
  850. data/spec/support/models/event.rb +24 -0
  851. data/spec/support/models/exhibition.rb +6 -0
  852. data/spec/support/models/exhibitor.rb +8 -0
  853. data/spec/support/models/explosion.rb +6 -0
  854. data/spec/support/models/eye.rb +11 -0
  855. data/spec/support/models/eye_bowl.rb +11 -0
  856. data/spec/support/models/face.rb +10 -0
  857. data/spec/support/models/fanatic.rb +8 -0
  858. data/spec/support/models/favorite.rb +8 -0
  859. data/spec/support/models/filesystem.rb +7 -0
  860. data/spec/support/models/fire_hydrant.rb +8 -0
  861. data/spec/support/models/firefox.rb +6 -0
  862. data/spec/support/models/fish.rb +9 -0
  863. data/spec/support/models/folder.rb +9 -0
  864. data/spec/support/models/folder_item.rb +11 -0
  865. data/spec/support/models/fruits.rb +36 -0
  866. data/spec/support/models/game.rb +21 -0
  867. data/spec/support/models/ghost.rb +9 -0
  868. data/spec/support/models/guitar.rb +4 -0
  869. data/spec/support/models/hole.rb +12 -0
  870. data/spec/support/models/home.rb +6 -0
  871. data/spec/support/models/house.rb +8 -0
  872. data/spec/support/models/html_writer.rb +5 -0
  873. data/spec/support/models/id_key.rb +8 -0
  874. data/spec/support/models/idnodef.rb +7 -0
  875. data/spec/support/models/image.rb +24 -0
  876. data/spec/support/models/implant.rb +27 -0
  877. data/spec/support/models/instrument.rb +8 -0
  878. data/spec/support/models/item.rb +10 -0
  879. data/spec/support/models/jar.rb +9 -0
  880. data/spec/support/models/kaleidoscope.rb +8 -0
  881. data/spec/support/models/kangaroo.rb +6 -0
  882. data/spec/support/models/label.rb +52 -0
  883. data/spec/support/models/language.rb +7 -0
  884. data/spec/support/models/lat_lng.rb +17 -0
  885. data/spec/support/models/league.rb +13 -0
  886. data/spec/support/models/learner.rb +4 -0
  887. data/spec/support/models/line_item.rb +8 -0
  888. data/spec/support/models/location.rb +10 -0
  889. data/spec/support/models/login.rb +10 -0
  890. data/spec/support/models/manufacturer.rb +9 -0
  891. data/spec/support/models/meat.rb +6 -0
  892. data/spec/support/models/membership.rb +7 -0
  893. data/spec/support/models/message.rb +13 -0
  894. data/spec/support/models/minim.rb +6 -0
  895. data/spec/support/models/mixed_drink.rb +6 -0
  896. data/spec/support/models/mop.rb +24 -0
  897. data/spec/support/models/movie.rb +15 -0
  898. data/spec/support/models/my_hash.rb +4 -0
  899. data/spec/support/models/name.rb +26 -0
  900. data/spec/support/models/name_only.rb +8 -0
  901. data/spec/support/models/node.rb +7 -0
  902. data/spec/support/models/note.rb +19 -0
  903. data/spec/support/models/nut.rb +7 -0
  904. data/spec/support/models/odd.rb +9 -0
  905. data/spec/support/models/order.rb +12 -0
  906. data/spec/support/models/ordered_post.rb +13 -0
  907. data/spec/support/models/ordered_preference.rb +8 -0
  908. data/spec/support/models/oscar.rb +16 -0
  909. data/spec/support/models/other_owner_object.rb +4 -0
  910. data/spec/support/models/override.rb +18 -0
  911. data/spec/support/models/ownable.rb +8 -0
  912. data/spec/support/models/owner.rb +10 -0
  913. data/spec/support/models/pack.rb +5 -0
  914. data/spec/support/models/page.rb +18 -0
  915. data/spec/support/models/page_question.rb +6 -0
  916. data/spec/support/models/palette.rb +9 -0
  917. data/spec/support/models/parent.rb +7 -0
  918. data/spec/support/models/parent_doc.rb +8 -0
  919. data/spec/support/models/passport.rb +22 -0
  920. data/spec/support/models/patient.rb +11 -0
  921. data/spec/support/models/pdf_writer.rb +5 -0
  922. data/spec/support/models/pencil.rb +3 -0
  923. data/spec/support/models/person.rb +231 -0
  924. data/spec/support/models/pet.rb +25 -0
  925. data/spec/support/models/pet_owner.rb +8 -0
  926. data/spec/support/models/phone.rb +13 -0
  927. data/spec/support/models/piano.rb +4 -0
  928. data/spec/support/models/pizza.rb +9 -0
  929. data/spec/support/models/player.rb +39 -0
  930. data/spec/support/models/post.rb +52 -0
  931. data/spec/support/models/post_genre.rb +8 -0
  932. data/spec/support/models/powerup.rb +25 -0
  933. data/spec/support/models/preference.rb +11 -0
  934. data/spec/support/models/princess.rb +12 -0
  935. data/spec/support/models/product.rb +19 -0
  936. data/spec/support/models/profile.rb +17 -0
  937. data/spec/support/models/pronunciation.rb +7 -0
  938. data/spec/support/models/pub.rb +8 -0
  939. data/spec/support/models/publication/encyclopedia.rb +11 -0
  940. data/spec/support/models/publication/review.rb +13 -0
  941. data/spec/support/models/publication.rb +4 -0
  942. data/spec/support/models/purchase.rb +6 -0
  943. data/spec/support/models/purchased_item.rb +10 -0
  944. data/spec/support/models/question.rb +10 -0
  945. data/spec/support/models/quiz.rb +9 -0
  946. data/spec/support/models/rating.rb +10 -0
  947. data/spec/support/models/record.rb +54 -0
  948. data/spec/support/models/registry.rb +7 -0
  949. data/spec/support/models/role.rb +9 -0
  950. data/spec/support/models/root_category.rb +6 -0
  951. data/spec/support/models/sandwich.rb +11 -0
  952. data/spec/support/models/scheduler.rb +9 -0
  953. data/spec/support/models/school.rb +14 -0
  954. data/spec/support/models/scribe.rb +7 -0
  955. data/spec/support/models/sealer.rb +7 -0
  956. data/spec/support/models/seat.rb +24 -0
  957. data/spec/support/models/seo.rb +9 -0
  958. data/spec/support/models/series.rb +7 -0
  959. data/spec/support/models/server.rb +15 -0
  960. data/spec/support/models/service.rb +24 -0
  961. data/spec/support/models/shape.rb +14 -0
  962. data/spec/support/models/shelf.rb +7 -0
  963. data/spec/support/models/shield.rb +18 -0
  964. data/spec/support/models/shipment_address.rb +5 -0
  965. data/spec/support/models/shipping_container.rb +7 -0
  966. data/spec/support/models/shipping_pack.rb +5 -0
  967. data/spec/support/models/shirt.rb +11 -0
  968. data/spec/support/models/shop.rb +8 -0
  969. data/spec/support/models/short_agent.rb +6 -0
  970. data/spec/support/models/short_quiz.rb +7 -0
  971. data/spec/support/models/simple.rb +7 -0
  972. data/spec/support/models/slave.rb +8 -0
  973. data/spec/support/models/song.rb +10 -0
  974. data/spec/support/models/sound.rb +7 -0
  975. data/spec/support/models/spacer.rb +7 -0
  976. data/spec/support/models/square.rb +6 -0
  977. data/spec/support/models/staff.rb +9 -0
  978. data/spec/support/models/store_as_dup_test1.rb +7 -0
  979. data/spec/support/models/store_as_dup_test2.rb +7 -0
  980. data/spec/support/models/store_as_dup_test3.rb +7 -0
  981. data/spec/support/models/store_as_dup_test4.rb +7 -0
  982. data/spec/support/models/strategy.rb +5 -0
  983. data/spec/support/models/student.rb +14 -0
  984. data/spec/support/models/sub_item.rb +5 -0
  985. data/spec/support/models/subscription.rb +7 -0
  986. data/spec/support/models/survey.rb +7 -0
  987. data/spec/support/models/symptom.rb +8 -0
  988. data/spec/support/models/system_role.rb +7 -0
  989. data/spec/support/models/tag.rb +10 -0
  990. data/spec/support/models/target.rb +7 -0
  991. data/spec/support/models/template.rb +7 -0
  992. data/spec/support/models/thing.rb +11 -0
  993. data/spec/support/models/threadlocker.rb +7 -0
  994. data/spec/support/models/title.rb +5 -0
  995. data/spec/support/models/tool.rb +10 -0
  996. data/spec/support/models/topping.rb +7 -0
  997. data/spec/support/models/toy.rb +9 -0
  998. data/spec/support/models/track.rb +40 -0
  999. data/spec/support/models/translation.rb +7 -0
  1000. data/spec/support/models/tree.rb +11 -0
  1001. data/spec/support/models/truck.rb +7 -0
  1002. data/spec/support/models/updatable.rb +7 -0
  1003. data/spec/support/models/user.rb +23 -0
  1004. data/spec/support/models/user_account.rb +12 -0
  1005. data/spec/support/models/validation_callback.rb +12 -0
  1006. data/spec/support/models/vehicle.rb +18 -0
  1007. data/spec/support/models/version.rb +7 -0
  1008. data/spec/support/models/vertex.rb +8 -0
  1009. data/spec/support/models/vet_visit.rb +7 -0
  1010. data/spec/support/models/video.rb +15 -0
  1011. data/spec/support/models/video_game.rb +3 -0
  1012. data/spec/support/models/washer.rb +7 -0
  1013. data/spec/support/models/weapon.rb +25 -0
  1014. data/spec/support/models/wiki_page.rb +17 -0
  1015. data/spec/support/models/word.rb +17 -0
  1016. data/spec/support/models/word_origin.rb +13 -0
  1017. data/spec/support/models/writer.rb +13 -0
  1018. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1019. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1020. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1021. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1022. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1023. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1024. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1025. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1026. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1027. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1028. data/spec/support/shared/time.rb +53 -0
  1029. data/spec/support/spec_config.rb +64 -0
  1030. data.tar.gz.sig +0 -0
  1031. metadata +1582 -912
  1032. metadata.gz.sig +0 -0
  1033. data/lib/mongoid/atomic/positionable.rb +0 -73
  1034. data/lib/mongoid/callbacks.rb +0 -314
  1035. data/lib/mongoid/components.rb +0 -93
  1036. data/lib/mongoid/config/inflections.rb +0 -6
  1037. data/lib/mongoid/config/validators/session.rb +0 -140
  1038. data/lib/mongoid/contextual/eager.rb +0 -158
  1039. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  1040. data/lib/mongoid/criterion/findable.rb +0 -179
  1041. data/lib/mongoid/criterion/inspection.rb +0 -25
  1042. data/lib/mongoid/criterion/marshalable.rb +0 -48
  1043. data/lib/mongoid/criterion/modifiable.rb +0 -189
  1044. data/lib/mongoid/criterion/scoping.rb +0 -158
  1045. data/lib/mongoid/dirty.rb +0 -376
  1046. data/lib/mongoid/errors/eager_load.rb +0 -22
  1047. data/lib/mongoid/errors/mixed_session_configuration.rb +0 -28
  1048. data/lib/mongoid/errors/no_default_session.rb +0 -23
  1049. data/lib/mongoid/errors/no_session_config.rb +0 -22
  1050. data/lib/mongoid/errors/no_session_database.rb +0 -27
  1051. data/lib/mongoid/errors/no_session_hosts.rb +0 -27
  1052. data/lib/mongoid/errors/no_sessions_config.rb +0 -20
  1053. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  1054. data/lib/mongoid/finders.rb +0 -130
  1055. data/lib/mongoid/hierarchy.rb +0 -188
  1056. data/lib/mongoid/identity_map.rb +0 -163
  1057. data/lib/mongoid/indexes/validators/options.rb +0 -102
  1058. data/lib/mongoid/indexes.rb +0 -154
  1059. data/lib/mongoid/inspection.rb +0 -55
  1060. data/lib/mongoid/json.rb +0 -16
  1061. data/lib/mongoid/matchers/all.rb +0 -27
  1062. data/lib/mongoid/matchers/and.rb +0 -30
  1063. data/lib/mongoid/matchers/default.rb +0 -72
  1064. data/lib/mongoid/matchers/exists.rb +0 -23
  1065. data/lib/mongoid/matchers/gt.rb +0 -21
  1066. data/lib/mongoid/matchers/gte.rb +0 -21
  1067. data/lib/mongoid/matchers/in.rb +0 -24
  1068. data/lib/mongoid/matchers/lt.rb +0 -21
  1069. data/lib/mongoid/matchers/lte.rb +0 -21
  1070. data/lib/mongoid/matchers/ne.rb +0 -21
  1071. data/lib/mongoid/matchers/nin.rb +0 -21
  1072. data/lib/mongoid/matchers/or.rb +0 -33
  1073. data/lib/mongoid/matchers/size.rb +0 -21
  1074. data/lib/mongoid/matchers/strategies.rb +0 -97
  1075. data/lib/mongoid/matchers.rb +0 -32
  1076. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  1077. data/lib/mongoid/nested_attributes.rb +0 -78
  1078. data/lib/mongoid/observer.rb +0 -192
  1079. data/lib/mongoid/paranoia.rb +0 -137
  1080. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  1081. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  1082. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  1083. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  1084. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  1085. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  1086. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  1087. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  1088. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  1089. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  1090. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  1091. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  1092. data/lib/mongoid/persistence/atomic.rb +0 -231
  1093. data/lib/mongoid/persistence/deletion.rb +0 -32
  1094. data/lib/mongoid/persistence/insertion.rb +0 -38
  1095. data/lib/mongoid/persistence/modification.rb +0 -35
  1096. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  1097. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  1098. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  1099. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  1100. data/lib/mongoid/persistence/operations/update.rb +0 -59
  1101. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  1102. data/lib/mongoid/persistence/operations.rb +0 -214
  1103. data/lib/mongoid/persistence/upsertion.rb +0 -31
  1104. data/lib/mongoid/persistence.rb +0 -352
  1105. data/lib/mongoid/railties/document.rb +0 -12
  1106. data/lib/mongoid/relations/accessors.rb +0 -299
  1107. data/lib/mongoid/relations/auto_save.rb +0 -107
  1108. data/lib/mongoid/relations/binding.rb +0 -241
  1109. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -63
  1110. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -52
  1111. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -55
  1112. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -70
  1113. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -42
  1114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -67
  1115. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1116. data/lib/mongoid/relations/bindings.rb +0 -9
  1117. data/lib/mongoid/relations/builder.rb +0 -57
  1118. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1119. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1120. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1121. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -177
  1122. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -127
  1123. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1124. data/lib/mongoid/relations/builders/referenced/many.rb +0 -27
  1125. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -40
  1126. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1127. data/lib/mongoid/relations/builders.rb +0 -104
  1128. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1129. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1130. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1131. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1132. data/lib/mongoid/relations/cascading.rb +0 -58
  1133. data/lib/mongoid/relations/constraint.rb +0 -49
  1134. data/lib/mongoid/relations/conversions.rb +0 -34
  1135. data/lib/mongoid/relations/counter_cache.rb +0 -107
  1136. data/lib/mongoid/relations/cyclic.rb +0 -107
  1137. data/lib/mongoid/relations/embedded/batchable.rb +0 -356
  1138. data/lib/mongoid/relations/embedded/in.rb +0 -231
  1139. data/lib/mongoid/relations/embedded/many.rb +0 -659
  1140. data/lib/mongoid/relations/embedded/one.rb +0 -223
  1141. data/lib/mongoid/relations/macros.rb +0 -359
  1142. data/lib/mongoid/relations/many.rb +0 -217
  1143. data/lib/mongoid/relations/marshalable.rb +0 -32
  1144. data/lib/mongoid/relations/metadata.rb +0 -1227
  1145. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1146. data/lib/mongoid/relations/one.rb +0 -60
  1147. data/lib/mongoid/relations/options.rb +0 -48
  1148. data/lib/mongoid/relations/polymorphic.rb +0 -40
  1149. data/lib/mongoid/relations/proxy.rb +0 -264
  1150. data/lib/mongoid/relations/referenced/in.rb +0 -314
  1151. data/lib/mongoid/relations/referenced/many.rb +0 -789
  1152. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -495
  1153. data/lib/mongoid/relations/referenced/one.rb +0 -297
  1154. data/lib/mongoid/relations/reflections.rb +0 -62
  1155. data/lib/mongoid/relations/synchronization.rb +0 -169
  1156. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  1157. data/lib/mongoid/relations/targets.rb +0 -2
  1158. data/lib/mongoid/relations/touchable.rb +0 -61
  1159. data/lib/mongoid/relations.rb +0 -162
  1160. data/lib/mongoid/reloading.rb +0 -92
  1161. data/lib/mongoid/scoping.rb +0 -356
  1162. data/lib/mongoid/serialization.rb +0 -161
  1163. data/lib/mongoid/sessions/factory.rb +0 -129
  1164. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  1165. data/lib/mongoid/sessions/validators/storage.rb +0 -49
  1166. data/lib/mongoid/sessions/validators.rb +0 -2
  1167. data/lib/mongoid/sessions.rb +0 -433
  1168. data/lib/mongoid/sharding.rb +0 -61
  1169. data/lib/mongoid/state.rb +0 -97
  1170. data/lib/mongoid/unit_of_work.rb +0 -61
  1171. data/lib/mongoid/validations/associated.rb +0 -46
  1172. data/lib/mongoid/validations/format.rb +0 -20
  1173. data/lib/mongoid/validations/length.rb +0 -20
  1174. data/lib/mongoid/validations/localizable.rb +0 -30
  1175. data/lib/mongoid/validations/macros.rb +0 -93
  1176. data/lib/mongoid/validations/presence.rb +0 -86
  1177. data/lib/mongoid/validations/queryable.rb +0 -31
  1178. data/lib/mongoid/validations/uniqueness.rb +0 -330
  1179. data/lib/mongoid/validations.rb +0 -166
  1180. data/lib/mongoid/versioning.rb +0 -217
  1181. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  1182. data/lib/rack/mongoid.rb +0 -2
  1183. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  1184. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  1185. data/lib/support/ruby_version.rb +0 -26
  1186. data/spec/app/models/account.rb +0 -32
  1187. data/spec/app/models/acolyte.rb +0 -16
  1188. data/spec/app/models/actor.rb +0 -19
  1189. data/spec/app/models/actor_observer.rb +0 -15
  1190. data/spec/app/models/actress.rb +0 -2
  1191. data/spec/app/models/address.rb +0 -72
  1192. data/spec/app/models/address_component.rb +0 -5
  1193. data/spec/app/models/address_number.rb +0 -6
  1194. data/spec/app/models/agency.rb +0 -5
  1195. data/spec/app/models/agent.rb +0 -12
  1196. data/spec/app/models/album.rb +0 -14
  1197. data/spec/app/models/alert.rb +0 -5
  1198. data/spec/app/models/animal.rb +0 -25
  1199. data/spec/app/models/answer.rb +0 -4
  1200. data/spec/app/models/appointment.rb +0 -7
  1201. data/spec/app/models/article.rb +0 -13
  1202. data/spec/app/models/artist.rb +0 -66
  1203. data/spec/app/models/artwork.rb +0 -4
  1204. data/spec/app/models/augmentation.rb +0 -11
  1205. data/spec/app/models/author.rb +0 -6
  1206. data/spec/app/models/band.rb +0 -25
  1207. data/spec/app/models/bar.rb +0 -9
  1208. data/spec/app/models/basic.rb +0 -6
  1209. data/spec/app/models/bed.rb +0 -1
  1210. data/spec/app/models/big_palette.rb +0 -2
  1211. data/spec/app/models/birthday.rb +0 -13
  1212. data/spec/app/models/book.rb +0 -12
  1213. data/spec/app/models/breed.rb +0 -4
  1214. data/spec/app/models/browser.rb +0 -6
  1215. data/spec/app/models/building.rb +0 -7
  1216. data/spec/app/models/building_address.rb +0 -7
  1217. data/spec/app/models/bus.rb +0 -7
  1218. data/spec/app/models/business.rb +0 -5
  1219. data/spec/app/models/callback_recorder.rb +0 -25
  1220. data/spec/app/models/callback_test.rb +0 -9
  1221. data/spec/app/models/canvas.rb +0 -25
  1222. data/spec/app/models/car.rb +0 -1
  1223. data/spec/app/models/cat.rb +0 -8
  1224. data/spec/app/models/category.rb +0 -8
  1225. data/spec/app/models/child.rb +0 -4
  1226. data/spec/app/models/child_doc.rb +0 -22
  1227. data/spec/app/models/church.rb +0 -4
  1228. data/spec/app/models/circle.rb +0 -3
  1229. data/spec/app/models/circuit.rb +0 -4
  1230. data/spec/app/models/circus.rb +0 -7
  1231. data/spec/app/models/code.rb +0 -5
  1232. data/spec/app/models/comment.rb +0 -16
  1233. data/spec/app/models/contractor.rb +0 -7
  1234. data/spec/app/models/cookie.rb +0 -6
  1235. data/spec/app/models/country_code.rb +0 -8
  1236. data/spec/app/models/definition.rb +0 -8
  1237. data/spec/app/models/description.rb +0 -11
  1238. data/spec/app/models/dictionary.rb +0 -10
  1239. data/spec/app/models/division.rb +0 -10
  1240. data/spec/app/models/doctor.rb +0 -12
  1241. data/spec/app/models/dog.rb +0 -7
  1242. data/spec/app/models/dokument.rb +0 -5
  1243. data/spec/app/models/driver.rb +0 -7
  1244. data/spec/app/models/drug.rb +0 -8
  1245. data/spec/app/models/email.rb +0 -6
  1246. data/spec/app/models/employer.rb +0 -5
  1247. data/spec/app/models/entry.rb +0 -6
  1248. data/spec/app/models/eraser.rb +0 -1
  1249. data/spec/app/models/event.rb +0 -22
  1250. data/spec/app/models/exhibition.rb +0 -4
  1251. data/spec/app/models/exhibitor.rb +0 -5
  1252. data/spec/app/models/eye.rb +0 -9
  1253. data/spec/app/models/eye_bowl.rb +0 -9
  1254. data/spec/app/models/face.rb +0 -8
  1255. data/spec/app/models/favorite.rb +0 -6
  1256. data/spec/app/models/filesystem.rb +0 -4
  1257. data/spec/app/models/fire_hydrant.rb +0 -6
  1258. data/spec/app/models/firefox.rb +0 -4
  1259. data/spec/app/models/fish.rb +0 -8
  1260. data/spec/app/models/folder.rb +0 -7
  1261. data/spec/app/models/folder_item.rb +0 -9
  1262. data/spec/app/models/fruits.rb +0 -28
  1263. data/spec/app/models/game.rb +0 -21
  1264. data/spec/app/models/ghost.rb +0 -7
  1265. data/spec/app/models/home.rb +0 -4
  1266. data/spec/app/models/house.rb +0 -8
  1267. data/spec/app/models/html_writer.rb +0 -3
  1268. data/spec/app/models/image.rb +0 -22
  1269. data/spec/app/models/implant.rb +0 -16
  1270. data/spec/app/models/item.rb +0 -12
  1271. data/spec/app/models/jar.rb +0 -7
  1272. data/spec/app/models/label.rb +0 -40
  1273. data/spec/app/models/language.rb +0 -5
  1274. data/spec/app/models/lat_lng.rb +0 -15
  1275. data/spec/app/models/league.rb +0 -11
  1276. data/spec/app/models/learner.rb +0 -2
  1277. data/spec/app/models/line_item.rb +0 -6
  1278. data/spec/app/models/location.rb +0 -8
  1279. data/spec/app/models/login.rb +0 -8
  1280. data/spec/app/models/manufacturer.rb +0 -7
  1281. data/spec/app/models/meat.rb +0 -4
  1282. data/spec/app/models/membership.rb +0 -4
  1283. data/spec/app/models/mixed_drink.rb +0 -4
  1284. data/spec/app/models/movie.rb +0 -12
  1285. data/spec/app/models/my_hash.rb +0 -2
  1286. data/spec/app/models/name.rb +0 -23
  1287. data/spec/app/models/node.rb +0 -5
  1288. data/spec/app/models/note.rb +0 -12
  1289. data/spec/app/models/ordered_post.rb +0 -6
  1290. data/spec/app/models/ordered_preference.rb +0 -6
  1291. data/spec/app/models/oscar.rb +0 -15
  1292. data/spec/app/models/override.rb +0 -16
  1293. data/spec/app/models/ownable.rb +0 -6
  1294. data/spec/app/models/owner.rb +0 -6
  1295. data/spec/app/models/pack.rb +0 -3
  1296. data/spec/app/models/page.rb +0 -5
  1297. data/spec/app/models/page_question.rb +0 -4
  1298. data/spec/app/models/palette.rb +0 -7
  1299. data/spec/app/models/paranoid_phone.rb +0 -25
  1300. data/spec/app/models/paranoid_post.rb +0 -36
  1301. data/spec/app/models/parent.rb +0 -5
  1302. data/spec/app/models/parent_doc.rb +0 -6
  1303. data/spec/app/models/passport.rb +0 -5
  1304. data/spec/app/models/patient.rb +0 -9
  1305. data/spec/app/models/pdf_writer.rb +0 -3
  1306. data/spec/app/models/pencil.rb +0 -1
  1307. data/spec/app/models/person.rb +0 -201
  1308. data/spec/app/models/pet.rb +0 -23
  1309. data/spec/app/models/pet_owner.rb +0 -6
  1310. data/spec/app/models/phone.rb +0 -11
  1311. data/spec/app/models/phone_observer.rb +0 -6
  1312. data/spec/app/models/pizza.rb +0 -7
  1313. data/spec/app/models/player.rb +0 -35
  1314. data/spec/app/models/post.rb +0 -43
  1315. data/spec/app/models/powerup.rb +0 -11
  1316. data/spec/app/models/preference.rb +0 -9
  1317. data/spec/app/models/princess.rb +0 -8
  1318. data/spec/app/models/product.rb +0 -17
  1319. data/spec/app/models/profile.rb +0 -5
  1320. data/spec/app/models/pronunciation.rb +0 -5
  1321. data/spec/app/models/purchase.rb +0 -4
  1322. data/spec/app/models/question.rb +0 -8
  1323. data/spec/app/models/quiz.rb +0 -10
  1324. data/spec/app/models/rating.rb +0 -8
  1325. data/spec/app/models/record.rb +0 -46
  1326. data/spec/app/models/registry.rb +0 -4
  1327. data/spec/app/models/role.rb +0 -7
  1328. data/spec/app/models/root_category.rb +0 -4
  1329. data/spec/app/models/sandwich.rb +0 -4
  1330. data/spec/app/models/scheduler.rb +0 -7
  1331. data/spec/app/models/seo.rb +0 -7
  1332. data/spec/app/models/series.rb +0 -4
  1333. data/spec/app/models/server.rb +0 -13
  1334. data/spec/app/models/service.rb +0 -22
  1335. data/spec/app/models/shape.rb +0 -12
  1336. data/spec/app/models/shelf.rb +0 -5
  1337. data/spec/app/models/shipping_container.rb +0 -5
  1338. data/spec/app/models/shipping_pack.rb +0 -3
  1339. data/spec/app/models/shop.rb +0 -6
  1340. data/spec/app/models/short_agent.rb +0 -4
  1341. data/spec/app/models/short_quiz.rb +0 -5
  1342. data/spec/app/models/slave.rb +0 -6
  1343. data/spec/app/models/song.rb +0 -8
  1344. data/spec/app/models/square.rb +0 -4
  1345. data/spec/app/models/strategy.rb +0 -3
  1346. data/spec/app/models/sub_item.rb +0 -3
  1347. data/spec/app/models/subscription.rb +0 -4
  1348. data/spec/app/models/survey.rb +0 -5
  1349. data/spec/app/models/symptom.rb +0 -6
  1350. data/spec/app/models/tag.rb +0 -8
  1351. data/spec/app/models/target.rb +0 -5
  1352. data/spec/app/models/template.rb +0 -5
  1353. data/spec/app/models/thing.rb +0 -9
  1354. data/spec/app/models/title.rb +0 -4
  1355. data/spec/app/models/tool.rb +0 -8
  1356. data/spec/app/models/topping.rb +0 -5
  1357. data/spec/app/models/track.rb +0 -38
  1358. data/spec/app/models/translation.rb +0 -5
  1359. data/spec/app/models/tree.rb +0 -9
  1360. data/spec/app/models/truck.rb +0 -3
  1361. data/spec/app/models/user.rb +0 -21
  1362. data/spec/app/models/user_account.rb +0 -10
  1363. data/spec/app/models/validation_callback.rb +0 -10
  1364. data/spec/app/models/vehicle.rb +0 -11
  1365. data/spec/app/models/version.rb +0 -5
  1366. data/spec/app/models/vet_visit.rb +0 -5
  1367. data/spec/app/models/video.rb +0 -17
  1368. data/spec/app/models/video_game.rb +0 -1
  1369. data/spec/app/models/weapon.rb +0 -11
  1370. data/spec/app/models/wiki_page.rb +0 -17
  1371. data/spec/app/models/word.rb +0 -12
  1372. data/spec/app/models/word_origin.rb +0 -11
  1373. data/spec/app/models/writer.rb +0 -11
  1374. data/spec/mongoid/atomic/positionable_spec.rb +0 -227
  1375. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  1376. data/spec/mongoid/callbacks_spec.rb +0 -1564
  1377. data/spec/mongoid/components_spec.rb +0 -24
  1378. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  1379. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  1380. data/spec/mongoid/criterion/inspection_spec.rb +0 -27
  1381. data/spec/mongoid/criterion/marshalable_spec.rb +0 -28
  1382. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  1383. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  1384. data/spec/mongoid/criterion/scoping_spec.rb +0 -391
  1385. data/spec/mongoid/dirty_spec.rb +0 -1508
  1386. data/spec/mongoid/errors/eager_load_spec.rb +0 -29
  1387. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +0 -29
  1388. data/spec/mongoid/errors/no_session_config_spec.rb +0 -29
  1389. data/spec/mongoid/errors/no_session_database_spec.rb +0 -29
  1390. data/spec/mongoid/errors/no_session_hosts_spec.rb +0 -29
  1391. data/spec/mongoid/errors/no_sessions_config_spec.rb +0 -29
  1392. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  1393. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1394. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1395. data/spec/mongoid/finders_spec.rb +0 -321
  1396. data/spec/mongoid/hierarchy_spec.rb +0 -244
  1397. data/spec/mongoid/identity_map_spec.rb +0 -564
  1398. data/spec/mongoid/indexes_spec.rb +0 -404
  1399. data/spec/mongoid/inspection_spec.rb +0 -57
  1400. data/spec/mongoid/json_spec.rb +0 -33
  1401. data/spec/mongoid/matchers/all_spec.rb +0 -31
  1402. data/spec/mongoid/matchers/and_spec.rb +0 -162
  1403. data/spec/mongoid/matchers/default_spec.rb +0 -130
  1404. data/spec/mongoid/matchers/exists_spec.rb +0 -57
  1405. data/spec/mongoid/matchers/gt_spec.rb +0 -74
  1406. data/spec/mongoid/matchers/gte_spec.rb +0 -74
  1407. data/spec/mongoid/matchers/in_spec.rb +0 -25
  1408. data/spec/mongoid/matchers/lt_spec.rb +0 -74
  1409. data/spec/mongoid/matchers/lte_spec.rb +0 -74
  1410. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  1411. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  1412. data/spec/mongoid/matchers/or_spec.rb +0 -106
  1413. data/spec/mongoid/matchers/size_spec.rb +0 -25
  1414. data/spec/mongoid/matchers_spec.rb +0 -532
  1415. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  1416. data/spec/mongoid/nested_attributes_spec.rb +0 -4945
  1417. data/spec/mongoid/observer_spec.rb +0 -290
  1418. data/spec/mongoid/paranoia_spec.rb +0 -759
  1419. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  1420. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  1421. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  1422. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  1423. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  1424. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  1425. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  1426. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  1427. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  1428. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  1429. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  1430. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  1431. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  1432. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  1433. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  1434. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  1435. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  1436. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  1437. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  1438. data/spec/mongoid/persistence_spec.rb +0 -2279
  1439. data/spec/mongoid/railties/document_spec.rb +0 -24
  1440. data/spec/mongoid/relations/accessors_spec.rb +0 -844
  1441. data/spec/mongoid/relations/auto_save_spec.rb +0 -261
  1442. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1443. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1444. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1445. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1446. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1447. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1448. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1449. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1450. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1451. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1452. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -234
  1453. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1454. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -241
  1455. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1456. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1457. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -124
  1458. data/spec/mongoid/relations/builders_spec.rb +0 -226
  1459. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1460. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1461. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1462. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1463. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1464. data/spec/mongoid/relations/constraint_spec.rb +0 -74
  1465. data/spec/mongoid/relations/conversions_spec.rb +0 -126
  1466. data/spec/mongoid/relations/counter_cache_spec.rb +0 -205
  1467. data/spec/mongoid/relations/cyclic_spec.rb +0 -156
  1468. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1469. data/spec/mongoid/relations/embedded/in_spec.rb +0 -580
  1470. data/spec/mongoid/relations/embedded/many_spec.rb +0 -3841
  1471. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1055
  1472. data/spec/mongoid/relations/macros_spec.rb +0 -625
  1473. data/spec/mongoid/relations/metadata_spec.rb +0 -2030
  1474. data/spec/mongoid/relations/options_spec.rb +0 -35
  1475. data/spec/mongoid/relations/polymorphic_spec.rb +0 -132
  1476. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1501
  1477. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3632
  1478. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3561
  1479. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1331
  1480. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1481. data/spec/mongoid/relations/synchronization_spec.rb +0 -453
  1482. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1710
  1483. data/spec/mongoid/relations_spec.rb +0 -188
  1484. data/spec/mongoid/reloading_spec.rb +0 -305
  1485. data/spec/mongoid/scoping_spec.rb +0 -978
  1486. data/spec/mongoid/serialization_spec.rb +0 -833
  1487. data/spec/mongoid/sessions/factory_spec.rb +0 -312
  1488. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  1489. data/spec/mongoid/sessions_spec.rb +0 -1111
  1490. data/spec/mongoid/sharding_spec.rb +0 -61
  1491. data/spec/mongoid/state_spec.rb +0 -102
  1492. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  1493. data/spec/mongoid/validations/associated_spec.rb +0 -183
  1494. data/spec/mongoid/validations/format_spec.rb +0 -83
  1495. data/spec/mongoid/validations/length_spec.rb +0 -223
  1496. data/spec/mongoid/validations/numericality_spec.rb +0 -30
  1497. data/spec/mongoid/validations/presence_spec.rb +0 -592
  1498. data/spec/mongoid/validations/uniqueness_spec.rb +0 -2399
  1499. data/spec/mongoid/validations_spec.rb +0 -309
  1500. data/spec/mongoid/versioning_spec.rb +0 -540
  1501. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -0,0 +1,2232 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Mongoid::Association::Referenced::HasMany::Enumerable do
6
+
7
+ describe "#==" do
8
+
9
+ context "when comparing with an enumerable" do
10
+
11
+ let(:person) do
12
+ Person.create!
13
+ end
14
+
15
+ let!(:post) do
16
+ Post.create!(person_id: person.id)
17
+ end
18
+
19
+ context "when only a criteria target exists" do
20
+
21
+ let(:criteria) do
22
+ Post.where(person_id: person.id)
23
+ end
24
+
25
+ let!(:enumerable) do
26
+ described_class.new(criteria)
27
+ end
28
+
29
+ it "returns the equality check" do
30
+ expect(enumerable).to eq([ post ])
31
+ end
32
+ end
33
+
34
+ context "when only an array target exists" do
35
+
36
+ let!(:enumerable) do
37
+ described_class.new([ post ])
38
+ end
39
+
40
+ it "returns the equality check" do
41
+ expect(enumerable._loaded.values).to eq([ post ])
42
+ end
43
+ end
44
+
45
+ context "when a criteria and added exist" do
46
+
47
+ let(:criteria) do
48
+ Post.where(person_id: person.id)
49
+ end
50
+
51
+ let(:enumerable) do
52
+ described_class.new(criteria)
53
+ end
54
+
55
+ let(:post_two) do
56
+ Post.new
57
+ end
58
+
59
+ context "when the added does not contain unloaded docs" do
60
+
61
+ before do
62
+ enumerable << post_two
63
+ end
64
+
65
+ it "returns the equality check" do
66
+ expect(enumerable).to eq([ post, post_two ])
67
+ end
68
+ end
69
+
70
+ context "when the added contains unloaded docs" do
71
+
72
+ before do
73
+ enumerable << post
74
+ end
75
+
76
+ it "returns the equality check" do
77
+ expect(enumerable).to eq([ post ])
78
+ end
79
+ end
80
+
81
+ context "when the enumerable is loaded" do
82
+
83
+ before do
84
+ enumerable.instance_variable_set(:@executed, true)
85
+ end
86
+
87
+ context "when the loaded has no docs and added is persisted" do
88
+
89
+ before do
90
+ post.save!
91
+ enumerable._added[post.id] = post
92
+ end
93
+
94
+ it "returns the equality check" do
95
+ expect(enumerable).to eq([ post ])
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ context "when comparing with a non enumerable" do
103
+
104
+ let(:enumerable) do
105
+ described_class.new([])
106
+ end
107
+
108
+ it "returns false" do
109
+ expect(enumerable).to_not eq("person")
110
+ end
111
+ end
112
+ end
113
+
114
+ describe "#===" do
115
+
116
+ let(:data) { [] }
117
+
118
+ shared_examples 'standard library-compatible enumerable' do
119
+ context "when compared to an array class" do
120
+
121
+ it "returns false" do
122
+ expect(enumerable === Array).to be false
123
+ end
124
+ end
125
+
126
+ context "when compared to an enumerable class" do
127
+
128
+ it "returns false" do
129
+ expect(enumerable === described_class).to be false
130
+ end
131
+ end
132
+
133
+ context "when compared to a different class" do
134
+
135
+ it "returns false" do
136
+ expect(enumerable === Mongoid::Document).to be false
137
+ end
138
+ end
139
+
140
+ context "when compared to an array instance" do
141
+
142
+ context "when the entries are equal" do
143
+
144
+ let(:data) do
145
+ [Post.new(id: 2)]
146
+ end
147
+
148
+ let(:other) do
149
+ described_class.new([Post.new(id: 2)])
150
+ end
151
+
152
+ it "returns true" do
153
+ expect(enumerable === other).to be true
154
+ end
155
+ end
156
+
157
+ context "when the entries are both empty" do
158
+
159
+ let(:other) do
160
+ described_class.new([])
161
+ end
162
+
163
+ it "returns true" do
164
+ expect(enumerable === other).to be true
165
+ end
166
+ end
167
+
168
+ context "when the entries are not equal" do
169
+
170
+ let(:other) do
171
+ described_class.new([ Band.new ])
172
+ end
173
+
174
+ it "returns false" do
175
+ expect(enumerable === other).to be false
176
+ end
177
+ end
178
+ end
179
+ end
180
+
181
+ context 'enumerable' do
182
+ let(:enumerable) do
183
+ described_class.new(data)
184
+ end
185
+
186
+ include_examples 'standard library-compatible enumerable'
187
+ end
188
+
189
+ context 'Array instance' do
190
+ let(:enumerable) do
191
+ data
192
+ end
193
+
194
+ include_examples 'standard library-compatible enumerable'
195
+ end
196
+ end
197
+
198
+ describe "#<<" do
199
+
200
+ let(:person) do
201
+ Person.create!
202
+ end
203
+
204
+ let!(:post) do
205
+ Post.create!(person_id: person.id)
206
+ end
207
+
208
+ let!(:enumerable) do
209
+ described_class.new([])
210
+ end
211
+
212
+ context "when the association is empty" do
213
+
214
+ let!(:added) do
215
+ enumerable << post
216
+ end
217
+
218
+ it "adds the document to the added target" do
219
+ expect(enumerable._added).to eq({ post.id => post })
220
+ end
221
+
222
+ it "returns the added documents" do
223
+ expect(added).to eq([ post ])
224
+ end
225
+
226
+ it "sets the base on the new document" do
227
+ expect_query(0) do
228
+ added.collect(&:person)
229
+ end
230
+ end
231
+ end
232
+ end
233
+
234
+ describe "#empty?" do
235
+
236
+ let(:person) do
237
+ Person.create!
238
+ end
239
+
240
+ let!(:post_one) do
241
+ Post.create!(person_id: person.id)
242
+ end
243
+
244
+ let!(:post_two) do
245
+ Post.create!(person_id: person.id)
246
+ end
247
+
248
+ context "when only a criteria target exists" do
249
+
250
+ let(:criteria) do
251
+ Post.where(person_id: person.id)
252
+ end
253
+
254
+ let!(:enumerable) do
255
+ described_class.new(criteria)
256
+ end
257
+
258
+ let(:empty) do
259
+ enumerable.empty?
260
+ end
261
+
262
+ it "returns false" do
263
+ expect(empty).to be false
264
+ end
265
+
266
+ context 'when #empty? is called' do
267
+
268
+ before { empty }
269
+
270
+ it "retains the correct length" do
271
+ expect(enumerable.length).to eq(2)
272
+ end
273
+
274
+ it "retains the correct length when calling to_a" do
275
+ expect(enumerable.to_a.length).to eq(2)
276
+ end
277
+
278
+ context "when iterating over the association a second time" do
279
+
280
+ before do
281
+ enumerable.each { |post| post }
282
+ end
283
+
284
+ it "retains the correct length" do
285
+ expect(enumerable.length).to eq(2)
286
+ end
287
+
288
+ it "retains the correct length when calling to_a" do
289
+ expect(enumerable.to_a.length).to eq(2)
290
+ end
291
+ end
292
+ end
293
+ end
294
+
295
+ context "when the documents have been loaded" do
296
+ let(:criteria) do
297
+ Post.where(person_id: person.id)
298
+ end
299
+
300
+ let!(:enumerable) do
301
+ described_class.new(criteria)
302
+ end
303
+
304
+ before do
305
+ enumerable.load_all!
306
+ end
307
+
308
+ it "is _loaded" do
309
+ expect(enumerable._loaded?).to be true
310
+ end
311
+
312
+ it "it does not call #exists? on the unloaded scope" do
313
+ expect(enumerable._unloaded).to_not receive(:exists?)
314
+ expect(enumerable.empty?).to be false
315
+ end
316
+ end
317
+
318
+ context "when the documents are not loaded" do
319
+
320
+ let(:criteria) do
321
+ Post.where(person_id: person.id)
322
+ end
323
+
324
+ let!(:enumerable) do
325
+ described_class.new(criteria)
326
+ end
327
+
328
+ it "is not _loaded" do
329
+ expect(enumerable._loaded?).to be false
330
+ end
331
+
332
+ it "it calls #exists? on the unloaded scope" do
333
+ expect(enumerable._unloaded).to receive(:exists?)
334
+ expect(enumerable.empty?).to be true
335
+ end
336
+
337
+ context "when documents are added" do
338
+
339
+ before do
340
+ enumerable << post_one
341
+ end
342
+
343
+ it "is not _loaded" do
344
+ expect(enumerable._loaded?).to be false
345
+ end
346
+
347
+ it "it does not call #exists? on the unloaded scope" do
348
+ expect(enumerable._unloaded).to_not receive(:exists?)
349
+ expect(enumerable.empty?).to be false
350
+ end
351
+ end
352
+ end
353
+ end
354
+
355
+ describe "#any?" do
356
+
357
+ let(:person) do
358
+ Person.create!
359
+ end
360
+
361
+ let!(:post_one) do
362
+ Post.create!(person_id: person.id)
363
+ end
364
+
365
+ let!(:post_two) do
366
+ Post.create!(person_id: person.id)
367
+ end
368
+
369
+ context "when only a criteria target exists" do
370
+
371
+ let(:criteria) do
372
+ Post.where(person_id: person.id)
373
+ end
374
+
375
+ let!(:enumerable) do
376
+ described_class.new(criteria)
377
+ end
378
+
379
+ let(:any) do
380
+ enumerable.any?
381
+ end
382
+
383
+ it "returns true" do
384
+ expect(any).to be true
385
+ end
386
+
387
+ context 'when #any? is called' do
388
+
389
+ before { any }
390
+
391
+ it "retains the correct length" do
392
+ expect(enumerable.length).to eq(2)
393
+ end
394
+
395
+ it "retains the correct length when calling to_a" do
396
+ expect(enumerable.to_a.length).to eq(2)
397
+ end
398
+
399
+ context "when iterating over the association a second time" do
400
+
401
+ before do
402
+ enumerable.each { |post| post }
403
+ end
404
+
405
+ it "retains the correct length" do
406
+ expect(enumerable.length).to eq(2)
407
+ end
408
+
409
+ it "retains the correct length when calling to_a" do
410
+ expect(enumerable.to_a.length).to eq(2)
411
+ end
412
+ end
413
+ end
414
+ end
415
+
416
+ context "when the documents have been loaded" do
417
+ let(:criteria) do
418
+ Post.where(person_id: person.id)
419
+ end
420
+
421
+ let!(:enumerable) do
422
+ described_class.new(criteria)
423
+ end
424
+
425
+ before do
426
+ enumerable.load_all!
427
+ end
428
+
429
+ it "is _loaded" do
430
+ expect(enumerable._loaded?).to be true
431
+ end
432
+
433
+ it "it does not call #exists? on the unloaded scope" do
434
+ expect(enumerable._unloaded).to_not receive(:exists?)
435
+ expect(enumerable.any?).to be true
436
+ end
437
+
438
+ context "when a block is given" do
439
+ it "returns true when the predicate is true" do
440
+ expect(
441
+ enumerable.any? { |doc| true }
442
+ ).to be true
443
+ end
444
+
445
+ it "returns false when the predicate is false" do
446
+ expect(
447
+ enumerable.any? { |doc| false }
448
+ ).to be false
449
+ end
450
+ end
451
+
452
+ context "when an argument is given" do
453
+
454
+ it "returns true when the argument is true" do
455
+ expect(enumerable.any?(Post)).to be true
456
+ end
457
+
458
+ it "returns false when the argument is false" do
459
+ expect(enumerable.any?(Sandwich)).to be false
460
+ end
461
+ end
462
+
463
+ context "when both an argument and a block are given" do
464
+
465
+ it "gives precedence to the pattern" do
466
+ expect(
467
+ enumerable.any?(Post) { |doc| false }
468
+ ).to be true
469
+ end
470
+ end
471
+ end
472
+
473
+ context "when the documents are not loaded" do
474
+
475
+ let(:criteria) do
476
+ Post.where(person_id: person.id)
477
+ end
478
+
479
+ let!(:enumerable) do
480
+ described_class.new(criteria)
481
+ end
482
+
483
+ it "is not _loaded" do
484
+ expect(enumerable._loaded?).to be false
485
+ end
486
+
487
+ it "it calls #exists? on the unloaded scope" do
488
+ expect(enumerable._unloaded).to receive(:exists?)
489
+ expect(enumerable.any?).to be false
490
+ end
491
+
492
+ context "when documents are added" do
493
+
494
+ before do
495
+ enumerable << post_one
496
+ end
497
+
498
+ it "is not _loaded" do
499
+ expect(enumerable._loaded?).to be false
500
+ end
501
+
502
+ it "it does not call #exists? on the unloaded scope" do
503
+ expect(enumerable._unloaded).to_not receive(:exists?)
504
+ expect(enumerable.any?).to be true
505
+ end
506
+ end
507
+
508
+ context "when a block is given" do
509
+ it "returns true when the predicate is true" do
510
+ expect(
511
+ enumerable.any? { |doc| true }
512
+ ).to be true
513
+ end
514
+
515
+ it "returns false when the predicate is false" do
516
+ expect(
517
+ enumerable.any? { |doc| false }
518
+ ).to be false
519
+ end
520
+ end
521
+
522
+ context "when an argument is given" do
523
+
524
+ it "returns true when the argument is true" do
525
+ expect(enumerable.any?(Post)).to be true
526
+ end
527
+
528
+ it "returns false when the argument is false" do
529
+ expect(enumerable.any?(Sandwich)).to be false
530
+ end
531
+ end
532
+
533
+ context "when both an argument and a block are given" do
534
+
535
+ it "gives precedence to the pattern" do
536
+ expect(
537
+ enumerable.any?(Post) { |doc| false }
538
+ ).to be true
539
+ end
540
+ end
541
+ end
542
+ end
543
+
544
+ describe "#clear" do
545
+
546
+ let(:person) do
547
+ Person.create!
548
+ end
549
+
550
+ let!(:post) do
551
+ Post.create!(person_id: person.id)
552
+ end
553
+
554
+ let!(:post_two) do
555
+ Post.create!(person_id: person.id)
556
+ end
557
+
558
+ let(:criteria) do
559
+ Post.where(person_id: person.id)
560
+ end
561
+
562
+ let(:enumerable) do
563
+ described_class.new(criteria)
564
+ end
565
+
566
+ before do
567
+ enumerable._loaded[post.id] = post
568
+ enumerable << post
569
+ end
570
+
571
+ let!(:clear) do
572
+ enumerable.clear do |doc|
573
+ expect(doc).to be_a(Post)
574
+ end
575
+ end
576
+
577
+ it "clears out the loaded docs" do
578
+ expect(enumerable._loaded).to be_empty
579
+ end
580
+
581
+ it "clears out the added docs" do
582
+ expect(enumerable._added).to be_empty
583
+ end
584
+
585
+ it "retains its loaded state" do
586
+ expect(enumerable).to_not be__loaded
587
+ end
588
+ end
589
+
590
+ describe "#clone" do
591
+
592
+ let(:person) do
593
+ Person.create!
594
+ end
595
+
596
+ let!(:post) do
597
+ Post.create!(title: "one", person_id: person.id)
598
+ end
599
+
600
+ let!(:post_two) do
601
+ Post.create!(title: "two", person_id: person.id)
602
+ end
603
+
604
+ let(:criteria) do
605
+ Post.where(person_id: person.id)
606
+ end
607
+
608
+ let(:enumerable) do
609
+ described_class.new(criteria)
610
+ end
611
+
612
+ before do
613
+ enumerable << post
614
+ enumerable << post_two
615
+ end
616
+
617
+ let(:cloned) do
618
+ enumerable.clone
619
+ end
620
+
621
+ it "does not retain the first id" do
622
+ expect(cloned.first).to_not eq(post)
623
+ end
624
+
625
+ it "does not retain the last id" do
626
+ expect(cloned.last).to_not eq(post_two)
627
+ end
628
+ end
629
+
630
+ describe "#delete" do
631
+
632
+ let(:person) do
633
+ Person.create!
634
+ end
635
+
636
+ context "when the document is loaded" do
637
+
638
+ let!(:post) do
639
+ Post.create!(person_id: person.id)
640
+ end
641
+
642
+ let!(:enumerable) do
643
+ described_class.new([ post ])
644
+ end
645
+
646
+ let!(:deleted) do
647
+ enumerable.delete(post)
648
+ end
649
+
650
+ it "deletes the document from the enumerable" do
651
+ expect(enumerable._loaded).to be_empty
652
+ end
653
+
654
+ it "returns the document" do
655
+ expect(deleted).to eq(post)
656
+ end
657
+ end
658
+
659
+ context "when the document is added" do
660
+
661
+ let!(:post) do
662
+ Post.new
663
+ end
664
+
665
+ let(:criteria) do
666
+ Person.where(person_id: person.id)
667
+ end
668
+
669
+ let!(:enumerable) do
670
+ described_class.new(criteria)
671
+ end
672
+
673
+ before do
674
+ enumerable << post
675
+ end
676
+
677
+ let!(:deleted) do
678
+ enumerable.delete(post)
679
+ end
680
+
681
+ it "removes the document from the added docs" do
682
+ expect(enumerable._added).to be_empty
683
+ end
684
+
685
+ it "returns the document" do
686
+ expect(deleted).to eq(post)
687
+ end
688
+ end
689
+
690
+ context "when the document is unloaded" do
691
+
692
+ let!(:post) do
693
+ Post.create!(person_id: person.id)
694
+ end
695
+
696
+ let(:criteria) do
697
+ Post.where(person_id: person.id)
698
+ end
699
+
700
+ let!(:enumerable) do
701
+ described_class.new(criteria)
702
+ end
703
+
704
+ let!(:deleted) do
705
+ enumerable.delete(post)
706
+ end
707
+
708
+ it "does not load the document" do
709
+ expect(enumerable._loaded).to be_empty
710
+ end
711
+
712
+ it "returns the document" do
713
+ expect(deleted).to eq(post)
714
+ end
715
+ end
716
+
717
+ context "when the document is not found" do
718
+
719
+ let!(:post) do
720
+ Post.create!(person_id: person.id)
721
+ end
722
+
723
+ let(:criteria) do
724
+ Person.where(person_id: person.id)
725
+ end
726
+
727
+ let!(:enumerable) do
728
+ described_class.new([ post ])
729
+ end
730
+
731
+ let!(:deleted) do
732
+ enumerable.delete(Post.new) do |doc|
733
+ expect(doc).to be_nil
734
+ end
735
+ end
736
+
737
+ it "returns nil" do
738
+ expect(deleted).to be_nil
739
+ end
740
+ end
741
+ end
742
+
743
+ describe "#delete_if" do
744
+
745
+ let(:person) do
746
+ Person.create!
747
+ end
748
+
749
+ context "when the document is loaded" do
750
+
751
+ let!(:post) do
752
+ Post.create!(person_id: person.id)
753
+ end
754
+
755
+ let!(:enumerable) do
756
+ described_class.new([ post ])
757
+ end
758
+
759
+ let!(:deleted) do
760
+ enumerable.delete_if { |doc| doc == post }
761
+ end
762
+
763
+ it "deletes the document from the enumerable" do
764
+ expect(enumerable._loaded).to be_empty
765
+ end
766
+
767
+ it "returns the remaining docs" do
768
+ expect(deleted).to be_empty
769
+ end
770
+ end
771
+
772
+ context "when the document is added" do
773
+
774
+ let!(:post) do
775
+ Post.new
776
+ end
777
+
778
+ let(:criteria) do
779
+ Person.where(person_id: person.id)
780
+ end
781
+
782
+ let!(:enumerable) do
783
+ described_class.new(criteria)
784
+ end
785
+
786
+ before do
787
+ enumerable << post
788
+ end
789
+
790
+ let!(:deleted) do
791
+ enumerable.delete_if { |doc| doc == post }
792
+ end
793
+
794
+ it "removes the document from the added docs" do
795
+ expect(enumerable._added).to be_empty
796
+ end
797
+
798
+ it "returns the remaining docs" do
799
+ expect(deleted).to be_empty
800
+ end
801
+ end
802
+
803
+ context "when the document is unloaded" do
804
+
805
+ let!(:post) do
806
+ Post.create!(person_id: person.id)
807
+ end
808
+
809
+ let(:criteria) do
810
+ Post.where(person_id: person.id)
811
+ end
812
+
813
+ let!(:enumerable) do
814
+ described_class.new(criteria)
815
+ end
816
+
817
+ let!(:deleted) do
818
+ enumerable.delete_if { |doc| doc == post }
819
+ end
820
+
821
+ it "does not load the document" do
822
+ expect(enumerable._loaded).to be_empty
823
+ end
824
+
825
+ it "returns the remaining docs" do
826
+ expect(deleted).to be_empty
827
+ end
828
+ end
829
+
830
+ context "when the block doesn't match" do
831
+
832
+ let!(:post) do
833
+ Post.create!(person_id: person.id)
834
+ end
835
+
836
+ let(:criteria) do
837
+ Person.where(person_id: person.id)
838
+ end
839
+
840
+ let!(:enumerable) do
841
+ described_class.new([ post ])
842
+ end
843
+
844
+ let!(:deleted) do
845
+ enumerable.delete_if { |doc| doc == Post.new }
846
+ end
847
+
848
+ it "returns the remaining docs" do
849
+ expect(deleted).to eq([ post ])
850
+ end
851
+ end
852
+ end
853
+
854
+ describe "#detect" do
855
+
856
+ let(:person) do
857
+ Person.create!
858
+ end
859
+
860
+ let!(:post) do
861
+ Post.create!(person: person, title: "test")
862
+ end
863
+
864
+ let(:criteria) do
865
+ Post.where(person_id: person.id)
866
+ end
867
+
868
+ let!(:enumerable) do
869
+ described_class.new(criteria)
870
+ end
871
+
872
+ context "when setting a value on the matching document" do
873
+
874
+ before do
875
+ enumerable.detect{ |post| post.title = "test" }.rating = 10
876
+ end
877
+
878
+ it "sets the value on the instance" do
879
+ expect(enumerable.detect{ |post| post.title = "test" }.rating).to eq(10)
880
+ end
881
+ end
882
+ end
883
+
884
+ describe "#each" do
885
+
886
+ let(:person) do
887
+ Person.create!
888
+ end
889
+
890
+ let!(:post) do
891
+ Post.create!(person_id: person.id)
892
+ end
893
+
894
+ context "when only a criteria target exists" do
895
+
896
+ let(:criteria) do
897
+ Post.where(person_id: person.id)
898
+ end
899
+
900
+ let!(:enumerable) do
901
+ described_class.new(criteria)
902
+ end
903
+
904
+ let!(:iterated) do
905
+ enumerable.each do |doc|
906
+ expect(doc).to be_a(Post)
907
+ end
908
+ end
909
+
910
+ it "loads each document" do
911
+ expect(enumerable._loaded).to eq({ post.id => post })
912
+ end
913
+
914
+ it "becomes loaded" do
915
+ expect(enumerable).to be__loaded
916
+ end
917
+
918
+ context 'when the base association is accessed from each document' do
919
+
920
+ let(:persons) do
921
+ described_class.new(criteria).collect(&:person)
922
+ end
923
+
924
+ before do
925
+ Post.create!(person_id: person.id)
926
+ Post.create!(person_id: person.id)
927
+ end
928
+
929
+ it 'sets the base association from the criteria' do
930
+ expect(persons.uniq.size).to eq(1)
931
+ end
932
+ end
933
+ end
934
+
935
+ context "when only an array target exists" do
936
+
937
+ let!(:enumerable) do
938
+ described_class.new([ post ])
939
+ end
940
+
941
+ let!(:iterated) do
942
+ enumerable.each do |doc|
943
+ expect(doc).to be_a(Post)
944
+ end
945
+ end
946
+
947
+ it "does not alter the loaded docs" do
948
+ expect(enumerable._loaded).to eq({ post.id => post })
949
+ end
950
+
951
+ it "stays loaded" do
952
+ expect(enumerable).to be__loaded
953
+ end
954
+ end
955
+
956
+ context "when a criteria and added exist" do
957
+
958
+ let(:criteria) do
959
+ Post.where(person_id: person.id)
960
+ end
961
+
962
+ let!(:enumerable) do
963
+ described_class.new(criteria)
964
+ end
965
+
966
+ let(:post_two) do
967
+ Post.new
968
+ end
969
+
970
+ context "when the added does not contain unloaded docs" do
971
+
972
+ before do
973
+ enumerable << post_two
974
+ end
975
+
976
+ let!(:iterated) do
977
+ enumerable.each do |doc|
978
+ expect(doc).to be_a(Post)
979
+ end
980
+ end
981
+
982
+ it "adds the unloaded to the loaded docs" do
983
+ expect(enumerable._loaded).to eq({ post.id => post })
984
+ end
985
+
986
+ it "keeps the appended in the added docs" do
987
+ expect(enumerable._added).to eq({ post_two.id => post_two })
988
+ end
989
+
990
+ it "stays loaded" do
991
+ expect(enumerable).to be__loaded
992
+ end
993
+ end
994
+
995
+ context "when the added contains unloaded docs" do
996
+
997
+ before do
998
+ enumerable << post
999
+ end
1000
+
1001
+ let!(:iterated) do
1002
+ enumerable.each do |doc|
1003
+ expect(doc).to be_a(Post)
1004
+ end
1005
+ end
1006
+
1007
+ it "adds the persisted added doc to the loaded" do
1008
+ expect(enumerable._loaded).to eq({ post.id => post })
1009
+ end
1010
+
1011
+ it "stays loaded" do
1012
+ expect(enumerable).to be__loaded
1013
+ end
1014
+ end
1015
+ end
1016
+
1017
+ context "when no block is passed" do
1018
+
1019
+ let(:criteria) do
1020
+ Post.where(person_id: person.id)
1021
+ end
1022
+
1023
+ let!(:enumerable) do
1024
+ described_class.new(criteria)
1025
+ end
1026
+
1027
+ it "returns an enumerator" do
1028
+ expect(enumerable.each.class.include?(Enumerable)).to be true
1029
+ end
1030
+
1031
+ end
1032
+ end
1033
+
1034
+ describe "#entries" do
1035
+
1036
+ let(:person) do
1037
+ Person.create!
1038
+ end
1039
+
1040
+ let(:criteria) do
1041
+ Post.where(person_id: person.id)
1042
+ end
1043
+
1044
+ let!(:enumerable) do
1045
+ described_class.new(criteria)
1046
+ end
1047
+
1048
+ context "when the added contains a persisted document" do
1049
+
1050
+ let!(:post) do
1051
+ Post.create!(person_id: person.id)
1052
+ end
1053
+
1054
+ before do
1055
+ enumerable << post
1056
+ end
1057
+
1058
+ let(:entries) do
1059
+ enumerable.entries
1060
+ end
1061
+
1062
+ it "yields to the in memory documents first" do
1063
+ expect(entries.first).to equal(post)
1064
+ end
1065
+ end
1066
+ end
1067
+
1068
+ describe "#first" do
1069
+
1070
+ let(:person) do
1071
+ Person.create!
1072
+ end
1073
+
1074
+ context "when the enumerable is not loaded" do
1075
+
1076
+ let(:criteria) do
1077
+ Post.where(person_id: person.id)
1078
+ end
1079
+
1080
+ let(:enumerable) do
1081
+ described_class.new(criteria)
1082
+ end
1083
+
1084
+ context "when unloaded is not empty" do
1085
+
1086
+ context "when added is empty" do
1087
+
1088
+ let!(:post) do
1089
+ Post.create!(person_id: person.id)
1090
+ end
1091
+
1092
+ let(:first) do
1093
+ enumerable.first
1094
+ end
1095
+
1096
+ it "returns the first unloaded doc" do
1097
+ expect(first).to eq(post)
1098
+ end
1099
+
1100
+ it "does not load the enumerable" do
1101
+ expect(enumerable).to_not be__loaded
1102
+ end
1103
+
1104
+ it "receives query only once" do
1105
+ expect(criteria).to receive(:first).once
1106
+ first
1107
+ end
1108
+ end
1109
+
1110
+ context "when added is not empty" do
1111
+
1112
+ let!(:post) do
1113
+ Post.create!(person_id: person.id)
1114
+ end
1115
+
1116
+ let(:post_two) do
1117
+ Post.new(person_id: person.id)
1118
+ end
1119
+
1120
+ before do
1121
+ enumerable << post_two
1122
+ end
1123
+
1124
+ let(:first) do
1125
+ enumerable.first
1126
+ end
1127
+
1128
+ context "when a perviously persisted unloaded doc exists" do
1129
+
1130
+ it "returns the first added doc" do
1131
+ expect(first).to eq(post)
1132
+ end
1133
+
1134
+ it "does not load the enumerable" do
1135
+ expect(enumerable).to_not be__loaded
1136
+ end
1137
+ end
1138
+ end
1139
+ end
1140
+
1141
+ context "when unloaded is empty" do
1142
+
1143
+ let!(:post) do
1144
+ Post.new(person_id: person.id)
1145
+ end
1146
+
1147
+ before do
1148
+ enumerable << post
1149
+ end
1150
+
1151
+ let(:first) do
1152
+ enumerable.first
1153
+ end
1154
+
1155
+ it "returns the first loaded doc" do
1156
+ expect(first).to eq(post)
1157
+ end
1158
+
1159
+ it "does not load the enumerable" do
1160
+ expect(enumerable).to_not be__loaded
1161
+ end
1162
+ end
1163
+
1164
+ context "when unloaded and added are empty" do
1165
+
1166
+ let(:first) do
1167
+ enumerable.first
1168
+ end
1169
+
1170
+ it "returns nil" do
1171
+ expect(first).to be_nil
1172
+ end
1173
+
1174
+ it "does not load the enumerable" do
1175
+ expect(enumerable).to_not be__loaded
1176
+ end
1177
+ end
1178
+ end
1179
+
1180
+ context "when the enumerable is loaded" do
1181
+
1182
+ context "when loaded is not empty" do
1183
+
1184
+ let!(:post) do
1185
+ Post.create!(person_id: person.id)
1186
+ end
1187
+
1188
+ let(:enumerable) do
1189
+ described_class.new([ post ])
1190
+ end
1191
+
1192
+ let(:first) do
1193
+ enumerable.first
1194
+ end
1195
+
1196
+ it "returns the first loaded doc" do
1197
+ expect(first).to eq(post)
1198
+ end
1199
+ end
1200
+
1201
+ context "when loaded is empty" do
1202
+
1203
+ let!(:post) do
1204
+ Post.create!(person_id: person.id)
1205
+ end
1206
+
1207
+ let(:enumerable) do
1208
+ described_class.new([])
1209
+ end
1210
+
1211
+ before do
1212
+ enumerable << post
1213
+ end
1214
+
1215
+ let(:first) do
1216
+ enumerable.first
1217
+ end
1218
+
1219
+ it "returns the first added doc" do
1220
+ expect(first).to eq(post)
1221
+ end
1222
+ end
1223
+
1224
+ context "when loaded and added are empty" do
1225
+
1226
+ let(:enumerable) do
1227
+ described_class.new([])
1228
+ end
1229
+
1230
+ let(:first) do
1231
+ enumerable.first
1232
+ end
1233
+
1234
+ it "returns nil" do
1235
+ expect(first).to be_nil
1236
+ end
1237
+ end
1238
+ end
1239
+
1240
+ context 'when including a limit' do
1241
+
1242
+ let(:person) do
1243
+ Person.create!
1244
+ end
1245
+
1246
+ let(:criteria) do
1247
+ Post.where(person_id: person.id)
1248
+ end
1249
+
1250
+ let(:enumerable) do
1251
+ described_class.new(criteria)
1252
+ end
1253
+
1254
+ let!(:first_post) do
1255
+ person.posts.create!(title: "One")
1256
+ end
1257
+
1258
+ let!(:second_post) do
1259
+ person.posts.create!(title: "Two")
1260
+ end
1261
+
1262
+ it 'returns the matching document' do
1263
+ expect(enumerable.first(1)).to eq([first_post])
1264
+ end
1265
+ end
1266
+
1267
+ context 'when no parameters are provided' do
1268
+
1269
+ let(:person) do
1270
+ Person.create!
1271
+ end
1272
+
1273
+ let(:criteria) do
1274
+ Post.where(person_id: person.id)
1275
+ end
1276
+
1277
+ let(:enumerable) do
1278
+ described_class.new(criteria)
1279
+ end
1280
+
1281
+ let!(:first_post) do
1282
+ person.posts.create!(title: "One")
1283
+ end
1284
+
1285
+ let!(:second_post) do
1286
+ person.posts.create!(title: "Two")
1287
+ end
1288
+
1289
+ it 'uses the sort on id' do
1290
+ expect(enumerable.first).to eq(first_post)
1291
+ end
1292
+ end
1293
+ end
1294
+
1295
+ describe "#include?" do
1296
+
1297
+ let(:person) do
1298
+ Person.create!
1299
+ end
1300
+
1301
+ let!(:post_one) do
1302
+ Post.create!(person_id: person.id)
1303
+ end
1304
+
1305
+ let!(:post_two) do
1306
+ Post.create!(person_id: person.id)
1307
+ end
1308
+
1309
+ context "when no criteria exists" do
1310
+
1311
+ context "when the enumerable is loaded" do
1312
+
1313
+ let!(:enumerable) do
1314
+ described_class.new([ post_one, post_two ])
1315
+ end
1316
+
1317
+ let!(:included) do
1318
+ enumerable.include?(post_two)
1319
+ end
1320
+
1321
+ it "returns true" do
1322
+ expect(included).to be true
1323
+ end
1324
+
1325
+ it "retains the correct length" do
1326
+ expect(enumerable.length).to eq(2)
1327
+ end
1328
+
1329
+ it "retains the correct length when calling to_a" do
1330
+ expect(enumerable.to_a.length).to eq(2)
1331
+ end
1332
+ end
1333
+
1334
+ context "when the enumerable contains an added document" do
1335
+
1336
+ let!(:enumerable) do
1337
+ described_class.new([])
1338
+ end
1339
+
1340
+ let(:post_three) do
1341
+ Post.new(person_id: person)
1342
+ end
1343
+
1344
+ before do
1345
+ enumerable.push(post_three)
1346
+ end
1347
+
1348
+ let!(:included) do
1349
+ enumerable.include?(post_three)
1350
+ end
1351
+
1352
+ it "returns true" do
1353
+ expect(included).to be true
1354
+ end
1355
+ end
1356
+ end
1357
+
1358
+ context "when the document is present and not the first" do
1359
+
1360
+ let(:criteria) do
1361
+ Post.where(person_id: person.id)
1362
+ end
1363
+
1364
+ let!(:enumerable) do
1365
+ described_class.new(criteria)
1366
+ end
1367
+
1368
+ let(:included) do
1369
+ enumerable.include?(post_two)
1370
+ end
1371
+
1372
+ it "returns true" do
1373
+ expect(included).to be true
1374
+ end
1375
+
1376
+ it "retains the correct length" do
1377
+ expect(enumerable.length).to eq(2)
1378
+ end
1379
+
1380
+ it "retains the correct length when calling to_a" do
1381
+ expect(enumerable.to_a.length).to eq(2)
1382
+ end
1383
+
1384
+ context "when iterating over the association a second time" do
1385
+
1386
+ before do
1387
+ enumerable.each { |post| post }
1388
+ end
1389
+
1390
+ it "retains the correct length" do
1391
+ expect(enumerable.length).to eq(2)
1392
+ end
1393
+
1394
+ it "retains the correct length when calling to_a" do
1395
+ expect(enumerable.to_a.length).to eq(2)
1396
+ end
1397
+ end
1398
+ end
1399
+ end
1400
+
1401
+ describe "#initialize" do
1402
+
1403
+ let(:person) do
1404
+ Person.new
1405
+ end
1406
+
1407
+ context "when provided with a criteria" do
1408
+
1409
+ let(:criteria) do
1410
+ Post.where(person_id: person.id)
1411
+ end
1412
+
1413
+ let(:enumerable) do
1414
+ described_class.new(criteria)
1415
+ end
1416
+
1417
+ it "sets the criteria" do
1418
+ expect(enumerable._unloaded).to eq(criteria)
1419
+ end
1420
+
1421
+ it "is not loaded" do
1422
+ expect(enumerable).to_not be__loaded
1423
+ end
1424
+ end
1425
+
1426
+ context "when provided an array" do
1427
+
1428
+ let(:post) do
1429
+ Post.new
1430
+ end
1431
+
1432
+ let(:enumerable) do
1433
+ described_class.new([ post ])
1434
+ end
1435
+
1436
+ it "does not set a criteria" do
1437
+ expect(enumerable._unloaded).to be_nil
1438
+ end
1439
+
1440
+ it "is loaded" do
1441
+ expect(enumerable).to be__loaded
1442
+ end
1443
+ end
1444
+ end
1445
+
1446
+ describe "#in_memory" do
1447
+
1448
+ let(:person) do
1449
+ Person.new
1450
+ end
1451
+
1452
+ context "when the enumerable is loaded" do
1453
+
1454
+ let(:post) do
1455
+ Post.new
1456
+ end
1457
+
1458
+ let(:enumerable) do
1459
+ described_class.new([ post ])
1460
+ end
1461
+
1462
+ let(:post_two) do
1463
+ Post.new
1464
+ end
1465
+
1466
+ before do
1467
+ enumerable << post_two
1468
+ end
1469
+
1470
+ let(:in_memory) do
1471
+ enumerable.in_memory
1472
+ end
1473
+
1474
+ it "returns the loaded and added docs" do
1475
+ expect(in_memory).to eq([ post, post_two ])
1476
+ end
1477
+ end
1478
+
1479
+ context "when the enumerable is not loaded" do
1480
+
1481
+ let(:post) do
1482
+ Post.new(person_id: person.id)
1483
+ end
1484
+
1485
+ let(:enumerable) do
1486
+ described_class.new(Post.where(person_id: person.id))
1487
+ end
1488
+
1489
+ let(:post_two) do
1490
+ Post.new(person_id: person.id)
1491
+ end
1492
+
1493
+ before do
1494
+ enumerable << post_two
1495
+ end
1496
+
1497
+ let(:in_memory) do
1498
+ enumerable.in_memory
1499
+ end
1500
+
1501
+ it "returns the added docs" do
1502
+ expect(in_memory).to eq([ post_two ])
1503
+ end
1504
+ end
1505
+
1506
+ context "when passed a block" do
1507
+
1508
+ let(:enumerable) do
1509
+ described_class.new(Post.where(person_id: person.id))
1510
+ end
1511
+
1512
+ let(:post_two) do
1513
+ Post.new(person_id: person.id)
1514
+ end
1515
+
1516
+ before do
1517
+ enumerable << post_two
1518
+ end
1519
+
1520
+ it "yields to each in memory document" do
1521
+ enumerable.in_memory do |doc|
1522
+ expect(doc).to eq(post_two)
1523
+ end
1524
+ end
1525
+ end
1526
+ end
1527
+
1528
+ describe "#is_a?" do
1529
+
1530
+ let(:enumerable) do
1531
+ described_class.new(Post.all)
1532
+ end
1533
+
1534
+ context "when checking against enumerable" do
1535
+
1536
+ it "returns true" do
1537
+ expect(enumerable.is_a?(::Enumerable)).to be true
1538
+ end
1539
+ end
1540
+
1541
+ context "when checking against array" do
1542
+
1543
+ it "returns true" do
1544
+ expect(enumerable.is_a?(Array)).to be true
1545
+ end
1546
+ end
1547
+ end
1548
+
1549
+ describe "#last" do
1550
+
1551
+ let(:person) do
1552
+ Person.create!
1553
+ end
1554
+
1555
+ context "when the enumerable is not loaded" do
1556
+
1557
+ let(:criteria) do
1558
+ Post.asc(:_id).where(person_id: person.id)
1559
+ end
1560
+
1561
+ let(:enumerable) do
1562
+ described_class.new(criteria)
1563
+ end
1564
+
1565
+ context "when unloaded is not empty" do
1566
+
1567
+ let!(:post) do
1568
+ Post.create!(person_id: person.id)
1569
+ end
1570
+
1571
+ let(:last) do
1572
+ enumerable.last
1573
+ end
1574
+
1575
+ it "returns the last unloaded doc" do
1576
+ expect(last).to eq(post)
1577
+ end
1578
+
1579
+ it "does not load the enumerable" do
1580
+ expect(enumerable).to_not be__loaded
1581
+ end
1582
+
1583
+ it "receives query only once" do
1584
+ expect(criteria).to receive(:last).once
1585
+ last
1586
+ end
1587
+ end
1588
+
1589
+ context "when unloaded is empty" do
1590
+
1591
+ let!(:post) do
1592
+ Post.new(person_id: person.id)
1593
+ end
1594
+
1595
+ before do
1596
+ enumerable << post
1597
+ end
1598
+
1599
+ let(:last) do
1600
+ enumerable.last
1601
+ end
1602
+
1603
+ it "returns the last unloaded doc" do
1604
+ expect(last).to eq(post)
1605
+ end
1606
+
1607
+ it "does not load the enumerable" do
1608
+ expect(enumerable).to_not be__loaded
1609
+ end
1610
+ end
1611
+
1612
+ context "when unloaded and added are empty" do
1613
+
1614
+ let(:last) do
1615
+ enumerable.last
1616
+ end
1617
+
1618
+ it "returns nil" do
1619
+ expect(last).to be_nil
1620
+ end
1621
+
1622
+ it "does not load the enumerable" do
1623
+ expect(enumerable).to_not be__loaded
1624
+ end
1625
+ end
1626
+
1627
+ context "when added is not empty" do
1628
+
1629
+ let!(:post_one) do
1630
+ person.posts.create!
1631
+ end
1632
+
1633
+ let!(:post_two) do
1634
+ person.posts.create!
1635
+ end
1636
+
1637
+ let(:last) do
1638
+ enumerable.last
1639
+ end
1640
+
1641
+ context "when accessing from a reloaded child" do
1642
+
1643
+ it "returns the last document" do
1644
+ expect(post_one.reload.person.posts.asc(:_id).last).to eq(post_two)
1645
+ end
1646
+ end
1647
+ end
1648
+ end
1649
+
1650
+ context "when the enumerable is loaded" do
1651
+
1652
+ context "when loaded is not empty" do
1653
+
1654
+ let!(:post) do
1655
+ Post.create!(person_id: person.id)
1656
+ end
1657
+
1658
+ let(:enumerable) do
1659
+ described_class.new([ post ])
1660
+ end
1661
+
1662
+ let(:last) do
1663
+ enumerable.last
1664
+ end
1665
+
1666
+ it "returns the last loaded doc" do
1667
+ expect(last).to eq(post)
1668
+ end
1669
+ end
1670
+
1671
+ context "when loaded is empty" do
1672
+
1673
+ let!(:post) do
1674
+ Post.create!(person_id: person.id)
1675
+ end
1676
+
1677
+ let(:enumerable) do
1678
+ described_class.new([])
1679
+ end
1680
+
1681
+ before do
1682
+ enumerable << post
1683
+ end
1684
+
1685
+ let(:last) do
1686
+ enumerable.last
1687
+ end
1688
+
1689
+ it "returns the last added doc" do
1690
+ expect(last).to eq(post)
1691
+ end
1692
+ end
1693
+
1694
+ context "when loaded and added are empty" do
1695
+
1696
+ let(:enumerable) do
1697
+ described_class.new([])
1698
+ end
1699
+
1700
+ let(:last) do
1701
+ enumerable.last
1702
+ end
1703
+
1704
+ it "returns nil" do
1705
+ expect(last).to be_nil
1706
+ end
1707
+ end
1708
+ end
1709
+
1710
+ context 'when including a limit' do
1711
+
1712
+ let(:person) do
1713
+ Person.create!
1714
+ end
1715
+
1716
+ let(:criteria) do
1717
+ Post.where(person_id: person.id)
1718
+ end
1719
+
1720
+ let(:enumerable) do
1721
+ described_class.new(criteria)
1722
+ end
1723
+
1724
+ let!(:first_post) do
1725
+ person.posts.create!(title: "One")
1726
+ end
1727
+
1728
+ let!(:second_post) do
1729
+ person.posts.create!(title: "Two")
1730
+ end
1731
+
1732
+ it 'returns the matching document' do
1733
+ expect(enumerable.last(1)).to eq([second_post])
1734
+ end
1735
+ end
1736
+
1737
+ context 'when no parameters are provided' do
1738
+
1739
+ let(:person) do
1740
+ Person.create!
1741
+ end
1742
+
1743
+ let(:criteria) do
1744
+ Post.where(person_id: person.id)
1745
+ end
1746
+
1747
+ let(:enumerable) do
1748
+ described_class.new(criteria)
1749
+ end
1750
+
1751
+ let!(:first_post) do
1752
+ person.posts.create!(title: "One")
1753
+ end
1754
+
1755
+ let!(:second_post) do
1756
+ person.posts.create!(title: "Two")
1757
+ end
1758
+
1759
+ it 'uses the sort on id' do
1760
+ expect(enumerable.last).to eq(second_post)
1761
+ end
1762
+ end
1763
+ end
1764
+
1765
+ describe "#kind_of?" do
1766
+
1767
+ let(:enumerable) do
1768
+ described_class.new(Post.all)
1769
+ end
1770
+
1771
+ context "when checking against enumerable" do
1772
+
1773
+ it "returns true" do
1774
+ expect(enumerable.kind_of?(::Enumerable)).to be true
1775
+ end
1776
+ end
1777
+
1778
+ context "when checking against array" do
1779
+
1780
+ it "returns true" do
1781
+ expect(enumerable.kind_of?(Array)).to be true
1782
+ end
1783
+ end
1784
+ end
1785
+
1786
+ describe "#load_all!" do
1787
+
1788
+ let(:person) do
1789
+ Person.create!
1790
+ end
1791
+
1792
+ let!(:post) do
1793
+ Post.create!(person_id: person.id)
1794
+ end
1795
+
1796
+ let(:criteria) do
1797
+ Post.where(person_id: person.id)
1798
+ end
1799
+
1800
+ let!(:enumerable) do
1801
+ described_class.new(criteria)
1802
+ end
1803
+
1804
+ let!(:loaded) do
1805
+ enumerable.load_all!
1806
+ end
1807
+
1808
+ it "loads all the unloaded documents" do
1809
+ expect(enumerable._loaded).to eq({ post.id => post })
1810
+ end
1811
+
1812
+ it "returns the object" do
1813
+ expect(loaded).to eq([post])
1814
+ end
1815
+
1816
+ it "sets loaded to true" do
1817
+ expect(enumerable).to be__loaded
1818
+ end
1819
+ end
1820
+
1821
+ describe "#reset" do
1822
+
1823
+ let(:person) do
1824
+ Person.create!
1825
+ end
1826
+
1827
+ let(:post) do
1828
+ Post.create!(person_id: person.id)
1829
+ end
1830
+
1831
+ let(:post_two) do
1832
+ Post.create!(person_id: person.id)
1833
+ end
1834
+
1835
+ let(:enumerable) do
1836
+ described_class.new([ post ])
1837
+ end
1838
+
1839
+ before do
1840
+ enumerable << post_two
1841
+ end
1842
+
1843
+ let!(:reset) do
1844
+ enumerable.reset
1845
+ end
1846
+
1847
+ it "is not loaded" do
1848
+ expect(enumerable).to_not be__loaded
1849
+ end
1850
+
1851
+ it "clears out the loaded docs" do
1852
+ expect(enumerable._loaded).to be_empty
1853
+ end
1854
+
1855
+ it "clears out the added docs" do
1856
+ expect(enumerable._added).to be_empty
1857
+ end
1858
+ end
1859
+
1860
+ describe "#respond_to?" do
1861
+
1862
+ let(:enumerable) do
1863
+ described_class.new([])
1864
+ end
1865
+
1866
+ context "when checking against array methods" do
1867
+
1868
+ [].methods.each do |method|
1869
+
1870
+ it "returns true for #{method}" do
1871
+ expect(enumerable).to respond_to(method)
1872
+ end
1873
+ end
1874
+ end
1875
+ end
1876
+
1877
+ describe "#size" do
1878
+
1879
+ let(:person) do
1880
+ Person.create!
1881
+ end
1882
+
1883
+ let!(:post) do
1884
+ Post.create!(person_id: person.id)
1885
+ end
1886
+
1887
+ context "when the base is new" do
1888
+
1889
+ let!(:person) do
1890
+ Person.new
1891
+ end
1892
+
1893
+ context "when the added contains a persisted document" do
1894
+
1895
+ let!(:post) do
1896
+ Post.create!(person_id: person.id)
1897
+ end
1898
+
1899
+ context "when the enumerable is not loaded" do
1900
+
1901
+ let(:enumerable) do
1902
+ described_class.new(Post.where(person_id: person.id))
1903
+ end
1904
+
1905
+ it "includes the number of all added documents" do
1906
+ expect(enumerable.size).to eq(1)
1907
+ end
1908
+ end
1909
+ end
1910
+ end
1911
+
1912
+ context "when the enumerable is loaded" do
1913
+
1914
+ let(:enumerable) do
1915
+ described_class.new([ post ])
1916
+ end
1917
+
1918
+ let(:post_two) do
1919
+ Post.new(person_id: person.id)
1920
+ end
1921
+
1922
+ before do
1923
+ enumerable << post_two
1924
+ end
1925
+
1926
+ let(:size) do
1927
+ enumerable.size
1928
+ end
1929
+
1930
+ it "returns the loaded size plus added size" do
1931
+ expect(size).to eq(2)
1932
+ end
1933
+
1934
+ it "matches the size of the loaded enumerable" do
1935
+ expect(size).to eq(enumerable.to_a.size)
1936
+ end
1937
+ end
1938
+
1939
+ context "when the enumerable is not loaded" do
1940
+
1941
+ let(:enumerable) do
1942
+ described_class.new(Post.where(person_id: person.id))
1943
+ end
1944
+
1945
+ context "when the added contains new documents" do
1946
+
1947
+ let(:post_two) do
1948
+ Post.new(person_id: person.id)
1949
+ end
1950
+
1951
+ before do
1952
+ enumerable << post_two
1953
+ end
1954
+
1955
+ let(:size) do
1956
+ enumerable.size
1957
+ end
1958
+
1959
+ it "returns the unloaded count plus added new size" do
1960
+ expect(size).to eq(2)
1961
+ end
1962
+ end
1963
+
1964
+ context "when the added contains persisted documents" do
1965
+
1966
+ let(:post_two) do
1967
+ Post.create!(person_id: person.id)
1968
+ end
1969
+
1970
+ before do
1971
+ enumerable << post_two
1972
+ end
1973
+
1974
+ let(:size) do
1975
+ enumerable.size
1976
+ end
1977
+
1978
+ it "returns the unloaded count plus added new size" do
1979
+ expect(size).to eq(2)
1980
+ end
1981
+ end
1982
+ end
1983
+ end
1984
+
1985
+ describe "#to_json" do
1986
+
1987
+ let(:person) do
1988
+ Person.create!
1989
+ end
1990
+
1991
+ let!(:post) do
1992
+ Post.create!(title: "test", person_id: person.id)
1993
+ end
1994
+
1995
+ let(:criteria) do
1996
+ Post.where(person_id: person.id)
1997
+ end
1998
+
1999
+ let!(:enumerable) do
2000
+ described_class.new(criteria)
2001
+ end
2002
+
2003
+ before do
2004
+ enumerable << post
2005
+ end
2006
+
2007
+ let!(:json) do
2008
+ enumerable.to_json
2009
+ end
2010
+
2011
+ it "serializes the enumerable" do
2012
+ expect(json).to include(post.title)
2013
+ end
2014
+ end
2015
+
2016
+ describe "#to_json(parameters)" do
2017
+
2018
+ let(:person) do
2019
+ Person.create!
2020
+ end
2021
+
2022
+ let!(:post) do
2023
+ Post.create!(title: "test", person_id: person.id)
2024
+ end
2025
+
2026
+ let(:criteria) do
2027
+ Post.where(person_id: person.id)
2028
+ end
2029
+
2030
+ let!(:json) do
2031
+ person.posts.to_json({except: 'title'})
2032
+ end
2033
+
2034
+ it "serializes the enumerable" do
2035
+ expect(json).to_not include(post.title)
2036
+ end
2037
+ end
2038
+
2039
+ describe "#as_json" do
2040
+
2041
+ let(:person) do
2042
+ Person.create!
2043
+ end
2044
+
2045
+ let!(:post) do
2046
+ Post.create!(title: "test", person_id: person.id)
2047
+ end
2048
+
2049
+ let(:criteria) do
2050
+ Post.where(person_id: person.id)
2051
+ end
2052
+
2053
+ let!(:enumerable) do
2054
+ described_class.new(criteria)
2055
+ end
2056
+
2057
+ before do
2058
+ enumerable << post
2059
+ end
2060
+
2061
+ let!(:json) do
2062
+ enumerable.as_json
2063
+ end
2064
+
2065
+ it "serializes the enumerable" do
2066
+ expect(json.size).to eq(1)
2067
+ expect(json[0]['title']).to eq(post.title)
2068
+ end
2069
+ end
2070
+
2071
+ describe "#as_json(parameters)" do
2072
+
2073
+ let(:person) do
2074
+ Person.create!
2075
+ end
2076
+
2077
+ let!(:post) do
2078
+ Post.create!(title: "test", person_id: person.id)
2079
+ end
2080
+
2081
+ let(:criteria) do
2082
+ Post.where(person_id: person.id)
2083
+ end
2084
+
2085
+ let!(:json) do
2086
+ person.posts.as_json({except: "title"})
2087
+ end
2088
+
2089
+ it "serializes the enumerable" do
2090
+ expect(json.size).to eq(1)
2091
+ end
2092
+
2093
+ it "includes the proper fields" do
2094
+ expect(json[0].keys).to_not include("title")
2095
+ end
2096
+ end
2097
+
2098
+ describe "#uniq" do
2099
+
2100
+ let(:person) do
2101
+ Person.create!
2102
+ end
2103
+
2104
+ let!(:post) do
2105
+ Post.create!(person_id: person.id)
2106
+ end
2107
+
2108
+ let(:criteria) do
2109
+ Post.where(person_id: person.id)
2110
+ end
2111
+
2112
+ let!(:enumerable) do
2113
+ described_class.new(criteria)
2114
+ end
2115
+
2116
+ before do
2117
+ enumerable << post
2118
+ enumerable._loaded[post.id] = post
2119
+ end
2120
+
2121
+ let!(:uniq) do
2122
+ enumerable.uniq
2123
+ end
2124
+
2125
+ it "returns the unique documents" do
2126
+ expect(uniq).to eq([ post ])
2127
+ end
2128
+
2129
+ it "sets loaded to true" do
2130
+ expect(enumerable).to be__loaded
2131
+ end
2132
+ end
2133
+
2134
+ describe 'setting the same parent object on enumerated children objects' do
2135
+
2136
+ let(:person) do
2137
+ Person.create!
2138
+ end
2139
+
2140
+ context 'when a single child is fetched' do
2141
+
2142
+ let!(:post) do
2143
+ person.posts << Post.new
2144
+ person.posts.first
2145
+ end
2146
+
2147
+ it 'does not query the database to access the parent' do
2148
+ expect_query(0) do
2149
+ expect(post.person).to eq(person)
2150
+ end
2151
+ end
2152
+ end
2153
+
2154
+ context 'when a single child is fetched with a scope' do
2155
+
2156
+ let!(:post) do
2157
+ person.posts << Post.new(title: 'open')
2158
+ person.posts.open.first
2159
+ end
2160
+
2161
+ it 'does not query the database to access the parent' do
2162
+ expect_query(0) do
2163
+ expect(post.person).to eq(person)
2164
+ end
2165
+ end
2166
+ end
2167
+
2168
+ context 'when multiple children are fetched' do
2169
+
2170
+ let!(:posts) do
2171
+ person.posts << Post.new
2172
+ person.posts << Post.new
2173
+ person.posts << Post.new
2174
+ person.posts.to_a
2175
+ end
2176
+
2177
+ it 'does not query the database to access the parent' do
2178
+ expect_query(0) do
2179
+ expect(posts.all? { |post| post.person == person }).to be(true)
2180
+ end
2181
+ end
2182
+ end
2183
+
2184
+ context 'when multiple children are fetched with query criteria' do
2185
+
2186
+ let!(:posts) do
2187
+ person.posts << Post.new(title: 'open')
2188
+ person.posts << Post.new(title: 'open')
2189
+ person.posts << Post.new(title: 'not-a-test')
2190
+ person.posts.where(title: 'open').to_a
2191
+ end
2192
+
2193
+ it 'does not query the database to access the parent' do
2194
+ expect_query(0) do
2195
+ expect(posts.all? { |post| post.person == person }).to be(true)
2196
+ end
2197
+ end
2198
+ end
2199
+
2200
+ context 'when multiple children are fetched with a scope' do
2201
+
2202
+ let!(:posts) do
2203
+ person.posts << Post.new(title: 'open')
2204
+ person.posts << Post.new(title: 'open')
2205
+ person.posts << Post.new(title: 'not-a-test')
2206
+ person.posts.open.to_a
2207
+ end
2208
+
2209
+ it 'does not query the database to access the parent' do
2210
+ expect_query(0) do
2211
+ expect(posts.all? { |post| post.person == person }).to be(true)
2212
+ end
2213
+ end
2214
+ end
2215
+
2216
+ context 'when the parent is updated in memory' do
2217
+
2218
+ let!(:posts) do
2219
+ person.posts << Post.new
2220
+ person.posts << Post.new
2221
+ person.username = 'emily'
2222
+ person.posts.to_a
2223
+ end
2224
+
2225
+ it 'does not query the database to access the parent' do
2226
+ expect_query(0) do
2227
+ expect(posts.all? { |post| post.person.username == 'emily' }).to be(true)
2228
+ end
2229
+ end
2230
+ end
2231
+ end
2232
+ end