File Coverage

blib/lib/Perl/Metrics/Lite/Analysis/File.pm
Criterion Covered Total %
statement 105 111 94.5
branch 12 20 60.0
condition 2 3 66.6
subroutine 22 23 95.6
pod 0 13 0.0
total 141 170 82.9


line stmt bran cond sub pod time code
1             package Perl::Metrics::Lite::Analysis::File;
2 4     4   27 use strict;
  4         10  
  4         135  
3 4     4   21 use warnings;
  4         8  
  4         111  
4              
5 4     4   22 use Carp qw(cluck confess);
  4         8  
  4         238  
6 4     4   37 use Perl::Metrics::Lite::Analysis;
  4         9  
  4         97  
7 4     4   24 use Perl::Metrics::Lite::Analysis::Util;
  4         9  
  4         119  
8 4     4   1764 use Perl::Metrics::Lite::Analysis::DocumentFactory;
  4         17  
  4         226  
9              
10             our $VERSION = '0.05';
11              
12             use Module::Pluggable
13 4         28 require => 1,
14             search_path => 'Perl::Metrics::Lite::Analysis::File::Plugin',
15 4     4   1958 sub_name => 'file_plugins';
  4         1003  
16              
17             use Module::Pluggable
18 4         19 require => 1,
19             search_path => 'Perl::Metrics::Lite::Analysis::Sub::Plugin',
20 4     4   331 sub_name => 'sub_plugins';
  4         9  
21              
22             # Private instance variables:
23             my %_PATH = ();
24             my %_MAIN_STATS = ();
25             my %_SUBS = ();
26             my %_PACKAGES = ();
27             my %_LINES = ();
28              
29             sub new {
30 18     18 0 309 my ( $class, %parameters ) = @_;
31 18         54 my $self = {};
32 18         48 bless $self, $class;
33 18         99 $self->_init(%parameters);
34 18         12068 return $self;
35             }
36              
37             sub _init {
38 18     18   64 my ( $self, %parameters ) = @_;
39 18         83 $_PATH{$self} = $parameters{'path'};
40              
41 18         84 my $path = $self->path();
42              
43 18         188 my $document = Perl::Metrics::Lite::Analysis::DocumentFactory
44             ->create_normalized_document($path);
45 18 50       93 if ( !defined $document ) {
46 0         0 cluck "Could not make a PPI document from '$path'";
47 0         0 return;
48             }
49              
50 18         101 my $packages
51             = Perl::Metrics::Lite::Analysis::Util::get_packages($document);
52              
53 18         45 my @sub_analysis = ();
54 18         64 my $sub_elements = $document->find('PPI::Statement::Sub');
55 18         52118 @sub_analysis = @{ $self->analyze_subs($sub_elements) };
  18         104  
56              
57 18         89 $_MAIN_STATS{$self} = $self->analyze_file($document);
58 18         59 $_SUBS{$self} = \@sub_analysis;
59 18         47 $_PACKAGES{$self} = $packages;
60 18         65 $_LINES{$self}
61             = Perl::Metrics::Lite::Analysis::Util::get_node_length($document);
62              
63 18         128 return $self;
64             }
65              
66             sub all_counts {
67 0     0 0 0 my $self = shift;
68 0         0 my $stats_hash = {
69             path => $self->path,
70             lines => $self->lines,
71             main_stats => $self->main_stats,
72             subs => $self->subs,
73             packages => $self->packages,
74             };
75 0         0 return $stats_hash;
76             }
77              
78             sub analyze_file {
79 18     18 0 57 my ($self, $document) = @_;
80              
81 18 50       97 if ( !$document->isa('PPI::Document') ) {
82 0         0 Carp::confess('Did not supply a PPI::Document');
83             }
84              
85 18         80 my $metrics = $self->measure_file_metrics($document);
86 18         65 $metrics->{path} = $self->path;
87 18         82 return $metrics;
88             }
89              
90             sub measure_file_metrics {
91 18     18 0 70 my ( $self, $file ) = @_;
92 18         51 my $metrics = {};
93 18         100 foreach my $plugin ( $self->file_plugins ) {
94 54         586 $plugin->init;
95 54 50       349 next unless $plugin->can('init');
96 54 50       248 next unless $plugin->can('measure');
97 54         174 my $metric = $plugin->measure( $self, $file );
98 54         207 my $metric_name = $self->metric_name($plugin);
99 54         225 $metrics->{$metric_name} = $metric;
100             }
101 18         62 return $metrics;
102             }
103              
104             sub metric_name {
105 111     111 0 300 my ( $self, $plugin ) = @_;
106 111         262 my $metric_name = $plugin;
107 111         697 $metric_name =~ s/.*::(.*)$/$1/;
108 111         293 $metric_name = _decamelize($metric_name);
109 111         277 $metric_name;
110             }
111              
112             sub _decamelize {
113 111     111   222 my $s = shift;
114 111         663 $s =~ s{([^a-zA-Z]?)([A-Z]*)([A-Z])([a-z]?)}{
115 185         434 my $fc = pos($s)==0;
116 185         853 my ($p0,$p1,$p2,$p3) = ($1,lc$2,lc$3,$4);
117 185 100 66     880 my $t = $p0 || $fc ? $p0 : '_';
118 185 50       522 $t .= $p3 ? $p1 ? "${p1}_$p2$p3" : "$p2$p3" : "$p1$p2";
    50          
119 185         1151 $t;
120             }ge;
121 111         374 $s;
122             }
123              
124             sub path {
125 85     85 0 194 my ($self) = @_;
126 85         309 return $_PATH{$self};
127             }
128              
129             sub main_stats {
130 30     30 0 53 my ($self) = @_;
131 30         106 return $_MAIN_STATS{$self};
132             }
133              
134             sub subs {
135 17     17 0 51 my ($self) = @_;
136 17         64 return $_SUBS{$self};
137             }
138              
139             sub packages {
140 16     16 0 40 my ($self) = @_;
141 16         68 return $_PACKAGES{$self};
142             }
143              
144             sub lines {
145 15     15 0 31 my ($self) = @_;
146 15         40 return $_LINES{$self};
147             }
148              
149             sub analyze_subs {
150 18     18 0 41 my $self = shift;
151 18         31 my $found_subs = shift;
152              
153 18 100       88 return []
154             if (
155             !Perl::Metrics::Lite::Analysis::Util::is_ref( $found_subs, 'ARRAY' )
156             );
157              
158 8         25 my @subs = ();
159 8         21 foreach my $sub ( @{$found_subs} ) {
  8         41  
160 19         136 my $metrics = $self->measure_sub_metrics($sub);
161 19         89 $self->add_basic_sub_info( $sub, $metrics );
162 19         716 push @subs, $metrics;
163             }
164 8         47 return \@subs;
165             }
166              
167             sub measure_sub_metrics {
168 19     19 0 56 my ( $self, $sub ) = @_;
169 19         57 my $metrics = {};
170 19         121 foreach my $plugin ( $self->sub_plugins ) {
171 57         612 $plugin->init;
172 57 50       414 next unless $plugin->can('init');
173 57 50       280 next unless $plugin->can('measure');
174 57         461 my $metric = $plugin->measure( $self, $sub );
175 57         40002 my $metric_name = $self->metric_name($plugin);
176 57         373 $metrics->{$metric_name} = $metric;
177             }
178 19         61 return $metrics;
179             }
180              
181             sub add_basic_sub_info {
182 19     19 0 53 my ( $self, $sub, $metrics ) = @_;
183 19         64 $metrics->{path} = $self->path;
184 19         103 $metrics->{name} = $sub->name;
185             }
186              
187             1;
188              
189             __END__