File Coverage

blib/lib/Footprintless/CommandRunner.pm
Criterion Covered Total %
statement 39 41 95.1
branch 4 4 100.0
condition n/a
subroutine 13 15 86.6
pod 8 8 100.0
total 64 68 94.1


line stmt bran cond sub pod time code
1 12     12   103961 use strict;
  12         54  
  12         285  
2 12     12   51 use warnings;
  12         23  
  12         447  
3              
4             package Footprintless::CommandRunner;
5             $Footprintless::CommandRunner::VERSION = '1.26';
6             # ABSTRACT: A contract for an command runner
7             # PODNAME: Footprintless::CommandRunner
8              
9 12     12   59 use Carp;
  12         29  
  12         646  
10 12     12   3211 use Footprintless::CommandRunner::ExecutionException;
  12         34  
  12         315  
11 12     12   382 use Log::Any;
  12         6093  
  12         83  
12              
13             my $logger = Log::Any->get_logger();
14              
15             sub new {
16 25     25 1 45890 return bless( {}, shift )->_init(@_);
17             }
18              
19             sub _init {
20 25     25   109 my ( $self, @options ) = @_;
21 25         97 return $self;
22             }
23              
24             sub get_command {
25 43     43 1 260 return $_[0]->{last_call}{command};
26             }
27              
28             sub get_exception {
29 1     1 1 4 return $_[0]->{last_call}{exception};
30             }
31              
32             sub get_exit_code {
33 0     0 1 0 return $_[0]->{last_call}{exit_code};
34             }
35              
36             sub get_stderr {
37 1     1 1 9 return $_[0]->{last_call}{stderr};
38             }
39              
40             sub get_stdout {
41 2     2 1 54 return $_[0]->{last_call}{stdout};
42             }
43              
44             sub _run {
45 0     0   0 croak("must use an implementation class");
46             }
47              
48             sub run {
49 82     82 1 2720 my ( $self, $command, @runner_options ) = @_;
50              
51 82         417 $self->{last_call} = { command => $command };
52              
53 82         413 $logger->debugf( 'running [%s]', $command );
54 82         1179 $logger->tracef( 'with options %s', \@runner_options );
55 82         665 my $exit_code;
56 82         171 eval {
57 82         393 $exit_code = $self->_run( $command, @runner_options );
58 81         742 $self->{last_call}{exit_code} = $exit_code;
59             };
60 82 100       358 if ($@) {
61 1         8 $self->{last_call}{exception} = $@;
62 1         4 $exit_code = -1;
63             }
64 82         301 return $exit_code;
65             }
66              
67             sub run_or_die {
68 76     76 1 6884 my ( $self, $command, @runner_options ) = @_;
69 76         321 my $exit_code = $self->run( $command, @runner_options );
70 76 100       303 if ($exit_code) {
71             die(Footprintless::CommandRunner::ExecutionException->new(
72             $command, $exit_code,
73             $self->{last_call}{exception}, $self->{last_call}{stderr}
74             )
75 6         171 );
76             }
77 70         287 return $self->{last_call}{stdout};
78             }
79              
80             1;
81              
82             __END__