|
| 1 | +use strict; |
| 2 | +use warnings; |
| 3 | +use v5.36; |
| 4 | + |
| 5 | +use Cpanel::JSON::XS qw< decode_json >; |
| 6 | +use Getopt::Long; |
| 7 | +use Path::Tiny qw< path >; |
| 8 | + |
| 9 | +use MetaCPAN::Logger qw< :log :dlog >; |
| 10 | + |
| 11 | +use MetaCPAN::ES; |
| 12 | +use MetaCPAN::Ingest qw< |
| 13 | + handle_error |
| 14 | + read_url |
| 15 | +>; |
| 16 | + |
| 17 | +# args |
| 18 | +my ( $json_file, $test ); |
| 19 | +GetOptions( |
| 20 | + "json=s" => \$json_file, |
| 21 | + "test" => \$test |
| 22 | +); |
| 23 | +my $cover_url //= 'http://cpancover.com/latest/cpancover.json'; |
| 24 | +my $cover_dev_url //= 'http://cpancover.com/latest/cpancover_dev.json'; |
| 25 | + |
| 26 | +# setup |
| 27 | +my %valid_keys |
| 28 | + = map { $_ => 1 } qw< branch condition statement subroutine total >; |
| 29 | + |
| 30 | +my $es = MetaCPAN::ES->new( index => "cover", type => "cover" ); |
| 31 | +my $bulk = $es->bulk(); |
| 32 | + |
| 33 | +my $data = retrieve_cover_data(); |
| 34 | + |
| 35 | +log_info {'Updating the cover index'}; |
| 36 | + |
| 37 | +for my $dist ( sort keys %{$data} ) { |
| 38 | + for my $version ( keys %{ $data->{$dist} } ) { |
| 39 | + my $release = $dist . '-' . $version; |
| 40 | + my $rel_check = $es->search( |
| 41 | + index => 'cpan', |
| 42 | + type => 'release', |
| 43 | + size => 0, |
| 44 | + body => { |
| 45 | + query => { term => { name => $release } }, |
| 46 | + }, |
| 47 | + ); |
| 48 | + if ( $rel_check->{hits}{total} ) { |
| 49 | + log_info { "Adding release info for '" . $release . "'" }; |
| 50 | + } |
| 51 | + else { |
| 52 | + log_warn { "Release '" . $release . "' does not exist." }; |
| 53 | + next; |
| 54 | + } |
| 55 | + |
| 56 | + my %doc_data = %{ $data->{$dist}{$version}{coverage}{total} }; |
| 57 | + |
| 58 | + for my $k ( keys %doc_data ) { |
| 59 | + delete $doc_data{$k} unless exists $valid_keys{$k}; |
| 60 | + } |
| 61 | + |
| 62 | + $bulk->update( { |
| 63 | + id => $release, |
| 64 | + doc => { |
| 65 | + distribution => $dist, |
| 66 | + version => $version, |
| 67 | + release => $release, |
| 68 | + criteria => \%doc_data, |
| 69 | + }, |
| 70 | + doc_as_upsert => 1, |
| 71 | + } ); |
| 72 | + } |
| 73 | +} |
| 74 | + |
| 75 | +$bulk->flush; |
| 76 | + |
| 77 | +### |
| 78 | + |
| 79 | +sub retrieve_cover_data { |
| 80 | + return decode_json( path($json_file)->slurp ) if $json_file; |
| 81 | + |
| 82 | + my $url = $test ? $cover_dev_url : $cover_url; |
| 83 | + |
| 84 | + return decode_json( read_url($url) ); |
| 85 | +} |
| 86 | + |
| 87 | +1; |
| 88 | + |
| 89 | +__END__ |
| 90 | +
|
| 91 | +=pod |
| 92 | +
|
| 93 | +=head1 SYNOPSIS |
| 94 | +
|
| 95 | + # bin/metacpan cover [--test] [json_file] |
| 96 | +
|
| 97 | +=head1 DESCRIPTION |
| 98 | +
|
| 99 | +Retrieves the CPAN Cover data from its source and |
| 100 | +updates our ES information. |
| 101 | +
|
| 102 | +=cut |
0 commit comments