File Coverage

blib/lib/CPAN/Flatten.pm
Criterion Covered Total %
statement 17 78 21.7
branch 0 28 0.0
condition 0 7 0.0
subroutine 6 13 46.1
pod 0 6 0.0
total 23 132 17.4


line stmt bran cond sub pod time code
1             package CPAN::Flatten;
2              
3 1     1   20109 use strict;
  1         2  
  1         29  
4 1     1   20 use 5.008_005;
  1         3  
5             our $VERSION = '0.01';
6              
7 1     1   497 use CPAN::Flatten::Distribution::Factory;
  1         2  
  1         22  
8 1     1   4 use CPAN::Flatten::Distribution;
  1         1  
  1         13  
9 1     1   3 use Module::CoreList;
  1         1  
  1         6  
10 1     1   14 use version;
  1         1  
  1         4  
11              
12             sub new {
13 0     0 0   my ($class, %opt) = @_;
14 0   0       my $target_perl = delete $opt{target_perl} || $];
15 0 0         $target_perl = "v$target_perl" if $target_perl =~ /^5\.[1-9]\d*$/;
16 0           $target_perl = version->parse($target_perl)->numify;
17 0           bless {target_perl => $target_perl, %opt}, $class;
18             }
19 0     0 0   sub target_perl { shift->{target_perl} }
20              
21             sub is_core {
22 0     0 0   my ($self, $package, $version) = @_;
23 0   0       $version ||= 0;
24 0 0         if ($package eq "perl") {
25 0 0         if ($version > $self->target_perl) {
26 0           my $err = "target perl version is only @{[$self->target_perl]}";
  0            
27 0           return (undef, $err);
28             } else {
29 0           return (1, undef);
30             }
31             }
32 0 0         if (exists $Module::CoreList::version{$self->target_perl}{$package}) {
33 0           return (1, undef);
34             } else {
35 0           return (0, undef);
36             }
37             }
38              
39             sub info_progress {
40 0     0 0   my ($self, $depth) = (shift, shift);
41 0 0         return if $self->{quiet};
42 0           print STDERR " " x $depth, "@_";
43             }
44             sub info_done {
45 0     0 0   my $self = shift;
46 0 0         return if $self->{quiet};
47 0           print STDERR " -> @_\n";
48             }
49              
50             sub flatten {
51 0     0 0   my ($self, $package, $version) = @_;
52 0           my $distribution = CPAN::Flatten::Distribution->new;
53 0           my $miss = +{};
54 0           $self->_flatten($distribution, $miss, $package, $version);
55 0           my @miss = sort keys %$miss;
56 0 0         return ($distribution, @miss ? \@miss : undef);
57             }
58              
59             sub _flatten {
60 0     0     my ($self, $distribution, $miss, $package, $version) = @_;
61 0 0         return 0 if $miss->{$package};
62 0   0       $version ||= 0;
63 0           my $already = $distribution->root->providing($package, $version);
64 0 0         if ($already) {
65 0 0         return 0 if $distribution->is_child($already);
66 0           $distribution->add_child( $already->dummy );
67 0           return 1;
68             }
69              
70 0           my ($is_core, $err) = $self->is_core($package, $version);
71 0 0         if (!defined $is_core) {
    0          
72 0           $miss->{$package}++;
73 0           $self->info_progress($distribution->depth, "$package ($version)");
74 0           $self->info_done("\e[31m$err\e[m");
75 0           return 0;
76             } elsif ($is_core) {
77 0 0         if ($self->{verbose}) {
78 0           $self->info_progress($distribution->depth, "$package ($version)");
79 0           $self->info_done("core");
80             }
81 0           return 0;
82             }
83              
84 0           $self->info_progress($distribution->depth, "$package ($version)");
85 0           my ($found, $reason) = CPAN::Flatten::Distribution::Factory->from_pacakge($package, $version);
86 0 0         if (!$found) {
87 0           $miss->{$package}++;
88 0           $self->info_done("\e[31m$reason\e[m");
89 0           return 0;
90             }
91 0           $self->info_done("@{[$found->name]}");
  0            
92 0           $distribution->add_child($found);
93 0           my $count = 0;
94 0           for my $requirement (@{$found->requirements}) {
  0            
95 0           $count += $self->_flatten($found, $miss, $requirement->{package}, $requirement->{version});
96             }
97 0           return $count; # count == 0 means leaf
98             }
99              
100             1;
101             __END__