Params-validator is a project mainly written in Ruby, it's free.
Validate method calls
The aim of params-validator is to allow an easy way to validate the parameters in a method call.
gem install params-validator
FEATURE: definition of validation rulesets inside the method, so it improves the code style including the validation as the first step in a method execution (suggested by osuka)
FIXED: If a method has a ruleset that defines all the parameters as optional, a nil argument is allowed. On previous versions an ArgumentError exception was thrown
FIXED: inheritance allowed. A method can define a more restrictive ruleset in a inherited method.
FIXED: a method validation can be redefined, the first definition will not be used.
MOVED: specs to folder ./spec
There are four ways of use:
See this example:
require 'params-validator'
class MockObject
include ParamsValidator::ValidParams
# define two useless methods
[:method1, :method2].each{|m|
define_method(m) do |*args, &block|
puts {:foo => "bar"}
true
end
}
# method1 arguments ruleset
validate_method(:method1) do
level(Fixnum, :optional)
end
# method2 arguments ruleset
validate_method(:method2) do
data(String) { |data| !data.nil? and data.length > 0}
level(Fixnum, :optional) {|level| level <= 3}
end
end
When calling a specific method, an ArgumentError exception will be raised if at least one parameter is invalid
obj = MockObject.new
obj.method1({:level => "1"}) # This will raise an ArgumentError exception because :level parameter type is invalid
obj.method1({:level => 1}) # This will execute successfully the method call
obj.method2({:level => 1}) # This will raise an ArgumentError exception because :data parameter is missing
Include validation rules outside the object:
class MockObject include ParamsValidator::ValidParams
[:method1, :method2].each{|m| define_method(m) do |*args, &block| true end }
validate_method [:method1, :method2] end
Then in a separate file, rulesets must be loaded:
require 'params-validator'
include ParamsValidator::ValidParams
# define rulesets
rules = <<EOF
validation_rule("MockObject::method1") do
level(Fixnum, :optional)
end
validation_rule("MockObject::method2") do
data(String) { |data| !data.nil? and data.length > 0}
level(Fixnum, :optional) {|level| level <= 3}
end
EOF
# load rulesets in validation framework
load_rules(rules)
obj = MockObject.new
obj.method1({:level => "1"}) # This will raise an ArgumentError exception because :level parameter type is invalid
obj.method1({:level => 1}) # This will execute successfully the method call
obj.method2({:level => 1}) # This will raise an ArgumentError exception because :data parameter is missing
Ruleset defined inside the method, kudos to osuka
require 'params-validator'
class MockObject
include ParamsValidator::ValidParams
def method1(args)
validate_method(args) do
level(Fixnum, :optional)
end
end
end
Request validation to ensure a method call is valid in advance, kudos to drslump
obj = ParamsValidator::Request.new
obj[:data] = "this is a log"
obj[:level] = 1
ruleset = MockObject.get_rule(:method2)
obj.valid?(ruleset) # false
begin
obj.validate(ruleset)
rescue ArgumentError => ae
p ae.message # array with validation errors
end
More examples can be found in test/spec folders.