Sha256: cc396542373d1b2d557b635774324303cf046f45576fbbd65107e0904b7b318d

Contents?: true

Size: 1.59 KB

Versions: 3

Compression:

Stored size: 1.59 KB

Contents

# frozen_string_literal: true

module DevSuite
  module Utils
    module Construct
      module Config
        module Settings
          class Base
            def initialize(settings = {})
              @default_settings = settings
              @settings = merge_settings(@default_settings, settings)
            end

            def set(*keys, value)
              key_path = normalize_keys(keys)
              last_key = key_path.pop
              target = key_path.each_with_object(@settings) do |key, nested|
                nested[key] ||= {}
              end
              target[last_key] = value
            end

            def get(*keys)
              key_path = normalize_keys(keys)
              key_path.reduce(@settings) do |nested, key|
                nested.is_a?(Hash) ? nested[key] : nil
              end
            end

            def reset!
              @settings = @default_settings
            end

            private

            def normalize_keys(keys)
              key_path = keys.flatten
              if key_path.size == 1 && key_path.first.is_a?(String)
                key_path.first.to_s.split(".").map(&:to_sym)
              else
                key_path.map(&:to_sym)
              end
            end

            def merge_settings(defaults, overrides)
              defaults.merge(overrides) do |_key, oldval, newval|
                if oldval.is_a?(Hash) && newval.is_a?(Hash)
                  merge_settings(oldval, newval)
                else
                  newval
                end
              end
            end
          end
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dev_suite-0.2.7 lib/dev_suite/utils/construct/config/settings/base.rb
dev_suite-0.2.6 lib/dev_suite/utils/construct/config/settings/base.rb
dev_suite-0.2.5 lib/dev_suite/utils/construct/config/settings/base.rb