mongoid 7.6.2 → 8.0.1

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 (333) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -0
  3. data/README.md +3 -3
  4. data/Rakefile +21 -85
  5. data/lib/config/locales/en.yml +46 -56
  6. data/lib/mongoid/association/accessors.rb +32 -3
  7. data/lib/mongoid/association/bindable.rb +48 -0
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/depending.rb +4 -8
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  13. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  14. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  15. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  16. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  17. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  18. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  19. data/lib/mongoid/association/macros.rb +2 -1
  20. data/lib/mongoid/association/many.rb +5 -0
  21. data/lib/mongoid/association/nested/many.rb +5 -39
  22. data/lib/mongoid/association/nested/nested_buildable.rb +0 -14
  23. data/lib/mongoid/association/proxy.rb +12 -0
  24. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  25. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  26. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  27. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  28. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  29. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  30. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  31. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  32. data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -107
  33. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  35. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  36. data/lib/mongoid/association/relatable.rb +38 -4
  37. data/lib/mongoid/attributes/processing.rb +9 -2
  38. data/lib/mongoid/attributes.rb +30 -27
  39. data/lib/mongoid/cacheable.rb +2 -2
  40. data/lib/mongoid/changeable.rb +37 -2
  41. data/lib/mongoid/clients/factory.rb +0 -4
  42. data/lib/mongoid/clients/options.rb +4 -0
  43. data/lib/mongoid/clients/sessions.rb +2 -14
  44. data/lib/mongoid/config.rb +15 -73
  45. data/lib/mongoid/contextual/aggregable/memory.rb +22 -20
  46. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  47. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  48. data/lib/mongoid/contextual/memory.rb +63 -47
  49. data/lib/mongoid/contextual/mongo.rb +173 -287
  50. data/lib/mongoid/contextual/none.rb +33 -15
  51. data/lib/mongoid/copyable.rb +32 -8
  52. data/lib/mongoid/criteria/includable.rb +24 -20
  53. data/lib/mongoid/criteria/marshalable.rb +10 -2
  54. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  55. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  56. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  57. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  58. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  59. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  60. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  62. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  63. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  64. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  65. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  66. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  67. data/lib/mongoid/criteria/queryable/mergeable.rb +0 -12
  68. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  69. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  70. data/lib/mongoid/criteria/queryable/selectable.rb +2 -133
  71. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  72. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  73. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  74. data/lib/mongoid/criteria/queryable.rb +11 -6
  75. data/lib/mongoid/criteria.rb +1 -28
  76. data/lib/mongoid/deprecable.rb +36 -0
  77. data/lib/mongoid/deprecation.rb +25 -0
  78. data/lib/mongoid/document.rb +88 -33
  79. data/lib/mongoid/equality.rb +4 -4
  80. data/lib/mongoid/errors/document_not_found.rb +6 -2
  81. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  82. data/lib/mongoid/errors/invalid_field.rb +5 -1
  83. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  84. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  85. data/lib/mongoid/errors.rb +2 -3
  86. data/lib/mongoid/extensions/array.rb +8 -6
  87. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  88. data/lib/mongoid/extensions/binary.rb +42 -0
  89. data/lib/mongoid/extensions/boolean.rb +8 -2
  90. data/lib/mongoid/extensions/date.rb +26 -20
  91. data/lib/mongoid/extensions/date_time.rb +1 -1
  92. data/lib/mongoid/extensions/float.rb +4 -5
  93. data/lib/mongoid/extensions/hash.rb +13 -32
  94. data/lib/mongoid/extensions/integer.rb +4 -5
  95. data/lib/mongoid/extensions/object.rb +2 -0
  96. data/lib/mongoid/extensions/range.rb +41 -10
  97. data/lib/mongoid/extensions/regexp.rb +11 -4
  98. data/lib/mongoid/extensions/set.rb +11 -4
  99. data/lib/mongoid/extensions/string.rb +2 -13
  100. data/lib/mongoid/extensions/symbol.rb +3 -14
  101. data/lib/mongoid/extensions/time.rb +27 -16
  102. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  103. data/lib/mongoid/extensions.rb +1 -0
  104. data/lib/mongoid/factory.rb +42 -7
  105. data/lib/mongoid/fields/foreign_key.rb +7 -0
  106. data/lib/mongoid/fields/validators/macro.rb +3 -9
  107. data/lib/mongoid/fields.rb +49 -7
  108. data/lib/mongoid/findable.rb +21 -16
  109. data/lib/mongoid/indexable/specification.rb +1 -1
  110. data/lib/mongoid/indexable/validators/options.rb +4 -1
  111. data/lib/mongoid/interceptable.rb +69 -9
  112. data/lib/mongoid/matchable.rb +1 -6
  113. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +5 -3
  114. data/lib/mongoid/matcher/regex.rb +9 -8
  115. data/lib/mongoid/matcher.rb +0 -1
  116. data/lib/mongoid/persistable/creatable.rb +14 -5
  117. data/lib/mongoid/persistable/updatable.rb +12 -5
  118. data/lib/mongoid/persistence_context.rb +8 -42
  119. data/lib/mongoid/query_cache.rb +6 -258
  120. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  121. data/lib/mongoid/reloadable.rb +7 -3
  122. data/lib/mongoid/scopable.rb +9 -11
  123. data/lib/mongoid/selectable.rb +1 -2
  124. data/lib/mongoid/shardable.rb +11 -35
  125. data/lib/mongoid/stateful.rb +27 -1
  126. data/lib/mongoid/threaded.rb +0 -3
  127. data/lib/mongoid/timestamps/created.rb +1 -1
  128. data/lib/mongoid/timestamps/updated.rb +1 -1
  129. data/lib/mongoid/touchable.rb +2 -3
  130. data/lib/mongoid/traversable.rb +1 -0
  131. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  132. data/lib/mongoid/version.rb +1 -5
  133. data/lib/mongoid/warnings.rb +3 -5
  134. data/lib/mongoid.rb +1 -0
  135. data/spec/config/mongoid.yml +16 -0
  136. data/spec/integration/app_spec.rb +8 -20
  137. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  138. data/spec/integration/associations/embedded_spec.rb +15 -0
  139. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  140. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  141. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  142. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  143. data/spec/integration/associations/has_one_spec.rb +97 -1
  144. data/spec/integration/associations/scope_option_spec.rb +1 -1
  145. data/spec/integration/callbacks_models.rb +95 -1
  146. data/spec/integration/callbacks_spec.rb +226 -4
  147. data/spec/integration/criteria/range_spec.rb +95 -1
  148. data/spec/integration/discriminator_key_spec.rb +115 -76
  149. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  150. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  151. data/spec/integration/matcher_examples_spec.rb +20 -13
  152. data/spec/integration/matcher_operator_data/regex.yml +0 -21
  153. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  154. data/spec/integration/matcher_operator_spec.rb +3 -5
  155. data/spec/integration/persistence/range_field_spec.rb +350 -0
  156. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  157. data/spec/mongoid/association/depending_spec.rb +9 -9
  158. data/spec/mongoid/association/eager_spec.rb +2 -1
  159. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  160. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  161. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  162. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  163. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  164. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  165. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  166. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  167. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  168. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  169. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  170. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  171. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  172. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  173. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  174. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  175. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +36 -51
  176. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  177. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  178. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  179. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  180. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +60 -156
  181. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  182. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  183. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  184. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  185. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  186. data/spec/mongoid/association/syncable_spec.rb +14 -0
  187. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  188. data/spec/mongoid/attributes/nested_spec.rb +73 -198
  189. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  190. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  191. data/spec/mongoid/attributes_spec.rb +480 -27
  192. data/spec/mongoid/cacheable_spec.rb +3 -3
  193. data/spec/mongoid/changeable_spec.rb +130 -13
  194. data/spec/mongoid/clients/factory_spec.rb +22 -60
  195. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  196. data/spec/mongoid/clients_spec.rb +2 -2
  197. data/spec/mongoid/config_spec.rb +52 -15
  198. data/spec/mongoid/contextual/aggregable/memory_spec.rb +371 -231
  199. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  200. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  201. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  202. data/spec/mongoid/contextual/memory_spec.rb +467 -156
  203. data/spec/mongoid/contextual/mongo_spec.rb +566 -426
  204. data/spec/mongoid/contextual/none_spec.rb +11 -19
  205. data/spec/mongoid/copyable_spec.rb +451 -2
  206. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  207. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  208. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  209. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  210. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  211. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  212. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
  213. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  214. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  215. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
  216. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  217. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  218. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  219. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  220. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  221. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -2
  222. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  223. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -200
  224. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  225. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  226. data/spec/mongoid/criteria_spec.rb +469 -1203
  227. data/spec/mongoid/document_fields_spec.rb +173 -24
  228. data/spec/mongoid/document_spec.rb +32 -41
  229. data/spec/mongoid/equality_spec.rb +12 -12
  230. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  231. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  232. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  233. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  234. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  235. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  236. data/spec/mongoid/extensions/array_spec.rb +16 -2
  237. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  238. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  239. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  240. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  241. data/spec/mongoid/extensions/date_spec.rb +71 -1
  242. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  243. data/spec/mongoid/extensions/float_spec.rb +48 -76
  244. data/spec/mongoid/extensions/hash_spec.rb +30 -236
  245. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  246. data/spec/mongoid/extensions/range_spec.rb +255 -54
  247. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  248. data/spec/mongoid/extensions/set_spec.rb +106 -0
  249. data/spec/mongoid/extensions/string_spec.rb +53 -25
  250. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  251. data/spec/mongoid/extensions/time_spec.rb +634 -66
  252. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  253. data/spec/mongoid/factory_spec.rb +61 -1
  254. data/spec/mongoid/fields_spec.rb +321 -50
  255. data/spec/mongoid/findable_spec.rb +64 -29
  256. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  257. data/spec/mongoid/indexable_spec.rb +16 -19
  258. data/spec/mongoid/interceptable_spec.rb +584 -5
  259. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  260. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  261. data/spec/mongoid/mongoizable_spec.rb +285 -0
  262. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  263. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  264. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  265. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  266. data/spec/mongoid/persistence_context_spec.rb +24 -0
  267. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  268. data/spec/mongoid/query_cache_spec.rb +1 -156
  269. data/spec/mongoid/reloadable_spec.rb +35 -2
  270. data/spec/mongoid/scopable_spec.rb +36 -34
  271. data/spec/mongoid/serializable_spec.rb +14 -7
  272. data/spec/mongoid/shardable_models.rb +0 -14
  273. data/spec/mongoid/shardable_spec.rb +61 -153
  274. data/spec/mongoid/stateful_spec.rb +28 -0
  275. data/spec/mongoid/timestamps_spec.rb +390 -0
  276. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  277. data/spec/mongoid/touchable_spec.rb +116 -0
  278. data/spec/mongoid/touchable_spec_models.rb +12 -8
  279. data/spec/mongoid/traversable_spec.rb +4 -11
  280. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  281. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  282. data/spec/mongoid/warnings_spec.rb +35 -0
  283. data/spec/mongoid_spec.rb +1 -7
  284. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  285. data/spec/rails/mongoid_spec.rb +4 -16
  286. data/spec/shared/lib/mrss/cluster_config.rb +40 -5
  287. data/spec/shared/lib/mrss/constraints.rb +46 -7
  288. data/spec/shared/lib/mrss/docker_runner.rb +21 -17
  289. data/spec/shared/lib/mrss/eg_config_utils.rb +31 -0
  290. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  291. data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
  292. data/spec/shared/lib/mrss/server_version_registry.rb +29 -18
  293. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  294. data/spec/shared/lib/mrss/utils.rb +6 -28
  295. data/spec/shared/share/Dockerfile.erb +114 -38
  296. data/spec/shared/shlib/distro.sh +0 -10
  297. data/spec/shared/shlib/server.sh +83 -64
  298. data/spec/shared/shlib/set_env.sh +81 -16
  299. data/spec/support/constraints.rb +24 -0
  300. data/spec/support/expectations.rb +17 -20
  301. data/spec/support/macros.rb +30 -0
  302. data/spec/support/models/augmentation.rb +12 -0
  303. data/spec/support/models/band.rb +3 -0
  304. data/spec/support/models/catalog.rb +24 -0
  305. data/spec/support/models/circus.rb +3 -0
  306. data/spec/support/models/fanatic.rb +8 -0
  307. data/spec/support/models/implant.rb +9 -0
  308. data/spec/support/models/label.rb +2 -0
  309. data/spec/support/models/passport.rb +9 -0
  310. data/spec/support/models/person.rb +1 -0
  311. data/spec/support/models/player.rb +2 -0
  312. data/spec/support/models/powerup.rb +12 -0
  313. data/spec/support/models/registry.rb +1 -0
  314. data/spec/support/models/school.rb +14 -0
  315. data/spec/support/models/shield.rb +18 -0
  316. data/spec/support/models/student.rb +14 -0
  317. data/spec/support/models/weapon.rb +12 -0
  318. data.tar.gz.sig +0 -0
  319. metadata +695 -650
  320. metadata.gz.sig +0 -0
  321. data/lib/mongoid/errors/eager_load.rb +0 -23
  322. data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
  323. data/lib/mongoid/errors/invalid_value.rb +0 -17
  324. data/lib/mongoid/field_readable.rb +0 -70
  325. data/lib/mongoid/matcher/regexp_budget.rb +0 -389
  326. data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
  327. data/spec/integration/query_operator_guard_spec.rb +0 -89
  328. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  329. data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
  330. data/spec/shared/CANDIDATE.md +0 -28
  331. data/spec/shared/lib/mrss/release/candidate.rb +0 -287
  332. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  333. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -2239,10 +2239,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2239
