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   34 use strict;
  4         9  
  4         118  
3 4     4   21 use warnings;
  4         7  
  4         118  
4              
5 4     4   27 use Carp qw(cluck confess);
  4         19  
  4         220  
6 4     4   24 use Perl::Metrics::Lite::Analysis;
  4         18  
  4         109  
7 4     4   24 use Perl::Metrics::Lite::Analysis::Util;
  4         6  
  4         95  
8 4     4   1744 use Perl::Metrics::Lite::Analysis::DocumentFactory;
  4         28  
  4         237  
9              
10             our $VERSION = '0.092';
11              
12             use Module::Pluggable
13 4         31 require => 1,
14             search_path => 'Perl::Metrics::Lite::Analysis::File::Plugin',
15 4     4   1936 sub_name => 'file_plugins';
  4         33162  
16              
17             use Module::Pluggable
18 4         24 require => 1,
19             search_path => 'Perl::Metrics::Lite::Analysis::Sub::Plugin',
20 4     4   454 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 2144 my ( $class, %parameters ) = @_;
31 18         44 my $self = {};
32 18         48 bless $self, $class;
33 18         88 $self->_init(%parameters);
34 18         12063 return $self;
35             }
36              
37             sub _init {
38 18     18   54 my ( $self, %parameters ) = @_;
39 18         75 $_PATH{$self} = $parameters{'path'};
40              
41 18         57 my $path = $self->path();
42              
43 18         141 my $document = Perl::Metrics::Lite::Analysis::DocumentFactory
44             ->create_normalized_document($path);
45 18 50       70 if ( !defined $document ) {
46 0         0 cluck "Could not make a PPI document from '$path'";
47 0         0 return;
48             }
49              
50 18         74 my $packages
51             = Perl::Metrics::Lite::Analysis::Util::get_packages($document);
52              
53 18         41 my @sub_analysis = ();
54 18         58 my $sub_elements = $document->find('PPI::Statement::Sub');
55 18         50741 @sub_analysis = @{ $self->analyze_subs($sub_elements) };
  18         86  
56              
57 18         75 $_MAIN_STATS{$self} = $self->analyze_file($document);
58 18         52 $_SUBS{$self} = \@sub_analysis;
59 18         51 $_PACKAGES{$self} = $packages;
60 18         57 $_LINES{$self}
61             = Perl::Metrics::Lite::Analysis::Util::get_node_length($document);
62              
63 18         111 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 48 my ($self, $document) = @_;
80              
81 18 50       80 if ( !$document->isa('PPI::Document') ) {
82 0         0 Carp::confess('Did not supply a PPI::Document');
83             }
84              
85 18         58 my $metrics = $self->measure_file_metrics($document);
86 18         55 $metrics->{path} = $self->path;
87 18         77 return $metrics;
88             }
89              
90             sub measure_file_metrics {
91 18     18 0 42 my ( $self, $file ) = @_;
92 18         40 my $metrics = {};
93 18         79 foreach my $plugin ( $self->file_plugins ) {
94 54         34884 $plugin->init;
95 54 50       309 next unless $plugin->can('init');
96 54 50       226 next unless $plugin->can('measure');
97 54         168 my $metric = $plugin->measure( $self, $file );
98 54         165 my $metric_name = $self->metric_name($plugin);
99 54         241 $metrics->{$metric_name} = $metric;
100             }
101 18         52 return $metrics;
102             }
103              
104             sub metric_name {
105 111     111 0 265 my ( $self, $plugin ) = @_;
106 111         205 my $metric_name = $plugin;
107 111         648 $metric_name =~ s/.*::(.*)$/$1/;
108 111         294 $metric_name = _decamelize($metric_name);
109 111         259 $metric_name;
110             }
111              
112             sub _decamelize {
113 111     111   211 my $s = shift;
114 111         571 $s =~ s{([^a-zA-Z]?)([A-Z]*)([A-Z])([a-z]?)}{
115 185         369 my $fc = pos($s)==0;
116 185         728 my ($p0,$p1,$p2,$p3) = ($1,lc$2,lc$3,$4);
117 185 100 66     752 my $t = $p0 || $fc ? $p0 : '_';
118 185 50       462 $t .= $p3 ? $p1 ? "${p1}_$p2$p3" : "$p2$p3" : "$p1$p2";
    50          
119 185         1000 $t;
120             }ge;
121 111         331 $s;
122             }
123              
124             sub path {
125 85     85 0 215 my ($self) = @_;
126 85         258 return $_PATH{$self};
127             }
128              
129             sub main_stats {
130 30     30 0 55 my ($self) = @_;
131 30         85 return $_MAIN_STATS{$self};
132             }
133              
134             sub subs {
135 17     17 0 37 my ($self) = @_;
136 17         61 return $_SUBS{$self};
137             }
138              
139             sub packages {
140 16     16 0 36 my ($self) = @_;
141 16         48 return $_PACKAGES{$self};
142             }
143              
144             sub lines {
145 15     15 0 31 my ($self) = @_;
146 15         45 return $_LINES{$self};
147             }
148              
149             sub analyze_subs {
150 18     18 0 62 my $self = shift;
151 18         37 my $found_subs = shift;
152              
153 18 100       61 return []
154             if (
155             !Perl::Metrics::Lite::Analysis::Util::is_ref( $found_subs, 'ARRAY' )
156             );
157              
158 8         29 my @subs = ();
159 8         20 foreach my $sub ( @{$found_subs} ) {
  8         37  
160 19         63 my $metrics = $self->measure_sub_metrics($sub);
161 19         71 $self->add_basic_sub_info( $sub, $metrics );
162 19         676 push @subs, $metrics;
163             }
164 8         45 return \@subs;
165             }
166              
167             sub measure_sub_metrics {
168 19     19 0 47 my ( $self, $sub ) = @_;
169 19         50 my $metrics = {};
170 19         85 foreach my $plugin ( $self->sub_plugins ) {
171 57         37521 $plugin->init;
172 57 50       352 next unless $plugin->can('init');
173 57 50       253 next unless $plugin->can('measure');
174 57         169 my $metric = $plugin->measure( $self, $sub );
175 57         39097 my $metric_name = $self->metric_name($plugin);
176 57         220 $metrics->{$metric_name} = $metric;
177             }
178 19         51 return $metrics;
179             }
180              
181             sub add_basic_sub_info {
182 19     19 0 50 my ( $self, $sub, $metrics ) = @_;
183 19         42 $metrics->{path} = $self->path;
184 19         80 $metrics->{name} = $sub->name;
185             }
186              
187             1;
188              
189             __END__