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