File Coverage

blib/lib/Module/cpmfile/Prereqs.pm
Criterion Covered Total %
statement 95 95 100.0
branch 17 20 85.0
condition 18 23 78.2
subroutine 11 11 100.0
pod 0 5 0.0
total 141 154 91.5


line stmt bran cond sub pod time code
1             package Module::cpmfile::Prereqs;
2 3     3   34 use v5.24;
  3         10  
3 3     3   15 use warnings;
  3         5  
  3         162  
4 3     3   16 use experimental qw(lexical_subs signatures);
  3         4  
  3         15  
5              
6 3     3   2020 use CPAN::Meta::Prereqs;
  3         27696  
  3         131  
7 3     3   1630 use Module::cpmfile::Util '_yaml_hash';
  3         14  
  3         260  
8 3     3   17 use Scalar::Util 'blessed';
  3         6  
  3         4954  
9              
10             my @PHASE = qw(runtime configure build test develop);
11             my @TYPE = qw(requires recommends suggests);
12              
13 8     8 0 21 sub new ($class, $hash = +{}) {
  8         15  
  8         14  
  8         10  
14 8         16 my $self = +{};
15 8         17 for my $phase (@PHASE) {
16 40         55 for my $type (@TYPE) {
17 120 100 100     331 next if !$hash->{$phase} || !$hash->{$phase}{$type};
18 15         22 for my $package (sort keys %{$hash->{$phase}{$type}}) {
  15         58  
19             $self->{$phase}{$type}{$package}
20 20   100     103 = $hash->{$phase}{$type}{$package} || +{};
21             }
22             }
23             }
24 8         33 bless $self, $class;
25             }
26              
27 2     2 0 495 sub from_cpanmeta ($class, $cpanmeta) {
  2         3  
  2         2  
  2         2  
28 2         3 my $hash = $cpanmeta;
29 2 50 33     13 if (blessed $cpanmeta and $cpanmeta->isa('CPAN::Meta::Prereqs')) {
30 2         17 $hash = $cpanmeta->as_string_hash;
31             }
32 2         528 my $out = {};
33 2         9 for my $phase (sort keys $hash->%*) {
34 3         7 for my $type (sort keys $hash->{$phase}->%*) {
35 5         6 for my $package (sort keys %{ $hash->{$phase}{$type} }) {
  5         8  
36 6         12 my $version = $hash->{$phase}{$type}{$package};
37 6 100       10 my $options = +{ $version ? (version => $version) : () };
38 6         12 $out->{$phase}{$type}{$package} = $options;
39             }
40             }
41             }
42 2         7 $class->new($out);
43             }
44              
45 1     1 0 922 sub cpanmeta ($self) {
  1         2  
  1         2  
46 1         1 my $hash = +{};
47 1         4 for my $phase (sort keys $self->%*) {
48 1         4 for my $type (sort keys $self->{$phase}->%*) {
49 1         2 for my $package (sort keys %{$self->{$phase}{$type}}) {
  1         2  
50 1         2 my $options = $self->{$phase}{$type}{$package};
51 1   50     8 $hash->{$phase}{$type}{$package} = $options->{version} || 0;
52             }
53             }
54             }
55 1         8 CPAN::Meta::Prereqs->new($hash);
56             }
57              
58 6     6 0 11 sub walk ($self, $phases, $types, $cb) {
  6         8  
  6         8  
  6         9  
  6         8  
  6         6  
59 6   100     25 $phases ||= \@PHASE;
60 6   100     18 $types ||= \@TYPE;
61 6         12 for my $phase ($phases->@*) {
62 26         33 for my $type ($types->@*) {
63 76 100 100     257 next if !$self->{$phase} || !$self->{$phase}{$type};
64 13         16 for my $package (sort keys %{$self->{$phase}{$type}}) {
  13         43  
65 19         35 my $options = $self->{$phase}{$type}{$package};
66 19         36 my $ret = $cb->($phase, $type, $package, $options);
67 19 50 33     74 return if ref($ret) eq 'SCALAR' && !$$ret;
68             }
69             }
70             }
71             }
72              
73 3     3 0 8 sub to_string ($self, $indent = "") {
  3         4  
  3         6  
  3         5  
74 3         4 my @out;
75 3         6 push @out, "prereqs:";
76 3         6 for my $phase (@PHASE) {
77 15 100       34 my $spec1 = $self->{$phase} or next;
78 4         12 push @out, " $phase:";
79 4         6 for my $type (@TYPE) {
80 12 100       33 my $spec2 = $spec1->{$type} or next;
81 5         11 push @out, " $type:";
82 5         18 for my $package (sort keys $spec2->%*) {
83 7 50       29 if (my %option = %{ $spec2->{$package} || +{} }) {
  7 100       40  
84 5         13 my @key = keys %option;
85 5 100 100     20 if (@key == 1 && $key[0] eq "version") {
86 3         14 push @out, " $package: { version: '$option{version}' }";
87             } else {
88 2         5 push @out, " $package:";
89 2         10 push @out, _yaml_hash(\%option, " ");
90             }
91             } else {
92 2         34 push @out, " $package:";
93             }
94             }
95             }
96             }
97 3         6 join "\n", map { "$indent$_" } @out;
  23         47  
98             }
99              
100             1;