perl solver works again too
[scpubgit/stemmatology.git] / t / 00dependencies.t
CommitLineData
bd645f0f 1#!/usr/bin/env perl
2
3use warnings;
4use strict;
5
6=head1 DESCRIPTION
7
8Makes sure that all of the modules that are 'use'd are listed in the
9Makefile.PL as dependencies.
10
11=cut
12
13use Test::More;
14use File::Find;
15eval 'use Module::CoreList';
16if ($@) { plan skip_all => 'Module::CoreList not installed' }
17
18plan 'no_plan';
19
a44aaf2a 20my %skipped;
21if( -f 'MANIFEST.SKIP' ) {
22 # We don't want these
23 open( SKIP, 'MANIFEST.SKIP' ) or die "Could not open manifest skip file";
24 while(<SKIP>) {
25 chomp;
26 $skipped{$_} = 1;
27 }
28 close SKIP;
29}
bd645f0f 30my %used;
31find( \&wanted, qw/ lib t / );
32
33sub wanted {
34 return unless -f $_;
35 return if $File::Find::dir =~ m!/.git($|/)!;
36 return if $File::Find::name =~ /~$/;
37 return if $File::Find::name =~ /\.(pod|html)$/;
a44aaf2a 38 return if $skipped{$File::Find::name};
bd645f0f 39
40 # read in the file from disk
41 my $filename = $_;
42 local $/;
43 open( FILE, $filename ) or return;
44 my $data = <FILE>;
45 close(FILE);
46
47 # strip pod, in a really idiotic way. Good enough though
48 $data =~ s/^=head.+?(^=cut|\Z)//gms;
49
50 # look for use and use base statements
51 $used{$1}{$File::Find::name}++ while $data =~ /^\s*use\s+([\w:]+)/gm;
52 while ( $data =~ m|^\s*use base qw.([\w\s:]+)|gm ) {
53 $used{$_}{$File::Find::name}++ for split ' ', $1;
54 }
55}
56
57my %required;
58{
59 local $/;
60 ok( open( MAKEFILE, "Makefile.PL" ), "Opened Makefile" );
61 my $data = <MAKEFILE>;
62 close(FILE);
63 while ( $data =~ /^\s*?(?:requires|recommends|).*?([\w:]+)'(?:\s*=>\s*['"]?([\d\.]+)['"]?)?.*?(?:#(.*))?$/gm ) {
64 $required{$1} = $2;
65 if ( defined $3 and length $3 ) {
66 $required{$_} = undef for split ' ', $3;
67 }
68 }
69}
70
71for ( sort keys %used ) {
72 my $first_in = Module::CoreList->first_release($_);
73 next if defined $first_in and $first_in <= 5.00803;
f00cefe8 74 next if /^(Text::Tradition|inc|t|feature)(::|$)/;
bd645f0f 75
76 #warn $_;
77 ok( exists $required{$_}, "$_ in Makefile.PL" )
78 or diag( "used in ", join ", ", sort keys %{ $used{$_} } );
79 delete $used{$_};
80 delete $required{$_};
81}
82
83for ( sort keys %required ) {
84 my $first_in = Module::CoreList->first_release( $_, $required{$_} );
85 fail("Required module $_ (v. $required{$_}) is in core since $first_in")
86 if defined $first_in and $first_in <= 5.008003;
87}
88
891;
90