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

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.

Parameters:

  • base (Hash)

    the base hash

  • override (Hash)

    values to merge on top

Returns:

  • (Hash)


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.

Parameters:

  • base (Hash)

    the hash to mutate

  • override (Hash)

    values to merge in

Returns:

  • (Hash)

    the mutated base hash



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