Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,8 @@ Style/RedundantBegin:
# NOTE: too situative
Metrics/ParameterLists:
Enabled: false

# Conflicts with current project style
Style/NilComparison:
Enabled: true
EnforcedStyle: predicate
5 changes: 4 additions & 1 deletion lib/qonfig/dsl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ def validators
# @param predefined [String, Symbol]
# @option by [String, Symbol, NilClass]
# @option stict [Boolean]
# @param custom_validation [Proc]
# @option error_message [NilClass, String, Proc]
# @param custom_validation [Block]
# @return [void]
#
# @see Qonfig::Validation::Building::InstanceBuilder
Expand All @@ -84,13 +85,15 @@ def validate(
predefined = nil,
strict: false,
by: nil,
error_message: nil,
&custom_validation
)
validators << Qonfig::Validation::Building::InstanceBuilder.build(
self,
setting_key_pattern: setting_key_pattern,
predefined_validator: predefined,
runtime_validation_method: by,
error_message: error_message,
strict: strict,
validation_logic: custom_validation
)
Expand Down
24 changes: 21 additions & 3 deletions lib/qonfig/validation/building/instance_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,18 @@ class Qonfig::Validation::Building::InstanceBuilder
# @since 0.17.0
DEFAULT_STRICT_BEHAVIOUR = false

# @return [Boolean]
#
# @api private
# @since 0.26.0
DEFAULT_ERROR_MESSAGE = nil

class << self
# @param data_set_klass [Class<Qonfig::DataSet>]
# @option setting_key_pattern [String, Symbol, NilClass]
# @option predefined_validator [String, Symbol, NilClass]
# @option runtime_validation_method [String, Symbol, NilClass]
# @option error_message [NilClass, String, Proc]
# @option validation_logic [Proc, NilClass]
# @option strict [Boolean]
# @return [Qonfig::Validator::MethodBased, Qonfig::Validator::ProcBased]
Expand All @@ -50,6 +57,7 @@ def build(
data_set_klass,
setting_key_pattern: EMPTY_SETTING_KEY_PATTERN,
runtime_validation_method: NO_RUNTIME_VALIDATION_METHOD,
error_message: DEFAULT_ERROR_MESSAGE,
validation_logic: NO_VALIDATION_LOGIC,
strict: DEFAULT_STRICT_BEHAVIOUR,
predefined_validator: NO_PREDEFINED_VALIDATOR
Expand All @@ -59,6 +67,7 @@ def build(
setting_key_pattern,
predefined_validator,
runtime_validation_method,
error_message,
strict,
validation_logic
).build
Expand All @@ -69,6 +78,7 @@ def build(
# @param setting_key_pattern [String, Symbol, NilClass]
# @param predefined_validator_name [String, Symbol, NilClass]
# @param runtime_validation_method [String, Symbol, NilClass]
# @param error_message [NilClass, String, Proc]
# @param strict [Boolean]
# @param validation_logic [Proc, NilClass]
# @return [void]
Expand All @@ -80,13 +90,15 @@ def initialize(
setting_key_pattern,
predefined_validator_name,
runtime_validation_method,
error_message,
strict,
validation_logic
)
@data_set_klass = data_set_klass
@setting_key_pattern = setting_key_pattern
@predefined_validator_name = predefined_validator_name
@runtime_validation_method = runtime_validation_method
@error_message = error_message
@strict = strict
@validation_logic = validation_logic
end
Expand Down Expand Up @@ -140,6 +152,12 @@ def build
# @since 0.20.0
attr_reader :validation_logic

# @return [NilClass, String, Proc]
#
# @api private
# @since 0.26.0
attr_reader :error_message

# @return [void]
#
# @raise [Qonfig::ArgumentError]
Expand Down Expand Up @@ -184,7 +202,7 @@ def build_setting_key_matcher
# @since 0.20.0
def build_method_based_validator
Qonfig::Validation::Validators::MethodBased.new(
build_setting_key_matcher, strict, runtime_validation_method
build_setting_key_matcher, strict, runtime_validation_method, error_message
)
end

Expand All @@ -194,7 +212,7 @@ def build_method_based_validator
# @since 0.20.0
def build_proc_based_validator
Qonfig::Validation::Validators::ProcBased.new(
build_setting_key_matcher, strict, validation_logic
build_setting_key_matcher, strict, validation_logic, error_message
)
end

Expand All @@ -213,7 +231,7 @@ def build_predefined_validator
end

Qonfig::Validation::Validators::Predefined.new(
build_setting_key_matcher, strict, predefined_validation_logic
build_setting_key_matcher, strict, predefined_validation_logic, error_message
)
end
end
28 changes: 27 additions & 1 deletion lib/qonfig/validation/validators/basic.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,23 @@ class Qonfig::Validation::Validators::Basic
# @since 0.20.0
attr_reader :strict

# @return [NilClass, String, Proc]
#
# @api private
# @since 0.26.0
attr_reader :error_message

# @param setting_key_matcher [Qonfig::Settings::KeyMatcher, NilClass]
# @param strict [Boolean]
# @param error_message [NilClass, String, Proc]
# @return [void]
#
# @api private
# @since 0.20.0
def initialize(setting_key_matcher, strict)
def initialize(setting_key_matcher, strict, error_message = nil)
@setting_key_matcher = setting_key_matcher
@strict = strict
@error_message = error_message
end

# @param data_set [Qonfig::DataSet]
Expand Down Expand Up @@ -58,4 +66,22 @@ def validate_full(data_set); end
# @api private
# @since 0.20.0
def validate_concrete(data_set); end

# @param context [Object, NilClass]
# @return [String]
#
# @api private
# @since 0.26.0
def default_error_message(context); end

# @param context [Object, NilClass]
# @return [String]
#
# @api private
# @since 0.26.0
def build_error_message(context = nil)
return error_message.to_s if error_message.is_a?(String)
return error_message.call(context).to_s if error_message.respond_to?(:call)
default_error_message(context)
end
end
19 changes: 15 additions & 4 deletions lib/qonfig/validation/validators/method_based.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ class Qonfig::Validation::Validators::MethodBased < Qonfig::Validation::Validato
# @param setting_key_matcher [Qonfig::Settings::KeyMatcher, NilClass]
# @param strict [Boolean]
# @param runtime_validation_method [String, Symbol]
# @param error_message [NilClass, String, Proc]
# @return [void]
#
# @api private
# @since 0.20.0
def initialize(setting_key_matcher, strict, runtime_validation_method)
super(setting_key_matcher, strict)
def initialize(setting_key_matcher, strict, runtime_validation_method, error_message = nil)
super(setting_key_matcher, strict, error_message)
@runtime_validation_method = runtime_validation_method
end

Expand All @@ -33,7 +34,7 @@ def validate_concrete(data_set)

raise(
Qonfig::ValidationError,
"Invalid value of setting <#{setting_key}> (#{setting_value})"
build_error_message(setting_key: setting_key, setting_value: setting_value)
) unless data_set.__send__(runtime_validation_method, setting_value)
end
end
Expand All @@ -45,7 +46,17 @@ def validate_concrete(data_set)
# @since 0.20.0
def validate_full(data_set)
unless data_set.__send__(runtime_validation_method)
raise(Qonfig::ValidationError, 'Invalid config object')
raise(Qonfig::ValidationError, build_error_message)
end
end

# @param context [Object, NilClass]
# @return [String]
#
# @api private
# @since 0.26.0
def default_error_message(context = nil)
return 'Invalid config object' if context.nil?
"Invalid value of setting <#{context[:setting_key]}> (#{context[:setting_value]})"
end
end
16 changes: 13 additions & 3 deletions lib/qonfig/validation/validators/predefined.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ class Qonfig::Validation::Validators::Predefined < Qonfig::Validation::Validator
# @param setting_key_matcher [Qonfig::Settings::KeyMatcher]
# @param strict [Boolean]
# @param validation [Proc]
# @param error_message [NilClass, String, Proc]
# @return [void]
#
# @api private
# @since 0.20.0
def initialize(setting_key_matcher, strict, validation)
super(setting_key_matcher, strict)
def initialize(setting_key_matcher, strict, validation, error_message = nil)
super(setting_key_matcher, strict, error_message)
@validation = validation
end

Expand All @@ -35,7 +36,7 @@ def validate_concrete(data_set)

raise(
Qonfig::ValidationError,
"Invalid value of setting <#{setting_key}> (#{setting_value})"
build_error_message(setting_key: setting_key, setting_value: setting_value)
) unless validation.call(setting_value)
end
end
Expand All @@ -52,4 +53,13 @@ def validate_full(data_set)
raise Qonfig::Error, 'Predefined validator can be used with a setting key only'
# :nocov:
end

# @param context [Object, NilClass]
# @return [String]
#
# @api private
# @since 0.26.0
def default_error_message(context = nil)
"Invalid value of setting <#{context[:setting_key]}> (#{context[:setting_value]})"
end
end
22 changes: 17 additions & 5 deletions lib/qonfig/validation/validators/proc_based.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@ class Qonfig::Validation::Validators::ProcBased < Qonfig::Validation::Validators

# @param setting_key_matcher [Qonfig::Settings::KeyMatcher, NilClass]
# @param strict [Boolean]
# @param vaidation [Proc]
# @param validation [Proc]
# @param error_message [NilClass, String, Proc]
# @return [void]
#
# @api private
# @since 0.20.0
def initialize(setting_key_matcher, strict, validation)
super(setting_key_matcher, strict)
def initialize(setting_key_matcher, strict, validation, error_message = nil)
super(setting_key_matcher, strict, error_message)
@validation = validation
end

Expand All @@ -35,9 +36,10 @@ def validate_concrete(data_set)

raise(
Qonfig::ValidationError,
"Invalid value of setting <#{setting_key}> (#{setting_value})"
build_error_message(setting_key: setting_key, setting_value: setting_value)
) unless data_set.instance_exec(setting_value, &validation)
end
false
end

# @param data_set [Qonfig::DataSet]
Expand All @@ -49,7 +51,17 @@ def validate_concrete(data_set)
# @since 0.20.0
def validate_full(data_set)
unless data_set.instance_eval(&validation)
raise(Qonfig::ValidationError, 'Invalid config object')
raise(Qonfig::ValidationError, build_error_message)
end
end

# @param context [Object, NilClass]
# @return [String]
#
# @api private
# @since 0.26.0
def default_error_message(context = nil)
return 'Invalid config object' if context.nil?
"Invalid value of setting <#{context[:setting_key]}> (#{context[:setting_value]})"
end
end
Loading