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
@@ -1,36 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "spec_helper"
4
+ require_relative '../association/referenced/has_many_models'
5
+ require_relative '../association/referenced/has_and_belongs_to_many_models'
6
+ require_relative './nested_spec_models'
4
7
 
5
8
  describe Mongoid::Attributes::Nested do
6
9
 
7
- # Expects the enclosing context to define `build_with_id`, taking an id
8
- # value and returning the document built with it in nested attributes.
9
- shared_examples 'rejects non-scalar ids' do |klass_name|
10
- not_found = /not found for class #{klass_name}/
11
-
12
- context 'when the id is an operator hash' do
13
- it 'raises a document not found error' do
14
- expect { build_with_id({ '$ne' => nil }) }
15
- .to raise_error(Mongoid::Errors::DocumentNotFound, not_found)
16
- end
17
- end
18
-
19
- context 'when the id is an array' do
20
- it 'raises a document not found error' do
21
- expect { build_with_id([BSON::ObjectId.new]) }
22
- .to raise_error(Mongoid::Errors::DocumentNotFound, not_found)
23
- end
24
- end
25
-
26
- context 'when the id is a malformed object id hash' do
27
- it 'raises a document not found error' do
28
- expect { build_with_id({ '$oid' => 'junk' }) }
29
- .to raise_error(Mongoid::Errors::DocumentNotFound, not_found)
30
- end
31
- end
32
- end
33
-
34
10
  describe ".accepts_nested_attributes_for" do
35
11
 
36
12
  context "when the autosave option is not defined" do
@@ -202,30 +178,6 @@ describe Mongoid::Attributes::Nested do
202
178
  end
203
179
  end
204
180
 
205
- context 'when the id in the attributes is not a scalar' do
206
- let(:person) { Person.create! }
207
-
208
- def build_with_id(id)
209
- person.update!(posts_attributes: { '0' => { id: id, title: 'Crafted' } })
210
- end
211
-
212
- context 'when the association is empty' do
213
- include_examples 'rejects non-scalar ids', 'Post'
214
- end
215
-
216
- context 'when the association is not empty' do
217
- before { person.posts.create!(title: 'Existing') }
218
-
219
- include_examples 'rejects non-scalar ids', 'Post'
220
- end
221
-
222
- context 'when allow_reparenting_via_nested_attributes is true' do
223
- config_override :allow_reparenting_via_nested_attributes, true
224
-
225
- include_examples 'rejects non-scalar ids', 'Post'
226
- end
227
- end
228
-
229
181
  context "when the relation is a references and referenced in many" do
230
182
 
231
183
  before do
@@ -249,100 +201,16 @@ describe Mongoid::Attributes::Nested do
249
201
  )
250
202
  end
251
203
 
