The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
#
# This file is part of Dist-Zilla-PluginBundle-Author-RWSTAUNER
#
# This software is copyright (c) 2010 by Randy Stauner.
#
# This is free software; you can redistribute it and/or modify it under
# the same terms as the Perl 5 programming language system itself.
#

use strict;
use warnings;

use Test::More tests => 1;

use ExtUtils::MakeMaker;
use File::Spec::Functions;
use List::Util qw/max/;

my @modules = qw(
  Data::Section
  Devel::Cover
  Dist::Zilla
  Dist::Zilla::App::Command::cover
  Dist::Zilla::Plugin::Authority
  Dist::Zilla::Plugin::AutoPrereqs
  Dist::Zilla::Plugin::Bootstrap::lib
  Dist::Zilla::Plugin::Bugtracker
  Dist::Zilla::Plugin::CheckChangesHasContent
  Dist::Zilla::Plugin::CheckExtraTests
  Dist::Zilla::Plugin::CheckMetaResources
  Dist::Zilla::Plugin::CheckPrereqsIndexed
  Dist::Zilla::Plugin::ConfirmRelease
  Dist::Zilla::Plugin::ContributorsFromGit
  Dist::Zilla::Plugin::DualBuilders
  Dist::Zilla::Plugin::ExecDir
  Dist::Zilla::Plugin::GatherDir
  Dist::Zilla::Plugin::GenerateFile
  Dist::Zilla::Plugin::Git::Describe
  Dist::Zilla::Plugin::Git::Init
  Dist::Zilla::Plugin::Git::NextVersion
  Dist::Zilla::Plugin::GithubMeta
  Dist::Zilla::Plugin::InstallRelease
  Dist::Zilla::Plugin::License
  Dist::Zilla::Plugin::MakeMaker
  Dist::Zilla::Plugin::Manifest
  Dist::Zilla::Plugin::ManifestSkip
  Dist::Zilla::Plugin::MetaConfig
  Dist::Zilla::Plugin::MetaJSON
  Dist::Zilla::Plugin::MetaNoIndex
  Dist::Zilla::Plugin::MetaProvides::Package
  Dist::Zilla::Plugin::MetaYAML
  Dist::Zilla::Plugin::MinimumPerl
  Dist::Zilla::Plugin::NextRelease
  Dist::Zilla::Plugin::OurPkgVersion
  Dist::Zilla::Plugin::PkgVersion
  Dist::Zilla::Plugin::PodWeaver
  Dist::Zilla::Plugin::Prepender
  Dist::Zilla::Plugin::PruneCruft
  Dist::Zilla::Plugin::PruneFiles
  Dist::Zilla::Plugin::Readme
  Dist::Zilla::Plugin::ReadmeAnyFromPod
  Dist::Zilla::Plugin::Repository
  Dist::Zilla::Plugin::Run
  Dist::Zilla::Plugin::Run::AfterMint
  Dist::Zilla::Plugin::ShareDir
  Dist::Zilla::Plugin::TaskWeaver
  Dist::Zilla::Plugin::TemplateModule
  Dist::Zilla::Plugin::Test::ChangesHasContent
  Dist::Zilla::Plugin::Test::PodSpelling
  Dist::Zilla::Plugin::Test::ReportPrereqs
  Dist::Zilla::Plugin::TestRelease
  Dist::Zilla::Plugin::UploadToCPAN
  Dist::Zilla::PluginBundle::Git
  Dist::Zilla::PluginBundle::TestingMania
  Dist::Zilla::Role::MintingProfile::ShareDir
  Dist::Zilla::Role::Plugin
  Dist::Zilla::Role::PluginBundle::Config::Slicer
  Dist::Zilla::Role::PluginBundle::Easy
  Dist::Zilla::Role::PluginBundle::PluginRemover
  Dist::Zilla::Role::Releaser
  Dist::Zilla::Stash::PodWeaver
  ExtUtils::MakeMaker
  File::Find
  File::ShareDir::Install
  File::Spec::Functions
  File::Temp
  Git::Wrapper
  List::Util
  Module::Build
  Moose
  Moose::Util::TypeConstraints
  MooseX::AttributeShortcuts
  Path::Class
  Pod::Elemental::Transformer::List
  Pod::Weaver
  Pod::Weaver::Config::Assembler
  Pod::Weaver::Plugin::Encoding
  Pod::Weaver::Plugin::StopWords
  Pod::Weaver::Plugin::Transformer
  Pod::Weaver::Plugin::WikiDoc
  Pod::Weaver::PluginBundle::CorePrep
  Pod::Weaver::Section::Authors
  Pod::Weaver::Section::Collect
  Pod::Weaver::Section::Contributors
  Pod::Weaver::Section::Generic
  Pod::Weaver::Section::Leftovers
  Pod::Weaver::Section::Legal
  Pod::Weaver::Section::Name
  Pod::Weaver::Section::Region
  Pod::Weaver::Section::Support
  Pod::Weaver::Section::Version
  Test::DZil
  Test::File::ShareDir
  Test::More
  YAML::Tiny
  perl
  strict
  warnings
);

# replace modules with dynamic results from MYMETA.json if we can
# (hide CPAN::Meta from prereq scanner)
my $cpan_meta = "CPAN::Meta";
if ( -f "MYMETA.json" && eval "require $cpan_meta" ) { ## no critic
  if ( my $meta = eval { CPAN::Meta->load_file("MYMETA.json") } ) {
    my $prereqs = $meta->prereqs;
    delete $prereqs->{develop};
    my %uniq = map {$_ => 1} map { keys %$_ } map { values %$_ } values %$prereqs;
    $uniq{$_} = 1 for @modules; # don't lose any static ones
    @modules = sort keys %uniq;
  }
}

my @reports = [qw/Version Module/];

for my $mod ( @modules ) {
  next if $mod eq 'perl';
  my $file = $mod;
  $file =~ s{::}{/}g;
  $file .= ".pm";
  my ($prefix) = grep { -e catfile($_, $file) } @INC;
  if ( $prefix ) {
    my $ver = MM->parse_version( catfile($prefix, $file) );
    $ver = "undef" unless defined $ver; # Newer MM should do this anyway
    push @reports, [$ver, $mod];
  }
  else {
    push @reports, ["missing", $mod];
  }
}

if ( @reports ) {
  my $vl = max map { length $_->[0] } @reports;
  my $ml = max map { length $_->[1] } @reports;
  splice @reports, 1, 0, ["-" x $vl, "-" x $ml];
  diag "Prerequisite Report:\n", map {sprintf("  %*s %*s\n",$vl,$_->[0],-$ml,$_->[1])} @reports;
}

pass;

# vim: ts=2 sts=2 sw=2 et: