X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FStats.pm;h=0f7dc4a0cf6a4b51131157d5b546a11e9aad9f2f;hb=26dc649ad1a74622697f25fcbf29e806e75fcd2f;hp=daa5a0e765d1f079c5a3a447d071eb749f856f0f;hpb=6680c772eaa987eafdb32e9437fd2d649dc914d9;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Stats.pm b/lib/Catalyst/Stats.pm index daa5a0e..0f7dc4a 100644 --- a/lib/Catalyst/Stats.pm +++ b/lib/Catalyst/Stats.pm @@ -3,14 +3,18 @@ package Catalyst::Stats; use Moose; use Time::HiRes qw/gettimeofday tv_interval/; use Text::SimpleTable (); +use Catalyst::Utils; use Tree::Simple qw/use_weak_refs/; use Tree::Simple::Visitor::FindByUID; +use namespace::clean -except => 'meta'; + has enable => (is => 'rw', required => 1, default => sub{ 1 }); has tree => ( is => 'ro', required => 1, - default => sub{ Tree::Simple->new({t => [gettimeofday]}) } + default => sub{ Tree::Simple->new({t => [gettimeofday]}) }, + handles => [qw/ accept traverse /], ); has stack => ( is => 'ro', @@ -87,13 +91,10 @@ sub elapsed { sub report { my $self = shift; - # close any remaining open nodes - map { $self->profile(end => $_->getNodeValue->{action}) } - (reverse @{ $self->stack })[1 .. $#{$self->stack}]; - - my $t = Text::SimpleTable->new( [ 62, 'Action' ], [ 9, 'Time' ] ); + my $column_width = Catalyst::Utils::term_width() - 9 - 13; + my $t = Text::SimpleTable->new( [ $column_width, 'Action' ], [ 9, 'Time' ] ); my @results; - $self->tree->traverse( + $self->traverse( sub { my $action = shift; my $stat = $action->getNodeValue; @@ -103,8 +104,10 @@ sub report { $stat->{elapsed}, $stat->{action} ? 1 : 0, ); + # Trim down any times >= 10 to avoid ugly Text::Simple line wrapping + my $elapsed = substr(sprintf("%f", $stat->{elapsed}), 0, 8) . "s"; $t->row( ( q{ } x $r[0] ) . $r[1], - defined $r[2] ? sprintf("%fs", $r[2]) : '??'); + defined $r[2] ? $elapsed : '??'); push(@results, \@r); } ); @@ -116,11 +119,43 @@ sub _get_uid { my $visitor = Tree::Simple::Visitor::FindByUID->new; $visitor->searchForUID($uid); - $self->tree->accept($visitor); + $self->accept($visitor); return $visitor->getResult; } -no Moose; +sub addChild { + my $self = shift; + my $node = $_[ 0 ]; + + my $stat = $node->getNodeValue; + + # do we need to fake $stat->{ t } ? + if( $stat->{ elapsed } ) { + # remove the "s" from elapsed time + $stat->{ elapsed } =~ s{s$}{}; + } + + $self->tree->addChild( @_ ); +} + +sub setNodeValue { + my $self = shift; + my $stat = $_[ 0 ]; + + # do we need to fake $stat->{ t } ? + if( $stat->{ elapsed } ) { + # remove the "s" from elapsed time + $stat->{ elapsed } =~ s{s$}{}; + } + + $self->tree->setNodeValue( @_ ); +} + +sub getNodeValue { + my $self = shift; + $self->tree->getNodeValue( @_ )->{ t }; +} + __PACKAGE__->meta->make_immutable(); 1; @@ -290,14 +325,28 @@ from the previous profiling point. The 'rollup' flag indicates whether the reported time is the rolled up time for the block, or the elapsed time from the previous profiling point. +=head1 COMPATIBILITY METHODS + +Some components might expect the stats object to be a regular Tree::Simple object. +We've added some compatibility methods to handle this scenario: + +=head2 accept + +=head2 addChild + +=head2 setNodeValue + +=head2 getNodeValue + +=head2 traverse =head1 SEE ALSO -L. +L -=head1 AUTHOR +=head1 AUTHORS -Jon Schutz +Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT