Skip to content

Commit 9b69ff2

Browse files
authored
Merge pull request #990 from metacpan/mickey/versions_support_latest
added support for 'latest' in versions param of release/versions/DIST
2 parents b41d951 + b84963e commit 9b69ff2

File tree

2 files changed

+64
-4
lines changed

2 files changed

+64
-4
lines changed

lib/MetaCPAN/Query/Release.pm

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,12 +566,39 @@ sub versions {
566566

567567
my $query;
568568

569+
# 'versions' param was sent
569570
if ( @{$versions} ) {
571+
my $filter_versions;
572+
573+
# we only want 'latest' version
574+
if ( @{$versions} == 1 and $versions->[0] eq 'latest' ) {
575+
$filter_versions = { term => { status => 'latest' } };
576+
}
577+
else {
578+
if ( grep $_ eq 'latest', @{$versions} ) {
579+
580+
# we want a combination of 'latest' and specific versions
581+
@{$versions} = grep $_ ne 'latest', @{$versions};
582+
$filter_versions = {
583+
bool => {
584+
should => [
585+
{ terms => { version => $versions } },
586+
{ term => { status => 'latest' } },
587+
],
588+
}
589+
};
590+
}
591+
else {
592+
# we only want specific versions
593+
$filter_versions = { terms => { version => $versions } };
594+
}
595+
}
596+
570597
$query = {
571598
bool => {
572599
must => [
573-
{ term => { distribution => $dist } },
574-
{ terms => { version => $versions } },
600+
{ term => { distribution => $dist } },
601+
$filter_versions
575602
]
576603
}
577604
};

t/server/controller/release.t

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,48 @@ test_psgi app, sub {
5353
);
5454

5555
# versions (/release/versions/DIST)
56-
get_json_ok(
56+
my $versions = get_json_ok(
5757
$cb,
5858
'/release/versions/Moose',
5959
'GET /release/versions/Moose',
6060
{
6161
# ???
6262
}
6363
);
64+
is( @{ $versions->{releases} }, 2, "Got 2 Moose versions (all)" );
65+
66+
# versions - specific (/release/versions/DIST?versions=VERSION)
67+
my $versions_specific = get_json_ok(
68+
$cb,
69+
'/release/versions/Moose?versions=0.01',
70+
'GET /release/versions/Moose?versions=0.01',
71+
{
72+
# ???
73+
}
74+
);
75+
is( @{ $versions_specific->{releases} },
76+
1, "Got 1 Moose version (specificly requested)" );
77+
78+
# versions - latest (/release/versions/DIST?versions=latest)
79+
my $versions_latest = get_json_ok(
80+
$cb,
81+
'/release/versions/Moose?versions=latest',
82+
'GET /release/versions/Moose?versions=latest',
83+
{
84+
# ???
85+
}
86+
);
87+
is( @{ $versions_latest->{releases} },
88+
1, "Got 1 Moose version (only latest requested)" );
89+
is( $versions_latest->{releases}[0]{status},
90+
'latest', "Release status is latest" );
91+
92+
# versions - plain (/release/versions/DIST?plain=1)
93+
ok( my $versions_plain = $cb->( GET '/release/versions/Moose?plain=1' ),
94+
'GET /release/versions/Moose?plain=1' );
95+
is( $versions_plain->code, 200, 'code 200' );
96+
ok( $versions_plain->content =~ /\A .+ \t .+ \n .+ \t .+ \z/xsm,
97+
'Content is plain text result' );
6498

6599
# latest_by_distribution (/release/latest_by_distribution/DIST)
66100
get_json_ok(
@@ -74,4 +108,3 @@ test_psgi app, sub {
74108
};
75109

76110
done_testing;
77-

0 commit comments

Comments
 (0)