CPAN-Visitor

 view release on metacpan or  search on metacpan

examples/scan-meta-files.pl  view on Meta::CPAN

# Contributed by Ricardo Signes
use CPAN::Visitor;
use Text::CSV_XS;;
use YAML::Tiny;

my $visitor = CPAN::Visitor->new(cpan => "/Users/rjbs/mirrors/minicpan");
my $count   = $visitor->select;

printf "preparing to scan %s files...\n", $count;

my $csv   = Text::CSV_XS->new;
my $total = 0;
my @data;

$csv->eol("\n");

open my $csv_fh, ">:encoding(utf8)", "dist.csv" or die "dist.csv: $!";

my @cols = qw(
  distfile
  author
  has_meta_yml has_meta_json meta_spec
  meta_generator meta_gen_package meta_gen_version
  meta_error
  has_dist_ini
);

$csv->print($csv_fh, \@cols);

my %template = map {; $_ => '' } @cols;

$visitor->iterate(
  visit => sub {
    my ($job) = @_;
    $total++;

    my %dist = %template;
    $dist{has_meta_yml}  = -e 'META.yml'  ? 1 : 0;
    $dist{has_meta_json} = -e 'META.json' ? 1 : 0;
    $dist{has_dist_ini}  = -e 'dist.ini'  ? 1 : 0;

    $dist{distfile} = $job->{distfile};
    ($dist{author}) = split m{/}, $job->{distfile};

    my ($data) = eval { YAML::Tiny->read('META.yml')->[0] };
    if ($data) {
      $dist{meta_spec} = eval { $data->{'meta-speak'}{version} };
      $dist{meta_generator} = $data->{generated_by};

      if ($data->{generated_by} =~ /(\S+) version (\S+)/) {
        $dist{meta_gen_package} = $1;
        $dist{meta_gen_version} = $2;
      }
    } else {
      my $error = $@;
      ($error) = split m{$}m, $error;
      $dist{meta_error} = $error;
    }

    $csv->print($csv_fh, [ @dist{ @cols } ]);
    say "completed $total / $count";
  }
);

close $csv_fh or die "new.csv: $!";



( run in 0.630 second using v1.01-cache-2.11-cpan-483215c6ad5 )