Skip to content

Commit 730bce7

Browse files
authored
progress: option to remove trackers on completion; fixes #321 (#336)
1 parent c27402a commit 730bce7

File tree

4 files changed

+58
-9
lines changed

4 files changed

+58
-9
lines changed

cmd/demo-progress/demo.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ var (
2424
flagShowPinned = flag.Bool("show-pinned", false, "Show a pinned message?")
2525
flagRandomFail = flag.Bool("rnd-fail", false, "Introduce random failures in tracking")
2626
flagRandomDefer = flag.Bool("rnd-defer", false, "Introduce random deferred starts")
27+
flagRandomRemove = flag.Bool("rnd-remove", false, "Introduce random remove of trackers on completion")
2728
flagRandomLogs = flag.Bool("rnd-logs", false, "Output random logs in the middle of tracking")
2829

2930
messageColors = []text.Color{
@@ -72,7 +73,13 @@ func trackSomething(pw progress.Writer, idx int64, updateMessage bool) {
7273

7374
units := getUnits(idx)
7475
message := getMessage(idx, units)
75-
tracker := progress.Tracker{Message: message, Total: total, Units: *units, DeferStart: *flagRandomDefer && rand.Float64() < 0.5}
76+
tracker := progress.Tracker{
77+
DeferStart: *flagRandomDefer && rand.Float64() < 0.5,
78+
Message: message,
79+
RemoveOnCompletion: *flagRandomRemove && rand.Float64() < 0.25,
80+
Total: total,
81+
Units: *units,
82+
}
7683
if idx == int64(*flagNumTrackers) {
7784
tracker.Total = 0
7885
}

progress/render.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (p *Progress) extractDoneAndActiveTrackers() ([]*Tracker, []*Tracker) {
7878
if eta := tracker.ETA(); eta > maxETA {
7979
maxETA = eta
8080
}
81-
} else {
81+
} else if !tracker.RemoveOnCompletion {
8282
trackersDone = append(trackersDone, tracker)
8383
}
8484
}
@@ -230,14 +230,16 @@ func (p *Progress) renderTracker(out *strings.Builder, t *Tracker, hint renderHi
230230
}
231231

232232
func (p *Progress) renderTrackerDone(out *strings.Builder, t *Tracker, message string) {
233-
out.WriteString(p.style.Colors.Message.Sprint(message))
234-
out.WriteString(p.style.Colors.Message.Sprint(p.style.Options.Separator))
235-
if !t.IsErrored() {
236-
out.WriteString(p.style.Colors.Message.Sprint(p.style.Options.DoneString))
237-
} else {
238-
out.WriteString(p.style.Colors.Error.Sprint(p.style.Options.ErrorString))
233+
if !t.RemoveOnCompletion {
234+
out.WriteString(p.style.Colors.Message.Sprint(message))
235+
out.WriteString(p.style.Colors.Message.Sprint(p.style.Options.Separator))
236+
if !t.IsErrored() {
237+
out.WriteString(p.style.Colors.Message.Sprint(p.style.Options.DoneString))
238+
} else {
239+
out.WriteString(p.style.Colors.Error.Sprint(p.style.Options.ErrorString))
240+
}
241+
p.renderTrackerStats(out, t, renderHint{hideTime: !p.style.Visibility.Time, hideValue: !p.style.Visibility.Value})
239242
}
240-
p.renderTrackerStats(out, t, renderHint{hideTime: !p.style.Visibility.Time, hideValue: !p.style.Visibility.Value})
241243
}
242244

243245
func (p *Progress) renderTrackerMessage(out *strings.Builder, t *Tracker, message string) {

progress/render_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,43 @@ func TestProgress_RenderNothing(t *testing.T) {
372372
assert.Empty(t, renderOutput.String())
373373
}
374374

375+
func TestProgress_RenderSomeTrackers_AndRemove(t *testing.T) {
376+
renderOutput := outputWriter{}
377+
378+
pw := generateWriter()
379+
pw.SetOutputWriter(&renderOutput)
380+
pw.SetTrackerPosition(PositionLeft)
381+
go trackSomething(pw, &Tracker{Message: "Calculating Total # 1", Total: 1000, Units: UnitsDefault, RemoveOnCompletion: true})
382+
go trackSomething(pw, &Tracker{Message: "Downloading File # 2", Total: 1000, Units: UnitsBytes, RemoveOnCompletion: true})
383+
go trackSomething(pw, &Tracker{Message: "Transferring Amount # 3", Total: 1000, Units: UnitsCurrencyDollar, RemoveOnCompletion: true})
384+
renderAndWait(pw, false)
385+
out := renderOutput.String()
386+
387+
expectedOutPatterns := []*regexp.Regexp{
388+
regexp.MustCompile(`\d+\.\d+% \[[#.]{23}] \[\d+ in [\d.]+ms] \.\.\. Calculating Total # 1`),
389+
regexp.MustCompile(`\d+\.\d+% \[[#.]{23}] \[\d+B in [\d.]+ms] \.\.\. Downloading File # 2`),
390+
regexp.MustCompile(`\d+\.\d+% \[[#.]{23}] \[\$\d+ in [\d.]+ms] \.\.\. Transferring Amount # 3`),
391+
}
392+
for _, expectedOutPattern := range expectedOutPatterns {
393+
if !expectedOutPattern.MatchString(out) {
394+
assert.Fail(t, "Failed to find a pattern in the Output.", expectedOutPattern.String())
395+
}
396+
}
397+
398+
unexpectedOutPatterns := []*regexp.Regexp{
399+
regexp.MustCompile(`Calculating Total # 1 \.\.\. done! \[\d+\.\d+K in [\d.]+ms]`),
400+
regexp.MustCompile(`Downloading File # 2 \.\.\. done! \[\d+\.\d+KB in [\d.]+ms]`),
401+
regexp.MustCompile(`Transferring Amount # 3 \.\.\. done! \[\$\d+\.\d+K in [\d.]+ms]`),
402+
}
403+
for _, unexpectedOutPattern := range unexpectedOutPatterns {
404+
if unexpectedOutPattern.MatchString(out) {
405+
assert.Fail(t, "Found a pattern in the Output which was not expected.", unexpectedOutPattern.String())
406+
}
407+
}
408+
409+
showOutputOnFailure(t, out)
410+
}
411+
375412
func TestProgress_RenderSomeTrackers_OnLeftSide(t *testing.T) {
376413
renderOutput := outputWriter{}
377414

progress/tracker.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ type Tracker struct {
2424
// ExpectedDuration tells how long this task is expected to take; and will
2525
// be used in calculation of the ETA value
2626
ExpectedDuration time.Duration
27+
// RemoveOnCompletion tells the Progress Bar to remove this tracker when
28+
// it is done, instead of rendering a "completed" line
29+
RemoveOnCompletion bool
2730
// Total should be set to the (expected) Total/Final value to be reached
2831
Total int64
2932
// Units defines the type of the "value" being tracked

0 commit comments

Comments
 (0)