From: Tara L Andrews Date: Sun, 2 Oct 2011 00:06:20 +0000 (+0200) Subject: keep module dependencies in sync X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=bd645f0ff0678d2b9d1f94b9d6d547ef84411498;p=scpubgit%2Fstemmatology.git keep module dependencies in sync --- diff --git a/t/00dependencies.t b/t/00dependencies.t new file mode 100644 index 0000000..ac53bf0 --- /dev/null +++ b/t/00dependencies.t @@ -0,0 +1,79 @@ +#!/usr/bin/env perl + +use warnings; +use strict; + +=head1 DESCRIPTION + +Makes sure that all of the modules that are 'use'd are listed in the +Makefile.PL as dependencies. + +=cut + +use Test::More; +use File::Find; +eval 'use Module::CoreList'; +if ($@) { plan skip_all => 'Module::CoreList not installed' } + +plan 'no_plan'; + +my %used; +find( \&wanted, qw/ lib t / ); + +sub wanted { + return unless -f $_; + return if $File::Find::dir =~ m!/.git($|/)!; + return if $File::Find::name =~ /~$/; + return if $File::Find::name =~ /\.(pod|html)$/; + + # read in the file from disk + my $filename = $_; + local $/; + open( FILE, $filename ) or return; + my $data = ; + close(FILE); + + # strip pod, in a really idiotic way. Good enough though + $data =~ s/^=head.+?(^=cut|\Z)//gms; + + # look for use and use base statements + $used{$1}{$File::Find::name}++ while $data =~ /^\s*use\s+([\w:]+)/gm; + while ( $data =~ m|^\s*use base qw.([\w\s:]+)|gm ) { + $used{$_}{$File::Find::name}++ for split ' ', $1; + } +} + +my %required; +{ + local $/; + ok( open( MAKEFILE, "Makefile.PL" ), "Opened Makefile" ); + my $data = ; + close(FILE); + while ( $data =~ /^\s*?(?:requires|recommends|).*?([\w:]+)'(?:\s*=>\s*['"]?([\d\.]+)['"]?)?.*?(?:#(.*))?$/gm ) { + $required{$1} = $2; + if ( defined $3 and length $3 ) { + $required{$_} = undef for split ' ', $3; + } + } +} + +for ( sort keys %used ) { + my $first_in = Module::CoreList->first_release($_); + next if defined $first_in and $first_in <= 5.00803; + next if /^(Text::Tradition|inc|t)(::|$)/; + + #warn $_; + ok( exists $required{$_}, "$_ in Makefile.PL" ) + or diag( "used in ", join ", ", sort keys %{ $used{$_} } ); + delete $used{$_}; + delete $required{$_}; +} + +for ( sort keys %required ) { + my $first_in = Module::CoreList->first_release( $_, $required{$_} ); + fail("Required module $_ (v. $required{$_}) is in core since $first_in") + if defined $first_in and $first_in <= 5.008003; +} + +1; +