File Coverage

blib/lib/App/BoolFindGrep/Find.pm
Criterion Covered Total %
statement 60 75 80.0
branch 14 28 50.0
condition 5 14 35.7
subroutine 13 15 86.6
pod 1 1 100.0
total 93 133 69.9


line stmt bran cond sub pod time code
1             package App::BoolFindGrep::Find;
2              
3 1     1   6 use common::sense;
  1         1  
  1         9  
4 1     1   50 use charnames q(:full);
  1         1  
  1         8  
5 1     1   187 use Carp;
  1         2  
  1         86  
6 1     1   6 use English qw[-no_match_vars];
  1         2  
  1         7  
7 1     1   335 use File::Find;
  1         2  
  1         86  
8 1     1   7 use IO::File;
  1         2  
  1         154  
9 1     1   4 use Moo;
  1         2  
  1         6  
10 1     1   809 use Text::Glob qw[glob_to_regex_string];
  1         609  
  1         1404  
11              
12             our $VERSION = '0.06'; # VERSION
13              
14             has files_from => (
15             is => q(rw),
16             isa => sub {
17             ( ( -e $_[0] && -r $_[0] && -f $_[0] && -s $_[0] )
18             || ( $_[0] eq q(-) || $_[0] =~ /\Astdin\z/i ) )
19             || die;
20             }
21             );
22             has files_delim => (
23             is => q(rw),
24             default => undef,
25             );
26             has file_expr => (
27             is => q(rw),
28             isa => sub { die if @_ > 1; die if ref $_[0]; },
29             default => undef,
30             );
31             has find_type => (
32             is => q(rw),
33             isa => sub {
34             ( grep { $_[0] eq $_ } qw[glob literal regexp] ) > 0 or die;
35             },
36             default => q(regexp),
37             );
38             has find_ignore_case => (
39             is => q(rw),
40             isa => sub { ( $_[0] == 0 || $_[0] == 1 ) or die; },
41             default => 0,
42             );
43             has directory => (
44             is => q(rw),
45             isa => sub {
46             @{ $_[0] } == ( grep { -d $_ && -r $_ } @{ $_[0] } ) or die;
47             },
48             default => sub { [q(.)] },
49             );
50             has patterns => ( is => q(rw), default => sub { {}; }, );
51             has found => ( is => q(rw), default => sub { {}; }, );
52             has files => ( is => q(rw), default => sub { []; }, );
53              
54             sub process {
55 11     11 1 20 my $self = shift;
56              
57 11 50 33     54 die if defined $self->files_delim() && !( defined $self->files_from() );
58 11 50 33     229 die if defined $self->files_from() && defined $self->file_expr();
59 0         0 die
60             if defined $self->files_from()
61 11 0 33     711 && @{ $self->directory() } != 1
      33        
62             && $self->directory->[0] ne q(.);
63              
64 11 50       213 if ( defined $self->files_from() ) {
65 0         0 $self->_get_made_list();
66             }
67 11         84 else { $self->_finder(); }
68              
69 11         102 return 1;
70             } ## end sub process
71              
72             sub _get_made_list {
73 0     0   0 my $self = shift;
74              
75 0         0 local $INPUT_RECORD_SEPARATOR = $self->files_delim();
76              
77 0 0       0 my $fh
78             = $self->files_from() =~ /\A(?:-|stdin)\z/i
79             ? \*STDIN
80             : IO::File->new( $self->files_from(), q(r) );
81              
82 0         0 while ( my $file = readline $fh ) {
83 0         0 chomp $file;
84 0 0       0 croak sprintf q('%s': irregular file.), $file if !-f $file;
85 0         0 push @{ $self->files() }, $file;
  0         0  
86             }
87              
88 0         0 return 1;
89             } ## end sub _get_made_list
90              
91             sub _finder {
92 11     11   19 my $self = shift;
93              
94 11 50       166 unless ( defined $self->file_expr() ) {
95 0 0   0   0 find sub { push @{ $self->files() }, $File::Find::name if -f },
  0         0  
96 0         0 @{ $self->directory() };
  0         0  
97             }
98              
99 11         96 $self->_process_patterns();
100              
101             find sub {
102 3971 100   3971   31581 if ( -f $_ ) {
103 3960 50       2850 if ( %{ $self->patterns() } ) {
  3960         7622  
104 3960         2805 foreach my $pattern ( keys %{ $self->patterns() } ) {
  3960         5824  
105 3960         4259 my $re = $self->patterns->{$pattern};
106 3960   50     16251 $self->found->{$File::Find::name}{$pattern} //= 0;
107 3960 100       28844 $self->found->{$File::Find::name}{$pattern}++ if m{$re};
108             }
109             }
110             }
111 11         98 }, @{ $self->directory() };
  11         217  
112              
113 11         104 return 1;
114             } ## end sub _finder
115              
116             sub _process_patterns {
117 11     11   16 my $self = shift;
118              
119 11         14 foreach my $pattern ( keys %{ $self->patterns() } ) {
  11         59  
120 11         14 my $value = $pattern;
121 11         183 foreach ( $self->find_type() ) {
122 11 100       102 if ( $_ eq q(literal) ) { $value = quotemeta $value; }
  3 100       10  
123             elsif ( $_ eq q(glob) ) {
124 5         25 $value = glob_to_regex_string($value);
125 5         538 $value.= q(\z);
126             }
127             }
128 11 50       189 $value = $self->find_ignore_case() == 1 ? qr{$value}i : qr{$value};
129 11         749 $self->patterns->{$pattern} = $value;
130             }
131              
132 11         20 return 1;
133             } ## end sub _process_patterns
134              
135 1     1   5 no Moo;
  1         1  
  1         6  
136             __PACKAGE__->meta->make_immutable;
137              
138             1;
139              
140             __END__