252
- context 'when allow_reparenting_via_nested_attributes is false' do
253
- config_override :allow_reparenting_via_nested_attributes, false
254
-
255
- it 'raises a document not found error' do
256
- expect { person }.to raise_error(Mongoid::Errors::DocumentNotFound,
257
- /Document\(s\) not found for class Preference/)
258
- end
259
- end
260
-
261
- context 'when allow_reparenting_via_nested_attributes is true' do
262
- config_override :allow_reparenting_via_nested_attributes, true
263
-
264
- it 'sets the nested attributes' do
265
- expect(person.preferences.map(&:name)).to eq([preference.name])
266
- end
267
-
268
- it 'updates attributes of existing document which is added to relation' do
269
- preference_name = 'updated preference'
270
- person = Person.new(
271
- preferences_attributes: { 0 => { id: preference.id, name: preference_name } }
272
- )
273
- expect(person.preferences.map(&:name)).to eq([preference_name])
274
- end
275
-
276
- context 'when the id does not correspond to an existing document' do
277
- let(:person) do
278
- Person.new(
279
- preferences_attributes: { 0 => { id: BSON::ObjectId.new, name: 'Ghost' } }
280
- )
281
- end
282
-
283
- context 'when raise_not_found_error is true' do
284
- config_override :raise_not_found_error, true
285
-
286
- it 'raises a document not found error' do
287
- expect { person }.to raise_error(Mongoid::Errors::DocumentNotFound,
288
- /Document\(s\) not found for class Preference/)
289
- end
290
- end
291
-
292
- context 'when raise_not_found_error is false' do
293
- config_override :raise_not_found_error, false
294
-
295
- it 'raises a document not found error' do
296
- expect { person }.to raise_error(Mongoid::Errors::DocumentNotFound,
297
- /Document\(s\) not found for class Preference/)
298
- end
299
- end
300
- end
301
- end
302
-
303
- context 'when _destroy is true for a document not in the relation' do
304
- before do
305
- Person.send(:undef_method, :preferences_attributes=)
306
- Person.accepts_nested_attributes_for :preferences, allow_destroy: true
307
- end
308
-
309
- let(:person) do
310
- Person.new(
311
- preferences_attributes: { 0 => { id: preference.id, _destroy: '1' } }
312
- )
313
- end
314
-
315
- it 'does not raise UnknownAttribute' do
316
- expect { person }.not_to raise_error
317
- end
318
-
319
- it 'does not add the document to the relation' do
320
- expect(person.preferences).to be_empty
321
- end
322
- end
323
- end
324
-
325
- context 'when the id in the attributes is not a scalar' do
326
- let(:target) { Person.create! }
327
-
328
- def build_with_id(id)
329
- target.update!(preferences_attributes: { 0 => { id: id, name: 'Crafted' } })
330
- end
331
-
332
- context 'when the association is empty' do
333
- include_examples 'rejects non-scalar ids', 'Preference'
334
- end
335
-
336
- context 'when the association is not empty' do
337
- before { target.preferences.create!(name: 'Existing') }
338
-
339
- include_examples 'rejects non-scalar ids', 'Preference'
204
+ it "sets the nested attributes" do
205
+ expect(person.preferences.map(&:name)).to eq([preference.name])
340
206
  end
341
207
 
342
- context 'when allow_reparenting_via_nested_attributes is true' do
343
- config_override :allow_reparenting_via_nested_attributes, true
344
-
345
- include_examples 'rejects non-scalar ids', 'Preference'
208
+ it "updates attributes of existing document which is added to relation" do
209
+ preference_name = 'updated preference'
210
+ person = Person.new(
211
+ preferences_attributes: { 0 => { id: preference.id, name: preference_name } }
212
+ )
213
+ expect(person.preferences.map(&:name)).to eq([preference_name])
346
214
  end
347
215
  end
348
216
  end
