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)