add trailing_whitespace option and release (3 times) 0.6
Arthur Axel 'fREW' Schmidt [Tue, 19 Jan 2010 22:08:33 +0000 (16:08 -0600)]
Changes
README
lib/Test/EOL.pm
t/11-all.t
t/12-fail.t

diff --git a/Changes b/Changes
index 9af52bd..358ce01 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,4 +1,15 @@
-Revision history for Test-NoTabs
+Revision history for Test-EOL
+
+0.6  2010-01-19
+     - I'm so bad at this!  Fix another logic error that made all files fail
+       when using trailing_whitespace option (fREW)
+
+0.5  2010-01-19
+     - Fix logic fail that made all filenames the same if a user uses the
+       trailing_whitespace option (fREW)
+
+0.4  2010-01-19
+     - Add checks for trailing whitespace (fREW)
 
 0.3  2009-07-18
      - Fix File::Find regex which I had broken.
diff --git a/README b/README
index 51a5614..d7ba2fe 100644 (file)
--- a/README
+++ b/README
@@ -8,6 +8,11 @@ SYNOPSIS
       use Test::EOL tests => 1;
       eol_unix_ok( 'lib/Module.pm', 'Module is ^M free');
 
+    and to add checks for trailing whitespace:
+
+      use Test::EOL tests => 1;
+      eol_unix_ok( 'lib/Module.pm', 'Module is ^M and trailing whitespace free', { trailing_whitespace => 1 });
+
     Module authors can include the following in a t/eol.t and have
     "Test::EOL" automatically find and check all perl files in a module
     distribution:
@@ -20,6 +25,16 @@ SYNOPSIS
       use Test::EOL;
       all_perl_files_ok( @mydirs );
 
+    and if authors would like to check for trailing whitespace:
+
+      use Test::EOL;
+      all_perl_files_ok({ trailing_whitespace => 1 });
+
+    or
+
+      use Test::EOL;
+      all_perl_files_ok({ trailing_whitespace => 1 }, @mydirs );
+
 DESCRIPTION
     This module scans your project/distribution for any perl files (scripts,
     modules, etc) for the presence of windows line endings.
@@ -29,7 +44,7 @@ EXPORT
     you don't export anything, such as for a purely object-oriented module.
 
 FUNCTIONS
-  all_perl_files_ok( [ @directories ] )
+  all_perl_files_ok( [ \%options ], [ @directories ] )
     Applies "eol_unix_ok()" to all perl files found in @directories (and sub
     directories). If no <@directories> is given, the starting point is one
     level above the current running script, that should cover all the files
@@ -43,7 +58,7 @@ FUNCTIONS
 
     the total number of files tested must be specified.
 
-  eol_unix_ok( $file [, $text] )
+  eol_unix_ok( $file [, $text] [, \%options ]  )
     Run a unix EOL check on $file. For a module, the path (lib/My/Module.pm)
     or the name (My::Module) can be both used.
 
index 464db7f..e1bb29b 100644 (file)
@@ -10,7 +10,7 @@ use File::Find;
 
 use vars qw( $VERSION $PERL $UNTAINT_PATTERN $PERL_PATTERN);
 
-$VERSION = '0.3';
+$VERSION = '0.6';
 
 $PERL    = $^X || 'perl';
 $UNTAINT_PATTERN  = qr|^([-+@\w./:\\]+)$|;