@@ -1488,7 +1356,7 @@ describe Mongoid::Attributes::Nested do
1488
1356
  expect {
1489
1357
  person.addresses_attributes =
1490
1358
  { "foo" => { "id" => "test", "street" => "Test" } }
1491
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1359
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
1492
1360
  end
1493
1361
  end
1494
1362
  end
@@ -3147,7 +3015,7 @@ describe Mongoid::Attributes::Nested do
3147
3015
  { "0" =>
3148
3016
  { "id" => BSON::ObjectId.new.to_s, "title" => "Rogue" }
3149
3017
  }
3150
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
3018
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
3151
3019
  end
3152
3020
  end
3153
3021
  end
@@ -3181,7 +3049,7 @@ describe Mongoid::Attributes::Nested do
3181
3049
  expect {
3182
3050
  person.posts_attributes =
3183
3051
  { "foo" => { "id" => "test", "title" => "Test" } }
3184
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
3052
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
3185
3053
  end
3186
3054
  end
3187
3055
  end
@@ -3898,7 +3766,7 @@ describe Mongoid::Attributes::Nested do
3898
3766
  expect {
3899
3767
  person.preferences_attributes =
3900
3768
  { "foo" => { "id" => "test", "name" => "Test" } }
3901
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
3769
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
3902
3770
  end
3903
3771
  end
3904
3772
  end
@@ -4530,13 +4398,6 @@ describe Mongoid::Attributes::Nested do
4530
4398
 
4531
4399
  context "when nesting multiple levels and parent is timestamped" do
4532
4400
 
4533
- around do |example|
4534
- original_relations = Location.relations
4535
- Location.embedded_in :address, touch: true
4536
- example.run
4537
- Location.relations = original_relations
4538
- end
4539
-
4540
4401
  after do
4541
4402
  Address.reset_callbacks(:save)
4542
4403
  end
@@ -5064,61 +4925,75 @@ describe Mongoid::Attributes::Nested do
5064
4925
  end
5065
4926
  end
5066
4927
 
5067
- context 'when an id in nested attributes belongs to another parent' do
5068
- let(:victim) { Person.create! }
5069
- let(:attacker) { Person.create! }
4928
+ context "when destroying has_many child using nested attributes" do
4929
+ let(:school) do
4930
+ School.create
4931
+ end
5070
4932
 
5071
- context 'when the association is a has-many' do
5072
- before do
5073
- Person.send(:undef_method, :posts_attributes=)
5074
- Person.accepts_nested_attributes_for :posts
5075
- end
4933
+ let!(:student) do
4934
+ school.students.create
4935
+ end
5076
4936
 
5077
- let!(:victim_post) { victim.posts.create!(title: 'Private') }
4937
+ before do
4938
+ school.attributes = {
4939
+ '_id': school.id,
4940
+ 'students_attributes': [{
4941
+ '_id': student.id,
4942
+ '_destroy': 1
4943
+ }]
4944
+ }
4945
+ end
5078
4946
 
5079
- it 'does not update the other parent\'s document' do
5080
- expect { attacker.update!(posts_attributes: { '0' => { id: victim_post.id, title: 'Overwritten' } }) }
5081
- .to raise_error(Mongoid::Errors::DocumentNotFound)
5082
- expect(victim_post.reload.title).to eq('Private')
5083
- end
4947
+ it "is able to access the parent in the after_destroy callback" do
4948
+ expect(school.after_destroy_triggered).to eq(true)
4949
+ end
4950
+ end
5084
4951
 
5085
- it 'does not add the other parent\'s document to the association' do
5086
- expect { attacker.update!(posts_attributes: { '0' => { id: victim_post.id, title: 'Overwritten' } }) }
5087
- .to raise_error(Mongoid::Errors::DocumentNotFound)
5088
- expect(attacker.reload.posts).to be_empty
5089
- end
4952
+ context "when destroying has_many child using nested attributes" do
4953
+ let(:school) do
4954
+ HabtmmSchool.create!(students: [student])
4955
+ end
5090
4956
 
5091
- it 'does not update via a direct association assignment' do
5092
- expect { attacker.update!(posts: { '0' => { id: victim_post.id, title: 'Overwritten' } }) }
5093
- .to raise_error(Mongoid::Errors::DocumentNotFound)
5094
- expect(victim_post.reload.title).to eq('Private')
5095
- end
4957
+ let(:student) do
4958
+ HabtmmStudent.create!
5096
4959
  end
5097
4960
 
5098
- context 'when the association is a has-and-belongs-to-many' do
5099
- before do
5100
- Person.send(:undef_method, :preferences_attributes=)
5101
- Person.accepts_nested_attributes_for :preferences
5102
- end
4961
+ before do
4962
+ student.schools << school
4963
+ school.attributes = {
4964
+ '_id': school.id,
4965
+ 'students_attributes': [{
4966
+ '_id': student.id,
4967
+ '_destroy': 1
4968
+ }]
4969
+ }
4970
+ end
4971
+
4972
+ it "is able to access the parent in the after_destroy callback" do
4973
+ expect(school.reload.after_destroy_triggered).to eq(true)
4974
+ end
4975
+ end
5103
4976
 
5104
- let!(:victim_preference) { victim.preferences.create!(name: 'Private') }
4977
+ context "when using a multi-leveled nested attribute on a referenced association" do
4978
+ let(:author) { NestedAuthor.create }
4979
+ let(:one_level_params) { { post_attributes: { title: 'test' } } }
4980
+ let(:two_levels_params) { { post_attributes: { comments_attributes: [ { body: 'test' } ] } } }
5105
4981
 
5106
- it 'does not update the other parent\'s document' do
5107
- expect { attacker.update!(preferences_attributes: { '0' => { id: victim_preference.id, name: 'Overwritten' } }) }
5108
- .to raise_error(Mongoid::Errors::DocumentNotFound)
5109
- expect(victim_preference.reload.name).to eq('Private')
5110
- end
4982
+ it "creates a 1st-depth child model" do
4983
+ author.update_attributes(one_level_params)
4984
+ expect(author.post.persisted?).to be true
4985
+ end
5111
4986
 
5112
- it 'does not add the other parent\'s document to the association' do
5113
- expect { attacker.update!(preferences_attributes: { '0' => { id: victim_preference.id, name: 'Overwritten' } }) }
5114
- .to raise_error(Mongoid::Errors::DocumentNotFound)
5115
- expect(attacker.reload.preferences).to be_empty
5116
- end
4987
+ it "creates a 1st-depth child model, and a 2nd-depth child model" do
4988
+ author.update_attributes(two_levels_params)
4989
+ expect(author.post.comments.count).to eq 1
4990
+ end
5117
4991
 
5118
- it 'does not update via a direct association assignment' do
5119
- expect { attacker.update!(preferences: { '0' => { id: victim_preference.id, name: 'Overwritten' } }) }
5120
- .to raise_error(Mongoid::Errors::DocumentNotFound)
5121
- expect(victim_preference.reload.name).to eq('Private')
4992
+ context "the 1st-depth child model already exists" do
4993
+ it "creates a 2nd-depth child model" do
4994
+ author.create_post(title: 'test')
4995
+ author.update_attributes(two_levels_params)
4996
+ expect(author.post.comments.count).to eq 1
5122
4997
  end
5123
4998
  end
5124
4999
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ class NestedAuthor
4
+ include Mongoid::Document
5
+
6
+ field :name, type: String
7
+ has_one :post, class_name: "NestedPost"
8
+ accepts_nested_attributes_for :post
9
+ end
10
+
11
+ class NestedComment
12
+ include Mongoid::Document
13
+
14
+ field :body, type: String
15
+ belongs_to :post, class_name: "NestedPost"
16
+ end
17
+
18
+ class NestedPost
19
+ include Mongoid::Document
20
+
21
+ field :title, type: String
22
+ belongs_to :author, class_name: "NestedAuthor"
23
+ has_many :comments, class_name: "NestedComment"
24
+ accepts_nested_attributes_for :comments
25
+ end
26
+
27
+ class NestedBook
28
+ include Mongoid::Document
29
+
30
+ embeds_one :cover, class_name: "NestedCover"
31
+ embeds_many :pages, class_name: "NestedPage"
32
+
33
+ accepts_nested_attributes_for :cover, :pages
34
+ end
35
+
36
+ class NestedCover
37
+ include Mongoid::Document
38
+
39
+ field :title, type: String
40
+ embedded_in :book, class_name: "NestedBook"
41
+ end
42
+
43
+ class NestedPage
44
+ include Mongoid::Document
45
+
46
+ field :number, type: Integer
47
+ embedded_in :book, class_name: "NestedBook"
48
+ end
@@ -5,11 +5,7 @@ require "spec_helper"
5
5
  describe Mongoid::Attributes::Projector do
6
6
  Dir[File.join(File.dirname(__FILE__), 'projector_data', '*.yml')].sort.each do |path|
7
7
  context File.basename(path) do
8
- specs = if RUBY_VERSION.start_with?("2.5")
9
- YAML.safe_load(File.read(path), [], [], true)
10
- else
11
- YAML.safe_load(File.read(path), aliases: true)
12
- end
8
+ specs = YAML.safe_load(File.read(path), aliases: true)
13
9
 
14
10
  specs.each do |spec|
15
11
  context spec['name'] do