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   557118 use strict;
  3         26  
  3         96  
3 3     3   18 use warnings;
  3         5  
  3         88  
4              
5 3     3   16 use CPAN::Meta::Requirements;
  3         7  
  3         1509  
6              
7             sub new {
8 15     15 0 1140843 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 15         111 }, $class;
15              
16 15         365 return $self;
17             }
18              
19 203     203 0 635 sub reqs { $_[0]->{reqs} }
20 132     132 0 471 sub cpanfile { $_[0]->{cpanfile} }
21 57     57 0 215 sub snapshot { $_[0]->{snapshot} }
22              
23             sub read_cpanfile_requirements {
24 15     15 0 188 my ($self) = @_;
25              
26 15         52 for my $phase (qw(configure build runtime test develop)) {
27 75         16758 $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 15         959 return;
35             }
36              
37             sub merge_snapshot_versions {
38 16     16 0 135 my ($self, $merge_method, $with_core) = @_;
39              
40 16 100       65 my $find_method = $with_core ? 'find_or_core' : 'find';
41              
42 16         33 my $cpanfile_modules = [ keys %{$self->reqs->as_string_hash} ];
  16         42  
43              
44 16         2259 for my $module (@$cpanfile_modules) {
45 57 50       3784 next if $self->ignore_module($module); # skip modules url specified
46              
47 57         137 my $installed_dist = $self->snapshot->$find_method($module);
48 57 100       49182 if ($installed_dist) {
49 51         180 my $version = $installed_dist->version_for($module);
50 51 50       1637 $self->reqs->$merge_method($module, $version) if $version;
51             }
52             }
53             }
54              
55             sub ignore_module {
56 57     57 0 128 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 57   50     119 my $opts = $self->cpanfile->options_for_module($module) || {};
65 57 50       2235 return 1 if $opts->{dist};
66 57 50       202 return 1 if $opts->{url};
67 57         134 return 0;
68             }
69              
70             sub get_version_range {
71 61     61 0 877 my ($self, $module) = @_;
72              
73 61         146 my $version_range = $self->reqs->requirements_for_module($module);
74              
75 61 100 66     2531 return undef if !$version_range || $version_range eq '0';
76              
77             # Remove noisy '>= 0'.
78             # This causes when setting version by "add_maximum"
79 51         135 $version_range =~ s/\A>= 0, //;
80              
81 51         202 return $version_range;
82             }
83              
84             1;