| 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; |