view release on metacpan or search on metacpan
bin/cpantesters-legacy-metabase view on Meta::CPAN
#pod
#pod =route /beta/register
#pod
#pod Register a new Metabase user. This does not appear to be used by any
#pod CPAN Testers reporter client, but if it is, we can add the user to the
#pod C<metabase_user> table (the
#pod L<CPAN::Testers::Schema::Result::MetabaseUser> result class).
#pod
#pod =cut
sub handle_register( $c ) {
#$c->app->log->debug( $c->req->body );
my @things = ref $c->req->json eq 'ARRAY' ? $c->req->json->@* : ( $c->req->json );
for my $body ( @things ) {
my $fact = Metabase::Fact->class_from_type( $body->{metadata}{core}{type} )
->from_struct( $body );
$c->app->log->debug( sprintf 'Got %s object during registration', ref $fact );
if ( ref $fact->content ne 'ARRAY' ) {
$c->app->log->warn( 'Registration fact object content is not an array. Skipping!' );
$c->app->log->debug( sprintf 'Fact object content %s', Dumper $fact->content );
bin/cpantesters-legacy-metabase view on Meta::CPAN
#pod =route /api/v1/guid/:guid
#pod
#pod =route /beta/guid/:guid
#pod
#pod This is necessary during the registration as a pre-flight check before
#pod submitting the user registration, for some reason...
#pod
#pod =cut
sub handle_guid( $c ) {
my $guid = $c->stash( 'guid' );
my $user = $c->schema->resultset( 'MetabaseUser' )->search( { resource => 'metabase:user:' . $guid } )->single;
if ( !$user ) {
$c->app->log->info( 'Unregistered user ' . $guid );
return $c->render(
status => 404,
json => {
error => $guid . ' not found',
},
);
lib/CPAN/Testers/API.pm view on Meta::CPAN
#pod "errors": [
#pod {
#pod "path": "/since",
#pod "message": "Invalid date/time"
#pod }
#pod ]
#pod }
#pod
#pod =cut
sub render_error( $c, $status, @errors ) {
return $c->render(
status => $status,
openapi => {
errors => [
map { !ref $_ ? { message => $_, path => '/' } : $_ } @errors,
],
},
);
}
lib/CPAN/Testers/API/Controller/Release.pm view on Meta::CPAN
#pod limit (limits the total number of results sent with the C<limit> query parameter)
#pod
#pod =back
#pod
#pod Release data contains a summary of the pass, fail, na, and unknown test
#pod results created by stable Perls. Development Perls (odd-numbered 5.XX
#pod releases) are not included.
#pod
#pod =cut
sub release( $c ) {
$c->openapi->valid_input or return;
my $rs = $c->schema->resultset( 'Release' );
$rs = $rs->search(
{
perlmat => 1, # only stable perls
patched => 1, # not patched perls
},
{
columns => [qw( dist version pass fail na unknown )],
lib/CPAN/Testers/API/Controller/Report.pm view on Meta::CPAN
#pod
#pod ### Response:
#pod 201 Created
#pod { "id": "..." }
#pod
#pod Submit a new CPAN Testers report. This is used by testers when they're
#pod finished running a test.
#pod
#pod =cut
sub report_post( $c ) {
$c->app->log->debug( 'Submitting Report: ' . $c->req->body );
$c->openapi->valid_input or return;
my $report = $c->validation->param( 'report' );
my $row = $c->schema->resultset( 'TestReport' )->create( {
report => $report,
} );
return $c->render(
status => 201,
openapi => {
id => $row->id,
lib/CPAN/Testers/API/Controller/Report.pm view on Meta::CPAN
#pod GET /v3/report/:guid
#pod
#pod ### Response
#pod 200 OK
#pod { "id": "...", ... }
#pod
#pod Get a single CPAN Testers report from the database.
#pod
#pod =cut
sub report_get( $c ) {
$c->openapi->valid_input or return;
my $id = $c->validation->param( 'id' );
my $row = $c->schema->resultset( 'TestReport' )->find( $id );
if ( !$row ) {
return $c->render(
status => 404,
openapi => {
errors => [
{
message => 'Report ID not found',
lib/CPAN/Testers/API/Controller/Summary.pm view on Meta::CPAN
#pod ]
#pod
#pod Get test report summary data for the given distribution and version.
#pod
#pod Report summary data contains a select set of fields from the full test
#pod report. These fields are the most useful ones for building aggregate
#pod reporting and graphs for dashboards.
#pod
#pod =cut
sub summary( $c ) {
$c->openapi->valid_input or return;
my $dist = $c->validation->param( 'dist' );
my $version = $c->validation->param( 'version' );
my $grade = $c->validation->param( 'grade' );
my $perl = $c->validation->every_param( 'perl' );
my $osname = $c->validation->every_param( 'osname' );
if ( !$dist && !$version && ( !$perl || !@$perl ) && ( !$osname || !@$osname ) ) {
return $c->render_error( 400, "You must provide one of 'perl' or 'osname'" );
lib/CPAN/Testers/API/Controller/Summary.pm view on Meta::CPAN
$c->stream_rs( $rs, sub {
my $result = shift;
$result->{grade} = delete $result->{state};
$result->{date} = _format_date( delete $result->{fulldate} );
$result->{reporter} = delete $result->{tester};
return $result;
} );
}
sub _format_date( $fulldate ) {
my ( $y, $m, $d, $h, $n ) = $fulldate =~ /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/;
return "$y-$m-${d}T$h:$n:00Z";
}
1;
__END__
=pod
lib/CPAN/Testers/API/Controller/Upload.pm view on Meta::CPAN
#pod "released": "2016-08-12T04:02:34Z",
#pod }
#pod ]
#pod
#pod Get CPAN upload data. Results can be limited by distribution (with the
#pod C<dist> key in the stash), by author (with the C<author> key in the
#pod stash), and by date (with the C<since> query parameter).
#pod
#pod =cut
sub get( $c ) {
$c->openapi->valid_input or return;
my $rs = $c->schema->resultset( 'Upload' );
$rs = $rs->search(
{ },
{
order_by => 'released',
columns => [qw( dist version author filename released )],
}
);
lib/CPAN/Testers/API/Controller/Upload.pm view on Meta::CPAN
);
}
#pod =method feed
#pod
#pod Get a feed for uploads to CPAN. This feed returns the same information as
#pod the regular API, but as they come in.
#pod
#pod =cut
sub feed( $c ) {
$c->inactivity_timeout( 60000 );
my $path = $c->stash( 'dist' ) ? '/upload/dist/' . $c->stash( 'dist' )
: $c->stash( 'author' ) ? '/upload/author/' . $c->stash( 'author' )
: '/upload/dist' # Default to all dists
;
my $ua = Mojo::UserAgent->new( inactivity_timeout => 6000 );
$ua->websocket(
$c->app->config->{broker} . '/sub' . $path,
sub( $ua, $tx ) {
t/controller/release.t view on Meta::CPAN
$t->get_ok( '/v3/release/dist/My-Dist/1.001' )
->status_is( 200 )
->json_is( { $data{Release}[0]->%{ @API_FIELDS } } );
$t->get_ok( '/v3/release/dist/My-Dist/0.001' )
->status_is( 404 )
->json_has( '/errors' )
;
};
};
sub _test_api( $base ) {
subtest 'all releases' => sub {
$t->get_ok( $base . '/release' )
->status_is( 200 )
->json_is( [ map { +{ $_->%{ @API_FIELDS } } } $data{Release}->@[0..8] ] );
subtest 'since (disabled until optimized)' => sub {
$t->get_ok( $base . '/release?since=2016-08-20T00:00:00' )
->status_is( 400 )
->json_has( '/errors' )
->or( sub { diag explain shift->tx->res->json } );
t/controller/report.t view on Meta::CPAN
use FindBin ();
use Mojo::File qw( path );
use Mojo::JSON qw( decode_json );
my $SHARE_DIR = path( $FindBin::Bin, '..', 'share' );
my $HEX = qr{[A-Fa-f0-9]};
my $t = prepare_test_app();
subtest '/v3/report' => \&_test_api, '/v3';
sub _test_api( $base ) {
subtest 'post valid report' => sub {
my $report = decode_json( $SHARE_DIR->child( qw( report perl5 valid.v3.json ) )->slurp );
$t->post_ok( $base . '/report', json => $report )
->status_is( 201 )
->or( sub { diag shift->tx->res->body } )
->json_like( '/id' => qr{${HEX}{8}-${HEX}{4}-${HEX}{4}-${HEX}{4}-${HEX}{12}} )
;
};
subtest 'invalid report: version number starts with v' => sub {
t/controller/summary.t view on Meta::CPAN
my $schema = $t->app->schema;
$schema->populate( $_, $data{ $_ } ) for keys %data;
my $rs = $schema->resultset( 'Stats' );
$rs->result_class( 'DBIx::Class::ResultClass::HashRefInflator' );
is_deeply [ $rs->all ], $data{Stats}, 'sanity check that items were inserted'
or diag explain [ $rs->all ];
};
subtest '/v3/summary/{dist}/{version}' => \&_test_api, '/v3';
sub _test_api( $base ) {
subtest 'by dist' => sub {
$t->get_ok( $base . '/summary/My-Dist' )
->status_is( 200 )
->json_is( '/0/guid' => $data{Stats}[0]{guid} )
->json_is( '/1/guid' => $data{Stats}[1]{guid} )
->json_is( '/2/guid' => $data{Stats}[2]{guid} )
->json_is( '/0/date' => '2016-08-12T04:01:00Z' )
->json_is( '/1/date' => '2016-08-12T00:00:00Z' )
->json_is( '/2/date' => '2016-08-20T00:00:00Z' )
t/controller/upload.t view on Meta::CPAN
};
for \my %upload ( $data{ Upload }->@* ) {
my $dt = DateTime->from_epoch( epoch => $upload{ released } );
$upload{ released } = $dt->datetime . 'Z';
}
subtest '/v1/upload' => \&_test_api, '/v1';
subtest '/v3/upload' => \&_test_api, '/v3';
sub _test_api( $base ) {
subtest 'all uploads' => sub {
$t->get_ok( $base . '/upload' )
->status_is( 200 )
->json_is( [ map { +{ $_->%{ @API_FIELDS } } } $data{Upload}->@[0..2] ] )
->or( sub { diag explain $_[0]->tx->res->json } );
subtest 'since' => sub {
$t->get_ok( $base . '/upload?since=2016-11-19T03:05:00Z' )
->status_is( 200 )
->json_is( [ map { +{ $_->%{ @API_FIELDS } } } $data{Upload}->@[1..2] ] )
t/legacy/metabase.t view on Meta::CPAN
# from => 'doug@example.com (PREACTION)',
# );
#
# Create a new report to submit. Returns a data structure suitable to be
# encoded into JSON and submitted.
#
# This code is stolen from:
# * Test::Reporter::Transport::Metabase sub send
# * Metabase::Client::Simple sub submit_fact
sub create_report( %args ) {
my $creator = delete $args{creator};
my $textreport = delete $args{textreport};
my $report = Test::Reporter->new( transport => 'Null', %args );
# Build CPAN::Testers::Report with its various component facts.
my $metabase_report = CPAN::Testers::Report->open(
resource => 'cpan:///distfile/' . $report->distfile,
creator => $creator,
);
t/lib/Local/App.pm view on Meta::CPAN
=sub prepare_test_app
my $t = prepare_test_app();
Prepare a L<Test::Mojo> object with a L<CPAN::Testers::API> application
hooked up to a local, temporary L<CPAN::Testers::Schema> schema.
=cut
sub prepare_test_app() {
my $schema = prepare_temp_schema();
my $app = CPAN::Testers::API->new(
schema => $schema,
);
return Test::Mojo->new( $app );
}
1;