diff --git a/lib/proxy/pluggable.rb b/lib/proxy/pluggable.rb index 4bd6060ab..3efef4cb2 100644 --- a/lib/proxy/pluggable.rb +++ b/lib/proxy/pluggable.rb @@ -42,16 +42,17 @@ def initialize_after(*module_names) raise "#{plugin_name}: 'initialize_after' method has been removed." end - def validate_readable(*settings) - validate(*settings.push(:file_readable => true)) + def validate_readable(*settings, **validator_params) + validator_params[:file_readable] = true + validate(*settings, **validator_params) end - def validate_presence(*settings) - validate(*settings.push(:presence => true)) + def validate_presence(*settings, **validator_params) + validator_params[:presence] = true + validate(*settings, **validator_params) end - def validate(*settings) - validator_params = settings.pop + def validate(*settings, **validator_params) predicate = validator_params.delete(:if) validator_name = validator_params.keys.first validator_args = validator_params[validator_name] diff --git a/test/plugins/module_loader_test.rb b/test/plugins/module_loader_test.rb index ba83233ca..877645e83 100644 --- a/test/plugins/module_loader_test.rb +++ b/test/plugins/module_loader_test.rb @@ -70,6 +70,21 @@ def test_presence_validators_called_on_each_of_default_settings assert results.include?(:class => ::Proxy::PluginValidators::Presence, :setting => :default_2, :args => nil, :predicate => nil) end + VALIDATOR_PREDICATE = ->(settings) { false } + class TestPluginWithBuiltInValidators < ::Proxy::Plugin + default_settings :default_1 => "one", :default_2 => "two" + validate_presence :missing_setting, if: VALIDATOR_PREDICATE + validate_readable :missing_path, if: VALIDATOR_PREDICATE + end + def test_presence_validator_called_with_predicate + loader = ::Proxy::DefaultModuleLoader.new(TestPluginWithBuiltInValidators, nil) + results = loader.validate_settings(TestPluginWithBuiltInValidators, :default_1 => "one", :default_2 => "two") + assert_includes results, {:class => ::Proxy::PluginValidators::Presence, :setting => :default_1, :args => nil, :predicate => nil} + assert_includes results, {:class => ::Proxy::PluginValidators::Presence, :setting => :default_2, :args => nil, :predicate => nil} + assert_includes results, {:class => ::Proxy::PluginValidators::Presence, :setting => :missing_setting, :args => true, :predicate => VALIDATOR_PREDICATE} + assert_includes results, {:class => ::Proxy::PluginValidators::FileReadable, :setting => :missing_path, :args => true, :predicate => VALIDATOR_PREDICATE} + end + class TestValidator < ::Proxy::PluginValidators::Base def validate!(settings) true