Dist-Zilla-Plugin-Module-Features

 view release on metacpan or  search on metacpan

lib/Dist/Zilla/Plugin/Module/Features.pm  view on Meta::CPAN

    $self->log_debug("Trying to get abstract from ".($filename ? "file $filename" : "file content"));

    local @INC = @INC;
    unshift @INC, 'lib';

    unless (defined $filecontent) {
        $filecontent = do {
            open my($fh), "<", $filename or die "Can't open $filename: $!";
            local $/;
            ~~<$fh>;
        };
    }

    unless ($filecontent =~ m{^#[ \t]*ABSTRACT:[ \t]*([^\n]*)[ \t]*$}m) {
        $self->log_debug(["Skipping %s: no # ABSTRACT", $filename]);
        return undef; ## no critic: Subroutines::ProhibitExplicitReturnUndef
    }

    my $abstract = $1;
    if ($abstract =~ /\S/) {
        $self->log_debug(["Skipping %s: Abstract already filled (%s)", $filename, $abstract]);
        return $abstract;
    }

    my $pkg;
    if (!defined($filecontent)) {
        (my $mod_p = $filename) =~ s!^lib/!!;
        require $mod_p;

        # find out the package of the file
        ($pkg = $mod_p) =~ s/\.pm\z//; $pkg =~ s!/!::!g;
    } else {
        eval $filecontent; ## no critic: BuiltinFunctions::ProhibitStringyEval
        die if $@;
        if ($filecontent =~ /\bpackage\s+(\w+(?:::\w+)*)/s) {
            $pkg = $1;
        } else {
            die "Can't extract package name from file content";
        }
    }

    my $summary;
    no strict 'refs'; ## no critic: TestingAndDebugging::RequireUseStrict
    if (defined($summary = ${"$pkg\::FEATURES"}{summary})) {
        $self->log_debug("Using abstract from declaration summary: $summary");
        return $summary;
    } elsif (defined($summary = ${"$pkg\::FEATURES_DEF"}{summary})) {
        $self->log_debug("Using abstract from features definition summary: $summary");
        return $summary;
    }
    undef;
}

# dzil also wants to get abstract for main module to put in dist's
# META.{yml,json}
sub before_build {
   my $self  = shift;
   my $name  = $self->zilla->name;
   my $class = $name; $class =~ s{ [\-] }{::}gmx;
   my $filename = $self->zilla->_main_module_override ||
       catfile( 'lib', split m{ [\-] }mx, "${name}.pm" );

   $self->_load_modules;

   $filename or die 'No main module specified';
   -f $filename or die "Path ${filename} does not exist or not a file";
   my $abstract = $self->_get_abstract_from_def_or_decl($filename);
   return unless $abstract;

   $self->zilla->abstract($abstract);
   return;
}

sub register_prereqs {
    my ($self) = @_;
    $self->zilla->register_prereqs(
        {
            type  => 'requires',
            phase => 'develop',
        },
        'Test::Module::Features' => version_from_pmversions('Test::Module::Features') // '0.001',
    );

    for my $defmod (@definer_modules) {
        $self->zilla->register_prereqs(
            {
                type  => 'x_features_from',
                phase => 'develop',
            },
            $defmod => version_from_pmversions($defmod) // '0',
        );
    }
}

sub gather_files {
    my ($self) = @_;

    #return unless $self->check_dist_defines_module_features;

    my $filename = "xt/release/module-features.t";
    my $filecontent = <<_;
#!perl

# This file was automatically generated by ${\(__PACKAGE__)}.

use Test::More;

eval "use Test::Module::Features 0.001";
plan skip_all => "Test::Module::Features 0.001+ required for testing module features"
  if \$@;

module_features_in_all_modules_ok();
_

    $self->log(["Adding %s ...", $filename]);
    require Dist::Zilla::File::InMemory;
    $self->add_file(
        Dist::Zilla::File::InMemory->new({
            name => $filename,
            content => $filecontent,
        })



( run in 1.970 second using v1.01-cache-2.11-cpan-71847e10f99 )