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   39332 use strict;
  2         4  
  2         56  
4 2     2   10 use warnings;
  2         4  
  2         67  
5 2     2   1664 use CPAN::DistnameInfo;
  2         1986  
  2         68  
6 2     2   1496 use version;
  2         4386  
  2         12  
7 2     2   140 use base 'Acme::CPANAuthors::Utils::CPANIndex';
  2         5  
  2         1260  
8              
9 2     2   11 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   70 package => 'packages',
16             distribution => 'dists',
17             latest_distribution => 'latest_dists',
18             }}
19              
20             sub _parse {
21 2     2   4 my ($self, $file) = @_;
22              
23 2         10 my $handle = $self->_handle($file);
24              
25 2         6 my $done_preambles = 0;
26 2         41 while (my $line = $handle->getline) {
27 36         1487 $line =~ s/\r?\n$//;
28 36 100       95 unless ($done_preambles) {
29 18 100       122 if ($line =~ /^\s*$/) {
    50          
30 2         4 $done_preambles = 1;
31             }
32             elsif (my ($key, $value) = $line =~ /^([^:]+):\s*(.*)/) {
33 16         22 $key =~ tr/A-Z\-/a-z_/;
34 16         52 $self->{preambles}{$key} = $value;
35             }
36 18         228 next;
37             }
38              
39 18         58 my ($package, $version, $path) = split ' ', $line;
40              
41 18         43 my $dist = $self->_dist_from_path($path);
42              
43 18         108 my $pkg = Acme::CPANAuthors::Utils::Packages::Package->new({
44             package => $package,
45             version => $version,
46             distribution => $dist,
47             });
48              
49 18   100     184 push @{ $dist->{packages} ||= [] }, $pkg;
  18         103  
50              
51 18         318 $self->{packages}{$package} = $pkg;
52             }
53             }
54              
55             sub _dist_from_path {
56 18     18   32 my ($self, $path) = @_;
57              
58 18         34 my $dist = $self->{dists}{$path};
59 18 100       43 return $dist if $dist;
60              
61 14         56 my $info = CPAN::DistnameInfo->new($path);
62 14         955 $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         412 $self->{dists}{$path} = $dist;
73              
74 14 50 33     43 return unless defined $dist->version && $dist->dist;
75              
76             # see if it's latest
77 14         218 my $distname = $info->dist;
78 14         51 my $latest = $self->{latest_dists}{$distname};
79 14 100       35 unless ($latest) {
80 12         30 $self->{latest_dists}{$distname} = $dist;
81 12         53 return $dist;
82             }
83 2         3 my ($distv, $latestv);
84 2         4 eval {
85 2     2   15 no warnings;
  2         4  
  2         210  
86 2   50     6 $distv = version->new( $dist->version || 0 );
87 2   50     38 $latestv = version->new( $latest->version || 0 );
88             };
89 2 50 33     110 if ($distv && $latestv) {
90 2 50       15 if ($distv > $latestv) {
91 0         0 $self->{latest_dists}{$distname} = $dist;
92             }
93             }
94             else {
95 2     2   10 no warnings;
  2         4  
  2         275  
96 0 0       0 if ($dist->version > $latest->version) {
97 0         0 $self->{latest_dists}{$distname} = $dist;
98             }
99             }
100              
101 2         21 $dist;
102             }
103              
104             package #
105             Acme::CPANAuthors::Utils::Packages::Distribution;
106              
107 2     2   10 use strict;
  2         4  
  2         47  
108 2     2   8 use warnings;
  2         4  
  2         75  
109 2     2   10 use base 'Class::Accessor::Fast';
  2         2  
  2         2551  
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   499 sub contains { @{ shift->{packages} || [] } }
  1         9  
127              
128             package #
129             Acme::CPANAuthors::Utils::Packages::Package;
130              
131 2     2   9845 use strict;
  2         4  
  2         41  
132 2     2   11 use warnings;
  2         5  
  2         70  
133 2     2   10 use base 'Class::Accessor::Fast';
  2         4  
  2         268  
134              
135             __PACKAGE__->mk_ro_accessors(qw/
136             package
137             version
138             distribution
139             /);
140              
141             *name = *package;
142              
143             1;
144              
145             __END__