File Coverage

blib/lib/Module/cpmfile/Prereqs.pm
Criterion Covered Total %
statement 82 82 100.0
branch 17 20 85.0
condition 21 27 77.7
subroutine 10 10 100.0
pod 0 5 0.0
total 130 144 90.2


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