Skip to content

Commit 9f07286

Browse files
authored
Merge pull request #1185 from metacpan/haarg/perl-download-url
return correct data from download_url end point for "perl"
2 parents 2fd8305 + 0d850ff commit 9f07286

File tree

3 files changed

+249
-226
lines changed

3 files changed

+249
-226
lines changed

lib/MetaCPAN/Document/File/Set.pm

+1-225
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ has query_release => (
5151
isa => 'MetaCPAN::Query::Release',
5252
lazy => 1,
5353
builder => '_build_query_release',
54-
handles => [qw< get_checksums >],
54+
handles => [qw< find_download_url >],
5555
);
5656

5757
sub _build_query_release {
@@ -203,230 +203,6 @@ sub documented_modules {
203203
->source( [qw(name module path documentation distribution)] )->all;
204204
}
205205

206-
=head2 find_download_url
207-
208-
209-
cpanm Foo
210-
=> status: latest, maturity: released
211-
212-
cpanm --dev Foo
213-
=> status: -backpan, sort_by: version_numified,date
214-
215-
cpanm Foo~1.0
216-
=> status: latest, maturity: released, module.version_numified: gte: 1.0
217-
218-
cpanm --dev Foo~1.0
219-
-> status: -backpan, module.version_numified: gte: 1.0, sort_by: version_numified,date
220-
221-
cpanm Foo~<2
222-
=> maturity: released, module.version_numified: lt: 2, sort_by: status,version_numified,date
223-
224-
cpanm --dev Foo~<2
225-
=> status: -backpan, module.version_numified: lt: 2, sort_by: status,version_numified,date
226-
227-
$file->find_download_url( 'Foo', { version => $version, dev => 0|1 });
228-
229-
Sorting:
230-
231-
if it's stable:
232-
prefer latest > cpan > backpan
233-
then sort by version desc
234-
then sort by date descending (rev chron)
235-
236-
if it's dev:
237-
sort by version desc
238-
sort by date descending (reverse chronologically)
239-
240-
241-
=cut
242-
243-
sub find_download_url {
244-
my ( $self, $module, $args ) = @_;
245-
$args ||= {};
246-
247-
my $dev = $args->{dev};
248-
my $version = $args->{version};
249-
my $explicit_version = $version && $version =~ /==/;
250-
251-
my @filters;
252-
if ( !$explicit_version ) {
253-
push @filters, { not => { term => { status => 'backpan' } } };
254-
if ( !$dev ) {
255-
push @filters, { term => { maturity => 'released' } };
256-
}
257-
}
258-
259-
my $version_filters = $self->_version_filters($version);
260-
261-
# filters to be applied to the nested modules
262-
my $module_f = {
263-
nested => {
264-
path => 'module',
265-
inner_hits => { _source => 'version' },
266-
filter => {
267-
bool => {
268-
must => [
269-
{ term => { 'module.authorized' => 1 } },
270-
{ term => { 'module.indexed' => 1 } },
271-
{ term => { 'module.name' => $module } },
272-
(
273-
exists $version_filters->{must}
274-
? @{ $version_filters->{must} }
275-
: ()
276-
)
277-
],
278-
(
279-
exists $version_filters->{must_not}
280-
? ( must_not => [ $version_filters->{must_not} ] )
281-
: ()
282-
)
283-
}
284-
}
285-
}
286-
};
287-
288-
my $filter
289-
= @filters
290-
? { bool => { must => [ @filters, $module_f ] } }
291-
: $module_f;
292-
293-
# sort by score, then version desc, then date desc
294-
my @sort = (
295-
'_score',
296-
{
297-
'module.version_numified' => {
298-
mode => 'max',
299-
order => 'desc',
300-
nested_path => 'module',
301-
nested_filter => $module_f->{nested}{filter}
302-
}
303-
},
304-
{ date => { order => 'desc' } }
305-
);
306-
307-
my $query;
308-
309-
if ($dev) {
310-
$query = { filtered => { filter => $filter } };
311-
}
312-
else {
313-
# if not dev, then prefer latest > cpan > backpan
314-
$query = {
315-
function_score => {
316-
filter => $filter,
317-
score_mode => 'first',
318-
boost_mode => 'replace',
319-
functions => [
320-
{
321-
filter => { term => { status => 'latest' } },
322-
weight => 3
323-
},
324-
{
325-
filter => { term => { status => 'cpan' } },
326-
weight => 2
327-
},
328-
{ filter => { match_all => {} }, weight => 1 },
329-
]
330-
}
331-
};
332-
}
333-
334-
my $res
335-
= $self->size(1)->query($query)
336-
->source( [ 'release', 'download_url', 'date', 'status' ] )
337-
->search_type('dfs_query_then_fetch')->sort( \@sort )->raw->all;
338-
return unless $res->{hits}{total};
339-
340-
my @checksums;
341-
342-
my $hit = $res->{hits}{hits}[0];
343-
my $release = exists $hit->{_source} ? $hit->{_source}{release} : undef;
344-
345-
if ($release) {
346-
my $checksums = $self->get_checksums($release);
347-
@checksums = (
348-
(
349-
$checksums->{checksum_md5}
350-
? ( checksum_md5 => $checksums->{checksum_md5} )
351-
: ()
352-
),
353-
(
354-
$checksums->{checksum_sha256}
355-
? ( checksum_sha256 => $checksums->{checksum_sha256} )
356-
: ()
357-
),
358-
);
359-
}
360-
361-
return +{
362-
%{ $hit->{_source} },
363-
%{ $hit->{inner_hits}{module}{hits}{hits}[0]{_source} }, @checksums,
364-
};
365-
}
366-
367-
sub _version_filters {
368-
my ( $self, $version ) = @_;
369-
370-
return () unless $version;
371-
372-
if ( $version =~ s/^==\s*// ) {
373-
return +{
374-
must => [ {
375-
term => {
376-
'module.version_numified' => $self->_numify($version)
377-
}
378-
} ]
379-
};
380-
}
381-
elsif ( $version =~ /^[<>!]=?\s*/ ) {
382-
my %ops = qw(< lt <= lte > gt >= gte);
383-
my ( %filters, %range, @exclusion );
384-
my @requirements = split /,\s*/, $version;
385-
for my $r (@requirements) {
386-
if ( $r =~ s/^([<>]=?)\s*// ) {
387-
$range{ $ops{$1} } = $self->_numify($r);
388-
}
389-
elsif ( $r =~ s/\!=\s*// ) {
390-
push @exclusion, $self->_numify($r);
391-
}
392-
}
393-
394-
if ( keys %range ) {
395-
$filters{must}
396-
= [ { range => { 'module.version_numified' => \%range } } ];
397-
}
398-
399-
if (@exclusion) {
400-
$filters{must_not} = [];
401-
push @{ $filters{must_not} }, map {
402-
+{
403-
term => {
404-
'module.version_numified' => $self->_numify($_)
405-
}
406-
}
407-
} @exclusion;
408-
}
409-
410-
return \%filters;
411-
}
412-
elsif ( $version !~ /\s/ ) {
413-
return +{
414-
must => [ {
415-
range => {
416-
'module.version_numified' =>
417-
{ 'gte' => $self->_numify($version) }
418-
},
419-
} ]
420-
};
421-
}
422-
}
423-
424-
sub _numify {
425-
my ( $self, $ver ) = @_;
426-
$ver =~ s/_//g;
427-
version->new($ver)->numify;
428-
}
429-
430206
=head2 history
431207
432208
Find the history of a given module/documentation.

0 commit comments

Comments
 (0)