Login
Add allow_double_quote_if_string_contains_single_quote
authorElliot Shank <perl@galumph.com>
Mon, 14 Jul 2008 01:07:08 +0000 (01:07 +0000)
committerElliot Shank <perl@galumph.com>
Mon, 14 Jul 2008 01:07:08 +0000 (01:07 +0000)
option to ProhibitInterpolationOfLiterals.  Patch submitted
by Ed Avis (plus further edits).  RT #36125.

Changes
lib/Perl/Critic/Policy/ValuesAndExpressions/ProhibitInterpolationOfLiterals.pm
t/ValuesAndExpressions/ProhibitInterpolationOfLiterals.run

diff --git a/Changes b/Changes
index 35ed1c8..d2fdad8 100644 (file)
--- a/Changes
+++ b/Changes
@@ -3,6 +3,11 @@
     Minor Enhancements:
     * -s is now a synonym for --single-policy.
 
+    Policy Changes:
+    * ValuesAndExpressions::ProhibitInterpolationOfLiterals now takes a
+      allow_double_quote_if_string_contains_single_quote option.  Contributed
+      by Ed Avis <ed@membled.com>.  RT #36125.
+
     Bug fixes:
     * BuiltinFunctions::ProhibitSleepViaSelect would complain if there were
       three undefs as arguments to select(), but one of them was the timeout.
@@ -16,7 +21,7 @@
       "sort &foo(...)".
     * Makefile.PL, Build.PL and other ".PL" scripts which typically do not
       have a shebang are no longer mistaken as modules.  This prevents
-      spurrious warnings from Modules::RequireEndWithOne. RT #20481.
+      spurrious warnings from Modules::RequireEndWithOne.  RT #20481.
 
 [1.088] Released on 2008-07-04
 
index d6a16d8..e050e7b 100644 (file)
@@ -35,6 +35,13 @@ sub supported_parameters {
             default_string     => $EMPTY,
             parser             => \&_parse_allow,
         },
+        {
+            name               => 'allow_double_quote_if_string_contains_single_quote',
+            description        =>
+                q<If the string contains ' characters, allow "" to quote it.>,
+            default_string     => '0',
+            behavior           => 'boolean',
+        },
     );
 }
 
@@ -79,6 +86,11 @@ sub violates {
     # Overlook allowed quote styles
     return if any { $elem =~ m{ \A \Q$_\E }mx } @{ $self->{_allow} };
 
+    # If the flag is set, allow "I'm here".
+    if ( $self->{_allow_double_quote_if_string_contains_single_quote} ) {
+        return if index ($elem, $QUOTE) >= 0;
+    }
+
     # Must be a violation
     return $self->violation( $DESC, $EXPL, $elem );
 }
@@ -87,8 +99,8 @@ sub violates {
 
 sub _has_interpolation {
     my $elem = shift;
-    return $elem =~ m{ (?<!\\) [\$\@] \S+ }mx      #Contains unescaped $. or @.
-        || $elem =~ m{ \\[tnrfbae0xcNLuLUEQ] }mx;   #Containts escaped metachars
+    return $elem =~ m{ (?<!\\) [\$\@] \S+ }mx     #Contains unescaped $. or @.
+        || $elem =~ m{ \\[tnrfbae0xcNLuLUEQ] }mx; #Containts escaped metachars
 }
 
 1;
@@ -103,6 +115,7 @@ __END__
 
 Perl::Critic::Policy::ValuesAndExpressions::ProhibitInterpolationOfLiterals - Always use single quotes for literal strings.
 
+
 =head1 AFFILIATION
 
 This Policy is part of the core L<Perl::Critic|Perl::Critic>
@@ -128,6 +141,12 @@ the reader know that you really did intend the string to be literal.
     print qq{$foobar};  #preferred
     print qq{foobar\n}; #preferred
 
+Use of double-quotes might be reasonable if the string contains single
+quote (') characters:
+
+    print "it's me";    # ok, if configuration flag set
+
+
 =head1 CONFIGURATION
 
 The types of quoting styles to exempt from this policy can be
@@ -145,6 +164,15 @@ this, put the following in your F<.perlcriticrc> file:
     [ValuesAndExpressions::ProhibitInterpolationOfLiterals]
     allow = qq{} qq[]
 
+The flag C<allow_double_quote_if_string_contains_single_quote> permits
+double-quoted strings if the string contains a single quote (')
+character.  It defaults to off; to turn it on put the following in
+your F<.perlcriticrc> file:
+
+    [ValuesAndExpressions::ProhibitInterpolationOfLiterals]
+    allow_double_quote_if_string_contains_single = 1
+
+
 =head1 SEE ALSO
 
 L<Perl::Critic::Policy::ValuesAndExpressions::RequireInterpolationOfMetachars|Perl::Critic::Policy::ValuesAndExpressions::RequireInterpolationOfMetachars>
index 08d12ff..9f5ceba 100644 (file)
@@ -66,6 +66,25 @@ $sql = qq/select foo from bar/;
 
 #-----------------------------------------------------------------------------
 
+## name Allow double-quote if string contains single quote
+## failures 2
+## cut
+
+$sql = "it's me";
+$sql = "\'";
+
+#-----------------------------------------------------------------------------
+
+## name Configuration allowing double-quote for all single quote containing strings
+## failures 0
+## parms { allow_double_quote_if_string_contains_single_quote => 1 }
+## cut
+
+$sql = "it's me";
+$sql = "\'";
+
+#-----------------------------------------------------------------------------
+
 ##############################################################################
 #      $URL$
 #     $Date$