File Coverage

blib/lib/Perl/Lint/Policy/Modules/ProhibitEvilModules.pm
Criterion Covered Total %
statement 51 51 100.0
branch 10 10 100.0
condition 11 11 100.0
subroutine 10 10 100.0
pod 0 1 0.0
total 82 83 98.8


line stmt bran cond sub pod time code
1             package Perl::Lint::Policy::Modules::ProhibitEvilModules;
2 133     133   67777 use strict;
  133         182  
  133         3101  
3 133     133   388 use warnings;
  133         153  
  133         2750  
4 133     133   414 use List::Util qw/any/;
  133         138  
  133         5859  
5 133     133   835 use Perl::Lint::Constants::Type;
  133         170  
  133         57417  
6 133     133   560 use parent "Perl::Lint::Policy";
  133         149  
  133         538  
7              
8             use constant {
9 133         7561 DESC => 'The names of or patterns for modules to forbid',
10             EXPL => 'Find an alternative module',
11 133     133   6684 };
  133         167  
12              
13             # TODO Should use Module::Adviser?
14 133         48753 use constant EVILS => [qw/
15             Class::ISA
16             Pod::Plainer
17             Shell
18             Switch
19 133     133   489 /];
  133         158  
20              
21             sub evaluate {
22 15     15 0 35 my ($class, $file, $tokens, $src, $args) = @_;
23              
24 15   100     73 my $modules_arg = $args->{prohibit_evil_modules}->{modules} || '';
25 15         35 $modules_arg =~ s/{.*?}//g;
26 15         37 my @evils = split(/ /, $modules_arg);
27              
28 15         24 my $modules_file = $args->{prohibit_evil_modules}->{modules_file};
29 15 100       32 if ($modules_file) {
30 2         67 open my $fh, '<', $modules_file;
31 2         3 my $content = do { local $/; <$fh> };
  2         7  
  2         34  
32 2         29 push @evils, ($content =~ /^\s*?([^ \n\r\f\t#]+)/gm);
33             }
34              
35 15         33 my @evils_re = map {m!/(.+?)/!; $1} @evils;
  29         46  
  29         60  
36              
37 15         19 my @violations;
38 15         55 for (my $i = 0; my $token = $tokens->[$i]; $i++) {
39 70         57 my $token_type = $token->{type};
40 70 100       125 if ($token_type == USE_DECL) {
41 31         32 my $used_name = '';
42 31         54 for ($i++; my $token = $tokens->[$i]; $i++) {
43 115         97 my $token_type = $token->{type};
44 115 100 100     331 if (
      100        
45             $token_type != NAMESPACE &&
46             $token_type != NAMESPACE_RESOLVER &&
47             $token_type != USED_NAME
48             ) {
49 30         44 last;
50             }
51 85         138 $used_name .= $token->{data};
52             }
53              
54 31 100 100     98 if (
55 188     188   197 any {$used_name eq $_} (@{+EVILS}, @evils) or
  31         111  
56 37 100   37   324 any {$_ && $used_name =~ /$_/} @evils_re
57             ) {
58             push @violations, {
59             filename => $file,
60             line => $token->{line},
61 30         223 description => DESC,
62             explanation => EXPL,
63             policy => __PACKAGE__,
64             };
65             }
66             }
67             }
68              
69 15         60 return \@violations;
70             }
71              
72             1;
73