File Coverage

blib/lib/WWW/PGXN/Distribution.pm
Criterion Covered Total %
statement 89 89 100.0
branch 29 34 85.2
condition 6 10 60.0
subroutine 28 28 100.0
pod 17 17 100.0
total 169 178 94.9


line stmt bran cond sub pod time code
1             package WWW::PGXN::Distribution;
2              
3 9     9   116 use 5.8.1;
  9         30  
  9         394  
4 9     9   47 use strict;
  9         18  
  9         344  
5 9     9   49 use File::Spec;
  9         16  
  9         352  
6 9     9   51 use Carp;
  9         16  
  9         1467  
7             our $VERSION = v0.12.4;
8              
9             BEGIN {
10             # XXX Use DateTime for release date?
11             # XXX Use Software::License for license?
12             # XXX Use SemVer for versions?
13 9     9   30 for my $attr (qw(
14             abstract
15             license
16             name
17             version
18             description
19             generated_by
20             date
21             release_status
22             sha1
23             user
24             )) {
25 9     9   47 no strict 'refs';
  9         17  
  9         4659  
26 90         748 *{$attr} = sub {
27 47 100   47   156 $_[0]->_merge_meta unless $_[0]->{version};
28 47         245 $_[0]->{$attr}
29 90         464 };
30             }
31              
32             # Hash accessors.
33 9         23 for my $attr (qw(
34             no_index
35             prereqs
36             provides
37             resources
38             )) {
39 9     9   60 no strict 'refs';
  9         182  
  9         2127  
40 36 100   4   95 *{$attr} = sub { +{ %{ shift->{$attr} || {} } } };
  36         11142  
  4         6  
  4         64  
41             }
42             }
43              
44             sub new {
45 14     14 1 54 my ($class, $pgxn, $data) = @_;
46 14         46 $data->{_pgxn} = $pgxn;
47 14         95 bless $data, $class;
48             }
49              
50             # Merging accessors.
51             sub releases {
52 14     14 1 20 my $self = shift;
53 14 100       40 $self->_merge_by_dist unless $self->{releases};
54 14         20 return +{ %{ $self->{releases} } };
  14         123  
55             }
56              
57             sub docs {
58 3     3 1 6 my $self = shift;
59 3 100       13 $self->_merge_meta unless $self->{version};
60 3 100       7 return +{ %{ $self->{docs} || {} } };
  3         37  
61             }
62              
63             # List accessors.
64 1 50   1 1 2 sub tags { @{ shift->{tags} || [] } }
  1         9  
65 1 50   1 1 2 sub maintainers { @{ shift->{maintainer} || [] } }
  1         11  
66 1 50   1 1 1 sub special_files { @{ shift->{special_files} || [] } }
  1         11  
67 3 100   3 1 5 sub versions_for { map { $_->{version} } @{ shift->releases->{+shift} || [] } }
  3         16  
  3         9  
68              
69             # Instance methods.
70 7     7 1 25 sub version_for { shift->releases->{+shift}[0]{version} }
71 3     3 1 7 sub date_for { shift->releases->{+shift}[0]{date} }
72              
73             sub _merge_meta {
74 4     4   7 my $self = shift;
75 4         8 my $rel = $self->{releases};
76 4   33     19 my $rels = $rel->{stable} || $rel->{testing} || $rel->{unstable};
77 4   50     31 my $meta = $self->{_pgxn}->_fetch_json(meta => {
78             version => lc $rels->[0]{version},
79             dist => lc $self->{name},
80             }) || {};
81 4         23 @{$self}{keys %{ $meta }} = values %{ $meta };
  4         47  
  4         16  
  4         17  
82             }
83              
84             sub _merge_by_dist {
85 2     2   5 my $self = shift;
86 2   50     15 my $by_dist = $self->{_pgxn}->_fetch_json(dist => {
87             dist => lc $self->{name}
88             }) || {};
89 2         12 @{$self}{keys %{ $by_dist }} = values %{ $by_dist };
  2         14  
  2         6  
  2         7  
90             }
91              
92             sub download_url {
93 1     1 1 3 my $self = shift;
94 1         6 $self->{_pgxn}->_url_for(download => {
95             dist => lc $self->name,
96             version => lc $self->version
97             });
98             }
99              
100             sub download_path {
101 1     1 1 1009 my $self = shift;
102 1         5 $self->{_pgxn}->_path_for(download => {
103             dist => lc $self->name,
104             version => lc $self->version
105             });
106             }
107              
108             sub download_to {
109 2     2 1 4 my $self = shift;
110 2         10 $self->{_pgxn}->_download_to(shift, {
111             dist => lc $self->name,
112             version => lc $self->version
113             });
114             }
115              
116             sub source_url {
117 2     2 1 657 my $self = shift;
118 2 100       7 my $uri = $self->source_path or return;
119 1         259 return URI->new($self->{_pgxn}->url . $uri);
120             }
121              
122             sub source_path {
123 4     4 1 392 my $self = shift;
124 4 100       14 my $tmpl = $self->{_pgxn}->_uri_templates->{source} or return;
125 2         20 return $tmpl->process(
126             dist => lc $self->name,
127             version => lc $self->version
128             );
129             }
130              
131             sub url_for_html_doc {
132 9     9 1 1215 my $self = shift;
133 9 100       20 my $uri = $self->path_for_html_doc(shift) or return;
134 4         7690 return URI->new($self->{_pgxn}->url . $uri);
135             }
136              
137             sub path_for_html_doc {
138 14     14 1 1384 my ($self, $path) = @_;
139 14 50       37 $self->_merge_meta unless $self->{version};
140 14 100 100     89 return unless $self->{docs} && $self->{docs}{$path};
141              
142 9 100       34 my $tmpl = $self->{_pgxn}->_uri_templates->{htmldoc} or return;
143 6         47 $tmpl->process(
144             dist => lc $self->name,
145             version => lc $self->version,
146             docpath => $path,
147             );
148             }
149              
150             sub body_for_html_doc {
151 5     5 1 18657 my $self = shift;
152 5 100       17 my $url = $self->url_for_html_doc(shift) or return;
153 2 50       111 my $res = $self->{_pgxn}->_fetch($url) or return;
154 2         20 utf8::decode $res->{content};
155 2         19 return $res->{content};
156             }
157              
158             1;
159              
160             __END__