2239
  Person.create!(username: 'durran')
2240
2240
  end
2241
2241
 
2242
- before do
2243
- person.posts.create!(title: "Testing")
2244
- person.posts.create!(title: "Test")
2245
- end
2242
+ let!(:post1) { person.posts.create!(title: "Testing") }
2243
+ let!(:post2) { person.posts.create!(title: "Test") }
2246
2244
 
2247
2245
  it "removes the correct posts" do
2248
2246
  person.posts.send(method, { title: "Testing" })
@@ -2258,6 +2256,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2258
2256
  it "returns the number of documents deleted" do
2259
2257
  expect(person.posts.send(method, { title: "Testing" })).to eq(1)
2260
2258
  end
2259
+
2260
+ it "sets the association locally" do
2261
+ person.posts.send(method, { title: "Testing" })
2262
+ expect(person.posts).to eq([post2])
2263
+ end
2261
2264
  end
2262
2265
 
2263
2266
  context "when conditions are not provided" do
@@ -2284,150 +2287,10 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2284
2287
  it "returns the number of documents deleted" do
2285
2288
  expect(person.posts.send(method)).to eq(2)
2286
2289
  end
2287
- end
2288
-
2289
- context 'when a document is appended with an id that is already loaded' do
2290
- # Iterating the association moves an appended document out of _added
2291
- # without adding it to _loaded, so the scan for matches and the
2292
- # removal that follows see different instances for the same id.
2293
- let(:person) { Person.create! }
2294
- let!(:post) { person.posts.create!(title: 'Testing') }
2295
- let(:reloaded) { Person.find(person._id) }
2296
-
2297
- before do
2298
- reloaded.posts.to_a
2299
- reloaded.posts._target.push(
2300
- Post.new(_id: post._id, title: 'Testing', person_id: reloaded._id)
2301
- )
2302
- end
2303
-
2304
- shared_examples 'removes the document once' do
2305
- it 'sets the association locally' do
2306
- reloaded.posts.send(method, conditions)
2307
- expect(reloaded.posts).to eq([])
2308
- end
2309
-
2310
- it 'deletes the documents from the database' do
2311
- reloaded.posts.send(method, conditions)
2312
- expect(Post.count).to eq(0)
2313
- end
2314
- end
2315
-
2316
- context 'when the conditions carry no regular expression' do
2317
- let(:conditions) { { title: 'Testing' } }
2318
-
2319
- it_behaves_like 'removes the document once'
2320
- end
2321
2290
 
