Login
Redesigned the Statistics class. Now it is just an attribute
authorJeffrey Ryan Thalhammer <jeff@imaginative-software.com>
Tue, 22 May 2007 05:55:06 +0000 (05:55 +0000)
committerJeffrey Ryan Thalhammer <jeff@imaginative-software.com>
Tue, 22 May 2007 05:55:06 +0000 (05:55 +0000)
of Perl::Critic, and statistics are always accumulated.

bin/perlcritic
lib/Perl/Critic.pm
lib/Perl/Critic/Statistics.pm
t/15_statistics.t

index 4980f95..000393d 100755 (executable)
@@ -190,21 +190,11 @@ sub critique {
     $CRITIC = Perl::Critic->new( %{$opts_ref} );
     my $number_of_violations = undef;
 
-    my $statistics;
-    if ($opts_ref->{-statistics}) {
-        require Perl::Critic::Statistics;
-        $statistics = Perl::Critic::Statistics->new($CRITIC);
-        $CRITIC = $statistics;
-    }
-
-
     for my $file (@files) {
 
         eval {
-            my @violations;
-
-            @violations = $CRITIC->critique($file);
 
+            my @violations = $CRITIC->critique($file);
             render_report( $file, $opts_ref, @violations );
             $number_of_violations += scalar @violations;
         };
@@ -213,8 +203,9 @@ sub critique {
             if $EVAL_ERROR;
     }
 
-    if ($statistics) {
-        report_statistics( $opts_ref, $statistics );
+    if ( $opts_ref->{-statistics} ) {
+        my $stats = $CRITIC->statistics();
+        report_statistics( $opts_ref, $stats );
     }
 
     return $number_of_violations;
index 15676b1..e0f71a8 100644 (file)
@@ -18,6 +18,7 @@ use English qw(-no_match_vars);
 use Perl::Critic::Config;
 use Perl::Critic::Violation;
 use Perl::Critic::Document;
+use Perl::Critic::Statistics;
 use Perl::Critic::Utils qw{ :characters };
 use PPI::Document;
 use PPI::Document::File;
@@ -33,6 +34,7 @@ sub new {
     my ( $class, %args ) = @_;
     my $self = bless {}, $class;
     $self->{_config} = $args{-config} || Perl::Critic::Config->new( %args );
+    $self->{_stats} = Perl::Critic::Statistics->new();
     return $self;
 }
 
@@ -61,6 +63,13 @@ sub policies {
 
 #-----------------------------------------------------------------------------
 
+sub statistics {
+    my $self = shift;
+    return $self->{_stats};
+}
+
+#-----------------------------------------------------------------------------
+
 sub critique {
 
     #-------------------------------------------------------------------
@@ -141,6 +150,9 @@ sub _gather_violations {
     # others.  So for those, we squelch out all but the first violation.
     @violations = _squelch_noisy_violations( @violations );
 
+    # Accumulate statistics
+    $self->statistics->accumulate( $doc, \@violations );
+
     # If requested, rank violations by their severity and return the top N.
     if ( @violations && (my $top = $self->config->top()) ) {
         my $limit = @violations < $top ? $#violations : $top-1;
@@ -555,6 +567,12 @@ loaded into this engine.  Objects will be in the order that they were loaded.
 Returns the L<Perl::Critic::Config> object that was created for or given
 to this Critic.
 
+=item C< statistics() >
+
+Returns the L<Perl::Critic::Statistics> object that was created for this
+Critic.  The Statistics object accumulates data for all files that are
+analyzed by this Critic.
+
 =back
 
 =head1 FUNCTIONAL INTERFACE
index ca13073..23a3f0c 100644 (file)
@@ -39,24 +39,7 @@ sub new {
 
 #-----------------------------------------------------------------------------
 
-sub critique {
-    my ( $self, $source_code ) = @_;
-
-    return if not $source_code;
-
-    my $critic = $self->_critic();
-
-    my $doc = $critic->_create_perl_critic_document($source_code);
-    my @violations = $critic->_gather_violations($doc);
-
-    $self->_accumulate($doc, \@violations);
-
-    return @violations;
-}
-
-#-----------------------------------------------------------------------------
-
-sub _accumulate {
+sub accumulate {
     my ($self, $doc, $violations) = @_;
 
     $self->{_modules}++;
@@ -86,14 +69,6 @@ sub _accumulate {
     return;
 }
 
-#------------------------------------------------------------------------------
-
-sub _critic {
-    my ( $self ) = @_;
-
-    return $self->{_critic};
-}
-
 #-----------------------------------------------------------------------------
 
 sub modules {
@@ -192,56 +167,56 @@ __END__
 
 =head1 NAME
 
-Perl::Critic::Statistics - Decorator for a L<Perl::Critic> instance to
-accumulate statistics.
+Perl::Critic::Statistics - Compile stats on Perl::Critic violations
 
 =head1 DESCRIPTION
 
-Wraps an instance of L<Perl::Critic> and aggregates statistics resulting from
-calls to C<critique()>.  NOTE: This class is experimental and subject to
-change.
+This class accumulates statistics on Perl::Critic violations across one or
+more files.  NOTE: This class is experimental and subject to change.
 
 =head1 METHODS
 
 =over
 
-=item C<new( $critic )>
+=item C<new()>
 
-Create a new instance around a L<Perl::Critic>.
+Create a new instance of Perl::Critic::Statistics.  No arguments are supported
+at this time.
 
-=item C<critique( $source_code )>
+=item C< accumulate( $doc, \@violations ) >
 
-Version of L<Perl::Critic/"critique"> that gathers statistics.
+Accumulates statistics about the C<$doc> and the C<@violations> that were
+found.
 
 =item C<modules()>
 
-The number of chunks of code that have been passed to C<critique()>.
+The number of chunks of code (usually files) that have been analyzed.
 
 =item C<subs()>
 
-The number of subroutines analyzed by C<critique()>.
+The total number of subroutines analyzed by this Critic.
 
 =item C<statements()>
 
-The number of statements analyzed by C<critique()>.
+The total number of statements analyzed by this Critic.
 
 =item C<lines_of_code()>
 
-The number of lines of code analyzed by C<critique()>.
+The total number of lines of code analyzed by this Critic.
 
 =item C<violations_by_severity()>
 
-The number of violations of each severity found by C<critique()> as a
+The number of violations of each severity found by this Critic as a
 reference to a hash keyed by severity.
 
 =item C<violations_by_policy()>
 
-The number of violations of each policy found by C<critique()> as a
+The number of violations of each policy found by this Critic as a
 reference to a hash keyed by full policy name.
 
 =item C<total_violations()>
 
-The the total number of violations found by C<critique()>.
+The the total number of violations found by this Critic.
 
 =item C<average_sub_mccabe()>
 
index d395061..1c0c550 100644 (file)
@@ -10,7 +10,7 @@
 use strict;
 use warnings;
 
-use Test::More (tests => 18);
+use Test::More (tests => 19);
 use English qw(-no_match_vars);
 use Perl::Critic::PolicyFactory (-test => 1);
 use Perl::Critic::TestUtils;
@@ -52,8 +52,10 @@ END_PERL
 #-----------------------------------------------------------------------------
 
 my $critic = Perl::Critic->new( -severity => 1 );
-my $stats  = Perl::Critic::Statistics->new( $critic );
-$stats->critique( \$code );
+my @violations = $critic->critique( \$code );
+
+#print @violations;
+#exit;
 
 my %expected_stats = (
     average_sub_mccabe            => 2,
@@ -65,6 +67,9 @@ my %expected_stats = (
     violations_per_line_of_code   => 2,
 );
 
+my $stats = $critic->statistics();
+isa_ok($stats, $pkg);
+
 while ( my($method, $expected) = each %expected_stats) {
     is( $stats->$method, $expected, "Statistics: $method");
 }