package Perl::Metrics::Simple::Output::JSON;
use strict;
use warnings;
use parent qw(Perl::Metrics::Simple::Output);
use JSON::PP qw(encode_json);
our $VERSION = 'v1.0.3';
sub make_report {
my ($self) = @_;
my $report = +{
statistics => +{
file_count => $self->analysis()->file_count(),
counts => $self->make_counts(),
subroutine_sizes => $self->make_subroutine_size(),
mccabe_complexity => $self->make_code_complexity(),
},
subs => $self->make_list_of_subs()->[1],
};
return encode_json($report);
}
sub make_counts {
my ($self) = @_;
my $analysis = $self->analysis();
return +{
total_code_lines => $analysis->lines(),
lines_of_non_sub_code => $analysis->main_stats()->{'lines'},
packages_found => $analysis->package_count(),
subs_and_methods_count => $analysis->sub_count(),
};
}
sub make_subroutine_size {
my ($self) = @_;
my $stats = $self->analysis->summary_stats();
return +{
min => $stats->{'sub_length'}->{min},
max => $stats->{'sub_length'}->{max},
mean => $stats->{'sub_length'}->{mean},
standard_deviation => $stats->{'sub_length'}->{standard_deviation},
median => $stats->{'sub_length'}->{median},
};
}
sub make_code_complexity {
my ($self) = @_;
return +{
code_not_in_any_subroutine => $self->make_complexity_section('main_complexity'),
sub_complexity => $self->make_complexity_section('sub_complexity'),
};
}
sub make_complexity_section {
my ( $self, $key ) = @_;
my $analysis = $self->analysis();
return {
min => $analysis->summary_stats()->{$key}->{'min'},
max => $analysis->summary_stats()->{$key}->{'max'},
mean => $analysis->summary_stats()->{$key}->{'mean'},
standard_deviation => $analysis->summary_stats()->{$key}->{'standard_deviation'},
median => $analysis->summary_stats()->{$key}->{'median'},
};
}
1;