File Coverage

File:lib/Code/Statistics/File.pm
Coverage:95.6%

linestmtbrancondsubpodtimecode
1
2
2
2
0
0
0
use strict;
2
2
2
2
0
0
0
use warnings;
3
4package Code::Statistics::File;
5
6# ABSTRACT: loads a file, searches for targets in it and measures their metrics
7
8
2
2
2
0
0
0
use 5.004;
9
10
2
2
2
0
0
0
use Moose;
11
2
2
2
0
0
0
use MooseX::HasDefaults::RO;
12
2
2
2
0
0
0
use Code::Statistics::MooseTypes;
13
14
2
2
2
0
0
0
use PPI::Document;
15
2
2
2
0
0
0
use Path::Class qw(file);
16
17has relative_paths => ( isa => 'Bool' );
18has foreign_paths => ( isa => 'Str' );
19
20has path => (
21    isa => 'Str',
22    required => 1,
23);
24
25has original_path => (
26    isa => 'Str',
27    required => 1,
28);
29
30has targets => (
31    isa => 'CS::InputList',
32    coerce => 1,
33);
34
35has metrics => (
36    isa => 'CS::InputList',
37    coerce => 1,
38);
39
40has ppi => (
41    isa => 'PPI::Document',
42    lazy => 1,
43    default => sub {
44        PPI::Document->new( $_[0]->path );
45    },
46);
47
48has progress => ( isa => 'CodeRef' );
49
50 - 52
=head2 analyze
    Finds targets in the given file and collects the metrics on those.
=cut
53
54sub analyze {
55
16
0
    my ( $self ) = @_;
56
57
16
16
16
0
0
0
    $self->_process_target_class( $_ ) for @{ $self->targets };
58
16
0
    $self->_format_file_path;
59
16
0
    $self->progress->();
60
61
16
15625
    return $self;
62}
63
64sub _format_file_path {
65
18
0
    my ( $self ) = @_;
66
18
0
    my $path = file( $self->path );
67
68
18
0
    $path = $path->relative if $self->relative_paths;
69
18
0
    $path = $path->absolute if !$self->relative_paths;
70
71
18
0
    $path = $path->as_foreign( $self->foreign_paths ) if $self->foreign_paths;
72
73
18
0
    $self->{path} = $path->stringify;
74
18
0
    return $self;
75}
76
77sub _process_target_class {
78
48
0
    my ( $self, $target_type ) = @_;
79
80
48
48
0
0
    my @supported_metrics = grep $self->_are_compatible( $target_type, $_ ), @{ $self->metrics };
81
48
0
    return if !@supported_metrics;
82
83
48
0
    my $targets = "Code::Statistics::Target::$target_type"->find_targets( $self );
84
48
0
    return if !$targets;
85
86
32
32
0
0
    my @measurements = map _measure_target( $_, @supported_metrics ), @{$targets};
87
32
0
    $self->{measurements}{$target_type} = \@measurements;
88
89
32
0
    return $self;
90}
91
92sub _are_compatible {
93
288
15625
    my ( $self, $target, $metric ) = @_;
94
288
0
    return 1 if "Code::Statistics::Target::$target"->supports( $metric );
95
288
0
    return 1 if "Code::Statistics::Metric::$metric"->supports( $target );
96
288
0
    return 0 if "Code::Statistics::Target::$target"->incompatible_with( $metric );
97
288
0
    return 0 if "Code::Statistics::Metric::$metric"->incompatible_with( $target );
98
240
0
    return 1;
99}
100
101sub _measure_target {
102
152
0
    my ( $target, @metrics ) = @_;
103
104
152
0
    my %measurement;
105
152
152
0
0
    $measurement{$_} = "Code::Statistics::Metric::$_"->measure( $target ) for @metrics;
106
107
152
0
    return \%measurement;
108}
109
1101;