2322
- context 'when the conditions carry a regular expression' do
2323
- let(:conditions) { { title: /Testing/ } }
2324
-
2325
- it_behaves_like 'removes the document once'
2326
- end
2327
- end
2328
-
2329
- context 'when an appended document disagrees with the loaded one' do
2330
- # Only the appended instance matches, so the removal has to drop that
2331
- # id from both _loaded and _added. Removing by id and stopping at the
2332
- # first hash that has it would take the loaded instance instead and
2333
- # leave the unbound one behind.
2334
- let(:person) { Person.create! }
2335
- let!(:post) { person.posts.create!(title: 'Other') }
2336
- let(:reloaded) { Person.find(person._id) }
2337
-
2338
- before do
2339
- reloaded.posts.to_a
2340
- reloaded.posts._target.push(
2341
- Post.new(_id: post._id, title: 'Testing', person_id: reloaded._id)
2342
- )
2343
- end
2344
-
2345
- it 'deletes nothing from the database' do
2346
- expect(reloaded.posts.send(method, { title: /Testing/ })).to eq(0)
2347
- expect(Post.where(title: 'Other').count).to eq(1)
2348
- end
2349
-
2350
- it 'leaves no unbound document in the association' do
2351
- reloaded.posts.send(method, { title: /Testing/ })
2352
- expect(reloaded.posts._target.in_memory.map(&:person_id)).not_to include(nil)
2353
- end
2354
- end
2355
-
2356
- context 'when a nested selector is evaluated while the association loads' do
2357
- # Loading the association runs find callbacks, and application code in
2358
- # one of those can evaluate a selector of its own. A scope opened
2359
- # around the load would mark it as having nothing to bound, and that
2360
- # suppresses the decision for the nested selector too, leaving any
2361
- # pattern in it unguarded.
2362
- config_override :in_memory_regexp_time_limit, 5.0
2363
-
2364
- let(:person) { Person.create! }
2365
- let(:reloaded) { Person.find(person._id) }
2366
-
2367
- before do
2368
- person.posts.create!(title: 'Testing')
2369
- person.posts.create!(title: 'Keep')
2370
- reloaded
2371
- end
2372
-
2373
- it 'leaves the nested scope free to establish its own budget' do
2374
- seen = []
2375
- allow(Mongoid::Factory).to receive(:from_db).and_wrap_original do |original, *args|
2376
- Mongoid::Matcher::RegexpBudget.open('title' => /Testing/) do
2377
- seen << Mongoid::Matcher::RegexpBudget.remaining
2378
- end
2379
- original.call(*args)
2380
- end
2381
-
2382
- reloaded.posts.send(method, { title: 'Testing' })
2383
-
2384
- expect(seen).not_to be_empty
2385
- expect(seen).not_to include(nil)
2386
- end
2387
- end
2388
-
2389
- if method == :delete_all
2390
- context 'when the association has not been loaded' do
2391
- let(:person) { Person.create! }
2392
- let(:reloaded) { Person.find(person._id) }
2393
- let(:subscriber) { Mrss::EventSubscriber.new }
2394
-
2395
- before do
2396
- person.posts.create!(title: 'Testing')
2397
- person.posts.create!(title: 'Test')
2398
- reloaded
2399
- end
2400
-
2401
- def commands_for(conditions)
2402
- Person.collection.client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
2403
- reloaded.posts.delete_all(conditions)
2404
- subscriber.started_events.map(&:command_name)
2405
- ensure
2406
- Person.collection.client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
2407
- end
2408
-
2409
- context 'when the conditions carry no regular expression' do
2410
- # Nothing to bound, so the scan for matches stays where it was,
2411
- # after the delete, where the association it loads comes back
2412
- # empty. Moving it ahead of the delete would transfer the whole
2413
- # association for an operation that need send nothing over the
2414
- # wire.
2415
- it 'deletes before loading the association' do
2416
- expect(commands_for(nil)).to eq(%w[ delete find ])
2417
- end
2418
- end
2419
-
2420
- context 'when the conditions carry a regular expression' do
2421
- # The scan has to run under a budget, and before anything is
2422
- # deleted, so that a budget which runs out leaves the database
2423
- # untouched. What it scans is what is already in memory: loading
2424
- # would trade the matching cost the budget exists to bound for an
2425
- # unbounded amount of memory, since /.*/ is both cheap to supply
2426
- # and matches every document in the association.
2427
- it 'deletes without loading the association' do
2428
- expect(commands_for({ title: /Test/ })).to eq(%w[ delete ])
2429
- end
2430
- end
2291
+ it "sets the association locally" do
2292
+ person.posts.send(method)
2293
+ expect(person.posts).to eq([])
2431
2294
  end
