lib/anyway/config.rb in anyway_config-2.3.1 vs lib/anyway/config.rb in anyway_config-2.4.0

- old
+ new

@@ -6,10 +6,11 @@ module Anyway # :nodoc: using RubyNext using Anyway::Ext::DeepDup using Anyway::Ext::DeepFreeze using Anyway::Ext::Hash + using Anyway::Ext::FlattenNames using(Module.new do refine Object do def vm_object_id() = (object_id << 1).to_s(16) end @@ -24,10 +25,11 @@ # List of names that couldn't be used as config names # (the class instance methods we use) RESERVED_NAMES = %i[ config_name env_prefix + as_env values class clear deconstruct_keys dig @@ -45,12 +47,10 @@ to_source_trace write_config_attr __type_caster__ ].freeze - ENV_OPTION_EXCLUDE_KEY = :except - class Error < StandardError; end class ValidationError < Error; end include OptparseConfig @@ -126,40 +126,20 @@ else [] end end - def required(*names, env: nil) - unknown_names = names - config_attributes + def required(*names, env: nil, **nested) + unknown_names = names + nested.keys - config_attributes raise ArgumentError, "Unknown config param: #{unknown_names.join(",")}" if unknown_names.any? - names = filter_by_env(names, env) + return unless Settings.matching_env?(env) + required_attributes.push(*names) + required_attributes.push(*nested.flatten_names) end - def filter_by_env(names, env) - return names if env.nil? || env.to_s == current_env - - filtered_names = if env.is_a?(Hash) - names_with_exclude_env_option(names, env) - elsif env.is_a?(Array) - names if env.flat_map(&:to_s).include?(current_env) - end - - filtered_names || [] - end - - def current_env - Settings.current_environment.to_s - end - - def names_with_exclude_env_option(names, env) - envs = env[ENV_OPTION_EXCLUDE_KEY] - excluded_envs = [envs].flat_map(&:to_s) - names if excluded_envs.none?(current_env) - end - def required_attributes return @required_attributes if instance_variable_defined?(:@required_attributes) @required_attributes = if superclass < Anyway::Config superclass.required_attributes.dup @@ -221,10 +201,16 @@ def new_empty_config() = {} def coerce_types(mapping) Utils.deep_merge!(coercion_mapping, mapping) + + mapping.each do |key, val| + next unless val == :boolean || (val.is_a?(::Hash) && val[:type] == :boolean) + + alias_method :"#{key}?", :"#{key}" + end end def coercion_mapping return @coercion_mapping if instance_variable_defined?(:@coercion_mapping) @@ -266,11 +252,11 @@ def define_config_accessor(*names) names.each do |name| accessors_module.module_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{name}=(val) - __trace__&.record_value(val, \"#{name}\", **Tracing.current_trace_source) + __trace__&.record_value(val, "#{name}", **Tracing.current_trace_source) values[:#{name}] = val end def #{name} values[:#{name}] @@ -428,16 +414,21 @@ q.pp __trace__ end end end + def as_env + Env.from_hash(to_h, prefix: env_prefix) + end + private attr_reader :values, :__trace__ def validate_required_attributes! self.class.required_attributes.select do |name| - values[name].nil? || (values[name].is_a?(String) && values[name].empty?) + val = values.dig(*name.to_s.split(".").map(&:to_sym)) + val.nil? || (val.is_a?(String) && val.empty?) end.then do |missing| next if missing.empty? raise_validation_error "The following config parameters for `#{self.class.name}(config_name: #{self.class.config_name})` are missing or empty: #{missing.join(", ")}" end end