don't error on relationship deletion no-op
[scpubgit/stemmatology.git] / t / 00dependencies.t
1 #!/usr/bin/env perl
2
3 use warnings;
4 use strict;
5
6 =head1 DESCRIPTION
7
8 Makes sure that all of the modules that are 'use'd are listed in the
9 Makefile.PL as dependencies.
10
11 =cut
12
13 use Test::More;
14 use File::Find;
15 eval 'use Module::CoreList';
16 if ($@) { plan skip_all => 'Module::CoreList not installed' }
17
18 plan 'no_plan';
19
20 my %skipped;
21 if( -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 }
30 my %used;
31 find( \&wanted, qw/ lib t / );
32
33 sub 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)$/;
38     return if $skipped{$File::Find::name};
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
57 my %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
71 for ( sort keys %used ) {
72     my $first_in = Module::CoreList->first_release($_);
73     next if defined $first_in and $first_in <= 5.00803;
74     next if /^(Text::Tradition|inc|t|feature)(::|$)/;
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
83 for ( 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
89 1;
90