Created
September 20, 2008 14:48
-
-
Save dann/11757 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
use strict; | |
use warnings; | |
use Carp; | |
use PPI::Document; | |
use Path::Class qw(dir); | |
use File::Find::Rule; | |
use List::MoreUtils qw(uniq any); | |
use Perl6::Say; | |
main(); | |
sub main { | |
my $dir = $ARGV[0]; | |
croak 'module dir must be set.' unless $dir; | |
my $perl_files = find_perl_files($dir); | |
my $all_modules = extract_all_modules($perl_files); | |
my $module_name_space = $ARGV[1]; | |
croak 'module namespace must be set.' unless $module_name_space; | |
my $modules_in_plagger | |
= used_modules_by_module( $all_modules, $module_name_space ); | |
print_modules($modules_in_plagger); | |
} | |
sub extract_all_modules { | |
my $perl_files = shift; | |
my @all_modules = (); | |
for my $file ( @{$perl_files} ) { | |
my $modules = extract_modules($file); | |
push @all_modules, @{$modules}; | |
} | |
¥@all_modules; | |
} | |
sub find_perl_files { | |
my $module_dir = shift; | |
my @files = File::Find::Rule->file()->name('*.pm')->in($module_dir); | |
¥@files; | |
} | |
sub extract_modules { | |
my $file = shift; | |
croak "File does not exist!" unless -e $file; | |
my $document = eval { PPI::Document->new($file) }; | |
unless ($document) { | |
warn "Could not parse file [$file]"; | |
return; | |
} | |
my $modules = $document->find( ¥&is_module_statement ); | |
my @modules = eval { | |
map { $_->module } @{$modules}; | |
}; | |
¥@modules; | |
} | |
sub is_module_statement { | |
my $ppi = $_[1]; | |
return 0 unless ( $ppi->isa('PPI::Statement::Include') ); | |
return 0 unless $ppi->type eq 'use'; | |
my @not_modules | |
= qw/strict warnings utf8 overload integer mro parent vars constant bytes attributes base/; | |
return 0 if any { $ppi->module eq $_ } @not_modules; | |
return 1; | |
} | |
sub used_modules_by_module { | |
my $all_modules = shift; | |
my $module_namespace = shift; | |
my @used_modules = uniq @{$all_modules}; | |
@used_modules = grep { $_ !~ /^${module_namespace}/ } @used_modules; | |
¥@used_modules; | |
} | |
sub print_modules { | |
my $modules = shift; | |
my @sorted_modules = sort @{$modules}; | |
say join( "¥n", @sorted_modules ); | |
} | |
__END__ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment