blob: 0d7a4851ee8f9114e06d58160955fd9b898e1cf2 [file] [log] [blame]
package TAP::Parser::SourceHandler::RawTAP;
use strict;
use vars qw($VERSION @ISA);
use TAP::Parser::SourceHandler ();
use TAP::Parser::IteratorFactory ();
use TAP::Parser::Iterator::Array ();
@ISA = qw(TAP::Parser::SourceHandler);
TAP::Parser::IteratorFactory->register_handler(__PACKAGE__);
=head1 NAME
TAP::Parser::SourceHandler::RawTAP - Stream output from raw TAP in a scalar/array ref.
=head1 VERSION
Version 3.23
=cut
$VERSION = '3.23';
=head1 SYNOPSIS
use TAP::Parser::Source;
use TAP::Parser::SourceHandler::RawTAP;
my $source = TAP::Parser::Source->new->raw( \"1..1\nok 1\n" );
$source->assemble_meta;
my $class = 'TAP::Parser::SourceHandler::RawTAP';
my $vote = $class->can_handle( $source );
my $iter = $class->make_iterator( $source );
=head1 DESCRIPTION
This is a I<raw TAP output> L<TAP::Parser::SourceHandler> - it has 2 jobs:
1. Figure out if the L<TAP::Parser::Source> it's given is raw TAP output
(L</can_handle>).
2. Creates an iterator for raw TAP output (L</make_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 is an array, or a scalar with newlines. Casts the
following votes:
0.9 if it's a scalar with '..' in it
0.7 if it's a scalar with 'ok' in it
0.3 if it's just a scalar with newlines
0.5 if it's an array
=cut
sub can_handle {
my ( $class, $src ) = @_;
my $meta = $src->meta;
return 0 if $meta->{file};
if ( $meta->{is_scalar} ) {
return 0 unless $meta->{has_newlines};
return 0.9 if ${ $src->raw } =~ /\d\.\.\d/;
return 0.7 if ${ $src->raw } =~ /ok/;
return 0.3;
}
elsif ( $meta->{is_array} ) {
return 0.5;
}
return 0;
}
=head3 C<make_iterator>
my $iterator = $class->make_iterator( $source );
Returns a new L<TAP::Parser::Iterator::Array> for the source.
C<$source-E<gt>raw> must be an array ref, or a scalar ref.
C<croak>s on error.
=cut
sub make_iterator {
my ( $class, $src ) = @_;
my $meta = $src->meta;
my $tap_array;
if ( $meta->{is_scalar} ) {
$tap_array = [ split "\n" => ${ $src->raw } ];
}
elsif ( $meta->{is_array} ) {
$tap_array = $src->raw;
}
$class->_croak('No raw TAP found in $source->raw')
unless scalar $tap_array;
return TAP::Parser::Iterator::Array->new($tap_array);
}
1;
=head1 SUBCLASSING
Please see L<TAP::Parser/SUBCLASSING> for a subclassing overview.
=head1 SEE ALSO
L<TAP::Object>,
L<TAP::Parser>,
L<TAP::Parser::IteratorFactory>,
L<TAP::Parser::SourceHandler>,
L<TAP::Parser::SourceHandler::Executable>,
L<TAP::Parser::SourceHandler::Perl>,
L<TAP::Parser::SourceHandler::File>,
L<TAP::Parser::SourceHandler::Handle>
=cut