#!/usr/bin/perl # # Check for spelling errors in POD documentation # # Checks all POD files in the tree for spelling problems using Pod::Spell and # either aspell or ispell. aspell is preferred. This test is disabled unless # RRA_MAINTAINER_TESTS is set, since spelling dictionaries vary too much # between environments. # # Copyright 2008, 2009 Russ Allbery # # See LICENSE for licensing terms. use strict; use Test::More; # Skip all spelling tests unless the maintainer environment variable is set. plan skip_all => 'Spelling tests only run for maintainer' unless $ENV{RRA_MAINTAINER_TESTS}; # Load required Perl modules. eval 'use Test::Pod 1.00'; plan skip_all => 'Test::Pod 1.00 required for testing POD' if $@; eval 'use Pod::Spell'; plan skip_all => 'Pod::Spell required to test POD spelling' if $@; # Locate a spell-checker. hunspell is not currently supported due to its lack # of support for contractions (at least in the version in Debian). my @spell; my %options = (aspell => [ qw(-d en_US --home-dir=./ list) ], ispell => [ qw(-d american -l -p /dev/null) ]); SEARCH: for my $program (qw/aspell ispell/) { for my $dir (split ':', $ENV{PATH}) { if (-x "$dir/$program") { @spell = ("$dir/$program", @{ $options{$program} }); } last SEARCH if @spell; } } plan skip_all => 'aspell or ispell required to test POD spelling' unless @spell; # Prerequisites are satisfied, so we're going to do some testing. Figure out # what POD files we have and from that develop our plan. $| = 1; my @pod = map { s,[^/]+/../,,; $_ } (glob ("$ENV{SOURCE}/../docs/*.pod"), glob ("$ENV{SOURCE}/../docs/api/*.pod")); plan tests => scalar @pod; # Finally, do the checks. for my $pod (@pod) { my $child = open (CHILD, '-|'); if (not defined $child) { die "Cannot fork: $!\n"; } elsif ($child == 0) { my $pid = open (SPELL, '|-', @spell) or die "Cannot run @spell: $!\n"; open (POD, '<', $pod) or die "Cannot open $pod: $!\n"; my $parser = Pod::Spell->new; $parser->parse_from_filehandle (\*POD, \*SPELL); close POD; close SPELL; exit ($? >> 8); } else { my @words = ; close CHILD; SKIP: { skip "@spell failed for $pod", 1 unless $? == 0; for (@words) { s/^\s+//; s/\s+$//; } is ("@words", '', $pod); } } }