2432
2295
  end
2433
2296
  end
@@ -2440,10 +2303,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2440
2303
  Movie.create!(title: "Bladerunner")
2441
2304
  end
2442
2305
 
2443
- before do
2444
- movie.ratings.create!(value: 1)
2445
- movie.ratings.create!(value: 2)
2446
- end
2306
+ let!(:rating1) { movie.ratings.create!(value: 1) }
2307
+ let!(:rating2) { movie.ratings.create!(value: 2) }
2447
2308
 
2448
2309
  it "removes the correct ratings" do
2449
2310
  movie.ratings.send(method, { value: 1 })
@@ -2458,6 +2319,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2458
2319
  it "returns the number of documents deleted" do
2459
2320
  expect(movie.ratings.send(method, { value: 1 })).to eq(1)
2460
2321
  end
2322
+
2323
+ it "sets the association locally" do
2324
+ movie.ratings.send(method, { value: 1 })
2325
+ expect(movie.ratings).to eq([rating2])
2326
+ end
2461
2327
  end
2462
2328
 
2463
2329
  context "when conditions are not provided" do
@@ -2484,6 +2350,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2484
2350
  it "returns the number of documents deleted" do
2485
2351
  expect(movie.ratings.send(method)).to eq(2)
2486
2352
  end
2353
+
2354
+ it "sets the association locally" do
2355
+ movie.ratings.send(method)
2356
+ expect(movie.ratings).to eq([])
2357
+ end
2487
2358
  end