@@ -64,13 +64,22 @@ sub _all_files {
 
 sub eol_unix_ok {
     my $file = shift;
-    my $test_txt = shift || "No windows line endings in '$file'";
+    my $test_txt;
+    $test_txt   = shift if !ref $_[0];
+    $test_txt ||= "No windows line endings in '$file'";
+    my $options = shift if ref $_[0] eq 'HASH';
+    $options ||= {
+        trailing_whitespace => 0,
+    };
     $file = _module_to_path($file);
     open my $fh, $file or do { $Test->ok(0, $test_txt); $Test->diag("Could not open $file: $!"); return; };
     my $line = 0;
     while (<$fh>) {
         $line++;
-        if ( /\r$/ ) {
+        if (
+           (!$options->{trailing_whitespace} && /\r$/) ||
+           ( $options->{trailing_whitespace} && /(\r|[ \t]+)$/)
+        ) {
           $Test->ok(0, $test_txt . " on line $line");
           return 0;
         }
@@ -78,12 +87,12 @@ sub eol_unix_ok {
     $Test->ok(1, $test_txt);
     return 1;
 }
-
 sub all_perl_files_ok {
+    my $options = shift if ref $_[0] eq 'HASH';
     my @files = _all_perl_files( @_ );
     _make_plan();
     foreach my $file ( @files ) {
-      eol_unix_ok($file);
+      eol_unix_ok($file, $options);
     }
 }
 
@@ -142,6 +151,11 @@ report its results in standard C<Test::Simple> fashion:
   use Test::EOL tests => 1;
   eol_unix_ok( 'lib/Module.pm', 'Module is ^M free');
 
+and to add checks for trailing whitespace:
+
+  use Test::EOL tests => 1;
+  eol_unix_ok( 'lib/Module.pm', 'Module is ^M and trailing whitespace free', { trailing_whitespace => 1 });
+
 Module authors can include the following in a t/eol.t and have C<Test::EOL>
 automatically find and check all perl files in a module distribution:
 
@@ -153,6 +167,16 @@ or
   use Test::EOL;
   all_perl_files_ok( @mydirs );
 
+and if authors would like to check for trailing whitespace:
+
+  use Test::EOL;
+  all_perl_files_ok({ trailing_whitespace => 1 });
+
+or
+
+  use Test::EOL;
+  all_perl_files_ok({ trailing_whitespace => 1 }, @mydirs );
+
 =head1 DESCRIPTION
 
 This module scans your project/distribution for any perl files (scripts,
@@ -165,7 +189,7 @@ if you don't export anything, such as for a purely object-oriented module.
 
 =head1 FUNCTIONS
 
-=head2 all_perl_files_ok( [ @directories ] )
+=head2 all_perl_files_ok( [ \%options ], [ @directories ] )
 
 Applies C<eol_unix_ok()> to all perl files found in C<@directories> (and sub
 directories). If no <@directories> is given, the starting point is one level
@@ -180,7 +204,7 @@ If the test plan is defined:
 
 the total number of files tested must be specified.
 
-=head2 eol_unix_ok( $file [, $text] )
+=head2 eol_unix_ok( $file [, $text] [, \%options ]  )
 
 Run a unix EOL check on C<$file>. For a module, the path (lib/My/Module.pm) or the
 name (My::Module) can be both used.
index 2433d01..dbb4e0f 100644 (file)
@@ -18,7 +18,10 @@ eol_unix_ok( $file2 );
 my $file3 = make_file3();
 eol_unix_ok( $file3 );
 
-unlink foreach ( $file1, $file2, $file3 );
+my $file4 = make_file3();
+eol_unix_ok( $file3, { trailing_whitespace => 1 });
+
+unlink foreach ( $file1, $file2, $file3, $file4 );
 
 sub make_file1 {
   my ($fh, $filename) = tempfile();
index 41a32ad..91cc6b8 100644 (file)
@@ -42,6 +42,18 @@ $inc = "-I $inc" if $inc;
     system("rm -rf $dir");
 }
 
+{
+    my $dir = make_bad_file_4();
+    my (undef, $outfile) = tempfile();
+    ok( `$perl $inc -MTest::EOL -e "all_perl_files_ok({trailing_whitespace => 1}, '$dir' )" 2>&1 > $outfile` );
+    open my $fh, '<', $outfile or die $!;
+    local $/ = undef;
+    my $content = <$fh>;
+    like( $content, qr/^not ok 1 - No windows line endings in '[^']*' on line \d+/m, 'windows EOL found in tmp file 4' );
+    unlink $outfile;
+    system("rm -rf $dir");
+}
+
 sub make_bad_file_1 {
   my $tmpdir = tempdir();
   my ($fh, $filename) = tempfile( DIR => $tmpdir, SUFFIX => '.pL' );
@@ -50,7 +62,7 @@ sub make_bad_file_1 {
 
 sub main {
     print "Hello!\r\n";
-}\r
+}
 DUMMY
   return $tmpdir;
 }
@@ -97,3 +109,26 @@ DUMMY
   return ($tmpdir, $filename);
 }
 
+sub make_bad_file_4 {
+  my $tmpdir = tempdir();
+  my ($fh, $filename) = tempfile( DIR => $tmpdir, SUFFIX => '.pL' );
+  print $fh <<"DUMMY";
+#!perl
+
+=pod
+
+=head1 NAME
+
+test.pL -      A test script
+
+=cut
+
+sub main {
+DUMMY
+
+print $fh qq{    print "Hello!\n";   \n}; # <-- whitespace
+print $fh '}';
+
+  return $tmpdir;
+}
+