Login
Create an option for CodeLayout::ProhibitQuotedWordLists
authorElliot Shank <perl@galumph.com>
Fri, 22 Aug 2008 01:18:27 +0000 (01:18 +0000)
committerElliot Shank <perl@galumph.com>
Fri, 22 Aug 2008 01:18:27 +0000 (01:18 +0000)
that makes it complain about word lists containing non-word
characters again.

Changes
lib/Perl/Critic/Policy/CodeLayout/ProhibitQuotedWordLists.pm
t/CodeLayout/ProhibitQuotedWordLists.run
xt/author/40_perlcriticrc-code
xt/author/42_perlcriticrc-tests

diff --git a/Changes b/Changes
index afaf4ae..d9894c7 100644 (file)
--- a/Changes
+++ b/Changes
@@ -5,19 +5,20 @@
       case you accidentally say "if ($foo = 42) {...}"
 
     Policy Changes:
-    * CodeLayout::ProhibitQuotedWordLists no longer applies if the
-      list contains any non-words.  A non-word is anything that
-      does not match /[\w-]+/.  RT #37886.
-    * CodeLayout::ProhibitQuotedWordLists also now applies to the
-      import arguments of a C<use> statement.  RT #24467.
-    * ErrorHandling::RequireCheckingReturnValueOfEval now recognizes
-      ternary left-sides as valid checks.
+    * CodeLayout::ProhibitQuotedWordLists no longer applies if the list
+      contains any non-words, by default.  A non-word is anything that does
+      not match /[\w-]+/.  You can restore the former behavior by setting the
+      "strict" option.  RT #37886.
+    * CodeLayout::ProhibitQuotedWordLists also now applies to the import
+      arguments of a C<use> statement.  RT #24467.
+    * ErrorHandling::RequireCheckingReturnValueOfEval now recognizes ternary
+      left-sides as valid checks.
     * RegularExpressions::RequireExtendedFormatting gains
       minimum_regex_length_to_complain_about a option.  Also, regexes that
       contain only word and whitespace characters are now exempt from this
       policy, by default; you can make it complain about them by turning on
       the new strict option.  Contributed by Michael Schwern.  RT #38531.
-    * TestingAndDebugging/ProhibitNoWarnings now supports a
+    * TestingAndDebugging::ProhibitNoWarnings now supports a
       allow_with_category_restriction option, thanks to Michael Schwern.
       RT #38514.
 
index db1bc64..646b504 100644 (file)
@@ -10,6 +10,7 @@ package Perl::Critic::Policy::CodeLayout::ProhibitQuotedWordLists;
 use 5.006001;
 use strict;
 use warnings;
+
 use Readonly;
 
 use Perl::Critic::Utils qw{ :characters :severities :classification};
@@ -33,6 +34,12 @@ sub supported_parameters {
             behavior        => 'integer',
             integer_minimum => 1,
         },
+        {
+            name            => 'strict',
+            description     => 'Complain even if there are non-word characters in the values.',
+            default_string  => '0',
+            behavior        => 'boolean',
+        },
     );
 }
 
@@ -46,18 +53,18 @@ sub violates {
     my ( $self, $elem, undef ) = @_;
 
     # Don't worry about subroutine calls
-    my $sib = $elem->sprevious_sibling();
-    return if !$sib;
+    my $sibling = $elem->sprevious_sibling();
+    return if not $sibling;
 
-    return if $sib->isa('PPI::Token::Symbol');
-    return if $sib->isa('PPI::Token::Operator') && $sib eq '->';
-    return if $sib->isa('PPI::Token::Word') && !is_included_module_name($sib);
+    return if $sibling->isa('PPI::Token::Symbol');
+    return if $sibling->isa('PPI::Token::Operator') and $sibling eq '->';
+    return if $sibling->isa('PPI::Token::Word') and not is_included_module_name($sibling);
 
     # Get the list elements
     my $expr = $elem->schild(0);
-    return if !$expr;
+    return if not $expr;
     my @children = $expr->schildren();
-    return if !@children;
+    return if not @children;
 
     my $count = 0;
     for my $child ( @children ) {
@@ -66,10 +73,12 @@ sub violates {
         # All elements must be literal strings,
         # and must contain 1 or more word characters.
 
-        return if ! _is_literal($child);
+        return if not _is_literal($child);
 
         my $string = $child->string();
-        return if $string !~ m{\A [\w-]+ \z}mx;
+        return if $string =~ m{ \s }mx;
+        return if $string eq $EMPTY;
+        return if not $self->{_strict} and $string !~ m{\A [\w-]+ \z}mx;
         $count++;
     }
 
@@ -130,6 +139,13 @@ value for C<min_elements> in F<.perlcriticrc> like this:
 This would cause this policy to only complain about lists containing
 four or more words.
 
+By default, this policy won't complain if any of the values in the list
+contain non-word characters.  If you want it to, set the C<strict>
+option to a true value.
+
+    [CodeLayout::ProhibitQuotedWordLists]
+    strict = 1
+
 
 =head1 NOTES
 
index 28eb2a9..f62315e 100644 (file)
@@ -9,6 +9,7 @@
         'baz-bot');
 
 #-----------------------------------------------------------------------------
+
 ## name Non-word lists
 ## failures 0
 ## cut
@@ -20,6 +21,7 @@
         '#@$%');
 
 #-----------------------------------------------------------------------------
