File Coverage

blib/lib/CPAN/Common/Index/MetaDB.pm
Criterion Covered Total %
statement 41 44 93.1
branch 7 12 58.3
condition 3 9 33.3
subroutine 10 12 83.3
pod 3 4 75.0
total 64 81 79.0


line stmt bran cond sub pod time code
1 2     2   117578 use 5.008001;
  2         8  
2 2     2   11 use strict;
  2         5  
  2         38  
3 2     2   7 use warnings;
  2         4  
  2         99  
4              
5             package CPAN::Common::Index::MetaDB;
6             # ABSTRACT: Search index via CPAN MetaDB
7              
8             our $VERSION = '0.009'; # TRIAL
9              
10 2     2   9 use parent 'CPAN::Common::Index';
  2         4  
  2         15  
11              
12 2     2   96 use Class::Tiny qw/uri/;
  2         4  
  2         8  
13              
14 2     2   321 use Carp;
  2         4  
  2         101  
15 2     2   871 use CPAN::Meta::YAML;
  2         8828  
  2         117  
16 2     2   554 use HTTP::Tiny;
  2         19817  
  2         638  
17              
18             #pod =attr uri
19             #pod
20             #pod A URI for the endpoint of a CPAN MetaDB server. The
21             #pod default is L.
22             #pod
23             #pod =cut
24              
25             sub BUILD {
26 3     3 0 3713 my $self = shift;
27 3         66 my $uri = $self->uri;
28 3 100       23 $uri = "http://cpanmetadb.plackperl.org/v1.0/"
29             unless defined $uri;
30             # ensure URI ends in '/'
31 3         13 $uri =~ s{/?$}{/};
32 3         47 $self->uri($uri);
33 3         16 return;
34             }
35              
36             sub search_packages {
37 1     1 1 469 my ( $self, $args ) = @_;
38 1 50       5 Carp::croak("Argument to search_packages must be hash reference")
39             unless ref $args eq 'HASH';
40              
41             # only support direct package query
42             return
43 1 50 33     13 unless keys %$args == 1 && exists $args->{package} && ref $args->{package} eq '';
      33        
44              
45 1         3 my $mod = $args->{package};
46 1         6 my $res = HTTP::Tiny->new->get( $self->uri . "package/$mod" );
47 1 50       122685 return unless $res->{success};
48              
49 1 50       25 if ( my $yaml = CPAN::Meta::YAML->read_string( $res->{content} ) ) {
50 1         21255 my $meta = $yaml->[0];
51 1 50 33     10 if ( $meta && $meta->{distfile} ) {
52 1         3 my $file = $meta->{distfile};
53 1         6 $file =~ s{^./../}{}; # strip leading
54             return {
55             package => $mod,
56             version => $meta->{version},
57 1         103 uri => "cpan:///distfile/$file",
58             };
59             }
60             }
61              
62 0           return;
63             }
64              
65 0     0 1   sub index_age { return time }; # pretend always current
66              
67 0     0 1   sub search_authors { return }; # not supported
68              
69             1;
70              
71              
72             # vim: ts=4 sts=4 sw=4 et:
73              
74             __END__