2488
2359
  end
2489
2360
  end
@@ -2669,7 +2540,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2669
2540
  it "raises an error" do
2670
2541
  expect {
2671
2542
  person.posts.find(post.id)
2672
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2543
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2673
2544
  end
2674
2545
  end
2675
2546
 
@@ -2684,7 +2555,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2684
2555
  it "raises an error" do
2685
2556
  expect {
2686
2557
  person.posts.find(BSON::ObjectId.new)
2687
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2558
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2688
2559
  end
2689
2560
  end
2690
2561
 
@@ -2733,7 +2604,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2733
2604
  it "raises an error" do
2734
2605
  expect {
2735
2606
  person.posts.find([ BSON::ObjectId.new ])
2736
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2607
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
2737
2608
  end
2738
2609
  end
2739
2610
 
@@ -2797,7 +2668,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2797
2668
  it "raises an error" do
2798
2669
  expect {
2799
2670
  movie.ratings.find(BSON::ObjectId.new)
2800
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2671
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Rating with id\(s\)/)
2801
2672
  end
2802
2673
  end
2803
2674
 
@@ -2854,7 +2725,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
2854
2725
  it "raises an error" do
2855
2726
  expect {
2856
2727
  movie.ratings.find([ BSON::ObjectId.new ])
2857
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2728
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Rating with id\(s\)/)
2858
2729
  end
2859
2730
  end
2860
2731
 
@@ -4235,6 +4106,39 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
4235
4106
  end
4236
4107
  end
4237
4108
 
4109
+ context "when removing a document with counter_cache on" do
4110
+ let(:post) { Post.create! }
4111
+ let(:person1) { Person.create! }
4112
+ let(:person2) { Person.create! }
4113
+
4114
+ before do
4115
+ post.update_attribute(:person, person1)
4116
+ expect(person1.posts_count).to eq 1
4117
+
4118
+ person2
4119
+ post.update_attribute(:person, person2)
4120
+ person1.reload
4121
+ expect(person1.posts_count).to eq 0
4122
+ expect(person2.posts_count).to eq 1
4123
+
4124
+ post.update_attribute(:person, nil)
4125
+ person1.reload
4126
+ person2.reload
4127
+ end
4128
+
4129
+ it "the count field is updated" do
4130
+ expect(person2.posts_count).to eq 0
4131
+ end
4132
+ end
4133
+
4134
+ context "when there is a foreign key in the aliased associations" do
4135
+ it "has the correct aliases" do
4136
+ expect(Band.aliased_associations["artist_ids"]).to eq("artists")
4137
+ expect(Artist.aliased_associations.key?("band_id")).to be false
4138
+ expect(Artist.aliased_fields["band"]).to eq("band_id")
4139
+ end
4140
+ end
4141
+
4238
4142
  context "when executing concat on foreign key array from the db" do
4239
4143
  config_override :legacy_attributes, false
4240
4144
 
@@ -42,6 +42,7 @@ end
42
42
 
43
43
  class HmmSchool
44
44
  include Mongoid::Document
45
+ include Mongoid::Timestamps
45
46
 
46
47
  has_many :students, class_name: 'HmmStudent'
47
48
 
@@ -51,8 +52,9 @@ end
51
52
 
52
53
  class HmmStudent
53
54
  include Mongoid::Document
55
+ include Mongoid::Timestamps
54
56
 
55
- belongs_to :school, class_name: 'HmmSchool'
57
+ belongs_to :school, class_name: 'HmmSchool', touch: true
56
58
 
57
59
  field :name, type: String
58
60
  field :grade, type: Integer, default: 3
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require_relative './has_many_models'
4
5
 
5
6
  describe Mongoid::Association::Referenced::HasMany do
6
7
 
@@ -1245,4 +1246,28 @@ describe Mongoid::Association::Referenced::HasMany do
1245
1246
  expect(association.create_relation(owner, target)).to be_a(Array)
1246
1247
  end
1247
1248
  end
1249
+
1250
+ context "when adding an object to the association" do
1251
+ let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
1252
+
1253
+ let(:update_time) do
1254
+ Timecop.freeze(Time.at(Time.now.to_i) + 2)
1255
+ end
1256
+
1257
+ after do
1258
+ Timecop.return
1259
+ end
1260
+
1261
+ let!(:school) { HmmSchool.create! }
1262
+ let!(:student) { HmmStudent.create! }
1263
+
1264
+ before do
1265
+ update_time
1266
+ student.update(school: school)
1267
+ end
1268
+
1269
+ it "updates the updated_at" do
1270
+ expect(student.updated_at).to eq(update_time)
1271
+ end
1272
+ end
1248
1273
  end
@@ -91,7 +91,7 @@ describe Mongoid::Association::Referenced::HasOne::Buildable do
91
91
  expect(document).to eq(object)
92
92
  end
93
93
 
94
- context 'when the object is already related to another object' do
94
+ context 'when the object is already associated with another object' do
95
95
 
96
96
  let(:original_person) do
97
97
  Person.new
@@ -105,7 +105,7 @@ describe Mongoid::Association::Referenced::HasOne::Buildable do
105
105
  association.build(Person.new, object)
106
106
  end
107
107
 
108
- it 'clears the object of its previous relation' do
108
+ it 'clears the object of its previous association' do
109
109
  expect(original_person.account).to be_nil
110
110
  end
111
111
 
@@ -133,7 +133,7 @@ describe Mongoid::Association::Referenced::HasOne::Proxy do
133
133
  it "detaches the previous relation" do
134
134
  expect {
135
135
  game.reload
136
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
136
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Game with id\(s\)/)
137
137
  end
138
138
  end
139
139
  end
@@ -1139,4 +1139,110 @@ describe Mongoid::Association::Referenced::HasOne::Proxy do
1139
1139
  end
1140
1140
  end
1141
1141
  end
1142
+
1143
+ context "when there is a foreign key in the aliased associations" do
1144
+ it "has the correct aliases" do
1145
+ # Instances of Driver do not respond to vehicle_id.
1146
+ expect(Driver.aliased_associations.key?("vehicle_id")).to be false
1147
+ expect(Vehicle.aliased_associations.key?("driver_id")).to be false
1148
+ expect(Vehicle.aliased_fields["driver"]).to eq("driver_id")
1149
+ end
1150
+ end
1151
+
1152
+ context "when the document is not persisted and the association is invalid" do
1153
+
1154
+ before do
1155
+ class HomParent
1156
+ include Mongoid::Document
1157
+ has_one :child, class_name: "HomChild"
1158
+ field :name
1159
+ validates :name, presence: true
1160
+ end
1161
+
1162
+ class HomChild; include Mongoid::Document; end
1163
+
1164
+ belongs_to
1165
+ child.parent = parent
1166
+ child.save
1167
+ end
1168
+
1169
+ after do
1170
+ Object.send(:remove_const, :HomParent)
1171
+ Object.send(:remove_const, :HomChild)
1172
+ end
1173
+
1174
+ let(:belongs_to) do
1175
+ HomChild.belongs_to :parent, autosave: true, validate: false, optional: optional
1176
+ end
1177
+
1178
+ let(:child) { HomChild.new }
1179
+ let(:parent) { HomParent.new }
1180
+
1181
+
1182
+ context "when belongs_to_required_by_default is true" do
1183
+ config_override :belongs_to_required_by_default, true
1184
+
1185
+ context "when optional is true" do
1186
+ let(:optional) { true }
1187
+
1188
+ it "persists the child with the parent_id" do
1189
+ expect(HomChild.first.parent_id).to eq(parent._id)
1190
+ expect(HomParent.count).to eq(0)
1191
+ end
1192
+ end
1193
+
1194
+ context "when optional is false" do
1195
+ let(:optional) { false }
1196
+
1197
+ it "doesn't persist the parent or the child" do
1198
+ expect(HomChild.count).to eq(0)
1199
+ expect(HomParent.count).to eq(0)
1200
+ end
1201
+ end
1202
+
1203
+ context "when optional is not set" do
1204
+ let(:belongs_to) do
1205
+ HomChild.belongs_to :parent, autosave: true, validate: false
1206
+ end
1207
+
1208
+ it "doesn't persist the parent or the child" do
1209
+ expect(HomChild.count).to eq(0)
1210
+ expect(HomParent.count).to eq(0)
1211
+ end
1212
+ end
1213
+ end
1214
+
1215
+ context "when belongs_to_required_by_default is false" do
1216
+ config_override :belongs_to_required_by_default, false
1217
+
1218
+ context "when optional is true" do
1219
+ let(:optional) { true }
1220
+
1221
+ it "persists the child with the parent_id" do
1222
+ expect(HomChild.first.parent_id).to eq(parent._id)
1223
+ expect(HomParent.count).to eq(0)
1224
+ end
1225
+ end
1226
+
1227
+ context "when optional is false" do
1228
+ let(:optional) { false }
1229
+
1230
+ it "doesn't persist the parent or the child" do
1231
+ expect(HomChild.count).to eq(0)
1232
+ expect(HomParent.count).to eq(0)
1233
+ end
1234
+ end
1235
+
1236
+ context "when optional is not set" do
1237
+ let(:belongs_to) do
1238
+ HomChild.belongs_to :parent, autosave: true, validate: false
1239
+ end
1240
+
1241
+ it "persists the child with the parent_id" do
1242
+ expect(HomChild.first.parent_id).to eq(parent._id)
1243
+ expect(HomParent.count).to eq(0)
1244
+ end
1245
+ end
1246
+ end
1247
+ end
1142
1248
  end
@@ -95,3 +95,19 @@ class HomAnimal
95
95
 
96
96
  belongs_to :trainer, class_name: 'HomTrainer', scope: -> { where(name: 'Dave') }
97
97
  end
98
+
99
+ class HomPost
100
+ include Mongoid::Document
101
+
102
+ field :title, type: String
103
+
104
+ has_one :comment, inverse_of: :post, class_name: 'HomComment'
105
+ end
106
+
107
+ class HomComment
108
+ include Mongoid::Document
109
+
110
+ field :content, type: String
111
+
112
+ belongs_to :post, inverse_of: :comment, optional: true, class_name: 'HomPost'
113
+ end
@@ -496,4 +496,18 @@ describe "Syncable Association" do
496
496
  expect(dog.reload.breed_ids).to eq([ breed.id ])
497
497
  end
498
498
  end
499
+
500
+ context "when setting one document on unpersisted HABTM association" do
501
+ let!(:dog) { Dog.create! }
502
+ let!(:breed) { Breed.new }
503
+
504
+ before do
505
+ breed.dogs = Dog.all
506
+ breed.save!
507
+ end
508
+
509
+ it "sets the foreign key on the other side" do
510
+ expect(dog.reload.breed_ids).to eq([breed._id])
511
+ end
512
+ end
499
513
  end
@@ -329,7 +329,6 @@ describe Mongoid::Atomic::Paths do
329
329
  context "assignment after saving" do
330
330
 
331
331
  it "correctly sets the association for the embedded class" do
332
- pending 'MONGOID-5039'
333
332
 
334
333
  customer.home_address = CustomerAddress.new
335
334
  customer.work_address = CustomerAddress.new
@@ -346,19 +345,6 @@ describe Mongoid::Atomic::Paths do
346
345
  expect(customer.work_address.atomic_path).to eq("work_address")
347
346
  end
348
347
  end
349
-
350
- context "inverse assignment" do
351
-
352
- it "correctly returns the path for each embedded class" do
353
- pending 'MONGOID-5039'
354
-
355
- customer.work_address = CustomerAddress.new
356
- customer.work_address.addressable = customer
357
-
358
- expect(customer.home_address.atomic_path).to eq("home_address")
359
- expect(customer.work_address.atomic_path).to eq("work_address")
360
- end
361
- end
362
348
  end
363
349
  end
364
350
  end