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   31 use strict;
  4         9  
  4         129  
3 4     4   21 use warnings;
  4         13  
  4         114  
4              
5 4     4   21 use Carp qw(cluck confess);
  4         11  
  4         225  
6 4     4   39 use Perl::Metrics::Lite::Analysis;
  4         17  
  4         88  
7 4     4   28 use Perl::Metrics::Lite::Analysis::Util;
  4         9  
  4         119  
8 4     4   1736 use Perl::Metrics::Lite::Analysis::DocumentFactory;
  4         14  
  4         229  
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   1891 sub_name => 'file_plugins';
  4         1010  
16              
17             use Module::Pluggable
18 4         17 require => 1,
19             search_path => 'Perl::Metrics::Lite::Analysis::Sub::Plugin',
20 4     4   329 sub_name => 'sub_plugins';
  4         11  
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 264 my ( $class, %parameters ) = @_;
31 18         48 my $self = {};
32 18         50 bless $self, $class;
33 18         78 $self->_init(%parameters);
34 18         11858 return $self;
35             }
36              
37             sub _init {
38 18     18   67 my ( $self, %parameters ) = @_;
39 18         84 $_PATH{$self} = $parameters{'path'};
40              
41 18         56 my $path = $self->path();
42              
43 18         147 my $document = Perl::Metrics::Lite::Analysis::DocumentFactory
44             ->create_normalized_document($path);
45 18 50       86 if ( !defined $document ) {
46 0         0 cluck "Could not make a PPI document from '$path'";
47 0         0 return;
48             }
49              
50 18         78 my $packages
51             = Perl::Metrics::Lite::Analysis::Util::get_packages($document);
52              
53 18         55 my @sub_analysis = ();
54 18         56 my $sub_elements = $document->find('PPI::Statement::Sub');
55 18         49565 @sub_analysis = @{ $self->analyze_subs($sub_elements) };
  18         88  
56              
57 18         80 $_MAIN_STATS{$self} = $self->analyze_file($document);
58 18         59 $_SUBS{$self} = \@sub_analysis;
59 18         48 $_PACKAGES{$self} = $packages;
60 18         56 $_LINES{$self}
61             = Perl::Metrics::Lite::Analysis::Util::get_node_length($document);
62              
63 18         113 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 49 my ($self, $document) = @_;
80              
81 18 50       85 if ( !$document->isa('PPI::Document') ) {
82 0         0 Carp::confess('Did not supply a PPI::Document');
83             }
84              
85 18         64 my $metrics = $self->measure_file_metrics($document);
86 18         55 $metrics->{path} = $self->path;
87 18         67 return $metrics;
88             }
89              
90             sub measure_file_metrics {
91 18     18 0 43 my ( $self, $file ) = @_;
92 18         38 my $metrics = {};
93 18         85 foreach my $plugin ( $self->file_plugins ) {
94 54         494 $plugin->init;
95 54 50       338 next unless $plugin->can('init');
96 54 50       245 next unless $plugin->can('measure');
97 54         181 my $metric = $plugin->measure( $self, $file );
98 54         170 my $metric_name = $self->metric_name($plugin);
99 54         199 $metrics->{$metric_name} = $metric;
100             }
101 18         55 return $metrics;
102             }
103              
104             sub metric_name {
105 111     111 0 305 my ( $self, $plugin ) = @_;
106 111         245 my $metric_name = $plugin;
107 111         660 $metric_name =~ s/.*::(.*)$/$1/;
108 111         283 $metric_name = _decamelize($metric_name);
109 111         267 $metric_name;
110             }
111              
112             sub _decamelize {
113 111     111   225 my $s = shift;
114 111         551 $s =~ s{([^a-zA-Z]?)([A-Z]*)([A-Z])([a-z]?)}{
115 185         394 my $fc = pos($s)==0;
116 185         709 my ($p0,$p1,$p2,$p3) = ($1,lc$2,lc$3,$4);
117 185 100 66     859 my $t = $p0 || $fc ? $p0 : '_';
118 185 50       480 $t .= $p3 ? $p1 ? "${p1}_$p2$p3" : "$p2$p3" : "$p1$p2";
    50          
119 185         1027 $t;
120             }ge;
121 111         351 $s;
122             }
123              
124             sub path {
125 85     85 0 245 my ($self) = @_;
126 85         287 return $_PATH{$self};
127             }
128              
129             sub main_stats {
130 30     30 0 48 my ($self) = @_;
131 30         102 return $_MAIN_STATS{$self};
132             }
133              
134             sub subs {
135 17     17 0 38 my ($self) = @_;
136 17         61 return $_SUBS{$self};
137             }
138              
139             sub packages {
140 16     16 0 39 my ($self) = @_;
141 16         56 return $_PACKAGES{$self};
142             }
143              
144             sub lines {
145 15     15 0 32 my ($self) = @_;
146 15         41 return $_LINES{$self};
147             }
148              
149             sub analyze_subs {
150 18     18 0 40 my $self = shift;
151 18         39 my $found_subs = shift;
152              
153 18 100       71 return []
154             if (
155             !Perl::Metrics::Lite::Analysis::Util::is_ref( $found_subs, 'ARRAY' )
156             );
157              
158 8         24 my @subs = ();
159 8         21 foreach my $sub ( @{$found_subs} ) {
  8         28  
160 19         56 my $metrics = $self->measure_sub_metrics($sub);
161 19         81 $self->add_basic_sub_info( $sub, $metrics );
162 19         609 push @subs, $metrics;
163             }
164 8         38 return \@subs;
165             }
166              
167             sub measure_sub_metrics {
168 19     19 0 54 my ( $self, $sub ) = @_;
169 19         45 my $metrics = {};
170 19         89 foreach my $plugin ( $self->sub_plugins ) {
171 57         490 $plugin->init;
172 57 50       339 next unless $plugin->can('init');
173 57 50       245 next unless $plugin->can('measure');
174 57         366 my $metric = $plugin->measure( $self, $sub );
175 57         38405 my $metric_name = $self->metric_name($plugin);
176 57         343 $metrics->{$metric_name} = $metric;
177             }
178 19         60 return $metrics;
179             }
180              
181             sub add_basic_sub_info {
182 19     19 0 50 my ( $self, $sub, $metrics ) = @_;
183 19         55 $metrics->{path} = $self->path;
184 19         88 $metrics->{name} = $sub->name;
185             }
186              
187             1;
188              
189             __END__