3 ##############################################################################
8 ##############################################################################
14 use version; our $VERSION = qv('1.116');
17 use English qw{ -no_match_vars };
23 use Perl::Critic::Utils qw{ all_perl_files };
28 die qq{usage: generatestats path [...]\n};
37 foreach my $path ( @ARGV ) {
38 say "Looking at $path.";
40 my @files = all_perl_files($path);
41 say 'Analyzing ', scalar @files, ' files.';
43 my $results = summarize( \@files, File::Spec->canonpath($path) );
55 my ( $files, $path ) = @_;
57 # Force reporting level to be really strict, just so that the statistics
59 my $critic = Perl::Critic->new( -severity => 1 );
66 foreach my $file ( @{$files} ) {
71 $relative_path = $file;
73 my $absolute_path_length = ( length $path ) + 1;
75 $relative_path = substr $file, $absolute_path_length;
78 if ($file =~ m/ [.] ([^.]+) \z /xms) {
84 $types{$type}{files}++;
85 foreach my $violation ( $critic->critique($file) ) {
86 $files{ $relative_path }{ severities }{ $violation->severity() }++;
87 $files{ $relative_path }{ policies }{ $violation->policy() }++;
89 $types{ $type }{ severities }{ $violation->severity() }++;
90 $types{ $type }{ policies }{ $violation->policy() }++;
92 $total_severities{ $violation->severity() }++;
93 $total_policies{ $violation->policy() }++;
98 severities => \%total_severities,
99 policies => \%total_policies,
107 my ( $results ) = @_;
109 report_totals( $results );
110 report_types( $results );
111 report_files( $results );
118 my ( $results ) = @_;
121 say 'Total violations by severity:';
122 report_severities( $results->{severities} );
125 say 'Total violations by policy:';
126 report_policies( $results->{policies} );
133 my ( $results ) = @_;
134 my $types = $results->{types};
137 say 'Total files by type:';
138 foreach my $type ( sort keys %{$types} ) {
139 say qq{\t}, $type, ': ', $types->{$type}{files};
142 foreach my $type ( sort keys %{$types} ) {
144 say "Violations in $type files by severity:";
145 report_severities( $types->{$type}{severities} );
148 say "Violations in $type files by policy:";
149 report_policies( $types->{$type}{policies} );
157 my ( $results ) = @_;
158 my $files = $results->{files};
160 foreach my $file ( sort keys %{$files} ) {
162 say "Violations in $file by severity:";
163 report_severities( $files->{$file}{severities} );
166 say "Violations in $file by policy:";
167 report_policies( $files->{$file}{policies} );
174 sub report_severities {
175 my ($severities) = @_;
177 foreach my $severity ( reverse sort { $a <=> $b } keys %{$severities} ) {
178 say qq{\t}, $severity, ': ', $severities->{$severity};
185 sub report_policies {
188 foreach my $policy ( sort keys %{$policies} ) {
189 (my $short_policy = $policy) =~ s/ \A Perl::Critic::Policy:: //xms;
191 say qq{\t}, $short_policy, ': ', $policies->{$policy};
202 =for stopwords codebase perlartistic
206 C<generatestats> - Produce some simple quality statistics of a codebase
211 generatestats path [...]
216 Scan a body of code and generate some statistics on violations of the
217 installed L<Perl::Critic|Perl::Critic> policies. While there is no means of
218 configuring the policies here, this will take into account your
219 F<.perlcriticrc>, if available.
222 =head1 REQUIRED ARGUMENTS
224 A list of paths to files and directories to find code in.
249 L<Perl::Critic|Perl::Critic>
250 L<Perl6::Say|Perl6::Say>
254 =head1 INCOMPATIBILITIES
259 =head1 BUGS AND LIMITATIONS
261 This is an example program and thus does minimal error handling.
266 Elliot Shank C<< <perl@galumph.com> >>
271 Copyright (c) 2006-2011, Elliot Shank.
273 This module is free software; you can redistribute it and/or modify it under
274 the same terms as Perl itself. See L<perlartistic|perlartistic>.
277 =head1 DISCLAIMER OF WARRANTY
279 BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE
280 SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
281 STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
282 SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
283 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
284 FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
285 PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE,
286 YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR CORRECTION.
288 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY
289 COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
290 SOFTWARE AS PERMITTED BY THE ABOVE LICENSE, BE LIABLE TO YOU FOR DAMAGES,
291 INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
292 OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO
293 LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
294 THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER
295 SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
296 POSSIBILITY OF SUCH DAMAGES.
302 # cperl-indent-level: 4
304 # indent-tabs-mode: nil
305 # c-indentation-style: bsd
307 # ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :