File Coverage

blib/lib/Test/Class/Load.pm
Criterion Covered Total %
statement 48 48 100.0
branch 10 10 100.0
condition n/a
subroutine 10 10 100.0
pod 2 2 100.0
total 70 70 100.0


line stmt bran cond sub pod time code
1 4     4   166013 use strict;
  4         21  
  4         90  
  6         3047  
  6         13  
  2         3  
2 4     4   17 use warnings;
  4         5  
  4         115  
  3         222  
  3         187  
  10         240  
3              
4             package Test::Class::Load;
5              
6 4     4   1422 use Test::Class;
  4         9  
  4         101  
  10         27  
  4         9  
7 4     4   22 use File::Find;
  4         10  
  4         212  
8 4     4   20 use File::Spec;
  4         7  
  4         112  
9 4     4   1402 use Module::Runtime 'require_module';
  4         4189  
  4         20  
10              
11             our $VERSION = '0.51';
12              
13             # Override to get your own filter
14             sub is_test_class {
15 5     5 1 10 my ( $class, $file, $dir ) = @_;
          1    
16             # By default, we only care about .pm files
17 5 100       16 if ($file =~ /\.pm$/) {
    100          
18 2         6 return 1;
19             }
20 3         248 return;
21             }
22              
23             my %Added_to_INC;
24             sub _load {
25 15     15   24 my ( $class, $file, $dir ) = @_;
26 15         49 $file =~ s{\.pm$}{}; # remove .pm extension
27 9         19 $file =~ s{\\}{/}g; # to make win32 happy
28 11         374 $dir =~ s{\\}{/}g; # to make win32 happy
29 5         33 $file =~ s/^$dir//;
30 5         53 my $_package = join '::' => grep $_ => File::Spec->splitdir( $file );
31              
32             # untaint that puppy!
33 5         72 my ( $package ) = $_package =~ /^([[:word:]]+(?:::[[:word:]]+)*)$/;
34              
35             # Filter out bad classes (mainly this means things in .svn and similar)
36 5 100       17 return unless defined $package;
37              
38 5 100       19 unshift @INC => $dir unless $Added_to_INC{ $dir }++;
39 5         13 require_module($package);
40             }
41              
42             sub import {
43 7     7   49 my ( $class, @directories ) = @_;
44 7         16 my @test_classes;
45              
46 7         21 foreach my $dir ( @directories ) {
47 6         34 $dir = File::Spec->catdir( split '/', $dir );
48             find(
49             { no_chdir => 1,
50             wanted => sub {
51 17     20   1474 my @args = ($File::Find::name, $dir);
52 17 100       56 if ($class->is_test_class(@args)) {
53 9         47 $class->_load(@args);
54             }
55             },
56             },
57 6         344 $dir
58             );
59             }
60             }
61              
62             1;
63              
64             __END__