Module: Legion::Settings::DeepMerge
- Defined in:
- lib/legion/settings/deep_merge.rb
Overview
Shared deep-merge logic used by Loader, Overlay, ProjectEnv, and the top-level Settings module. Consolidates four previously duplicated implementations into one place.
Class Method Summary collapse
-
.deep_merge(base, override) ⇒ Hash
Non-destructive deep merge.
-
.deep_merge!(base, override) ⇒ Hash
In-place deep merge.
Class Method Details
.deep_merge(base, override) ⇒ Hash
Non-destructive deep merge. Returns a new hash with override values merged on top of base. Preserves Concurrent::Hash type when the base hash is one.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/legion/settings/deep_merge.rb', line 20 def deep_merge(base, override) merged = base.is_a?(Concurrent::Hash) ? Concurrent::Hash[base] : base.dup override.each do |key, value| existing = base[key] merged[key] = if existing.is_a?(Hash) && value.is_a?(Hash) deep_merge(existing, value) elsif existing.is_a?(Array) && value.is_a?(Array) (existing + value).uniq else value end end merged end |
.deep_merge!(base, override) ⇒ Hash
In-place deep merge. Mutates base with values from override. Nested hashes are merged recursively; scalars and arrays are replaced.
41 42 43 44 45 46 47 48 49 50 |
# File 'lib/legion/settings/deep_merge.rb', line 41 def deep_merge!(base, override) override.each do |key, value| if base[key].is_a?(Hash) && value.is_a?(Hash) deep_merge!(base[key], value) else base[key] = value end end base end |