I just noticed a difference between the behaviour of 'validated_hash' and
'validated_list' in MX::Params::Validate when dealing with coercing optional
params:
- validated_list doesn't try to coerce options that are optional and
haven't been specified (correct)
- validated_hash does try to coerce optional params (and will die when
they're not specified)
MooseX/Params/Validate.pm
sub validated_hash {
...
$args{$_} = $spec{$_}{constraint}->coerce( $args{$_} )
for grep { $spec{$_}{coerce} } keys %spec;
...
sub validated_list {
...
$args{$_} = $spec{$_}{constraint}->coerce( $args{$_} )
for grep { $spec{$_}{coerce} && exists $args{$_} } keys %spec;
...
Assuming this is just a typo rather than designed (there's a test for the
validated_list case but not validated_hash) - I've attached a patch with the
extra test and fix.
Cheers,
Ian
diff -crB MooseX-Params-Validate-0.12/lib/MooseX/Params/Validate.pm MooseX-Params-Validate-new/lib/MooseX/Params/Validate.pm
*** MooseX-Params-Validate-0.12/lib/MooseX/Params/Validate.pm Tue Jul 7 21:46:38 2009
--- MooseX-Params-Validate-new/lib/MooseX/Params/Validate.pm Thu Nov 26 12:45:03 2009
***************
*** 52,58 ****
my %args = @$args;
$args{$_} = $spec{$_}{constraint}->coerce( $args{$_} )
! for grep { $spec{$_}{coerce} } keys %spec;
%args = Params::Validate::validate_with(
params => \%args,
--- 52,58 ----
my %args = @$args;
$args{$_} = $spec{$_}{constraint}->coerce( $args{$_} )
! for grep { $spec{$_}{coerce} && exists $args{$_} } keys %spec;
%args = Params::Validate::validate_with(
params => \%args,
diff -crB MooseX-Params-Validate-0.12/t/005_coercion.t MooseX-Params-Validate-new/t/005_coercion.t
*** MooseX-Params-Validate-0.12/t/005_coercion.t Tue Jul 7 18:51:37 2009
--- MooseX-Params-Validate-new/t/005_coercion.t Thu Nov 26 12:39:21 2009
***************
*** 3,9 ****
use strict;
use warnings;
! use Test::More tests => 10;
use Test::Exception;
{
--- 3,9 ----
use strict;
use warnings;
! use Test::More tests => 11;
use Test::Exception;
{
***************
*** 27,32 ****
--- 27,45 ----
[ $params{size1}, $params{size2}, $params{number} ];
}
+ # added to test 'optional' on validated_hash
+ sub baropt {
+ my $self = shift;
+ my %params = validated_hash(
+ \...@_,
+ size1 => { isa => 'Size', coerce => 1, optional => 1 },
+ size2 => { isa => 'Size', coerce => 0, optional => 1 },
+ number => { isa => 'Num', coerce => 1, optional => 1 },
+ );
+ [ $params{size1}, $params{size2}, $params{number} ];
+ }
+
+
sub baz {
my $self = shift;
my ( $size1, $size2, $number ) = validated_list(
***************
*** 95,101 ****
'... the number param cannot be coerced';
is_deeply(
$foo->quux( size2 => 4 ),
[ undef, 4, undef ],
! '... does not try to coerce keys which are not provided'
);
--- 107,119 ----
'... the number param cannot be coerced';
is_deeply(
+ $foo->baropt( size2 => 4 ),
+ [ undef, 4, undef ],
+ '... validated_hash does not try to coerce keys which are not provided'
+ );
+
+ is_deeply(
$foo->quux( size2 => 4 ),
[ undef, 4, undef ],
! '... validated_list does not try to coerce keys which are not provided'
);