Module::CPANTS::Generator::ModuleInfo - Find author, description


Module-CPANTS-Generator documentation Contained in the Module-CPANTS-Generator distribution.

Index


Code Index:

NAME

Top

Module::CPANTS::Generator::ModuleInfo - Find author, description

SYNOPSIS

Top

  use Module::CPANTS::Generator::ModuleInfo;

  my $m = Module::CPANTS::Generator::ModuleInfo->new;
  $m->cpanplus($cpanplus);
  $m->generate;

DESCRIPTION

Top

This module is part of the beta CPANTS project. It goes through the CPANPLUS module tree and adds information about distribution author and description. If the description is missing, it tries to find it from the POD of the main module in the distribution.

AUTHOR

Top

Leon Brocard <acme@astray.com>

LICENSE

Top

This code is distributed under the same license as Perl.


Module-CPANTS-Generator documentation Contained in the Module-CPANTS-Generator distribution.

package Module::CPANTS::Generator::ModuleInfo;
use strict;
use Carp;
use Clone qw(clone);
use File::Find::Rule;
use Pod::POM;
use Module::CPANTS::Generator;
use String::Approx qw(adist);
use base 'Module::CPANTS::Generator';

use vars qw($VERSION);
$VERSION = "0.005";

sub generate {
  my $self = shift;

  my $cpants = $self->grab_cpants;
  my $cp = $self->cpanplus || croak("No CPANPLUS object");

  my %seen;
  my $count;
#  foreach my $module (sort { $a->package cmp $b->package } values %{$cp->module_tree}) {
  foreach my $module (values %{$cp->module_tree}) {
    my $package = $module->package;
    next unless $package;
    next unless -d $package;
    next if $seen{$package}++;

    # copy over the size
    $cpants->{cpants}->{$package}->{size} = clone($cpants->{$package}->{size});

    if (not exists $cpants->{$package}->{author}) {
      my $author = $module->author;
      $cpants->{$package}->{author} = $author;
    }
    $cpants->{cpants}->{$package}->{author} = clone($cpants->{$package}->{author});

    if (not exists $cpants->{$package}->{description}) {
      my $description = $module->description;
      $description ||= $self->get_description($module->module, $package);
      $cpants->{$package}->{description} = $description;
    }
    $cpants->{cpants}->{$package}->{description} = clone($cpants->{$package}->{description});
  }

  $self->save_cpants($cpants);
}

sub get_description {
  my($self, $module, $package) = @_;
  my $cpanplus = $self->cpanplus;

  # get all the files in the package
  my @files = File::Find::Rule->file()
    ->name('*.pm')
    ->in($package);

  # find the main file in the package

print "* $package *\n";
  my $bestfile;
  my $bestscore = 1000;
  foreach my $file (@files) {
    my $origfile = $file;
    $file =~ s/$package//;
    $file =~ s{/}{-}g;
    $file =~ s/^-//;
    $file =~ s/\.pm$//;
    $file =~ s/^lib-//;
#    my $dist = adist($package, $file);
    my $dist = abs(adist($file, $package));
#    print "$file: $dist\n";
    if ($dist < $bestscore) {
      $bestfile = $origfile;
      $bestscore = $dist;
    }
  }
  print "  $bestfile\n";

  # parse the file and try and get the description

  my $parser = Pod::POM->new();

  my($name, $description);

  eval {
    my $pom = $parser->parse($bestfile)
      || return undef;

    foreach my $head1 ($pom->head1()) {
      my $title = $head1->title;
      next unless "$title" eq 'NAME';
      my $content = $head1->content;
      $content =~ s/\n/ /g;
      $content =~ s/ +/ /g;
      $content =~ s/ $//g;
      ($name, $description) = split /- ?/, $content, 2;
      print "  $description\n";
      last;
    }
  };

  if ($@) {
    print "  NOT FOUND DESCRIPTION\n";
  }

  return $description;
}

1;

__END__