App-CSVUtils
view release on metacpan or search on metacpan
t/01-basic.t view on Meta::CPAN
require App::CSVUtils::csv_delete_fields;
$res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_fields=>["f4"]);
is($res->[0], 400, "deleting unknown field -> error");
subtest "deleting unknown field with ignore_unknown_fields option -> ok" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_fields=>["f4"], ignore_unknown_fields=>1) };
is($stdout, "f1,f2,f3\n1,2,3\n4,5,6\n7,8,9\n");
};
subtest "exclude_field_pat option" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_field_pat => qr/.*/, exclude_field_pat=>qr/3/) };
is($stdout, "f3\n3\n6\n9\n");
};
subtest "exclude_fields option" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_field_pat => qr/.*/, exclude_fields=>['f3']) };
is($stdout, "f3\n3\n6\n9\n");
};
subtest "show_selected_fields option" => sub {
$res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_field_pat => qr/.*/, exclude_fields=>['f3'], show_selected_fields=>1);
is_deeply($res, [200, "OK", ["f1","f2"]]) or diag explain $res;
};
$res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/2.csv", include_field_pat=>qr/.*/);
is($res->[0], 412, "deleting last remaining field -> error (1)");
$res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/3.csv", include_fields=>["f2\n0", "f1"]);
is($res->[0], 412, "deleting last remaining field -> error (2)");
subtest "include_fields (1)" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_fields=>["f1"]) };
is($stdout, "f2,f3\n2,3\n5,6\n8,9\n", "output");
};
subtest "include_fields (2)" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_delete_fields::csv_delete_fields(input_filename=>"$dir/1.csv", include_fields=>["f3", "f1"]) };
is($stdout, "f2\n2\n5\n8\n");
};
};
subtest csv_list_field_names => sub {
my ($res, $stdout);
require App::CSVUtils::csv_list_field_names;
$res = App::CSVUtils::csv_list_field_names::csv_list_field_names(input_filename=>"$dir/1.csv");
is_deeply($res, [200,"OK",[{name=>'f1',index=>1},{name=>'f2',index=>2},{name=>'f3',index=>3}],{'table.fields'=>[qw/name index/]}], "result");
};
subtest csv_munge_field => sub {
my ($res, $stdout);
require App::CSVUtils::csv_munge_field;
$res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f1", eval=>"blah +");
is($res->[0], 400, "error in code -> error");
$res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f4", eval=>'1');
is($res->[0], 404, "munging unknown field -> error");
$stdout = capture_stdout { $res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f3", eval=>'$_ = $_*3') };
is($stdout, "f1,f2,f3\n1,2,9\n4,5,18\n7,8,27\n", "output");
};
subtest csv_munge_rows => sub {
my ($res, $stdout);
require App::CSVUtils::csv_munge_rows;
$res = App::CSVUtils::csv_munge_rows::csv_munge_rows(input_filename=>"$dir/1.csv", eval=>"blah +");
is($res->[0], 400, "error in code -> error");
$stdout = capture_stdout { $res = App::CSVUtils::csv_munge_rows::csv_munge_rows(input_filename=>"$dir/1.csv", eval=>'$_->[2] *= 3') };
is($stdout, "f1,f2,f3\n1,2,9\n4,5,18\n7,8,27\n", "output");
$stdout = capture_stdout { $res = App::CSVUtils::csv_munge_rows::csv_munge_rows(input_filename=>"$dir/1.csv", hash=>1, eval=>'$_->{f3} *= 3; delete $_->{f1}; $_->{f4} = 1') };
is($stdout, "f1,f2,f3\n,2,9\n,5,18\n,8,27\n", "output (with --hash, new fields ignored)");
};
subtest csv_replace_newline => sub {
my ($res, $stdout);
require App::CSVUtils::csv_replace_newline;
$stdout = capture_stdout { $res = App::CSVUtils::csv_replace_newline::csv_replace_newline(input_filename=>"$dir/3.csv", with=>" ") };
is($stdout, qq(f1,"f2 0"\n1,"row 1"\n2,"row 2"\n), "output");
# XXX opt=with
};
subtest csv_sort_fields => sub {
my ($res, $stdout);
require App::CSVUtils::csv_sort_fields;
subtest "alphabetical" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv") };
is($stdout,qq(F3,f1,f2\n2,1,3\n5,4,6\n), "output");
};
subtest "reverse alphabetical" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", reverse=>1) };
is($stdout,qq(f2,f1,F3\n3,1,2\n6,4,5\n), "output");
};
subtest "ci alphabetical" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", ci=>1) };
is($stdout,qq(f1,f2,F3\n1,3,2\n4,6,5\n), "output");
};
subtest "by_examples" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", by_examples=>["f2","F3","f1"]) };
is($stdout,qq(f2,F3,f1\n3,2,1\n6,5,4\n), "output");
};
subtest "reverse by_examples" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", by_examples=>["f2","F3","f1"], reverse=>1) };
is($stdout,qq(f1,F3,f2\n1,2,3\n4,5,6\n), "output");
};
subtest "by_code" => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_sort_fields::csv_sort_fields(input_filename=>"$dir/4.csv", by_code=>sub { lc($a->[0]) cmp lc($b->[0]) }) };
is($stdout,qq(f1,f2,F3\n1,3,2\n4,6,5\n), "output") or diag explain $res;
};
subtest by_sortsub => sub {
test_needs 'Sort::Sub', 'Sort::Sub::by_length';
t/01-basic.t view on Meta::CPAN
$stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"diff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"], result_fields=>"f2,f1") };
is($stdout, "f2,f1\nv5,v4\n", "opt:result_fields");
};
subtest symdiff => sub {
$stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"symdiff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"]) };
is($stdout, "f1,f2,f3\nv4,v5,v6\nv4,V5,v7\n");
$stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"symdiff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"], compare_fields=>"f1") };
is($stdout, "", "opt:compare_fields");
$stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"symdiff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"], compare_fields=>"f1,f2", ignore_case=>1) };
is($stdout, "", "opt:ignore_case");
$stdout = capture_stdout { $res = App::CSVUtils::csv_setop::csv_setop(op=>"symdiff", input_filenames=>["$dir/setop1.csv", "$dir/setop2.csv"], result_fields=>"f3,f1") };
is($stdout, "f3,f1\nv6,v4\nv7,v4\n", "opt:result_fields");
};
};
subtest csv_lookup_fields => sub {
require App::CSVUtils::csv_lookup_fields;
write_text("$dir/report.csv", <<'_');
client_id,followup_staff,followup_note,client_email,client_phone
101,Jerry,not renewing,
299,Jerry,still thinking over,
734,Elaine,renewing,
_
write_text("$dir/clients.csv", <<'_');
id,name,email,client_phone
101,Andy,andy@example.com,555-2983
102,Bob,bob@acme.example.com,555-2523
299,Cindy,cindy@example.com,555-7892
400,Derek,derek@example.com,555-9018
701,Edward,edward@example.com,555-5833
734,Felipe,felipe@example.com,555-9067
_
my ($res, $stdout);
$stdout = capture_stdout { $res = App::CSVUtils::csv_lookup_fields::csv_lookup_fields(input_filenames=>["$dir/report.csv", "$dir/clients.csv"], lookup_fields=>"client_id:id", fill_fields=>"client_email:email,client_phone") };
is($stdout, <<'_');
client_id,followup_staff,followup_note,client_email,client_phone
101,Jerry,"not renewing",andy@example.com,555-2983
299,Jerry,"still thinking over",cindy@example.com,555-7892
734,Elaine,renewing,felipe@example.com,555-9067
_
# XXX test opt:ignore_case
};
subtest "csv_uniq" => sub {
require App::CSVUtils::csv_uniq;
my ($res, $stdout);
write_text("$dir/uniq.csv", "f1,f2,f3\n1,2,a\n4,5,b\n4,7,B\n");
$res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["foo"]);
is($res->[0], 404, "unknown field -> error") or diag explain $res;
is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f2"]) }), "", "no duplicate values in field f2");
is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1"]) }), "csv-uniq: Duplicate value '4'\n", "duplicate values in field f1 reported");
is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1","f3"]) }), "", "no duplicate values in fields f1+f3");
is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1","f3"], ignore_case=>1) }), "csv-uniq: Duplicate value '4|b'\n", "Duplicate values (ignore_case) in fields f1+f3");
is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f2"], unique=>1) }), "csv-uniq: Unique value '2'\ncsv-uniq: Unique value '5'\ncsv-uniq: Unique value '7'\n", "unique values reported");
};
subtest "csv_csv, opt: --inplace" => sub {
require App::CSVUtils::csv_csv;
App::CSVUtils::csv_csv::csv_csv(input_filename=>"$dir/4.csv", output_always_quote=>1, inplace=>1);
is(read_text("$dir/4.csv"), qq("f1","F3","f2"\n"1","2","3"\n"4","5","6"\n));
App::CSVUtils::csv_csv::csv_csv(input_filename=>"$dir/4.csv", output_always_quote=>0, inplace=>1, inplace_backup_ext=>"~");
is(read_text("$dir/4.csv"), qq(f1,F3,f2\n1,2,3\n4,5,6\n));
is(read_text("$dir/4.csv~"), qq("f1","F3","f2"\n"1","2","3"\n"4","5","6"\n));
# TODO: test with util that reads multiple csv
# TODO: test with util that writes multiple csv
};
subtest "csv_fill_cells" => sub {
require App::CSVUtils::csv_fill_cells;
my ($res, $stdout);
# layout=left_to_right_then_top_to_bottom
$stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3) };
is($stdout, "field0,field1,field2\n1,2,3\n4,5,6\n7,8,9\n");
# layout=left_to_right_then_bottom_to_top
$stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"left_to_right_then_bottom_to_top") };
is($stdout, "field0,field1,field2\n7,8,9\n4,5,6\n1,2,3\n");
# layout=right_to_left_then_top_to_bottom
$stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"right_to_left_then_top_to_bottom") };
is($stdout, "field0,field1,field2\n3,2,1\n6,5,4\n9,8,7\n");
# layout=right_to_left_then_bottom_to_top
$stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"right_to_left_then_bottom_to_top") };
is($stdout, "field0,field1,field2\n9,8,7\n6,5,4\n3,2,1\n");
# layout=top_to_bottom_then_left_to_right
$stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"top_to_bottom_then_left_to_right") };
is($stdout, "field0,field1,field2\n1,4,7\n2,5,8\n3,6,9\n");
# layout=top_to_bottom_then_right_to_left
$stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"top_to_bottom_then_right_to_left") };
is($stdout, "field0,field1,field2\n7,4,1\n8,5,2\n9,6,3\n");
# layout=bottom_to_top_then_left_to_right
$stdout = capture_stdout { $res = App::CSVUtils::csv_fill_cells::csv_fill_cells(
input_filename=>"$dir/6.csv", num_rows=>3, num_fields=>3, layout=>"bottom_to_top_then_left_to_right") };
is($stdout, "field0,field1,field2\n3,6,9\n2,5,8\n1,4,7\n");
( run in 1.045 second using v1.01-cache-2.11-cpan-39bf76dae61 )