File Coverage

blib/lib/CPAN/Audit/Installed.pm
Criterion Covered Total %
statement 50 51 98.0
branch 23 30 76.6
condition 5 6 83.3
subroutine 9 9 100.0
pod 0 4 0.0
total 87 100 87.0


line stmt bran cond sub pod time code
1             package CPAN::Audit::Installed;
2 14     14   99656 use strict;
  14         22  
  14         531  
3 14     14   58 use warnings;
  14         21  
  14         904  
4 14     14   57 use File::Find ();
  14         63  
  14         162  
5 14     14   36 use Cwd ();
  14         64  
  14         8281  
6              
7             our $VERSION = "1.002";
8              
9             sub new {
10 3     3 0 147081 my( $class, %params ) = @_;
11 3         12 bless \%params, $class;
12             }
13              
14             sub find {
15 3     3 0 6 my $self = shift;
16 3         6 my (@inc) = @_;
17              
18 3 100       17 @inc = @INC unless @inc;
19 3 50       7 @inc = grep { defined && -d $_ } map { Cwd::realpath($_) } @inc;
  19         218  
  19         646  
20              
21 3         14 my %seen;
22             my @deps;
23 3 50       23 push @deps, { dist => 'perl', version => $] } if $self->{include_perl};
24              
25             File::Find::find(
26             {
27             wanted => sub {
28 24513     24513   44122 my $path = $File::Find::name;
29 24513 100 66     1256566 if ( $path && -f $path && m/\.pm$/ ) {
      100        
30 3236 100       6895 return unless my $module = module_from_file($path);
31              
32 3210 100       112343 return unless my $distname = $self->{db}->{module2dist}->{$module};
33              
34 785         1706 my $dist = $self->{db}->{dists}->{$distname};
35 785 100       27196 if ( $dist->{main_module} eq $module ) {
36 95 50       509 return if $seen{$module}++;
37              
38 95 50       250 return unless my $version = module_version($path);
39              
40 95         433 push @deps, { dist => $distname, version => $version };
41              
42 95 100       2440 if ( $self->{cb} ) {
43 47         314 $self->{cb}->(
44             {
45             path => $path,
46             distname => $distname,
47             version => $version
48             }
49             );
50             }
51             }
52             }
53             },
54 3         511 follow => 1,
55             follow_skip => 2,
56             },
57             @inc
58             );
59              
60 3         88 return @deps;
61             }
62              
63             sub module_version {
64 95     95 0 2008 require Module::Extract::VERSION;
65 95         5729 my( $file ) = @_;
66              
67 95         760 my $version = Module::Extract::VERSION->parse_version_safely( $file );
68              
69 95 50       278613 if( eval { $version->can('numify') } ) {
  95         871  
70 0         0 $version = $version->numify;
71             }
72              
73 95 50       474 return defined $version ? $version : '';
74             }
75              
76             sub module_from_file {
77 3236     3236 0 5057 my ($path) = @_;
78 3236         3496 my $module;
79              
80 3236 50       80703 open my $fh, '<', $path or return;
81 3236         61896 while ( my $line = <$fh> ) {
82 24226 100       66977 if ( $line =~ m/package\s+(.*?)\s*;/ms ) {
83 3210         7473 $module = $1;
84 3210         5085 last;
85             }
86             }
87 3236         31036 close $fh;
88              
89 3236 100       16626 return unless $module;
90             }
91              
92             1;