Spaces:
Running
Running
| package TAP::Parser::SourceHandler::File; | |
| use strict; | |
| use warnings; | |
| use TAP::Parser::IteratorFactory (); | |
| use TAP::Parser::Iterator::Stream (); | |
| use base 'TAP::Parser::SourceHandler'; | |
| TAP::Parser::IteratorFactory->register_handler(__PACKAGE__); | |
| =head1 NAME | |
| TAP::Parser::SourceHandler::File - Stream TAP from a text file. | |
| =head1 VERSION | |
| Version 3.43 | |
| =cut | |
| our $VERSION = '3.43'; | |
| =head1 SYNOPSIS | |
| use TAP::Parser::Source; | |
| use TAP::Parser::SourceHandler::File; | |
| my $source = TAP::Parser::Source->new->raw( \'file.tap' ); | |
| $source->assemble_meta; | |
| my $class = 'TAP::Parser::SourceHandler::File'; | |
| my $vote = $class->can_handle( $source ); | |
| my $iter = $class->make_iterator( $source ); | |
| =head1 DESCRIPTION | |
| This is a I<raw TAP stored in a file> L<TAP::Parser::SourceHandler> - it has 2 jobs: | |
| 1. Figure out if the I<raw> source it's given is a file containing raw TAP | |
| output. See L<TAP::Parser::IteratorFactory> for more details. | |
| 2. Takes raw TAP from the text file given, and converts into an iterator. | |
| Unless you're writing a plugin or subclassing L<TAP::Parser>, you probably | |
| won't need to use this module directly. | |
| =head1 METHODS | |
| =head2 Class Methods | |
| =head3 C<can_handle> | |
| my $vote = $class->can_handle( $source ); | |
| Only votes if $source looks like a regular file. Casts the following votes: | |
| 0.9 if it's a .tap file | |
| 0.9 if it has an extension matching any given in user config. | |
| =cut | |
| sub can_handle { | |
| my ( $class, $src ) = @_; | |
| my $meta = $src->meta; | |
| my $config = $src->config_for($class); | |
| return 0 unless $meta->{is_file}; | |
| my $file = $meta->{file}; | |
| return 0.9 if $file->{lc_ext} eq '.tap'; | |
| if ( my $exts = $config->{extensions} ) { | |
| my @exts = ref $exts eq 'ARRAY' ? @$exts : $exts; | |
| return 0.9 if grep { lc($_) eq $file->{lc_ext} } @exts; | |
| } | |
| return 0; | |
| } | |
| =head3 C<make_iterator> | |
| my $iterator = $class->make_iterator( $source ); | |
| Returns a new L<TAP::Parser::Iterator::Stream> for the source. C<croak>s | |
| on error. | |
| =cut | |
| sub make_iterator { | |
| my ( $class, $source ) = @_; | |
| $class->_croak('$source->raw must be a scalar ref') | |
| unless $source->meta->{is_scalar}; | |
| my $file = ${ $source->raw }; | |
| my $fh; | |
| open( $fh, '<', $file ) | |
| or $class->_croak("error opening TAP source file '$file': $!"); | |
| return $class->iterator_class->new($fh); | |
| } | |
| =head3 C<iterator_class> | |
| The class of iterator to use, override if you're sub-classing. Defaults | |
| to L<TAP::Parser::Iterator::Stream>. | |
| =cut | |
| use constant iterator_class => 'TAP::Parser::Iterator::Stream'; | |
| 1; | |
| __END__ | |
| =head1 CONFIGURATION | |
| { | |
| extensions => [ @case_insensitive_exts_to_match ] | |
| } | |
| =head1 SUBCLASSING | |
| Please see L<TAP::Parser/SUBCLASSING> for a subclassing overview. | |
| =head1 SEE ALSO | |
| L<TAP::Object>, | |
| L<TAP::Parser>, | |
| L<TAP::Parser::SourceHandler>, | |
| L<TAP::Parser::SourceHandler::Executable>, | |
| L<TAP::Parser::SourceHandler::Perl>, | |
| L<TAP::Parser::SourceHandler::Handle>, | |
| L<TAP::Parser::SourceHandler::RawTAP> | |
| =cut | |