Skip to content

Commit

Permalink
Add progress bar (#693)
Browse files Browse the repository at this point in the history
  • Loading branch information
nwagner84 authored Aug 29, 2023
1 parent 840d986 commit f153c97
Show file tree
Hide file tree
Showing 28 changed files with 253 additions and 6 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

* #693 Add progress bar


## [0.19.0] - 2023-08-23

Expand Down
4 changes: 4 additions & 0 deletions docs/book/src/referenz/kommandos/cat.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ $ pica cat ger.dat eng.dat -o ger_eng.dat
* `--tee <filename>` — Abzweigen der Ausgabe in eine zusätzliche Datei.
* `-g`, `--gzip` — Komprimieren der Ausgabe im
[gzip](https://de.wikipedia.org/wiki/Gzip)-Format.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe
`stdout` geschrieben. Endet der Dateiname mit dem Suffix `.gz`, wird
Expand Down
7 changes: 4 additions & 3 deletions docs/book/src/referenz/kommandos/convert.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,12 @@ $ pica convert --from plus --to xml DUMP.dat.gz -o dump.xml

* `-s`, `--skip-invalid` — überspringt jene Zeilen aus der Eingabe, die nicht
dekodiert werden konnten.

* `-f`, `--from` — Auswahl des Datenformats der Eingabe.

* `-t`, `--to` — Auswahl des Datenformats der Ausgabe.

* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe
`stdout` geschrieben.
Expand Down
4 changes: 4 additions & 0 deletions docs/book/src/referenz/kommandos/count.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ subfields: 3973
* `--csv` — die Ausgabe erfolgt im CSV-Format.
* `--tsv` — die Ausgabe erfolgt im TSV-Format.
* `--no-header` — es wird keine Kopfzeile in die Ausgabe geschrieben.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe
`stdout` geschrieben.
Expand Down
5 changes: 4 additions & 1 deletion docs/book/src/referenz/kommandos/filter.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,16 @@ $ pica print goethe.dat
Ausgabe an die Datei angehangen. Ist das Flag nicht gesetzt, wird eine
bestehende Datei überschrieben.
* `--tee <filename>` — Abzweigen der Ausgabe in eine zusätzliche Datei.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe
`stdout` geschrieben. Endet der Dateiname mit dem Suffix `.gz`, wird
die Ausgabe automatisch im gzip-Format komprimiert.



## Konfiguration

<!-- TODO: Link zum allgemeinen Kapitel über die Konfigurationsdatei -->
Expand Down
4 changes: 4 additions & 0 deletions docs/book/src/referenz/kommandos/frequency.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ Ts1,1
* `-t`, `--tsv` — Ausgabe erfolgt im TSV-Format.
* `--translit` `<nf>` — Ausgabe wird in die angegebene Normalform
transliteriert. Mögliche Werte: `nfd`, `nfkd`, `nfc` und `nfkc`.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe
`stdout` geschrieben.
Expand Down
4 changes: 4 additions & 0 deletions docs/book/src/referenz/kommandos/hash.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ idn,sha256
* `-H`, `--header` `<header>` — Kopfzeile, die den Ergebnissen
vorangestellt wird.
* `-t`, `--tsv` — Ausgabe erfolgt im TSV-Format.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll.

Expand Down
4 changes: 4 additions & 0 deletions docs/book/src/referenz/kommandos/invalid.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ $ pica invalid DUMP.dat.gz -o invalid.dat

## Optionen

* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe
`stdout` geschrieben.
2 changes: 2 additions & 0 deletions docs/book/src/referenz/kommandos/partition.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ out
* `-g`, `--gzip` — Komprimieren der Ausgabe im [Gzip]-Format.
* `-t`, `--template` — Template für die Dateinamen. Der Platzhalter `{}`
wird durch den Namen der Partition ersetzt.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt.
* `-o`, `--outdir` — Angabe, in welches Verzeichnis die Partitionen
geschrieben werden sollen. Standardmäßig wird das aktuelle Verzeichnis
verwendet.
Expand Down
4 changes: 4 additions & 0 deletions docs/book/src/referenz/kommandos/print.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ $ pica print -s -l1 DUMP.dat.gz
unterstützt oder die Umgebungsvariable `NO_COLOR` definiert ist.
Schließlich wird mit der Einstellung `never` die Farbausgabe
deaktiviert.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe
`stdout` geschrieben.
Expand Down
4 changes: 4 additions & 0 deletions docs/book/src/referenz/kommandos/slice.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ $ pica count --records slice.dat
* `--append` — Wenn die Ausgabedatei bereits existiert, wird die
Ausgabe an die Datei angehangen. Ist das Flag nicht gesetzt, wird eine
bestehende Datei standardmäßig überschrieben.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt. Das
Aktivieren der Option erfordert das Schreiben der Datensätze in eine
Datei mittels `-o` bzw. `--output`.
* `-o`, `--output` — Angabe, in welche Datei die Ausgabe geschrieben
werden soll. Standardmäßig wird die Ausgabe in die Standardausgabe
`stdout` geschrieben.
Expand Down
2 changes: 2 additions & 0 deletions docs/book/src/referenz/kommandos/split.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ $ tree
* `-g`, `--gzip` — Komprimieren der Ausgabe im [Gzip]-Format.
* `--template` — Template für die Dateinamen. Der Platzhalter `{}` wird
durch eine fortlaufende Nummer ersetzt.
* `-p`, `--progress` — Anzeige des Fortschritts, der die Anzahl der
eingelesenen gültigen sowie invaliden Datensätze anzeigt.
* `-o`, `--outdir` — Angabe, in welches Verzeichnis die Ausgabe
geschrieben werden soll. Standardmäßig wird das aktuelle Verzeichnis
verwendet.
Expand Down
1 change: 1 addition & 0 deletions pica-toolkit/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ clap_complete = { workspace = true }
csv = { workspace = true }
directories = { version = "5.0" }
flate2 = { workspace = true }
indicatif = { version = "0.17" }
nom = { workspace = true }
pica-matcher = { workspace = true }
pica-path = { workspace = true }
Expand Down
11 changes: 11 additions & 0 deletions pica-toolkit/src/commands/cat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use pica_record::ByteRecord;
use serde::{Deserialize, Serialize};

use crate::config::Config;
use crate::progress::Progress;
use crate::util::CliResult;
use crate::{gzip_flag, skip_invalid_flag};

Expand Down Expand Up @@ -84,6 +85,10 @@ pub(crate) struct Cat {
#[arg(short, long, requires = "output")]
gzip: bool,

/// Show progress bar (requires `-o`/`--output`).
#[arg(short, long, requires = "output")]
progress: bool,

/// Write output to <OUTPUT> instead of stdout
#[arg(short, long)]
output: Option<OsString>,
Expand Down Expand Up @@ -145,6 +150,8 @@ impl Cat {
None => None,
};

let mut progress = Progress::new(self.progress);

for filename in self.filenames {
let mut reader =
ReaderBuilder::new().from_path(filename)?;
Expand All @@ -153,12 +160,15 @@ impl Cat {
match result {
Err(e) => {
if e.is_invalid_record() && skip_invalid {
progress.invalid();
continue;
} else {
return Err(e.into());
}
}
Ok(record) => {
progress.record();

if self.unique {
let k = key(&record);

Expand All @@ -178,6 +188,7 @@ impl Cat {
}
}

progress.finish();
writer.finish()?;
if let Some(ref mut writer) = tee_writer {
writer.finish()?;
Expand Down
11 changes: 11 additions & 0 deletions pica-toolkit/src/commands/convert/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use self::import::ImportWriter;
use self::json::JsonWriter;
use self::plain::PlainWriter;
use self::xml::XmlWriter;
use crate::progress::Progress;
use crate::util::CliError;
use crate::{skip_invalid_flag, CliResult, Config};

Expand Down Expand Up @@ -66,6 +67,10 @@ pub(crate) struct Convert {
)]
to: Format,

/// Show progress bar (requires `-o`/`--output`).
#[arg(short, long, requires = "output")]
progress: bool,

/// Write output to <filename> instead of stdout
#[arg(short, long, value_name = "filename")]
output: Option<OsString>,
Expand Down Expand Up @@ -101,6 +106,8 @@ impl Convert {
Format::Xml => Box::new(XmlWriter::new(self.output)?),
};

let mut progress = Progress::new(self.progress);

for filename in self.filenames {
let mut reader =
ReaderBuilder::new().from_path(filename)?;
Expand All @@ -109,19 +116,23 @@ impl Convert {
match result {
Err(e) => {
if e.is_invalid_record() && skip_invalid {
progress.invalid();
continue;
} else {
return Err(e.into());
}
}
Ok(record) => {
progress.record();
writer.write_byte_record(&record)?;
}
}
}
}

progress.finish();
writer.finish()?;

Ok(())
}
}
11 changes: 11 additions & 0 deletions pica-toolkit/src/commands/count.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use pica_record::io::{ReaderBuilder, RecordsIterator};
use serde::{Deserialize, Serialize};

use crate::config::Config;
use crate::progress::Progress;
use crate::skip_invalid_flag;
use crate::util::CliResult;

Expand Down Expand Up @@ -55,6 +56,10 @@ pub(crate) struct Count {
#[arg(long)]
no_header: bool,

/// Show progress bar (requires `-o`/`--output`).
#[arg(short, long, requires = "output")]
progress: bool,

/// Write output to <filename> instead of stdout
#[arg(short, long, value_name = "filename")]
output: Option<OsString>,
Expand Down Expand Up @@ -88,6 +93,8 @@ impl Count {
let mut fields = 0;
let mut subfields = 0;

let mut progress = Progress::new(self.progress);

for filename in self.filenames {
let mut reader =
ReaderBuilder::new().from_path(filename)?;
Expand All @@ -96,12 +103,15 @@ impl Count {
match result {
Err(e) => {
if e.is_invalid_record() && skip_invalid {
progress.invalid();
continue;
} else {
return Err(e.into());
}
}
Ok(record) => {
progress.record();

records += 1;
fields += record.iter().len();
subfields += record
Expand Down Expand Up @@ -135,6 +145,7 @@ impl Count {
writeln!(writer, "subfields: {subfields}")?;
}

progress.finish();
writer.flush()?;
Ok(())
}
Expand Down
11 changes: 11 additions & 0 deletions pica-toolkit/src/commands/filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use pica_record::io::{ReaderBuilder, RecordsIterator, WriterBuilder};
use serde::{Deserialize, Serialize};

use crate::common::FilterList;
use crate::progress::Progress;
use crate::translit::translit_maybe2;
use crate::util::{CliError, CliResult};
use crate::{gzip_flag, skip_invalid_flag, Config};
Expand Down Expand Up @@ -122,6 +123,10 @@ pub(crate) struct Filter {
#[arg(long, value_name = "filename", conflicts_with = "output")]
tee: Option<PathBuf>,

/// Show progress bar (requires `-o`/`--output`).
#[arg(short, long, requires = "output")]
progress: bool,

/// Write output to <filename> instead of stdout
#[arg(short, long, value_name = "filename")]
output: Option<OsString>,
Expand Down Expand Up @@ -231,6 +236,8 @@ impl Filter {
FilterList::default()
};

let mut progress = Progress::new(self.progress);

let mut count = 0;
let options = MatcherOptions::new()
.strsim_threshold(self.strsim_threshold as f64 / 100.0)
Expand All @@ -244,12 +251,15 @@ impl Filter {
match result {
Err(e) => {
if e.is_invalid_record() && skip_invalid {
progress.invalid();
continue;
} else {
return Err(e.into());
}
}
Ok(mut record) => {
progress.record();

if !allow_list.is_empty()
&& !allow_list.check(&record)
{
Expand Down Expand Up @@ -315,6 +325,7 @@ impl Filter {
}
}

progress.finish();
writer.finish()?;
if let Some(ref mut writer) = tee_writer {
writer.finish()?;
Expand Down
Loading

0 comments on commit f153c97

Please sign in to comment.