File Coverage

blib/lib/App/CpanfileSlipstop/Resolver.pm
Criterion Covered Total %
statement 39 39 100.0
branch 10 14 71.4
condition 3 5 60.0
subroutine 11 11 100.0
pod 0 8 0.0
total 63 77 81.8


line stmt bran cond sub pod time code
1             package App::CpanfileSlipstop::Resolver;
2 3     3   443447 use strict;
  3         20  
  3         74  
3 3     3   14 use warnings;
  3         5  
  3         70  
4              
5 3     3   13 use CPAN::Meta::Requirements;
  3         6  
  3         1173  
6              
7             sub new {
8 17     17 0 1031861 my ($class, %args) = @_;
9              
10             my $self = bless +{
11             reqs => CPAN::Meta::Requirements->new,
12             cpanfile => $args{cpanfile}, # Module::CPANfile
13             snapshot => $args{snapshot}, # Carton::Snapshot
14 17         69 }, $class;
15              
16 17         269 return $self;
17             }
18              
19 231     231 0 569 sub reqs { $_[0]->{reqs} }
20 150     150 0 380 sub cpanfile { $_[0]->{cpanfile} }
21 65     65 0 207 sub snapshot { $_[0]->{snapshot} }
22              
23             sub read_cpanfile_requirements {
24 17     17 0 143 my ($self) = @_;
25              
26 17         44 for my $phase (qw(configure build runtime test develop)) {
27 85         14572 $self->reqs->add_requirements(
28             $self->cpanfile->prereqs->requirements_for($phase, 'requires')
29             );
30             }
31             # `carton install` only treats 'requires'.
32             # https://metacpan.org/source/MIYAGAWA/Carton-v1.0.34/lib/Carton/CPANfile.pm#L38
33              
34 17         875 return;
35             }
36              
37             sub merge_snapshot_versions {
38 18     18 0 118 my ($self, $merge_method, $with_core) = @_;
39              
40 18 100       55 my $find_method = $with_core ? 'find_or_core' : 'find';
41              
42 18         24 my $cpanfile_modules = [ keys %{$self->reqs->as_string_hash} ];
  18         39  
43              
44 18         2038 for my $module (@$cpanfile_modules) {
45 65 50       3372 next if $self->ignore_module($module); # skip modules url specified
46              
47 65         123 my $installed_dist = $self->snapshot->$find_method($module);
48 65 100       44786 if ($installed_dist) {
49 59         146 my $version = $installed_dist->version_for($module);
50 59 50       1183 $self->reqs->$merge_method($module, $version) if $version;
51             }
52             }
53             }
54              
55             sub ignore_module {
56 65     65 0 140 my ($self, $module) = @_;
57              
58             # ignore like this.
59             #
60             # requires 'Class::Enumemon',
61             # mirror => 'https://cpan.metacpan.org/',
62             # dist => 'POKUTUNA/Class-Enumemon-0.01.tar.gz';
63              
64 65   50     112 my $opts = $self->cpanfile->options_for_module($module) || {};
65 65 50       1957 return 1 if $opts->{dist};
66 65 50       154 return 1 if $opts->{url};
67 65         119 return 0;
68             }
69              
70             sub get_version_range {
71 69     69 0 708 my ($self, $module) = @_;
72              
73 69         135 my $version_range = $self->reqs->requirements_for_module($module);
74              
75 69 100 66     2259 return undef if !$version_range || $version_range eq '0';
76              
77             # Remove noisy '>= 0'.
78             # This causes when setting version by "add_maximum"
79 59         128 $version_range =~ s/\A>= 0, //;
80              
81 59         157 return $version_range;
82             }
83              
84             1;