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__ |