progress_bar 0.1.0 → 0.2.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.
- data/lib/progress_bar/version.rb +1 -1
- data/lib/progress_bar.rb +109 -25
- metadata +14 -12
- data/lib/progress_bar/meter.rb +0 -5
- data/lib/progress_bar/meters.rb +0 -10
- data/lib/progress_bar/time_formatter.rb +0 -15
- data/test/counter_test.rb +0 -15
- data/test/elapsed_test.rb +0 -33
- data/test/eta_test.rb +0 -44
data/lib/progress_bar/version.rb
CHANGED
data/lib/progress_bar.rb
CHANGED
@@ -2,26 +2,27 @@
|
|
2
2
|
require 'options'
|
3
3
|
require 'highline'
|
4
4
|
|
5
|
-
require File.join(File.dirname(__FILE__), 'progress_bar', 'time_formatter')
|
6
|
-
require File.join(File.dirname(__FILE__), 'progress_bar', 'meter')
|
7
|
-
require File.join(File.dirname(__FILE__), 'progress_bar', 'meters')
|
8
|
-
|
9
5
|
class ProgressBar
|
10
6
|
|
11
|
-
attr_accessor :count, :max, :start
|
7
|
+
attr_accessor :count, :max, :start, :meters
|
8
|
+
|
9
|
+
def initialize(max = 100, meters = :all)
|
12
10
|
|
13
|
-
|
14
|
-
|
11
|
+
@count = 0
|
12
|
+
@max = max
|
13
|
+
@start = Time.now
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
if meters == :all
|
16
|
+
@meters = [:bar, :counter, :percentage, :elapsed, :eta, :rate]
|
17
|
+
else
|
18
|
+
@meters = meters
|
19
|
+
end
|
19
20
|
|
20
21
|
@hl = HighLine.new
|
21
22
|
end
|
22
23
|
|
23
|
-
def increment!
|
24
|
-
self.count
|
24
|
+
def increment!(count = 1)
|
25
|
+
self.count += count
|
25
26
|
write
|
26
27
|
end
|
27
28
|
|
@@ -30,33 +31,38 @@ class ProgressBar
|
|
30
31
|
print to_s
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
-
|
34
|
+
def remaining
|
35
|
+
max - count
|
35
36
|
end
|
36
37
|
|
37
|
-
def
|
38
|
-
|
38
|
+
def ratio
|
39
|
+
count.to_f / max
|
39
40
|
end
|
40
41
|
|
41
42
|
def percentage
|
42
|
-
|
43
|
+
ratio * 100
|
43
44
|
end
|
44
45
|
|
45
46
|
def elapsed
|
46
|
-
|
47
|
+
Time.now - start
|
48
|
+
end
|
49
|
+
|
50
|
+
def rate
|
51
|
+
if count > 0
|
52
|
+
count / elapsed
|
53
|
+
else
|
54
|
+
0
|
55
|
+
end
|
47
56
|
end
|
48
57
|
|
49
58
|
def eta
|
50
|
-
|
59
|
+
remaining / rate
|
51
60
|
end
|
52
61
|
|
53
62
|
def to_s
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
(elapsed.width + 1) -
|
58
|
-
(eta.width + 1)
|
59
|
-
"#{bar(width)} #{counter} #{percentage} #{elapsed} #{eta}"
|
63
|
+
meters.inject("") do |text, meter|
|
64
|
+
text << render(meter) + " "
|
65
|
+
end.strip
|
60
66
|
end
|
61
67
|
|
62
68
|
protected
|
@@ -65,8 +71,86 @@ class ProgressBar
|
|
65
71
|
print "\r"
|
66
72
|
end
|
67
73
|
|
74
|
+
def render(meter)
|
75
|
+
send(:"render_#{meter}")
|
76
|
+
end
|
77
|
+
|
78
|
+
def width_of(meter)
|
79
|
+
send(:"#{meter}_width")
|
80
|
+
end
|
81
|
+
|
82
|
+
def render_bar
|
83
|
+
"[" +
|
84
|
+
"#" * (ratio * (bar_width - 2)).ceil +
|
85
|
+
" " * ((1-ratio) * (bar_width - 2)).floor +
|
86
|
+
"]"
|
87
|
+
end
|
88
|
+
|
89
|
+
def render_counter
|
90
|
+
"[%#{max.to_s.length}i/%i]" % [count, max]
|
91
|
+
end
|
92
|
+
|
93
|
+
def render_percentage
|
94
|
+
format = (max % 10 == 0 ? "%3i" : "%6.2f")
|
95
|
+
"[#{format}%%]" % percentage
|
96
|
+
end
|
97
|
+
|
98
|
+
def render_elapsed
|
99
|
+
"[#{format_interval(elapsed)}]"
|
100
|
+
end
|
101
|
+
|
102
|
+
def render_eta
|
103
|
+
"[#{format_interval(eta)}]"
|
104
|
+
end
|
105
|
+
|
106
|
+
def render_rate
|
107
|
+
"[%.2f/s]" % rate
|
108
|
+
end
|
109
|
+
|
68
110
|
def terminal_width
|
69
111
|
@hl.output_cols.to_i
|
70
112
|
end
|
71
113
|
|
114
|
+
def bar_width
|
115
|
+
terminal_width - non_bar_width
|
116
|
+
end
|
117
|
+
|
118
|
+
def non_bar_width
|
119
|
+
meters.reject { |m| m == :bar }.inject(0) do |width, meter|
|
120
|
+
width += width_of(meter) + 1
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def counter_width # [ 1/100]
|
125
|
+
max.to_s.length * 2 + 3
|
126
|
+
end
|
127
|
+
|
128
|
+
def percentage_width
|
129
|
+
if max == 100 # [ 24%]
|
130
|
+
6
|
131
|
+
else # [ 24.0%]
|
132
|
+
8
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def elapsed_width
|
137
|
+
format_interval(elapsed).length + 2
|
138
|
+
end
|
139
|
+
|
140
|
+
def eta_width
|
141
|
+
format_interval(eta).length + 2
|
142
|
+
end
|
143
|
+
|
144
|
+
def rate_width # [ 23.45/s]
|
145
|
+
render_rate.length
|
146
|
+
end
|
147
|
+
|
148
|
+
def format_interval(interval)
|
149
|
+
if interval > 3600
|
150
|
+
"%02i:%02i:%02i" % [interval/3600, interval%3600/60, interval%60]
|
151
|
+
else
|
152
|
+
"%02i:%02i" % [interval/60, interval%60]
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
72
156
|
end
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: progress_bar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Paul Sasauskas
|
@@ -10,7 +15,7 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-04-
|
18
|
+
date: 2011-04-08 00:00:00 -06:00
|
14
19
|
default_executable:
|
15
20
|
dependencies: []
|
16
21
|
|
@@ -29,19 +34,13 @@ files:
|
|
29
34
|
- README.mkd
|
30
35
|
- Rakefile
|
31
36
|
- lib/progress_bar.rb
|
32
|
-
- lib/progress_bar/meter.rb
|
33
|
-
- lib/progress_bar/meters.rb
|
34
37
|
- lib/progress_bar/meters/bar.rb
|
35
38
|
- lib/progress_bar/meters/counter.rb
|
36
39
|
- lib/progress_bar/meters/elapsed.rb
|
37
40
|
- lib/progress_bar/meters/eta.rb
|
38
41
|
- lib/progress_bar/meters/percentage.rb
|
39
|
-
- lib/progress_bar/time_formatter.rb
|
40
42
|
- lib/progress_bar/version.rb
|
41
43
|
- progress_bar.gemspec
|
42
|
-
- test/counter_test.rb
|
43
|
-
- test/elapsed_test.rb
|
44
|
-
- test/eta_test.rb
|
45
44
|
- test/progres_bar_test.rb
|
46
45
|
- test/test_helper.rb
|
47
46
|
has_rdoc: true
|
@@ -58,23 +57,26 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
57
|
requirements:
|
59
58
|
- - ">="
|
60
59
|
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 0
|
61
63
|
version: "0"
|
62
64
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
65
|
none: false
|
64
66
|
requirements:
|
65
67
|
- - ">="
|
66
68
|
- !ruby/object:Gem::Version
|
69
|
+
hash: 3
|
70
|
+
segments:
|
71
|
+
- 0
|
67
72
|
version: "0"
|
68
73
|
requirements: []
|
69
74
|
|
70
75
|
rubyforge_project: progress_bar
|
71
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.5.2
|
72
77
|
signing_key:
|
73
78
|
specification_version: 3
|
74
79
|
summary: Simple Progress Bar for output to a terminal
|
75
80
|
test_files:
|
76
|
-
- test/counter_test.rb
|
77
|
-
- test/elapsed_test.rb
|
78
|
-
- test/eta_test.rb
|
79
81
|
- test/progres_bar_test.rb
|
80
82
|
- test/test_helper.rb
|
data/lib/progress_bar/meter.rb
DELETED
data/lib/progress_bar/meters.rb
DELETED
data/test/counter_test.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
-
|
3
|
-
describe "Counter formatter" do
|
4
|
-
before do
|
5
|
-
@counter = ProgressBar::Counter.new(50, 100)
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'should format properly' do
|
9
|
-
@counter.to_s.must_equal "[ 50/100]"
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'should have the correct width' do
|
13
|
-
@counter.width.must_equal 9
|
14
|
-
end
|
15
|
-
end
|
data/test/elapsed_test.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
-
|
3
|
-
describe "Elapsed formatter" do
|
4
|
-
before do
|
5
|
-
start = Time.now - 60
|
6
|
-
@elapsed = ProgressBar::Elapsed.new(start)
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should format properly' do
|
10
|
-
@elapsed.to_s.must_equal "[01:00]"
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should have the correct width' do
|
14
|
-
@elapsed.width.must_equal 7
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "long running tasks" do
|
18
|
-
before do
|
19
|
-
start = Time.now - 6*3600
|
20
|
-
@elapsed = ProgressBar::Elapsed.new(start)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'should format properly' do
|
24
|
-
@elapsed.to_s.must_equal "[06:00:00]"
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should have the correct width' do
|
28
|
-
@elapsed.width.must_equal 10
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
data/test/eta_test.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
-
|
3
|
-
describe "ETA formatter" do
|
4
|
-
before do
|
5
|
-
start = Time.now - 60
|
6
|
-
@eta = ProgressBar::ETA.new(start, 50, 100)
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should format properly' do
|
10
|
-
@eta.to_s.must_equal "[ETA: 01:00]"
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should have the correct width' do
|
14
|
-
@eta.width.must_equal 12
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should be 0 at the end' do
|
18
|
-
eta = ProgressBar::ETA.new(Time.now - 5, 100, 100)
|
19
|
-
eta.remaining.must_equal 0
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should not have an error at the start' do
|
23
|
-
eta = ProgressBar::ETA.new(Time.now, 0, 100)
|
24
|
-
eta.remaining.must_equal 0
|
25
|
-
eta.to_s.must_equal "[ETA: 00:00]"
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "long running tasks" do
|
29
|
-
before do
|
30
|
-
start = Time.now - 6*3600
|
31
|
-
@eta = ProgressBar::ETA.new(start, 50, 100)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should format properly' do
|
35
|
-
@eta.to_s.must_equal "[ETA: 06:00:00]"
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'should have the correct width' do
|
39
|
-
@eta.width.must_equal 15
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|