lib/anyway/config.rb in anyway_config-1.0.0 vs lib/anyway/config.rb in anyway_config-1.1.0

- old
+ new

@@ -1,28 +1,36 @@ # frozen_string_literal: true require 'anyway/ext/class' require 'anyway/ext/deep_dup' +require 'anyway/ext/deep_freeze' require 'anyway/ext/hash' module Anyway # :nodoc: using Anyway::Ext::Class using Anyway::Ext::DeepDup + using Anyway::Ext::DeepFreeze using Anyway::Ext::Hash # Base config class # Provides `attr_config` method to describe # configuration parameters and set defaults class Config class << self attr_reader :defaults, :config_attributes def attr_config(*args, **hargs) - @defaults = hargs.deep_dup - defaults.stringify_keys! - @config_attributes = args + defaults.keys - attr_accessor(*@config_attributes) + @defaults ||= {} + @config_attributes ||= [] + + new_defaults = hargs.deep_dup + new_defaults.stringify_keys! + defaults.merge! new_defaults + + new_keys = (args + new_defaults.keys) - config_attributes + @config_attributes += new_keys + attr_accessor(*new_keys) end def config_name(val = nil) return (@config_name = val.to_s) unless val.nil? @config_name = underscore_name unless defined?(@config_name) @@ -42,10 +50,11 @@ attr_reader :config_name def initialize(config_name = nil, do_load = true) @config_name = config_name || self.class.config_name + raise ArgumentError, "Config name is missing" unless @config_name load if do_load end def reload clear @@ -84,9 +93,15 @@ end def load_from_env(config) config.deep_merge!(Anyway.env.fetch(config_name)) config + end + + def to_h + self.class.config_attributes.each_with_object({}) do |key, obj| + obj[key.to_sym] = send(key) + end.deep_dup.deep_freeze end private def set_value(key, val)