@@ -51,7 +51,7 @@ has query_release => (
51
51
isa => ' MetaCPAN::Query::Release' ,
52
52
lazy => 1,
53
53
builder => ' _build_query_release' ,
54
- handles => [qw< get_checksums > ],
54
+ handles => [qw< find_download_url > ],
55
55
);
56
56
57
57
sub _build_query_release {
@@ -203,230 +203,6 @@ sub documented_modules {
203
203
-> source( [qw( name module path documentation distribution) ] )-> all;
204
204
}
205
205
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
-
430
206
=head2 history
431
207
432
208
Find the history of a given module/documentation.
0 commit comments