File Coverage

blib/lib/PAUSE/Packages/ReleaseIterator.pm
Criterion Covered Total %
statement 49 50 98.0
branch 10 10 100.0
condition 4 6 66.6
subroutine 9 9 100.0
pod 0 1 0.0
total 72 76 94.7


line stmt bran cond sub pod time code
1             package PAUSE::Packages::ReleaseIterator;
2             $PAUSE::Packages::ReleaseIterator::VERSION = '0.16';
3 2     2   27 use 5.10.0;
  2         6  
4 2     2   12 use Moo 1.006;
  2         34  
  2         15  
5 2     2   610 use PAUSE::Packages;
  2         4  
  2         51  
6 2     2   10 use PAUSE::Packages::Release;
  2         4  
  2         44  
7 2     2   14 use PAUSE::Packages::Module;
  2         5  
  2         59  
8 2     2   10 use JSON::MaybeXS;
  2         2  
  2         127  
9 2     2   11 use autodie;
  2         3  
  2         16  
10 2     2   13041 use feature 'state';
  2         4  
  2         1360  
11              
12             has 'packages' =>
13             (
14             is => 'ro',
15             default => sub { return PAUSE::Packages->new(); },
16             );
17              
18             has 'well_formed' =>
19             (
20             is => 'ro',
21             default => sub { 0 },
22             );
23              
24             has _fh => ( is => 'rw' );
25              
26             sub next_release
27             {
28 7     7 0 4111 my $self = shift;
29 7         10 my @modules;
30             my $fh;
31              
32 7 100       44 if (not defined $self->_fh) {
33 2         65 open($fh, '<', $self->packages->path());
34 2         4154 my $inheader = 1;
35              
36             # Skip the header block at the top of the file
37 2         33 while (<$fh>) {
38 6 100       31 last if /^$/;
39             }
40 2         10 $self->_fh($fh);
41             }
42             else {
43 5         13 $fh = $self->_fh;
44             }
45              
46             RELEASE:
47 7         10 while (1) {
48 8         39 my $line = <$fh>;
49 8         12 my @args;
50              
51 8 100       20 if (defined($line)) {
52 6         12 chomp($line);
53 6         28 my ($path, $json) = split(/\s+/, $line, 2);
54 6         9 foreach my $entry (@{ decode_json($json) }) {
  6         64  
55 8         153 my $module = PAUSE::Packages::Module->new(
56             name => $entry->[0],
57             version => $entry->[1],
58             );
59 8         2173 push(@modules, $module);
60             }
61 6         26 @args = (modules => [@modules], path => $path);
62 6 100       33 if ($self->well_formed) {
63 3         12 my $distinfo = CPAN::DistnameInfo->new($path);
64 3 100 66     178 next RELEASE unless defined($distinfo)
      66        
65             && defined($distinfo->dist)
66             && defined($distinfo->cpanid);
67 2         31 push(@args, distinfo => $distinfo);
68             }
69 5         86 return PAUSE::Packages::Release->new(@args);
70             } else {
71 2         9 return undef;
72             }
73             }
74              
75 0           return undef;
76             }
77              
78             1;