File Coverage

blib/lib/WWW/PGXN/Distribution.pm
Criterion Covered Total %
statement 88 88 100.0
branch 29 34 85.2
condition 5 10 50.0
subroutine 28 28 100.0
pod 17 17 100.0
total 167 177 94.3


line stmt bran cond sub pod time code
1             package WWW::PGXN::Distribution;
2              
3 9     9   121 use 5.8.1;
  9         29  
4 9     9   60 use strict;
  9         17  
  9         302  
5 9     9   54 use File::Spec;
  9         13  
  9         262  
6 9     9   41 use Carp;
  9         16  
  9         1330  
7             our $VERSION = v0.13.0;
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   38 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   53 no strict 'refs';
  9         15  
  9         1349  
26 90         438 *{$attr} = sub {
27 47 100   47   162 $_[0]->_merge_meta unless $_[0]->{version};
28 47         266 $_[0]->{$attr}
29 90         305 };
30             }
31              
32             # Hash accessors.
33 9         38 for my $attr (qw(
34             no_index
35             prereqs
36             provides
37             resources
38             )) {
39 9     9   66 no strict 'refs';
  9         16  
  9         772  
40 36 100   4   170 *{$attr} = sub { +{ %{ shift->{$attr} || {} } } };
  36         9946  
  4         12  
  4         49  
41             }
42             }
43              
44             sub new {
45 14     14 1 37 my ($class, $pgxn, $data) = @_;
46 14         26 $data->{_pgxn} = $pgxn;
47 14         195 bless $data, $class;
48             }
49              
50             # Merging accessors.
51             sub releases {
52 14     14 1 26 my $self = shift;
53 14 100       48 $self->_merge_by_dist unless $self->{releases};
54 14         24 return +{ %{ $self->{releases} } };
  14         148  
55             }
56              
57             sub docs {
58 3     3 1 10 my $self = shift;
59 3 100       15 $self->_merge_meta unless $self->{version};
60 3 100       8 return +{ %{ $self->{docs} || {} } };
  3         36  
61             }
62              
63             # List accessors.
64 1 50   1 1 2 sub tags { @{ shift->{tags} || [] } }
  1         12  
65 1 50   1 1 4 sub maintainers { @{ shift->{maintainer} || [] } }
  1         10  
66 1 50   1 1 3 sub special_files { @{ shift->{special_files} || [] } }
  1         10  
67 3 100   3 1 8 sub versions_for { map { $_->{version} } @{ shift->releases->{+shift} || [] } }
  3         18  
  3         10  
68              
69             # Instance methods.
70 7     7 1 29 sub version_for { shift->releases->{+shift}[0]{version} }
71 3     3 1 12 sub date_for { shift->releases->{+shift}[0]{date} }
72              
73             sub _merge_meta {
74 4     4   8 my $self = shift;
75 4         9 my $rel = $self->{releases};
76 4   0     13 my $rels = $rel->{stable} || $rel->{testing} || $rel->{unstable};
77             my $meta = $self->{_pgxn}->_fetch_json(meta => {
78             version => lc $rels->[0]{version},
79             dist => lc $self->{name},
80 4   50     33 }) || {};
81 4         10 @{$self}{keys %{ $meta }} = values %{ $meta };
  4         28  
  4         11  
  4         10  
82             }
83              
84             sub _merge_by_dist {
85 2     2   7 my $self = shift;
86             my $by_dist = $self->{_pgxn}->_fetch_json(dist => {
87             dist => lc $self->{name}
88 2   50     14 }) || {};
89 2         5 @{$self}{keys %{ $by_dist }} = values %{ $by_dist };
  2         11  
  2         4  
  2         5  
90             }
91              
92             sub download_url {
93 1     1 1 2 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 1055 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 6 my $self = shift;
110             $self->{_pgxn}->_download_to(shift, {
111 2         7 dist => lc $self->name,
112             version => lc $self->version
113             });
114             }
115              
116             sub source_url {
117 2     2 1 989 my $self = shift;
118 2 100       9 my $uri = $self->source_path or return;
119 1         323 return URI->new($self->{_pgxn}->url . $uri);
120             }
121              
122             sub source_path {
123 4     4 1 686 my $self = shift;
124 4 100       18 my $tmpl = $self->{_pgxn}->_uri_templates->{source} or return;
125 2         34 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 1771 my $self = shift;
133 9 100       26 my $uri = $self->path_for_html_doc(shift) or return;
134 4         1592 return URI->new($self->{_pgxn}->url . $uri);
135             }
136              
137             sub path_for_html_doc {
138 14     14 1 2770 my ($self, $path) = @_;
139 14 50       76 $self->_merge_meta unless $self->{version};
140 14 100 100     117 return unless $self->{docs} && $self->{docs}{$path};
141              
142 9 100       68 my $tmpl = $self->{_pgxn}->_uri_templates->{htmldoc} or return;
143 6         102 $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 1977 my $self = shift;
152 5 100       15 my $url = $self->url_for_html_doc(shift) or return;
153 2 50       98 my $res = $self->{_pgxn}->_fetch($url) or return;
154 2         8 utf8::decode $res->{content};
155 2         12 return $res->{content};
156             }
157              
158             1;
159              
160             __END__