0.17.0
indicatif is one of the most popular terminal progress bar libraries in the Rust ecosystem. More than a year after the 0.16.0 release, we're happy to finally release 0.17. In the past year, the indicatif team has grown to two maintainers, since @chris-laplante joined @djc as a maintainer. We also now have a Discord channel.
Apart from many small API additions and fixes, particular effort has gone into reducing the overhead for reporting progress. To this end, we've removed some of the explicit rate limiting APIs in favor of a single refresh rate in the ProgressDrawTarget
. We now set a rate limit by default (50ms) that should drastically reduce overhead for most applications while being more than enough for most terminal applications. Additionally, position updates are now synchronized by using atomic integer APIs instead of a mutex. In a basic test the simplest possible progress bar is about 95x faster on 0.17.0 compared to 0.16.2.
We've made many changes to the way MultiProgress
collections work. You no longer need to explicitly join()
the MultiProgress
, there are more ways to insert new progress bars into the collection, and many correctness improvements have been made, in part to more effort having gone into testing the crate.
Additionally, we've reduced our dependency footprint, removing lazy_static and regex from our required dependencies.
Additions
- Add ability to add custom template keys (#301, thanks to @redzic)
- Allow custom template keys to maintain state (#420, thanks to @1Dragoon)
- Add
HumanCount
and template keys to print more humane position/length (#340, thanks to @dabreegster) - Remove extra new line after progress bar (#338 with fixes in #343, #350 and #356, thanks to @sigmaSd)
- Implement
ProgressBar::suspend()
(#333, thanks to @ishitatsuyuki) - Add
ProgressIterator::progress_with_style()
(#306, thanks to @LeCyberDucky) - Pass through
stream_position()
inProgressBarIter
(#309, thanks to @rlee287) - Add
AsyncRead
/AsyncWrite
support forProgressBar
(#308, thanks to @x0f5c3) - Add
AsyncBufRead
implementation forProgressBarIterator
(#315, thanks to @x0f5c3) - Add builder methods for
ProgressBarIter
(#337, thanks to @chubei-oppen) - Allow overriding
ProgressBar
elapsed time (#325, thanks to @zhaofengli) - Add a space between numbers and their units (#345, thanks to @firasuke)
- Add
ProgressBar::style()
to enable access to the current style (#396, thanks to @andrewchambers) - Account for alignment when truncating (#402)
Performance
- Use atomics to track the current position (#390 with follow up in #404, #406, #414)
- Faster template expansion (without the regex dependency; #319)
- Draw progress bars into draw states (#361, with follow up in #371)
- Remove draw limiting from the progress bar state (#380)
- Simplify
ProgressDrawTarget
to reduce in-memory size (#277, thanks to @mibac138)
MultiProgress
changes
- Run
MultiProgress
drawing on the main thread (#231 and #284, thanks to @marienz and @aj-bagwell) - Enable inserting progress bars at the end in
MultiProgress
(#326, thanks to @omjadas) - Add
insert_after()
/insert_before()
methods onMultiProgress
(#331, with follow up in #424) MultiProgress
: addprintln()
andsuspend()
methods (#351)MultiProgress
: prune zombie progress bars (#438, with follow up in #446)- Make
is_hidden()
work forMultiProgress
(#430) - Allow vertical alignment in
MultiProgress
bars (#295, thanks to @nlinker)
Fixes
- Expand tabs to spaces to fix formatting (#150)
- Enable 256 color support in template strings (#283, thanks to @MoSal)
- Fix potential panic for hidden draw targets (#286, thanks to @matthiasbeyer)
ProgressFolder
shouldn't finish progress bars on completion (#290, thanks to @mibac138)- Improve precision of estimates for high progress rates (#293, thanks to @kayru)
- Reduce precision in
per_sec
values to make them more readable (#312) - Fix time rounding for
HumanDuration
values (#296, thanks to @Armavica) - Make unicode-width dependency actually optional (#281, thanks to @Shnatsel)
- Fix progress bar width in the presence of ANSI formatting codes (#316, thanks to @redzic)
- Fix wide element styling to work with improved unicode feature (#357)
WeakProgressBar::new()
should not takeself
(#359, thanks to @ishitatsuyuki)- Fix panic when calculating padding spaces (#364, thanks to @sigmaSd)
- Use final values when showing speed after finishing (#381, thanks to @Yatekii)
- Fix panic in the estimator (#403, thanks to @arxanas)
- Resolve potential deadlock when ticker is enabled (#417, #437)
- Fix issue with spinners when the ticker is enabled (#407)
- Make sure we use the first style for wide elements (#441)
Non-functional improvements
- Use once_cell instead of lazy_static (#324, thanks to @sigmaSd)
- Document interaction between
wide_bar
andwide_msg
(#329, thanks to @sigmaSd) - Use
doc(cfg)
to improve docs.rs documentation (#399) - Add categories in Cargo metadata (#330, thanks to @jqnatividad)
- Introduce in-memory testing interface (#354, with follow up in #378 and #379)
- Simplify how drawing is planned internally (#374, #382, #383, #384, #385, #386)
- Add sleep in iterator example to see progress bars (#314, thanks to @bidoubiwa)
- Don't conflate ticking with updating estimates (#434)
- Store length as an
Option
(#415)