+
 ## name Basic passing
 ## failures 0
 ## cut
@@ -60,6 +62,7 @@ foreach ('foo', 'bar', 'nuts'){ do_something($_) }
 @list = ('foo', 'bar', 'baz', 'nuts');
 
 #-----------------------------------------------------------------------------
+
 ## name Failing 'use' statements
 ## failures 1
 ## cut
@@ -67,6 +70,7 @@ foreach ('foo', 'bar', 'nuts'){ do_something($_) }
 use Foo ('foo', 'bar', 'baz');
 
 #-----------------------------------------------------------------------------
+
 ## name Passing 'use' statements
 ## failures 0
 ## cut
@@ -75,6 +79,21 @@ use Foo ();
 use Foo ('foo', 1, 'bar', '1/2');
 use Foo ('foo' => 'bar', 'baz' => 'nuts');
 
+## name Non-word lists in strict mode.
+## failures 3
+## parms { strict => 1 }
+## cut
+
+use Foo ('foo', 'bar', '1/2');
+
+@list = ('3/4', '-123', '#@$%');
+
+@list = ('3/4',
+        '-123',
+        '#@$%');
+
+#-----------------------------------------------------------------------------
+
 ##############################################################################
 #      $URL$
 #     $Date$
index fe70042..55cf762 100644 (file)
@@ -12,30 +12,32 @@ verbose = %f: %m at line %l, column %c.  %e.  (Severity: %s, %p)\n
 
 #-----------------------------------------------------------------------------
 
-[-CodeLayout::RequireTidyCode]
-
-[Documentation::RequirePodSections]
-lib_sections    = NAME|DESCRIPTION|AUTHOR|COPYRIGHT
-script_sections = NAME|DESCRIPTION|AUTHOR|COPYRIGHT
-
-[Miscellanea::RequireRcsKeywords]
-keywords = URL Date Author Revision
-
 [CodeLayout::ProhibitHardTabs]
 allow_leading_tabs = 0
 
+[CodeLayout::ProhibitQuotedWordLists]
+strict = 1
+
+[-CodeLayout::RequireTidyCode]
+
 [Documentation::PodSpelling]
 stop_words = accessor accessors autoflushes AUTOLOAD backticks bareword barewords BBEdit bitwise boolean booleans builtin CGI config CPAN CVS dereference dereferencing Dolan Dominus elsif exponentials filehandle filehandle filehandles filename globals globbing Guzis hashref HEREDOC HEREDOCs IDE lvalue Maxia Mehner memoization metacharacters Metadata metadata multi-line mutators namespace namespaces PBP perl perlcritic perlcriticrc perldoc Perlish perls PolicyListing postfix PPI pragma pragmas prepend prepending programmatically readline Readonly refactor refactoring regex runtime Schwartzian sigil sigils SQL STDERR STDIN STDOUT stringification subdirectories superclass TerMarsch Thalhammer TODO typeglob UI unblessed undef unescaped unparsed vice-versa whitespace
 
+[Documentation::RequirePodSections]
+lib_sections    = NAME|DESCRIPTION|AUTHOR|COPYRIGHT
+script_sections = NAME|DESCRIPTION|AUTHOR|COPYRIGHT
+
 [InputOutput::RequireCheckedSyscalls]
 functions = open close
 
+[Miscellanea::RequireRcsKeywords]
+keywords = URL Date Author Revision
+
 [RegularExpressions::ProhibitUnusualDelimiters]
 allow_all_brackets = 1
 
 [RegularExpressions::RequireBracesForMultiline]
 allow_all_brackets = 1
 
-#Might move this to P::C::More
+# Might move this to P::C::More
 [-ValuesAndExpressions::RequireConstantOnLeftSideOfEquality]
-
index 6d5c8f6..bedc090 100644 (file)
@@ -12,15 +12,14 @@ verbose = %f: %m at line %l, column %c.  %e.  (Severity: %s, %p)\n
 
 #-----------------------------------------------------------------------------
 
-[-CodeLayout::RequireTidyCode]
-
-[Documentation::RequirePodSections]
-lib_sections    = NAME|DESCRIPTION|AUTHOR|COPYRIGHT
-script_sections = NAME|DESCRIPTION|AUTHOR|COPYRIGHT
+[CodeLayout::ProhibitQuotedWordLists]
+strict = 1
 
 [CodeLayout::ProhibitHardTabs]
 allow_leading_tabs = 0
 
+[-CodeLayout::RequireTidyCode]
+
 [ControlStructures::ProhibitPostfixControls]
 flowcontrol = warn die carp croak cluck confess goto exit plan skip
 
@@ -55,4 +54,3 @@ allow_all_brackets = 1
 
 # Might move this to P::C::More
 [-ValuesAndExpressions::RequireConstantOnLeftSideOfEquality]
-