Compare commits

...

5 Commits
1.0 ... main

Author SHA1 Message Date
a5dae03897 Default output to stdout. 2023-01-08 16:58:18 -06:00
Jonathan Bernard
57e9419565 Fixed bug calculating remaining time in Nim implementation. 2016-01-26 01:29:14 -06:00
Jonathan Bernard
f4dcfd2a24 Changed print & erase logic to used a fixed max width. 2016-01-25 19:04:00 -06:00
Jonathan Bernard
5f7cbeae92 Updated license file. 2016-01-25 15:13:51 -06:00
Jonathan Bernard
42eb01d5f8 Fixed access modifiers for Java version. 2016-01-25 15:13:21 -06:00
7 changed files with 78 additions and 37 deletions

View File

@ -1,4 +1,4 @@
Copyright (c) 2014
Copyright (c) 2016
All rights reserved.
Redistribution and use in source and binary forms, with or without
@ -24,4 +24,4 @@ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

45
README.md Normal file
View File

@ -0,0 +1,45 @@
# Console Progress Bar
Simple progress bar for long-running operations.
## Java/Groovy
Build with gradle:
gradle assemble
Example usage:
```java
import com.jdbernard.util.ConsoleProgressBar
// ...
ConsoleProgressBar progressBar = new ConsoleProgressBar()
progressBar.setOut(System.out) // optional
progressBar.setMax(100)
for (int i = 0; i <= 100; i++) {
progressBar.update(i, "Message for " + i);
Thread.sleep(500);
}
```
## Nim
Install the library using nimble:
nimble install
Example usage:
```nim
import os, console_progress
var progress = newProgress(sout = stdout, maxValue = 100)
for i in 0..100:
progress.updateProgress(i, "Message for " & i)
sleep(500)
```

View File

@ -2,7 +2,7 @@ apply plugin: "groovy"
apply plugin: "maven"
group = "com.jdbernard"
version = "1.0"
version = "1.2.2"
repositories {
mavenLocal()

View File

@ -1,6 +1,6 @@
# Package
version = "1.0"
version = "1.2.2"
author = "Jonathan Bernard"
description = "Utility for writing dynamic progress bars to the console."
license = "BSD"
@ -9,4 +9,3 @@ srcDir = "src/main/nim"
# Dependencies
requires "nim >= 0.13.0"

View File

@ -8,20 +8,20 @@ package com.jdbernard.util
* counter is 1-based because the current step is complete for this counter.
* @author Jonathan Bernard (jdbernard@gmail.com)
*/
class ConsoleProgressBar {
int MAX_STEP = 30
public class ConsoleProgressBar {
int WIDTH = 79
int MAX_STEP = 35
long max = 10
def out = System.out
private int lastStepAmount = -1
private String lastLinePrinted = ""
private String lastInfo = ""
private long startTime
public void setMax(long max) {
this.max = Math.max(max, 1) }
void update(long value, String info) {
public void update(long value, String info) {
if (value == 0 || startTime == 0)
startTime = System.currentTimeMillis()
@ -50,20 +50,17 @@ class ConsoleProgressBar {
if (info.length() > 16) info = info[0..<16]
if (info.length() < 16) info = info.padRight(16)
out.print '\b' * lastLinePrinted.length()
lastLinePrinted = '=' * numEq + (curStep > 0 ? "0" : "") + '-' * (MAX_STEP - curStep)
lastLinePrinted += " ${info} -- (" +
out.print '\b' * WIDTH
def line = = '=' * numEq + (curStep > 0 ? "0" : "") + '-' * (MAX_STEP - curStep)
line += " ${info} -- (" +
"${String.format('%5.2f', curPercent * 100)}%, ${remMin ? remMin + 'm ' : ''}${remSec}s) "
out.print lastLinePrinted
out.print line.padRight(WIDTH)
lastStepAmount = curStep;
}
out.flush()
}
void erase() {
out.print '\b' * lastLinePrinted.length()
out.print ' ' * lastLinePrinted.length()
out.print '\b' * lastLinePrinted.length()
lastLinePrinted = ""
public void erase() {
out.print ('\b' * WIDTH) + (' ' * WIDTH) + ('\b' * WIDTH)
}
}

View File

@ -2,9 +2,9 @@ import strutils, times, math
type Progress* = ref object of RootObj
sout: File
lastStep, maxSteps: int
lastStep, width, maxSteps: int
startTime: float
lastLinePrinted, lastInfo: string
lastInfo: string
maxValue: BiggestInt
proc getMax*(pd: Progress): BiggestInt =
@ -13,13 +13,13 @@ proc getMax*(pd: Progress): BiggestInt =
proc setMax*(pd: Progress, maxValue: BiggestInt) =
pd.maxValue = max(maxValue, 1)
proc newProgress*(sout: File, maxValue: BiggestInt): Progress =
proc newProgress*(maxValue: BiggestInt, sout: File = stdout): Progress =
return Progress(sout: sout,
startTime: cpuTime(),
lastStep: 0,
lastLinePrinted: "",
maxValue: maxValue,
maxSteps: 30)
width: 79,
maxSteps: 35)
proc updateProgress*(pd: Progress, newValue: BiggestInt, info: string): void =
@ -30,8 +30,8 @@ proc updateProgress*(pd: Progress, newValue: BiggestInt, info: string): void =
if info == pd.lastInfo and curStep == pd.lastStep: return
let curTime = cpuTime()
let remTime = ((curTime / curPercent) - curTime) * 1000
let curDuration = cpuTime() - pd.startTime
let remTime = ((curDuration / curPercent) - curDuration)
let displayedSteps = max(curStep - 1, 0)
pd.lastInfo = info
@ -40,29 +40,29 @@ proc updateProgress*(pd: Progress, newValue: BiggestInt, info: string): void =
if displayedInfo.len < 16:
displayedInfo = displayedInfo & ' '.repeat(16 - displayedInfo.len)
pd.sout.write('\b'.repeat(pd.lastLinePrinted.len))
pd.sout.write('\b'.repeat(pd.width))
pd.lastLinePrinted =
var line =
'='.repeat(displayedSteps) & (if curStep > 0: "0" else: "") &
'-'.repeat(pd.maxSteps - curStep) & " " &
displayedInfo & " -- (" &
(curPercent * 100).formatFloat(ffDecimal, 2) & "%"
(curPercent * 100).formatFloat(ffDecimal, 2) & "%"
if curPercent > 0.05:
pd.lastLinePrinted &= ", "
line &= ", "
if remTime > 60:
pd.lastLinePrinted &= $floor(remTime / 60).int & "m "
pd.lastLinePrinted &= $ceil(remTime mod 60) & "s"
line &= $floor(remTime / 60).int & "m "
line &= $ceil(remTime mod 60) & "s"
pd.lastLinePrinted &= ")"
line &= ")"
line &= spaces(max(pd.width - line.len, 0))
pd.sout.write(pd.lastLinePrinted)
pd.sout.write(line)
pd.lastStep = curStep
pd.sout.flushFile
proc erase*(pd: Progress): void =
pd.sout.write('\b'.repeat(pd.lastLinePrinted.len))
pd.sout.write(' '.repeat(pd.lastLinePrinted.len))
pd.sout.write('\b'.repeat(pd.lastLinePrinted.len))
pd.lastLinePrinted = ""
pd.sout.write('\b'.repeat(pd.width))
pd.sout.write(' '.repeat(pd.width))
pd.sout.write('\b'.repeat(pd.width))