From: Jos I. Boumans Date: Fri, 8 Sep 2006 13:57:16 +0000 (+0200) Subject: Add Params::Check to the core X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=703d525de284641e86ec58a1bcdea72653258b30;p=p5sagit%2Fp5-mst-13.2.git Add Params::Check to the core From: "Jos Boumans" Message-ID: <8319.80.127.35.68.1157716636.squirrel@webmail.xs4all.nl> (Just the Params-Check part: Locale-Maketext-Simple has already been added by change #28809) p4raw-link: @28809 on //depot/perl: c9d0c046ab7aa1e87edc8cd6fbfa8dc66f709875 p4raw-id: //depot/perl@28811 --- diff --git a/MANIFEST b/MANIFEST index cdbb260..45f4a72 100644 --- a/MANIFEST +++ b/MANIFEST @@ -2065,6 +2065,8 @@ lib/overload.pm Module for overloading perl operators lib/overload.t See if operator overloading works lib/Package/Constants.pm Package::Constants lib/Package/Constants/t/01_list.t Package::Constants tests +lib/Params/Check.pm Params::Check +lib/Params/Check/t/01_Params-Check.t Params::Check tests lib/perl5db.pl Perl debugging routines lib/PerlIO.pm PerlIO support module lib/PerlIO/via/QuotedPrint.pm PerlIO::via::QuotedPrint @@ -2309,9 +2311,9 @@ lib/Search/Dict.pm Perform binary search on dictionaries lib/Search/Dict.t See if Search::Dict works lib/SelectSaver.pm Enforce proper select scoping lib/SelectSaver.t See if SelectSaver works +lib/SelfLoader-buggy.t See if SelfLoader works lib/SelfLoader.pm Load functions only on demand lib/SelfLoader.t See if SelfLoader works -lib/SelfLoader-buggy.t See if SelfLoader works lib/Shell.pm Make AUTOLOADed system() calls lib/Shell.t Tests for above lib/shellwords.pl Perl library to split into words with shell quoting @@ -2598,8 +2600,8 @@ lib/unicore/LineBreak.txt Unicode character database lib/unicore/Makefile Unicode character database lib/unicore/mktables Unicode character database generator lib/unicore/mktables.lst File list for mktables -lib/unicore/NamedSqProv.txt Unicode character database lib/unicore/NamedSequences.txt Unicode character database +lib/unicore/NamedSqProv.txt Unicode character database lib/unicore/NamesList.txt Unicode character database lib/unicore/NormalizationCorrections.txt Unicode character database lib/unicore/PropertyAliases.txt Unicode character database diff --git a/lib/Params/Check.pm b/lib/Params/Check.pm new file mode 100644 index 0000000..66781f6 --- /dev/null +++ b/lib/Params/Check.pm @@ -0,0 +1,710 @@ +package Params::Check; + +use strict; + +use Carp qw[carp croak]; +use Locale::Maketext::Simple Style => 'gettext'; + +use Data::Dumper; + +BEGIN { + use Exporter (); + use vars qw[ @ISA $VERSION @EXPORT_OK $VERBOSE $ALLOW_UNKNOWN + $STRICT_TYPE $STRIP_LEADING_DASHES $NO_DUPLICATES + $PRESERVE_CASE $ONLY_ALLOW_DEFINED $WARNINGS_FATAL + $SANITY_CHECK_TEMPLATE $CALLER_DEPTH + ]; + + @ISA = qw[ Exporter ]; + @EXPORT_OK = qw[check allow last_error]; + + $VERSION = '0.25'; + $VERBOSE = $^W ? 1 : 0; + $NO_DUPLICATES = 0; + $STRIP_LEADING_DASHES = 0; + $STRICT_TYPE = 0; + $ALLOW_UNKNOWN = 0; + $PRESERVE_CASE = 0; + $ONLY_ALLOW_DEFINED = 0; + $SANITY_CHECK_TEMPLATE = 1; + $WARNINGS_FATAL = 0; + $CALLER_DEPTH = 0; +} + +my %known_keys = map { $_ => 1 } + qw| required allow default strict_type no_override + store defined |; + +=pod + +=head1 NAME + +Params::Check - A generic input parsing/checking mechanism. + +=head1 SYNOPSIS + + use Params::Check qw[check allow last_error]; + + sub fill_personal_info { + my %hash = @_; + my $x; + + my $tmpl = { + firstname => { required => 1, defined => 1 }, + lastname => { required => 1, store => \$x }, + gender => { required => 1, + allow => [qr/M/i, qr/F/i], + }, + married => { allow => [0,1] }, + age => { default => 21, + allow => qr/^\d+$/, + }, + + phone => { allow => [ sub { return 1 if /$valid_re/ }, + '1-800-PERL' ] + }, + id_list => { default => [], + strict_type => 1 + }, + employer => { default => 'NSA', no_override => 1 }, + }; + + ### check() returns a hashref of parsed args on success ### + my $parsed_args = check( $tmpl, \%hash, $VERBOSE ) + or die qw[Could not parse arguments!]; + + ... other code here ... + } + + my $ok = allow( $colour, [qw|blue green yellow|] ); + + my $error = Params::Check::last_error(); + + +=head1 DESCRIPTION + +Params::Check is a generic input parsing/checking mechanism. + +It allows you to validate input via a template. The only requirement +is that the arguments must be named. + +Params::Check can do the following things for you: + +=over 4 + +=item * + +Convert all keys to lowercase + +=item * + +Check if all required arguments have been provided + +=item * + +Set arguments that have not been provided to the default + +=item * + +Weed out arguments that are not supported and warn about them to the +user + +=item * + +Validate the arguments given by the user based on strings, regexes, +lists or even subroutines + +=item * + +Enforce type integrity if required + +=back + +Most of Params::Check's power comes from its template, which we'll +discuss below: + +=head1 Template + +As you can see in the synopsis, based on your template, the arguments +provided will be validated. + +The template can take a different set of rules per key that is used. + +The following rules are available: + +=over 4 + +=item default + +This is the default value if none was provided by the user. +This is also the type C will look at when checking type +integrity (see below). + +=item required + +A boolean flag that indicates if this argument was a required +argument. If marked as required and not provided, check() will fail. + +=item strict_type + +This does a C check on the argument provided. The C of the +argument must be the same as the C of the default value for this +check to pass. + +This is very useful if you insist on taking an array reference as +argument for example. + +=item defined + +If this template key is true, enforces that if this key is provided by +user input, its value is C. This just means that the user is +not allowed to pass C as a value for this key and is equivalent +to: + allow => sub { defined $_[0] && OTHER TESTS } + +=item no_override + +This allows you to specify C in your template. ie, they +keys that are not allowed to be altered by the user. It pretty much +allows you to keep all your C data in one place; the +C template. + +=item store + +This allows you to pass a reference to a scalar, in which the data +will be stored: + + my $x; + my $args = check(foo => { default => 1, store => \$x }, $input); + +This is basically shorthand for saying: + + my $args = check( { foo => { default => 1 }, $input ); + my $x = $args->{foo}; + +You can alter the global variable $Params::Check::NO_DUPLICATES to +control whether the C'd key will still be present in your +result set. See the L section below. + +=item allow + +A set of criteria used to validate a particular piece of data if it +has to adhere to particular rules. + +See the C function for details. + +=back + +=head1 Functions + +=head2 check( \%tmpl, \%args, [$verbose] ); + +This function is not exported by default, so you'll have to ask for it +via: + + use Params::Check qw[check]; + +or use its fully qualified name instead. + +C takes a list of arguments, as follows: + +=over 4 + +=item Template + +This is a hashreference which contains a template as explained in the +C and C