App-cpanm-meta-checker

 view release on metacpan or  search on metacpan

lib/App/cpanm/meta/checker/State.pm  view on Meta::CPAN

use 5.006;    # our
use strict;
use warnings;

package App::cpanm::meta::checker::State;

our $VERSION = '0.001002';

# ABSTRACT: Shared state for a single test run

our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY

use Moo qw(has);
use Carp qw(croak);
use CPAN::Meta;
use CPAN::Meta::Check qw(verify_dependencies);
use App::cpanm::meta::checker::State::Duplicates;
use Path::Tiny qw(path);





has 'tests' => (
  is       => ro =>,
  lazy     => 1,
  required => 1,
);





has 'list_fd' => (
  is      => ro =>,
  lazy    => 1,
  builder => sub {
    \*STDERR;
  },
);

has '_duplicates' => (
  is      => ro =>,
  lazy    => 1,
  builder => sub {
    return App::cpanm::meta::checker::State::Duplicates->new();
  },
);

sub _output {
  my ( $self, $prefix, $message ) = @_;
  return $self->list_fd->printf( qq[%s: %s\n], $prefix, $message );
}





sub x_test_list {
  my ( $self, $path, ) = @_;
  return $self->_output( 'list', path($path)->basename );
}





sub x_test_list_nonempty {
  my ( $self, $path ) = @_;
  return unless path($path)->children;
  return $self->_output( 'list_nonempty', path($path)->basename );
}





sub x_test_list_empty {
  my ( $self, $path ) = @_;
  return if path($path)->children;
  return $self->_output( 'list_empty', path($path)->basename );
}

## no critic (Compatibility::PerlMinimumVersionAndWhy)
# _Pulp__5010_qr_m_propagate_properly
my $distversion_re = qr{
    \A
    (.*)
    -
    (
        [^-]+
        (?:-TRIAL)?
    )
    \z
}msx;





sub x_test_list_duplicates {
  my ( $self, $path ) = @_;
  my $basename = path($path)->basename;
  my ( $dist, $version ) = $basename =~ $distversion_re;
  $self->_duplicates->seen_dist_version( $dist, $version );

  return unless $self->_duplicates->has_duplicates($dist);

  my $label = 'list_duplicates';
  my $fmt   = '%s-%s';

  if ( $self->_duplicates->reported_duplicates($dist) ) {
    $self->_output( $label, sprintf $fmt, $dist, $version );
    return;
  }

  $self->_output( $label, sprintf $fmt, $dist, $_ ) for $self->_duplicates->duplicate_versions($dist);

  $self->_duplicates->reported_duplicates( $dist, 1 );

  return;
}

sub _cache_cpan_meta {
  my ( undef, $path, $state ) = @_;
  return $state->{cpan_meta} if defined $state->{cpan_meta};
  return ( $state->{cpan_meta} = CPAN::Meta->load_file( path($path)->child('MYMETA.json') ) );
}

sub _cpan_meta_check_phase_type {
  my ( $self, %args ) = @_;
  my $meta = $self->_cache_cpan_meta( $args{path}, $args{state} );
  for my $dep ( verify_dependencies( $meta, $args{phase}, $args{type} ) ) {
    $self->_output( $args{label}, ( sprintf '%s: %s', path( $args{path} )->basename, $dep ) );
  }
  return;
}











































for my $phase (qw( runtime configure build develop test )) {
  for my $rel (qw( requires suggests conflicts recommends )) {
    my $method = 'x_test_check_' . $phase . '_' . $rel;

    my $code = sub {
      my ( $self, $path, $state ) = @_;
      return $self->_cpan_meta_check_phase_type(
        path  => $path,
        state => $state,
        label => ( 'check_' . $phase . '_' . $rel ),
        phase => $phase,
        type  => $rel,
      );



( run in 3.604 seconds using v1.01-cache-2.11-cpan-d8267643d1d )