Spaces:
Running
Running
text-generation-webui
/
installer_files
/env
/lib
/5.34.0
/TAP
/Parser
/SourceHandler
/Executable.pm
package TAP::Parser::SourceHandler::Executable; | |
use strict; | |
use warnings; | |
use TAP::Parser::IteratorFactory (); | |
use TAP::Parser::Iterator::Process (); | |
use base 'TAP::Parser::SourceHandler'; | |
TAP::Parser::IteratorFactory->register_handler(__PACKAGE__); | |
=head1 NAME | |
TAP::Parser::SourceHandler::Executable - Stream output from an executable TAP source | |
=head1 VERSION | |
Version 3.43 | |
=cut | |
our $VERSION = '3.43'; | |
=head1 SYNOPSIS | |
use TAP::Parser::Source; | |
use TAP::Parser::SourceHandler::Executable; | |
my $source = TAP::Parser::Source->new->raw(['/usr/bin/ruby', 'mytest.rb']); | |
$source->assemble_meta; | |
my $class = 'TAP::Parser::SourceHandler::Executable'; | |
my $vote = $class->can_handle( $source ); | |
my $iter = $class->make_iterator( $source ); | |
=head1 DESCRIPTION | |
This is an I<executable> L<TAP::Parser::SourceHandler> - it has 2 jobs: | |
1. Figure out if the L<TAP::Parser::Source> it's given is an executable | |
command (L</can_handle>). | |
2. Creates an iterator for executable commands (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 looks like an executable file. Casts the | |
following votes: | |
0.9 if it's a hash with an 'exec' key | |
0.8 if it's a .bat file | |
0.75 if it's got an execute bit set | |
=cut | |
sub can_handle { | |
my ( $class, $src ) = @_; | |
my $meta = $src->meta; | |
if ( $meta->{is_file} ) { | |
my $file = $meta->{file}; | |
return 0.85 if $file->{execute} && $file->{binary}; | |
return 0.8 if $file->{lc_ext} eq '.bat'; | |
return 0.25 if $file->{execute}; | |
} | |
elsif ( $meta->{is_hash} ) { | |
return 0.9 if $src->raw->{exec}; | |
} | |
return 0; | |
} | |
=head3 C<make_iterator> | |
my $iterator = $class->make_iterator( $source ); | |
Returns a new L<TAP::Parser::Iterator::Process> for the source. | |
C<$source-E<gt>raw> must be in one of the following forms: | |
{ exec => [ @exec ] } | |
[ @exec ] | |
$file | |
C<croak>s on error. | |
=cut | |
sub make_iterator { | |
my ( $class, $source ) = @_; | |
my $meta = $source->meta; | |
my @command; | |
if ( $meta->{is_hash} ) { | |
@command = @{ $source->raw->{exec} || [] }; | |
} | |
elsif ( $meta->{is_scalar} ) { | |
@command = ${ $source->raw }; | |
} | |
elsif ( $meta->{is_array} ) { | |
@command = @{ $source->raw }; | |
} | |
$class->_croak('No command found in $source->raw!') unless @command; | |
$class->_autoflush( \*STDOUT ); | |
$class->_autoflush( \*STDERR ); | |
push @command, @{ $source->test_args || [] }; | |
return $class->iterator_class->new( | |
{ command => \@command, | |
merge => $source->merge | |
} | |
); | |
} | |
=head3 C<iterator_class> | |
The class of iterator to use, override if you're sub-classing. Defaults | |
to L<TAP::Parser::Iterator::Process>. | |
=cut | |
use constant iterator_class => 'TAP::Parser::Iterator::Process'; | |
# Turns on autoflush for the handle passed | |
sub _autoflush { | |
my ( $class, $flushed ) = @_; | |
my $old_fh = select $flushed; | |
$| = 1; | |
select $old_fh; | |
} | |
1; | |
=head1 SUBCLASSING | |
Please see L<TAP::Parser/SUBCLASSING> for a subclassing overview. | |
=head2 Example | |
package MyRubySourceHandler; | |
use strict; | |
use Carp qw( croak ); | |
use TAP::Parser::SourceHandler::Executable; | |
use base 'TAP::Parser::SourceHandler::Executable'; | |
# expect $handler->(['mytest.rb', 'cmdline', 'args']); | |
sub make_iterator { | |
my ($self, $source) = @_; | |
my @test_args = @{ $source->test_args }; | |
my $rb_file = $test_args[0]; | |
croak("error: Ruby file '$rb_file' not found!") unless (-f $rb_file); | |
return $self->SUPER::raw_source(['/usr/bin/ruby', @test_args]); | |
} | |
=head1 SEE ALSO | |
L<TAP::Object>, | |
L<TAP::Parser>, | |
L<TAP::Parser::IteratorFactory>, | |
L<TAP::Parser::SourceHandler>, | |
L<TAP::Parser::SourceHandler::Perl>, | |
L<TAP::Parser::SourceHandler::File>, | |
L<TAP::Parser::SourceHandler::Handle>, | |
L<TAP::Parser::SourceHandler::RawTAP> | |
=cut | |