File Coverage

lib/Acme/CPANAuthors/Utils/Packages.pm
Criterion Covered Total %
statement 79 82 96.3
branch 13 20 65.0
condition 6 12 50.0
subroutine 18 18 100.0
pod n/a
total 116 132 87.8


line stmt bran cond sub pod time code
1             package Acme::CPANAuthors::Utils::Packages;
2              
3 2     2   27709 use strict;
  2         3  
  2         72  
4 2     2   8 use warnings;
  2         2  
  2         120  
5 2     2   853 use CPAN::DistnameInfo;
  2         1630  
  2         48  
6 2     2   793 use version;
  2         2602  
  2         7  
7 2     2   111 use base 'Acme::CPANAuthors::Utils::CPANIndex';
  2         3  
  2         772  
8              
9 2     2   13 sub _preambles {qw(
10             file url description columns intended_for
11             written_by line_count last_updated
12             )}
13              
14             sub _mappings {+{
15 10     10   60 package => 'packages',
16             distribution => 'dists',
17             latest_distribution => 'latest_dists',
18             }}
19              
20             sub _parse {
21 2     2   3 my ($self, $file) = @_;
22              
23 2         9 my $handle = $self->_handle($file);
24              
25 2         4 my $done_preambles = 0;
26 2         62 while (my $line = $handle->getline) {
27 36         1122 $line =~ s/\r?\n$//;
28 36 100       55 unless ($done_preambles) {
29 18 100       82 if ($line =~ /^\s*$/) {
    50          
30 2         4 $done_preambles = 1;
31             }
32             elsif (my ($key, $value) = $line =~ /^([^:]+):\s*(.*)/) {
33 16         17 $key =~ tr/A-Z\-/a-z_/;
34 16         33 $self->{preambles}{$key} = $value;
35             }
36 18         152 next;
37             }
38              
39 18         42 my ($package, $version, $path) = split ' ', $line;
40              
41 18         31 my $dist = $self->_dist_from_path($path);
42              
43 18         75 my $pkg = Acme::CPANAuthors::Utils::Packages::Package->new({
44             package => $package,
45             version => $version,
46             distribution => $dist,
47             });
48              
49 18   100     126 push @{ $dist->{packages} ||= [] }, $pkg;
  18         72  
50              
51 18         201 $self->{packages}{$package} = $pkg;
52             }
53             }
54              
55             sub _dist_from_path {
56 18     18   18 my ($self, $path) = @_;
57              
58 18         25 my $dist = $self->{dists}{$path};
59 18 100       29 return $dist if $dist;
60              
61 14         35 my $info = CPAN::DistnameInfo->new($path);
62 14         756 $dist = Acme::CPANAuthors::Utils::Packages::Distribution->new({
63             prefix => $path,
64             dist => $info->dist,
65             version => $info->version,
66             maturity => $info->maturity,
67             filename => $info->filename,
68             cpanid => $info->cpanid,
69             distvname => $info->distvname,
70             });
71              
72 14         307 $self->{dists}{$path} = $dist;
73              
74 14 50 33     31 return unless defined $dist->version && $dist->dist;
75              
76             # see if it's latest
77 14         145 my $distname = $info->dist;
78 14         38 my $latest = $self->{latest_dists}{$distname};
79 14 100       23 unless ($latest) {
80 12         17 $self->{latest_dists}{$distname} = $dist;
81 12         40 return $dist;
82             }
83 2         2 my ($distv, $latestv);
84 2         3 eval {
85 2     2   12 no warnings;
  2         6  
  2         163  
86 2   50     5 $distv = version->new( $dist->version || 0 );
87 2   50     21 $latestv = version->new( $latest->version || 0 );
88             };
89 2 50 33     85 if ($distv && $latestv) {
90 2 50       10 if ($distv > $latestv) {
91 0         0 $self->{latest_dists}{$distname} = $dist;
92             }
93             }
94             else {
95 2     2   9 no warnings;
  2         2  
  2         211  
96 0 0       0 if ($dist->version > $latest->version) {
97 0         0 $self->{latest_dists}{$distname} = $dist;
98             }
99             }
100              
101 2         18 $dist;
102             }
103              
104             package #
105             Acme::CPANAuthors::Utils::Packages::Distribution;
106              
107 2     2   9 use strict;
  2         2  
  2         63  
108 2     2   8 use warnings;
  2         2  
  2         65  
109 2     2   8 use base 'Class::Accessor::Fast';
  2         2  
  2         1116  
110              
111             __PACKAGE__->mk_ro_accessors(qw/
112             prefix
113             dist
114             version
115             maturity
116             filename
117             cpanid
118             distvname
119             packages
120             /);
121              
122             *path = *prefix;
123             *name = *dist;
124             *pauseid = *cpanid;
125              
126 1 50   1   397 sub contains { @{ shift->{packages} || [] } }
  1         9  
127              
128             package #
129             Acme::CPANAuthors::Utils::Packages::Package;
130              
131 2     2   5543 use strict;
  2         3  
  2         63  
132 2     2   9 use warnings;
  2         2  
  2         60  
133 2     2   8 use base 'Class::Accessor::Fast';
  2         2  
  2         188  
134              
135             __PACKAGE__->mk_ro_accessors(qw/
136             package
137             version
138             distribution
139             /);
140              
141             *name = *package;
142              
143             1;
144              
145             __END__