tty-progressbar 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +2 -1
- data/lib/tty/progressbar/meter.rb +48 -22
- data/lib/tty/progressbar/version.rb +1 -1
- data/spec/unit/formatter/byte_rate_spec.rb +11 -4
- data/spec/unit/formatter/mean_byte_spec.rb +10 -3
- data/spec/unit/formatter/mean_rate_spec.rb +8 -2
- data/spec/unit/formatter/rate_spec.rb +9 -3
- data/spec/unit/meter_spec.rb +47 -44
- metadata +17 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae9ad2ae6d8a85a713de8ee733bcee99f30363ae
|
4
|
+
data.tar.gz: bf7550f7709ecf82fed2760ba04c15aca402fa10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a2ccc30badc32c66c6c83c98be1ec9509ab79ecec0cd79ed72f9c85c331d73f74403a40744db0489de026b7b9a2ba05d8875eedda7368dbe0dc1ae3ca1bde71
|
7
|
+
data.tar.gz: 211f366e8a8fefc4741da94388d783b98204c633826d652674c65827b01398c9d4aa08fa84d7dc6930050b3a8c6a58ab682b6da23e38dc19d4d6563da9212ef7
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.10.0] - 2016-06-25
|
4
|
+
|
5
|
+
### Fixed
|
6
|
+
* Fix Meter#sample to accurately calculate rate and mean_rate by Sylvain Joyeux
|
7
|
+
|
3
8
|
## [v0.9.0] - 2016-04-09
|
4
9
|
|
5
10
|
### Fixed
|
@@ -85,6 +90,8 @@
|
|
85
90
|
|
86
91
|
* Initial implementation and release
|
87
92
|
|
93
|
+
[v0.10.0]: https://github.com/peter-murach/tty-progressbar/compare/v0.9.0...v0.10.0
|
94
|
+
[v0.9.0]: https://github.com/peter-murach/tty-progressbar/compare/v0.8.2...v0.9.0
|
88
95
|
[v0.8.2]: https://github.com/peter-murach/tty-progressbar/compare/v0.8.1...v0.8.2
|
89
96
|
[v0.8.1]: https://github.com/peter-murach/tty-progressbar/compare/v0.8.0...v0.8.1
|
90
97
|
[v0.8.0]: https://github.com/peter-murach/tty-progressbar/compare/v0.7.0...v0.8.0
|
data/README.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
# TTY::ProgressBar
|
1
|
+
# TTY::ProgressBar [][gitter]
|
2
2
|
[][gem]
|
3
3
|
[][travis]
|
4
4
|
[][codeclimate]
|
5
5
|
[][coverage]
|
6
6
|
[][inchpages]
|
7
7
|
|
8
|
+
[gitter]: https://gitter.im/piotrmurach/tty
|
8
9
|
[gem]: http://badge.fury.io/rb/tty-progressbar
|
9
10
|
[travis]: http://travis-ci.org/piotrmurach/tty-progressbar
|
10
11
|
[codeclimate]: https://codeclimate.com/github/piotrmurach/tty-progressbar
|
@@ -14,32 +14,56 @@ module TTY
|
|
14
14
|
#
|
15
15
|
# @api private
|
16
16
|
def initialize(interval)
|
17
|
-
@samples = Hash.new { |h, el| h[el] = [] }
|
18
17
|
@interval = interval || 1 # 1 sec
|
19
|
-
|
20
|
-
|
21
|
-
@start_time = Time.now.to_f
|
22
|
-
@last_sample_at = @start_time
|
18
|
+
start
|
23
19
|
end
|
24
20
|
|
25
21
|
# Start sampling timer
|
26
22
|
#
|
27
23
|
# @api public
|
28
24
|
def start
|
29
|
-
@start_time
|
30
|
-
@
|
25
|
+
@start_time = Time.now
|
26
|
+
@current = 0
|
27
|
+
@samples = [[@start_time, 0]]
|
28
|
+
@rates = []
|
29
|
+
@start_time
|
31
30
|
end
|
32
31
|
|
33
32
|
# Update meter with value
|
34
33
|
#
|
34
|
+
# @param [Time] at
|
35
|
+
# the time of the sampling
|
36
|
+
#
|
37
|
+
# @param [Integer] value
|
38
|
+
# the current value of progress
|
39
|
+
#
|
35
40
|
# @api public
|
36
41
|
def sample(at, value)
|
37
|
-
|
38
|
-
|
42
|
+
@current += value
|
43
|
+
prune_samples(at)
|
44
|
+
@samples << [at, @current]
|
45
|
+
save_rate(at)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Remove samples that are obsolete
|
49
|
+
#
|
50
|
+
# @api private
|
51
|
+
def prune_samples(at)
|
52
|
+
cutoff = at - @interval
|
53
|
+
while @samples.size > 1 && (@samples.first.first < cutoff)
|
54
|
+
@samples.shift
|
39
55
|
end
|
40
|
-
|
56
|
+
end
|
41
57
|
|
42
|
-
|
58
|
+
# If we crossed a period boundary since @start_time,
|
59
|
+
# save the rate for {#rates}
|
60
|
+
#
|
61
|
+
# @api private
|
62
|
+
def save_rate(at)
|
63
|
+
period_index = ((at - @start_time) / @interval).floor
|
64
|
+
while period_index > @rates.size
|
65
|
+
@rates << rate
|
66
|
+
end
|
43
67
|
end
|
44
68
|
|
45
69
|
# The current rate of sampling for a given interval
|
@@ -49,18 +73,20 @@ module TTY
|
|
49
73
|
#
|
50
74
|
# @api public
|
51
75
|
def rate
|
52
|
-
|
53
|
-
|
54
|
-
|
76
|
+
first_at, first_value = @samples.first
|
77
|
+
last_at, last_value = @samples.last
|
78
|
+
if first_at == last_at
|
79
|
+
0
|
80
|
+
else
|
81
|
+
(last_value - first_value) / (last_at - first_at)
|
82
|
+
end
|
55
83
|
end
|
56
84
|
|
57
85
|
# Group all rates per interval
|
58
86
|
#
|
59
87
|
# @api public
|
60
88
|
def rates
|
61
|
-
@
|
62
|
-
acc << @samples[key].reduce(:+)
|
63
|
-
end
|
89
|
+
@rates + [rate]
|
64
90
|
end
|
65
91
|
|
66
92
|
# The mean rate of all the sampled rates
|
@@ -70,10 +96,11 @@ module TTY
|
|
70
96
|
#
|
71
97
|
# @api public
|
72
98
|
def mean_rate
|
73
|
-
|
74
|
-
|
99
|
+
last_at, last_value = @samples.last
|
100
|
+
if last_at == @start_time
|
101
|
+
0
|
75
102
|
else
|
76
|
-
|
103
|
+
last_value / (last_at - @start_time)
|
77
104
|
end
|
78
105
|
end
|
79
106
|
alias_method :avg_rate, :mean_rate
|
@@ -82,8 +109,7 @@ module TTY
|
|
82
109
|
#
|
83
110
|
# @api public
|
84
111
|
def clear
|
85
|
-
|
86
|
-
@samples.clear
|
112
|
+
start
|
87
113
|
end
|
88
114
|
end # Meter
|
89
115
|
end # ProgressBar
|
@@ -9,6 +9,13 @@ RSpec.describe TTY::ProgressBar, ':byte_rate token' do
|
|
9
9
|
time_now = Time.local(2014, 10, 5, 12, 0, 0)
|
10
10
|
Timecop.freeze(time_now)
|
11
11
|
progress = TTY::ProgressBar.new(":byte_rate", output: output, total: 10000, interval: 1)
|
12
|
+
# Generate a serie of advances at 2s intervals
|
13
|
+
# t+0 advance=0 total=0
|
14
|
+
# t+2 advance=1000 total=1000
|
15
|
+
# t+4 advance=2000 total=3000
|
16
|
+
# t+6 advance=3000 total=6000
|
17
|
+
# t+8 advance=4000 total=10_000
|
18
|
+
# NOTE: mean_byte uses 1024 for the scale in K, M ...
|
12
19
|
5.times do |i|
|
13
20
|
time_now = Time.local(2014, 10, 5, 12, 0, i * 2)
|
14
21
|
Timecop.freeze(time_now)
|
@@ -16,11 +23,11 @@ RSpec.describe TTY::ProgressBar, ':byte_rate token' do
|
|
16
23
|
end
|
17
24
|
output.rewind
|
18
25
|
expect(output.read).to eq([
|
19
|
-
"\e[
|
26
|
+
"\e[1G0B",
|
27
|
+
"\e[1G500.0B",
|
20
28
|
"\e[1G1000.0B",
|
21
|
-
"\e[1G1.
|
22
|
-
"\e[
|
23
|
-
"\e[1G3.91KB\n"
|
29
|
+
"\e[1G1.46KB",
|
30
|
+
"\e[1G1.95KB\n"
|
24
31
|
].join)
|
25
32
|
Timecop.return
|
26
33
|
end
|
@@ -9,6 +9,13 @@ RSpec.describe TTY::ProgressBar, ':mean_byte token' do
|
|
9
9
|
time_now = Time.local(2014, 10, 5, 12, 0, 0)
|
10
10
|
Timecop.freeze(time_now)
|
11
11
|
progress = TTY::ProgressBar.new(":mean_byte", output: output, total: 10000, interval: 1)
|
12
|
+
# Generate a serie of advances at 2s intervals
|
13
|
+
# t+0 advance=0 total=0
|
14
|
+
# t+2 advance=1000 total=1000
|
15
|
+
# t+4 advance=2000 total=3000
|
16
|
+
# t+6 advance=3000 total=6000
|
17
|
+
# t+8 advance=4000 total=10_000
|
18
|
+
# NOTE: mean_byte uses 1024 for the scale in K, M ...
|
12
19
|
5.times do |i|
|
13
20
|
time_now = Time.local(2014, 10, 5, 12, 0, i * 2)
|
14
21
|
Timecop.freeze(time_now)
|
@@ -16,11 +23,11 @@ RSpec.describe TTY::ProgressBar, ':mean_byte token' do
|
|
16
23
|
end
|
17
24
|
output.rewind
|
18
25
|
expect(output.read).to eq([
|
19
|
-
"\e[
|
26
|
+
"\e[1G0B",
|
20
27
|
"\e[1G500.0B",
|
28
|
+
"\e[1G750.0B",
|
21
29
|
"\e[1G1000.0B",
|
22
|
-
"\e[1G1.
|
23
|
-
"\e[1G1.95KB\n"
|
30
|
+
"\e[1G1.22KB\n"
|
24
31
|
].join)
|
25
32
|
Timecop.return
|
26
33
|
end
|
@@ -9,6 +9,12 @@ RSpec.describe TTY::ProgressBar, ':mean_rate token' do
|
|
9
9
|
time_now = Time.local(2014, 10, 5, 12, 0, 0)
|
10
10
|
Timecop.freeze(time_now)
|
11
11
|
progress = TTY::ProgressBar.new(":mean_rate", output: output, total: 100, interval: 1)
|
12
|
+
# Generate a serie of advances at 2s intervals
|
13
|
+
# t+0 advance=0 total=0
|
14
|
+
# t+2 advance=10 total=10
|
15
|
+
# t+4 advance=20 total=30
|
16
|
+
# t+6 advance=30 total=60
|
17
|
+
# t+8 advance=40 total=100
|
12
18
|
5.times do |i|
|
13
19
|
time_now = Time.local(2014, 10, 5, 12, 0, i * 2)
|
14
20
|
Timecop.freeze(time_now)
|
@@ -18,9 +24,9 @@ RSpec.describe TTY::ProgressBar, ':mean_rate token' do
|
|
18
24
|
expect(output.read).to eq([
|
19
25
|
"\e[1G 0.00",
|
20
26
|
"\e[1G 5.00",
|
27
|
+
"\e[1G 7.50",
|
21
28
|
"\e[1G10.00",
|
22
|
-
"\e[
|
23
|
-
"\e[1G20.00\n"
|
29
|
+
"\e[1G12.50\n"
|
24
30
|
].join)
|
25
31
|
Timecop.return
|
26
32
|
end
|
@@ -9,6 +9,12 @@ RSpec.describe TTY::ProgressBar, ':rate token' do
|
|
9
9
|
time_now = Time.local(2014, 10, 5, 12, 0, 0)
|
10
10
|
Timecop.freeze(time_now)
|
11
11
|
progress = TTY::ProgressBar.new(":rate", output: output, total: 100, interval: 1)
|
12
|
+
# Generate a serie of advances at 2s intervals
|
13
|
+
# t+0 advance=0 total=0
|
14
|
+
# t+2 advance=10 total=10
|
15
|
+
# t+4 advance=20 total=30
|
16
|
+
# t+6 advance=30 total=60
|
17
|
+
# t+8 advance=40 total=100
|
12
18
|
5.times do |i|
|
13
19
|
time_now = Time.local(2014, 10, 5, 12, 0, i * 2)
|
14
20
|
Timecop.freeze(time_now)
|
@@ -17,10 +23,10 @@ RSpec.describe TTY::ProgressBar, ':rate token' do
|
|
17
23
|
output.rewind
|
18
24
|
expect(output.read).to eq([
|
19
25
|
"\e[1G 0.00",
|
26
|
+
"\e[1G 5.00",
|
20
27
|
"\e[1G10.00",
|
21
|
-
"\e[
|
22
|
-
"\e[
|
23
|
-
"\e[1G40.00\n"
|
28
|
+
"\e[1G15.00",
|
29
|
+
"\e[1G20.00\n"
|
24
30
|
].join)
|
25
31
|
Timecop.return
|
26
32
|
end
|
data/spec/unit/meter_spec.rb
CHANGED
@@ -6,64 +6,67 @@ RSpec.describe TTY::ProgressBar::Meter, '#rate' do
|
|
6
6
|
|
7
7
|
after { Timecop.return }
|
8
8
|
|
9
|
+
it "measures with no samples" do
|
10
|
+
meter = TTY::ProgressBar::Meter.new(1)
|
11
|
+
|
12
|
+
meter.start
|
13
|
+
|
14
|
+
expect(meter.rate).to eq(0)
|
15
|
+
expect(meter.mean_rate).to eq(0)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "measures with a single sample" do
|
19
|
+
meter = TTY::ProgressBar::Meter.new(1)
|
20
|
+
start_time = Time.at(10, 0)
|
21
|
+
Timecop.freeze(start_time)
|
22
|
+
meter.start
|
23
|
+
|
24
|
+
meter.sample(Time.at(10, 100_000), 10)
|
25
|
+
|
26
|
+
expect(meter.rate).to eq(100)
|
27
|
+
expect(meter.mean_rate).to eq(100)
|
28
|
+
end
|
29
|
+
|
9
30
|
it "measures rate per second" do
|
10
31
|
meter = TTY::ProgressBar::Meter.new(1)
|
32
|
+
start_time = Time.at(10, 0)
|
33
|
+
Timecop.freeze(start_time)
|
11
34
|
meter.start
|
12
|
-
time_now = Time.local(2014, 10, 5, 12, 0, 0)
|
13
|
-
Timecop.freeze(time_now)
|
14
35
|
|
15
36
|
# First sample batch
|
16
|
-
|
17
|
-
meter.
|
18
|
-
expect(meter.
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
meter.
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
expect(meter.
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
meter.
|
34
|
-
expect(meter.
|
35
|
-
expect(meter.mean_rate).to eq(2250)
|
36
|
-
|
37
|
-
time_now = Time.local(2014, 10, 5, 12, 0, 1, 500)
|
38
|
-
meter.sample time_now, 500
|
39
|
-
expect(meter.rate).to eq(500)
|
40
|
-
expect(meter.mean_rate).to eq(2500)
|
41
|
-
|
42
|
-
# Third sample batch after 3s
|
43
|
-
time_now = Time.local(2014, 10, 5, 12, 0, 2, 600)
|
44
|
-
meter.sample time_now, 3000
|
45
|
-
expect(meter.rate).to eq(3000)
|
46
|
-
expect(meter.mean_rate).to be_within(0.7).of(2666)
|
47
|
-
|
48
|
-
time_now = Time.local(2014, 10, 5, 12, 0, 2, 700)
|
49
|
-
meter.sample time_now, 3000
|
50
|
-
expect(meter.rate).to eq(3000)
|
51
|
-
expect(meter.mean_rate).to be_within(0.7).of(3666)
|
37
|
+
meter.sample Time.at(10, 100_000), 5
|
38
|
+
expect(meter.rate).to eq(50)
|
39
|
+
expect(meter.mean_rate).to eq(50)
|
40
|
+
|
41
|
+
meter.sample Time.at(10, 500_000), 5
|
42
|
+
expect(meter.rate).to eq(20)
|
43
|
+
expect(meter.mean_rate).to eq(20)
|
44
|
+
|
45
|
+
meter.sample Time.at(11, 000_000), 5
|
46
|
+
expect(meter.rate).to eq(15)
|
47
|
+
expect(meter.mean_rate).to eq(15)
|
48
|
+
|
49
|
+
meter.sample Time.at(11, 500_000), 5
|
50
|
+
expect(meter.rate).to eq(10)
|
51
|
+
expect(meter.mean_rate).to be_within(0.001).of(13.333)
|
52
|
+
|
53
|
+
meter.sample Time.at(12, 000_000), 10
|
54
|
+
expect(meter.rate).to eq(15)
|
55
|
+
expect(meter.mean_rate).to eq(15)
|
52
56
|
end
|
53
57
|
|
54
58
|
it "clears measurements" do
|
55
59
|
meter = TTY::ProgressBar::Meter.new(1)
|
60
|
+
start_time = Time.at(10, 0)
|
61
|
+
Timecop.freeze(start_time)
|
56
62
|
meter.start
|
57
|
-
time_now = Time.local(2014, 10, 5, 12, 0, 0)
|
58
|
-
Timecop.freeze(time_now)
|
59
63
|
|
60
|
-
|
61
|
-
meter.
|
62
|
-
expect(meter.rates).to eq([1000])
|
64
|
+
meter.sample(start_time + 1, 1000)
|
65
|
+
expect(meter.rates).to eq([1000, 1000])
|
63
66
|
expect(meter.rate).to eq(1000)
|
64
67
|
|
65
68
|
meter.clear
|
66
|
-
expect(meter.rates).to eq([])
|
69
|
+
expect(meter.rates).to eq([0])
|
67
70
|
expect(meter.rate).to eq(0)
|
68
71
|
end
|
69
72
|
end
|
metadata
CHANGED
@@ -1,61 +1,61 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty-progressbar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tty-screen
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.5.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.5.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.5.0
|
34
|
-
- - <
|
34
|
+
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
36
|
version: '2.0'
|
37
37
|
type: :development
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 1.5.0
|
44
|
-
- - <
|
44
|
+
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '2.0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
|
-
- -
|
51
|
+
- - ">="
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
|
-
- -
|
58
|
+
- - ">="
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: '0'
|
61
61
|
description: A flexible progress bars drawing in terminal emulators.
|
@@ -65,10 +65,10 @@ executables: []
|
|
65
65
|
extensions: []
|
66
66
|
extra_rdoc_files: []
|
67
67
|
files:
|
68
|
-
- .codeclimate.yml
|
69
|
-
- .gitignore
|
70
|
-
- .rspec
|
71
|
-
- .travis.yml
|
68
|
+
- ".codeclimate.yml"
|
69
|
+
- ".gitignore"
|
70
|
+
- ".rspec"
|
71
|
+
- ".travis.yml"
|
72
72
|
- CHANGELOG.md
|
73
73
|
- Gemfile
|
74
74
|
- LICENSE.txt
|
@@ -147,17 +147,17 @@ require_paths:
|
|
147
147
|
- lib
|
148
148
|
required_ruby_version: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- -
|
150
|
+
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
154
|
requirements:
|
155
|
-
- -
|
155
|
+
- - ">="
|
156
156
|
- !ruby/object:Gem::Version
|
157
157
|
version: '0'
|
158
158
|
requirements: []
|
159
159
|
rubyforge_project:
|
160
|
-
rubygems_version: 2.
|
160
|
+
rubygems_version: 2.5.1
|
161
161
|
signing_key:
|
162
162
|
specification_version: 4
|
163
163
|
summary: A flexible progress bars drawing in terminal emulators.
|