Factor out deep_merge
into AS::DeepMergeable
#45411
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The
ActiveSupport::DeepMergeable
module allows a class to providedeep_merge
anddeep_merge!
methods simply by implementing amerge!(other, &block)
method. Values will be deep merged only when they are compatible, according todeep_merge?
. By default, that only includes instances of the same class or its subclasses. A class may overridedeep_merge?
to further restrict or expand the domain of deep mergeable values.This does introduce a small change in behavior. Previously,
Hash#deep_merge
would only deep mergeHash
instances. Now,deep_merge
will deep merge anyDeepMergeable
instances that are compatible with each other.This was inspired by #45369 (comment). For now, I've marked
ActiveSupport::DeepMergeable
as:nodoc:
, but I can remove that if we want to make it publicly available.