App-Prolix
view release on metacpan or search on metacpan
lib/App/Prolix.pm view on Meta::CPAN
use strict;
use warnings;
use Getopt::Long qw(:config no_auto_version);
package App::Prolix;
# ABSTRACT: trim chatty command outputs
use Moose;
use String::ShellQuote ();
use v5.10;
{
package App::Prolix::ConfigFileRole;
use Moose::Role;
with "MooseX::ConfigFromFile";
use JSON 2.0;
sub get_config_from_file {
my($file) = @_;
open my $fh, "<", $file or confess "open: $file: $!";
local $/;
my $json = <$fh>;
close $fh or die "close: $file: $!";
return JSON->new->relaxed->utf8->decode($json);
}
}
use Data::Munge;
use IO::File;
use IPC::Run ();
use Term::ReadKey ();
use Term::ReadLine;
use Text::Balanced ();
use Try::Tiny;
use App::Prolix::MooseHelpers;
with "MooseX::Getopt";
# Flags affecting overall run style.
has_option "verbose" => (isa => "Bool", cmd_aliases => "v",
documentation => "Prints extra information.");
has_option "pipe" => (isa => "Bool", cmd_aliases => "p",
documentation => "Reads from stdin instead of interactively.");
has_option "log" => (isa => "Str", cmd_aliases => "l",
documentation => q{Logs output to a filename (say "auto" } .
q{to let prolix pick one for you)});
# Flags affecting filtering.
has_option "ignore_re" => (isa => "ArrayRef", cmd_aliases => "r",
"default" => sub { [] },
documentation => "Ignore lines matching this regexp.");
has_option "ignore_line" => (isa => "ArrayRef", cmd_aliases => "n",
"default" => sub { [] },
documentation => "Ignore lines exactly matching this.");
has_option "ignore_substring" => (isa => "ArrayRef", cmd_aliases => "b",
"default" => sub { [] },
documentation => "Ignore lines containing this substring.");
has_option "snippet" => (isa => "ArrayRef", cmd_aliases => "s",
"default" => sub { [] },
documentation => "Snip lines. Use s/search_re/replace/ syntax.");
# Internal attributes (leading _ means not GetOpt).
has_rw "_cmd" => (isa => "ArrayRef", "default" => sub { [] });
has_rw "_out" => (isa => "ScalarRef[Str]", default => \&_strref);
has_rw "_err" => (isa => "ScalarRef[Str]", default => \&_strref);
has_rw "_log" => (isa => "FileHandle");
has_rw "_term" => (
isa => "Ref");
# TODO(gaal): figure out how to fix this:
# isa => "Term::ReadLine|Term::ReadLine::Perl|Term::ReadLine::Gnu");
has_rw "_snippet" => (isa => "ArrayRef", "default" => sub { [] });
has_rw "_ignore_re" => (isa => "ArrayRef", "default" => sub { [] });
has_counter "_suppressed";
has_counter "_output_lines";
sub run {
my($self) = @_;
if ($self->verbose) {
$SIG{USR1} = \&_dump_stack;
}
$self->open_log;
$self->import_re($_) for @{$self->ignore_re};
$self->import_snippet($_) for @{$self->snippet};
if ($self->need_pipe) {
$self->run_pipe;
} else {
$self->run_spawn;
( run in 2.824 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )