Skip to content

Commit 6f88b6e

Browse files
authored
Merge pull request #37 from metacpan/mickey/cpan_testers_api
Added cpan_testers_api script
2 parents 3f6c611 + 7650cf6 commit 6f88b6e

File tree

2 files changed

+114
-1
lines changed

2 files changed

+114
-1
lines changed

bin/cpan_testers.pl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
}
115115

116116
# maybe use Data::Compare instead
117-
for my $condition ( qw< fail pass na unknown > ) {
117+
for my $condition (qw< fail pass na unknown >) {
118118
last if $insert_ok;
119119
if ( ( $tester_results->{$condition} || 0 )
120120
!= $row_from_db->{$condition} )

bin/cpan_testers_api.pl

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
use strict;
2+
use warnings;
3+
use v5.36;
4+
5+
use Cpanel::JSON::XS qw< decode_json >;
6+
use Getopt::Long;
7+
8+
use MetaCPAN::Logger qw< :log :dlog >;
9+
10+
use MetaCPAN::ES;
11+
use MetaCPAN::Ingest qw<
12+
home
13+
ua
14+
>;
15+
16+
# args
17+
my ();
18+
GetOptions();
19+
20+
# setup
21+
my $home = home();
22+
23+
my $url
24+
= $ENV{HARNESS_ACTIVE}
25+
? 'file:' . $home->child('t/var/cpantesters-release-api-fake.json')
26+
: 'http://api-3.cpantesters.org/v3/release';
27+
28+
my $ua = ua();
29+
30+
my $es = MetaCPAN::ES->new( type => "release" );
31+
my $bulk = $es->bulk();
32+
33+
log_info { 'Fetching ' . $url };
34+
35+
my $res;
36+
eval { $res = $ua->get($url) };
37+
exit(1) unless $res and $res->code == 200;
38+
39+
my $json = $res->decoded_content;
40+
my $data = decode_json $json;
41+
42+
my $scroll = $es->scroll(
43+
body => {
44+
sort => '_doc',
45+
},
46+
);
47+
48+
# Create a cache of all releases (dist + version combos)
49+
my %releases;
50+
51+
while ( my $release = $scroll->next ) {
52+
my $data = $release->{_source};
53+
54+
# XXX temporary hack. This may be masking issues with release
55+
# versions. (Olaf)
56+
my $version = $data->{version};
57+
$version =~ s{\Av}{} if $version;
58+
59+
$releases{ join( '-', grep {defined} $data->{distribution}, $version ) }
60+
= $data;
61+
}
62+
63+
for my $row (@$data) {
64+
65+
# The testers db seems to return q{} where we would expect
66+
# a version of 0.
67+
my $version = $row->{version} || 0;
68+
69+
# weblint++ gets a name of 'weblint' and a version of '++-1.15'
70+
# from the testers db. Special case it for now. Maybe try and
71+
# get the db fixed.
72+
73+
$version =~ s{\+}{}g;
74+
$version =~ s{\A-}{};
75+
76+
my $release = join( '-', $row->{dist}, $version );
77+
my $release_doc = $releases{$release};
78+
79+
# there's a cpantesters dist we haven't indexed
80+
next unless $release_doc;
81+
82+
# Check if we need to update this data
83+
my $insert_ok = 0;
84+
my $tester_results = $release_doc->{tests};
85+
if ( !$tester_results ) {
86+
$tester_results = {};
87+
$insert_ok = 1;
88+
}
89+
90+
# maybe use Data::Compare instead
91+
for my $condition (qw(fail pass na unknown)) {
92+
last if $insert_ok;
93+
if ( ( $tester_results->{$condition} || 0 ) != $row->{$condition} ) {
94+
$insert_ok = 1;
95+
}
96+
}
97+
98+
next unless $insert_ok;
99+
100+
my %tests = map { $_ => $row->{$_} } qw(fail pass na unknown);
101+
$bulk->update( {
102+
doc => { tests => \%tests },
103+
doc_as_upsert => 1,
104+
id => $release_doc->{id},
105+
} );
106+
}
107+
108+
$bulk->flush;
109+
$es->index_refresh;
110+
111+
log_info {'done'};
112+
113+
1;

0 commit comments

Comments
 (0)