File Coverage

lib/Perl/PrereqScanner/NotQuiteLite/Util/CPANfile.pm
Criterion Covered Total %
statement 79 79 100.0
branch 26 28 92.8
condition 6 7 85.7
subroutine 10 10 100.0
pod 1 2 50.0
total 122 126 96.8


line stmt bran cond sub pod time code
1             package Perl::PrereqScanner::NotQuiteLite::Util::CPANfile;
2              
3 10     10   1356 use strict;
  10         18  
  10         318  
4 10     10   36 use warnings;
  10         14  
  10         462  
5 10     10   645 use parent 'Module::CPANfile';
  10         363  
  10         89  
6 10     10   58592 use Perl::PrereqScanner::NotQuiteLite::Util::Prereqs;
  10         19  
  10         8851  
7              
8             sub load_and_merge {
9 22     22 0 84 my ($class, $file, $prereqs, $features) = @_;
10              
11 22 50       109 $prereqs = $prereqs->as_string_hash unless ref $prereqs eq 'HASH';
12              
13 22         10247 my $self;
14 22 100       882 if (-f $file) {
15 6         37 $self = $class->load($file);
16 6         391 $self->_merge_prereqs($prereqs);
17             } else {
18 16         113 $self = $class->from_prereqs($prereqs);
19             }
20              
21 22 100       1879 if ($features) {
22 9         22 for my $identifier (keys %$features) {
23 9         20 my $feature = $features->{$identifier};
24 9 100       27 next unless $feature->{prereqs};
25 8 100       31 $self->_merge_prereqs($feature->{prereqs}, $identifier) or next;
26 7         24 $self->{_prereqs}->add_feature($identifier, $feature->{description});
27             }
28             }
29              
30 22         102 $self->_dedupe;
31              
32 22         87 $self;
33             }
34              
35             sub features {
36 22     22 1 106 my $self = shift;
37 22         99 map $self->feature($_), sort $self->{_prereqs}->identifiers; # TWEAKED
38             }
39              
40             sub _merge_prereqs {
41 14     14   37 my ($self, $prereqs, $feature_id) = @_;
42 14 100       51 $prereqs = $prereqs->as_string_hash unless ref $prereqs eq 'HASH';
43              
44 14         3273 my $current = CPAN::Meta::Prereqs->new($self->{_prereqs}->specs($feature_id));
45 14         1622 my $merged = $current->with_merged_prereqs(CPAN::Meta::Prereqs->new($prereqs));
46              
47 14         7790 $self->__replace_prereqs($merged, $feature_id);
48             }
49              
50             sub __replace_prereqs {
51 44     44   98 my ($self, $prereqs, $feature_id) = @_;
52 44 50       131 $prereqs = $prereqs->as_string_hash unless ref $prereqs eq 'HASH';
53              
54 44   100     6574 @{$self->{_prereqs}{prereqs}{$feature_id || ''}} = ();
  44         373  
55 44         71 my $added = 0;
56 44         111 for my $phase (keys %$prereqs) {
57 41         57 for my $type (keys %{$prereqs->{$phase}}) {
  41         79  
58 41         56 while (my($module, $requirement) = each %{$prereqs->{$phase}{$type}}) {
  138         440  
59             $self->{_prereqs}->add(
60 97         235 feature => $feature_id,
61             phase => $phase,
62             type => $type,
63             module => $module,
64             requirement => Module::CPANfile::Requirement->new(name => $module, version => $requirement),
65             );
66 97         1886 $added++
67             }
68             }
69             }
70 44 100       135 delete $self->{_prereqs}{cpanmeta} unless $feature_id; # to rebuild cpanmeta
71 44         214 $added;
72             }
73              
74             sub _dedupe {
75 22     22   32 my $self = shift;
76 22         70 my $prereqs = $self->prereqs;
77 22         5913 my %features = map {$_ => $self->feature($_)->{prereqs} } $self->{_prereqs}->identifiers;
  8         71  
78              
79 22         3684 dedupe_prereqs_and_features($prereqs, \%features);
80              
81 22         122 $self->__replace_prereqs($prereqs);
82 22         131 for my $feature_id (keys %features) {
83 8         17 $self->__replace_prereqs($features{$feature_id}, $feature_id);
84             }
85             }
86              
87             sub _dump_prereqs {
88 30     30   37439 my($self, $prereqs, $include_empty, $base_indent) = @_;
89              
90 30         57 my $code = '';
91 30         63 my @x_phases = sort grep {/^x_/i} keys %$prereqs; # TWEAKED
  29         77  
92 30         64 for my $phase (qw(runtime configure build test develop), @x_phases) {
93 151 100       255 my $indent = $phase eq 'runtime' ? '' : ' ';
94 151   100     354 $indent = (' ' x ($base_indent || 0)) . $indent;
95              
96 151         196 my($phase_code, $requirements);
97 151 100       304 $phase_code .= "on $phase => sub {\n" unless $phase eq 'runtime';
98              
99 151         169 my @x_types = sort grep {/^x_/i} keys %{$prereqs->{$phase}}; # TWEAKED
  29         56  
  151         324  
100 151         251 for my $type (qw(requires recommends suggests conflicts), @x_types) {
101 604         655 for my $mod (sort keys %{$prereqs->{$phase}{$type}}) {
  604         1288  
102 75         131 my $ver = $prereqs->{$phase}{$type}{$mod};
103 75 100       192 $phase_code .= $ver eq '0'
104             ? "${indent}$type '$mod';\n"
105             : "${indent}$type '$mod', '$ver';\n";
106 75         118 $requirements++;
107             }
108             }
109              
110 151 100       256 $phase_code .= "\n" unless $requirements;
111 151 100       272 $phase_code .= "};\n" unless $phase eq 'runtime';
112              
113 151 100 66     383 $code .= $phase_code . "\n" if $requirements or $include_empty;
114             }
115              
116 30         189 $code =~ s/\n+$/\n/s;
117 30         96 $code;
118             }
119              
120             1;
121              
122             __END__