File Coverage

blib/lib/CPAN/Meta/Prereqs/Filter.pm
Criterion Covered Total %
statement 49 65 75.3
branch 22 38 57.8
condition 1 5 20.0
subroutine 7 7 100.0
pod 1 1 100.0
total 80 116 68.9


line stmt bran cond sub pod time code
1             package CPAN::Meta::Prereqs::Filter;
2             $CPAN::Meta::Prereqs::Filter::VERSION = '0.007';
3 1     1   158566 use strict;
  1         2  
  1         48  
4 1     1   6 use warnings;
  1         2  
  1         69  
5              
6 1     1   8 use Exporter 5.57 'import';
  1         21  
  1         79  
7             our @EXPORT_OK = qw/filter_prereqs/;
8              
9 1     1   7 use Carp 'croak';
  1         5  
  1         68  
10 1     1   8 use Scalar::Util 'isvstring';
  1         2  
  1         1073  
11              
12             my @phases = qw/configure build test runtime develop/;
13             my @relationships = qw/requires recommends suggests/;
14              
15             my %dependents_for = (
16             configure => [ qw/build test develop/ ],
17             runtime => [ qw/build test develop/ ],
18             build => [ qw/test develop/ ],
19             test => [ qw/develop/ ],
20             );
21              
22             sub _normalize_version {
23 1     1   1 my $raw = shift;
24 1 50       6 if (isvstring($raw)) {
25 0         0 $raw = sprintf 'v%vd', $raw;
26             }
27 1 50       7 if ($raw =~ / \A v5 (?> \. \d+)* \z /x) {
    50          
28 0         0 require version;
29 0         0 return sprintf '%7.6f', version->new($raw)->numify;
30             }
31             elsif ($raw eq 'latest') {
32 0         0 require Module::CoreList;
33 0         0 return (reverse sort keys %Module::CoreList::version)[0];
34             }
35 1         6 return sprintf '%7.6f', $raw;
36             }
37              
38             sub filter_prereqs {
39 3     3 1 206385 my ($prereqs, %args) = @_;
40 3 50       7 return $prereqs if not grep { $_ } values %args;
  3         14  
41 3         11 $prereqs = $prereqs->clone;
42 3 100       897 my $core_version = defined $args{omit_core} ? _normalize_version($args{omit_core}) : undef;
43 3 100       7 if ($core_version) {
44 1         4039 require Module::CoreList;
45 1 50       215403 croak "$core_version is not a known perl version" if not exists $Module::CoreList::version{$core_version};
46 1         3 for my $phase (@phases) {
47 5         1287 for my $relation (@relationships) {
48 15         54 my $req = $prereqs->requirements_for($phase, $relation);
49              
50 15 50       450 $req->clear_requirement('perl') if $req->accepts_module('perl', $core_version);
51 15         237 for my $module ($req->required_modules) {
52 2 100       28 next if not exists $Module::CoreList::version{$core_version}{$module};
53 1 50       3 next if not $req->accepts_module($module, $Module::CoreList::version{$core_version}{$module});
54 1 50       78 next if Module::CoreList->is_deprecated($module, $core_version);
55 1         43 $req->clear_requirement($module);
56             }
57             }
58             }
59             }
60 3 50       155 if ($args{sanitize}) {
61 0         0 for my $parent (qw/runtime configure build/) {
62 0         0 for my $child ( @{ $dependents_for{$parent} } ) {
  0         0  
63 0         0 for my $relationship (@relationships) {
64 0         0 my $source = $prereqs->requirements_for($parent, $relationship);
65 0         0 my $sink = $prereqs->requirements_for($child, $relationship);
66 0         0 for my $module ($source->required_modules) {
67 0 0       0 next if not defined(my $right = $sink->requirements_for_module($module));
68 0         0 my $left = $source->requirements_for_module($module);
69 0 0       0 $sink->clear_requirement($module) if $left ge $right;
70             }
71             }
72             }
73             }
74             }
75 3 100       8 if ($args{only_missing}) {
76 1         635 require Module::Metadata;
77 1         5656 for my $phase (@phases) {
78 5         16 for my $relation (@relationships) {
79 15         46 my $req = $prereqs->requirements_for($phase, $relation);
80 15 50       426 $req->clear_requirement('perl') if $req->accepts_module('perl', $]);
81 15         143 for my $module ($req->required_modules) {
82 3 100       360 if ($req->requirements_for_module($module)) {
83 1         34 my $metadata = Module::Metadata->new_from_module($module);
84 1 50 0     300 if ($metadata && $req->accepts_module($module, $metadata->version($module) || 0)) {
      33        
85 0         0 $req->clear_requirement($module);
86             }
87             }
88             else {
89 2 50       76 $req->clear_requirement($module) if Module::Metadata->find_module_by_name($module);
90             }
91             }
92             }
93             }
94             }
95 3         17 return $prereqs;
96             }
97              
98             1;
99              
100             # ABSTRACT: Filtering various things out of CPAN::Meta::Prereqs
101              
102             __END__