App-td

 view release on metacpan or  search on metacpan

lib/App/td.pm  view on Meta::CPAN

our %actions = (
    'actions' => {summary=>'List available actions', req_input=>0},
    'as-aoaos' => {summary=>'Convert table data to aoaos form'},
    'as-aohos' => {summary=>'Convert table data to aohos form'},
    'as-csv' => {summary=>'Convert table data to CSV'},
    'avg-row' => {summary=>'Append an average row'},
    'avg' => {summary=>'Return average of all numeric columns'},
    'cat' => {summary=>'Pass table data'},
    'colcount-row' => {summary=>'Append a row containing number of columns'},
    'colcount' => {summary=>'Count number of columns'},
    'colnames' => {summary=>'Return only the row containing column names'},
    'colnames-row' => {summary=>'Append a row containing column names'},
    'head' => {summary=>'Only return the first N rows'},
    'info' => {summary=>'Check if input is table data and show information about the table'},
    'nauniq' => {summary=>'Remove non-adjacent duplicates'},
    'pick' => {summary=>'Pick one or more random rows, alias for `shuf`', tags=>['alias']},
    'rowcount-row' => {summary=>'Count number of rows (equivalent to "wc -l" in Unix)'},
    'rowcount' => {summary=>'Append a row containing rowcount'},
    'rownum-col' => {summary=>'Add a column containing row number'},
    'select' => {summary=>'Select one or more columns'},
    'shuf' => {summary=>'Generate random permutations of rows'},
    'sort' => {summary=>'Sort rows'},
    'sum-row' => {summary=>'Append a row containing sums'},
    'sum' => {summary=>'Return a row containing sum of all numeric columns'},
    'tail' => {summary=>'Only return the last N rows'},
    'transpose' => {summary=>'Transpose table'},
    'uniq' => {summary=>'Remove adjacent duplicates'},
    'wc-row' => {summary=>'Alias for rowcount-row', tags=>['alias']},
    'wc' => {summary=>'Alias for rowcount', tags=>['alias']},

    'grep-row' => {summary=>'Use Perl code to filter rows', tags=>['perl']},
    'grep' => {summary=>'Alias for grep-row', tags=>['perl', 'alias']},
    'grep-col' => {summary=>'Use Perl code to filter columns', tags=>['perl']},
    'map-row' => {summary=>'Use Perl code to transform rows', tags=>['perl']},
    'map' => {summary=>'Alias for map-row', tags=>['perl', 'alias']},
    'psort' => {summary=>'Use Perl code to transform row', tags=>['perl']},
);

sub _get_table_spec_from_envres {
    my $envres = shift;
    my $tf  = $envres->[3]{'table.fields'};
    my $tfa = $envres->[3]{'table.field_aligns'};
    my $tff = $envres->[3]{'table.field_formats'};
    my $tfu = $envres->[3]{'table.field_units'};
    return undef unless $tf; ## no critic: BuiltinFunctions::ProhibitStringyEval
    my $spec = {fields=>{}};
    my $i = 0;
    for (@$tf) {
        $spec->{fields}{$_} = {
            pos=>$i,
            maybe _align  => $tfa->[$i],
            maybe _format => $tff->[$i],
            maybe _unit   => $tfu->[$i],
        };
        $i++;
    }
    $spec;
}

sub _decode_json {
    require Cpanel::JSON::XS;

    state $json = Cpanel::JSON::XS->new->allow_nonref;
    $json->decode(shift);
}

sub _get_td_obj {
    require Data::Check::Structure;

    my $input = shift;
    my ($input_form, $input_obj, $input_form_err);

  CHECK_STRUCT: {
        if (Data::Check::Structure::is_aohos($input->[2])) {
            $input_form = 'aohos';
            my $spec = _get_table_spec_from_envres($input);
            require Data::TableData::Object::aohos;
            $input_obj = Data::TableData::Object::aohos->new($input->[2], $spec);
            last CHECK_STRUCT;
        } else {
            $input_form_err ||= $Data::Check::Structure::errstr;
        }

        if (Data::Check::Structure::is_aoaos($input->[2])) {
            $input_form = 'aoaos';
            my $spec = _get_table_spec_from_envres($input);
            require Data::TableData::Object::aoaos;
            $input_obj = Data::TableData::Object::aoaos->new($input->[2], $spec);
            last CHECK_STRUCT;
        } else {
            $input_form_err ||= $Data::Check::Structure::errstr;
        }

        if (Data::Check::Structure::is_aos($input->[2])) {
            $input_form = 'aos';
            require Data::TableData::Object::aos;
            $input_obj = Data::TableData::Object::aos->new($input->[2]);
            last CHECK_STRUCT;
        } else {
            $input_form_err ||= $Data::Check::Structure::errstr;
        }

        if (Data::Check::Structure::is_hos($input->[2])) {
            $input_form = 'hos';
            require Data::TableData::Object::hash;
            $input_obj = Data::TableData::Object::hash->new($input->[2]);
            last CHECK_STRUCT;
        } else {
            $input_form_err ||= $Data::Check::Structure::errstr;
        }

        my $form = ref($input->[2]);
        $form ||= "scalar";
        $input_form_err ||= "not aoaos/aohos/aos/hos ($form)";
    } # CHECK

    ($input_form, $input_obj, $input_form_err);
}

$SPEC{td} = {
    v => 1.1,
    summary => 'Manipulate table data',
    description => <<'_',



( run in 0.450 second using v1.01-cache-2.11-cpan-39bf76dae61 )