Skip to content

Commit

Permalink
Add --append option to filter command (#449)
Browse files Browse the repository at this point in the history
  • Loading branch information
nwagner84 authored Mar 28, 2022
1 parent 85f7163 commit 7c68761
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/bin/pica/cmds/filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ pub(crate) fn cli() -> Command {
.default_value("0.75")
.help("The minimum score for string similarity comparisons (range from 0.0..1.0).")
)
.arg(
Arg::new("append")
.long("--append")
.help("Append to the given <file>, do not overwrite.")
)
.arg(
Arg::new("reduce")
.long("reduce")
Expand Down Expand Up @@ -147,6 +152,7 @@ pub(crate) fn run(args: &CliArgs, config: &Config) -> CliResult<()> {
let skip_invalid = skip_invalid_flag!(args, config.filter, config.global);
let gzip_compression = gzip_flag!(args, config.filter);
let ignore_case = args.is_present("ignore-case");
let append = args.is_present("append");

let mut allow_list = FilterList::default();
let mut deny_list = FilterList::default();
Expand All @@ -162,12 +168,14 @@ pub(crate) fn run(args: &CliArgs, config: &Config) -> CliResult<()> {

let mut writer: Box<dyn PicaWriter> = WriterBuilder::new()
.gzip(gzip_compression)
.append(append)
.from_path_or_stdout(args.value_of("output"))?;

let mut tee_writer = match args.value_of("tee") {
Some(path) => Some(
WriterBuilder::new()
.gzip(gzip_compression)
.append(append)
.from_path(path)?,
),
None => None,
Expand Down
93 changes: 93 additions & 0 deletions tests/pica/filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1593,6 +1593,99 @@ fn pica_filter_tee_option() -> TestResult {
Ok(())
}

#[test]
fn pica_filter_append_option() -> TestResult {
// --output
let filename = Builder::new().suffix(".dat").tempfile()?;
let filename_str = filename.path();

let mut cmd = Command::cargo_bin("pica")?;
let assert = cmd
.arg("filter")
.arg("[email protected] == '1004916019'")
.arg("tests/data/1004916019.dat")
.arg("--output")
.arg(filename_str)
.assert();

assert
.success()
.stderr(predicate::str::is_empty())
.stdout(predicate::str::is_empty());

let mut cmd = Command::cargo_bin("pica")?;
let assert = cmd
.arg("filter")
.arg("--append")
.arg("[email protected] == '000009229'")
.arg("tests/data/000009229.dat")
.arg("--output")
.arg(filename_str)
.assert();

assert
.success()
.stderr(predicate::str::is_empty())
.stdout(predicate::str::is_empty());

let expected = format!(
"{}{}",
read_to_string("tests/data/1004916019.dat").unwrap(),
read_to_string("tests/data/000009229.dat").unwrap()
);

assert_eq!(expected, read_to_string(filename_str)?);

// --tee
let filename = Builder::new().suffix(".dat").tempfile()?;
let filename_str = filename.path();

let mut cmd = Command::cargo_bin("pica")?;
let assert = cmd
.arg("filter")
.arg("[email protected] == '1004916019'")
.arg("--tee")
.arg(filename_str)
.arg("tests/data/1004916019.dat")
.assert();

let expected =
predicate::path::eq_file(Path::new("tests/data/1004916019.dat"));

assert
.success()
.stderr(predicate::str::is_empty())
.stdout(expected);

let mut cmd = Command::cargo_bin("pica")?;
let assert = cmd
.arg("filter")
.arg("--append")
.arg("--tee")
.arg(filename_str)
.arg("[email protected] == '000009229'")
.arg("tests/data/000009229.dat")
.assert();

let expected =
predicate::path::eq_file(Path::new("tests/data/000009229.dat"));

assert
.success()
.stderr(predicate::str::is_empty())
.stdout(expected);

let expected = format!(
"{}{}",
read_to_string("tests/data/1004916019.dat").unwrap(),
read_to_string("tests/data/000009229.dat").unwrap()
);

assert_eq!(expected, read_to_string(filename_str)?);

Ok(())
}

#[test]
fn pica_filter_invalid_filter() -> TestResult {
let mut cmd = Command::cargo_bin("pica")?;
Expand Down

0 comments on commit 7c68761

Please sign in to comment.