ruby-progressbar 1.6.1 → 1.7.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/Rakefile +1 -1
- data/lib/ruby-progressbar.rb +8 -3
- data/lib/ruby-progressbar/base.rb +121 -177
- data/lib/ruby-progressbar/calculators/length.rb +75 -0
- data/lib/ruby-progressbar/calculators/length_spec.rb +9 -0
- data/lib/ruby-progressbar/calculators/running_average.rb +9 -0
- data/lib/ruby-progressbar/components.rb +3 -5
- data/lib/ruby-progressbar/components/bar.rb +79 -43
- data/lib/ruby-progressbar/components/percentage.rb +29 -0
- data/lib/ruby-progressbar/components/rate.rb +34 -62
- data/lib/ruby-progressbar/components/time.rb +103 -0
- data/lib/ruby-progressbar/components/title.rb +13 -0
- data/lib/ruby-progressbar/format.rb +2 -1
- data/lib/ruby-progressbar/format/formatter.rb +27 -0
- data/lib/ruby-progressbar/format/molecule.rb +55 -37
- data/lib/ruby-progressbar/format/string.rb +36 -0
- data/lib/ruby-progressbar/output.rb +61 -0
- data/lib/ruby-progressbar/outputs/non_tty.rb +47 -0
- data/lib/ruby-progressbar/outputs/tty.rb +32 -0
- data/lib/ruby-progressbar/progress.rb +110 -0
- data/lib/ruby-progressbar/throttle.rb +25 -0
- data/lib/ruby-progressbar/time.rb +20 -17
- data/lib/ruby-progressbar/timer.rb +72 -0
- data/lib/ruby-progressbar/version.rb +2 -2
- data/spec/fixtures/benchmark.rb +21 -4
- data/spec/{lib/ruby-progressbar → ruby-progressbar}/base_spec.rb +55 -62
- data/spec/ruby-progressbar/calculators/running_average_spec.rb +19 -0
- data/spec/ruby-progressbar/components/bar_spec.rb +234 -0
- data/spec/ruby-progressbar/components/percentage_spec.rb +9 -0
- data/spec/ruby-progressbar/components/rate_spec.rb +9 -0
- data/spec/ruby-progressbar/components/throttle_spec.rb +157 -0
- data/spec/ruby-progressbar/components/time_spec.rb +308 -0
- data/spec/ruby-progressbar/components/title_spec.rb +12 -0
- data/spec/ruby-progressbar/format/formatter_spec.rb +9 -0
- data/spec/ruby-progressbar/format/molecule_spec.rb +30 -0
- data/spec/ruby-progressbar/format/string_spec.rb +9 -0
- data/spec/ruby-progressbar/output_spec.rb +7 -0
- data/spec/ruby-progressbar/outputs/non_tty_spec.rb +9 -0
- data/spec/ruby-progressbar/outputs/tty_spec.rb +9 -0
- data/spec/ruby-progressbar/progress_spec.rb +150 -0
- data/spec/ruby-progressbar/time_spec.rb +37 -0
- data/spec/ruby-progressbar/timer_spec.rb +7 -0
- data/spec/spec_helper.rb +2 -2
- data/spec/support/time.rb +3 -1
- metadata +55 -35
- data/lib/ruby-progressbar/components/elapsed_timer.rb +0 -25
- data/lib/ruby-progressbar/components/estimated_timer.rb +0 -90
- data/lib/ruby-progressbar/components/progressable.rb +0 -112
- data/lib/ruby-progressbar/components/throttle.rb +0 -21
- data/lib/ruby-progressbar/components/timer.rb +0 -69
- data/lib/ruby-progressbar/format/base.rb +0 -55
- data/lib/ruby-progressbar/formatter.rb +0 -112
- data/lib/ruby-progressbar/length_calculator.rb +0 -64
- data/lib/ruby-progressbar/running_average_calculator.rb +0 -7
- data/spec/lib/ruby-progressbar/components/bar_spec.rb +0 -210
- data/spec/lib/ruby-progressbar/components/elapsed_timer_spec.rb +0 -91
- data/spec/lib/ruby-progressbar/components/estimated_timer_spec.rb +0 -241
- data/spec/lib/ruby-progressbar/components/progressable_spec.rb +0 -47
- data/spec/lib/ruby-progressbar/components/throttle_spec.rb +0 -100
- data/spec/lib/ruby-progressbar/format/molecule_spec.rb +0 -22
- data/spec/lib/ruby-progressbar/running_average_calculator_spec.rb +0 -11
- data/spec/lib/ruby-progressbar/time_spec.rb +0 -49
@@ -1,64 +0,0 @@
|
|
1
|
-
class ProgressBar
|
2
|
-
module LengthCalculator
|
3
|
-
def initialize(options)
|
4
|
-
@length_override = ENV['RUBY_PROGRESS_BAR_LENGTH'] || options[:length]
|
5
|
-
@length_override = @length_override.to_i if @length_override
|
6
|
-
@current_length = nil
|
7
|
-
|
8
|
-
super()
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
def length
|
13
|
-
@current_length || reset_length
|
14
|
-
end
|
15
|
-
|
16
|
-
def length_changed?
|
17
|
-
@current_length != calculate_length
|
18
|
-
end
|
19
|
-
|
20
|
-
def calculate_length
|
21
|
-
@length_override || terminal_width || 80
|
22
|
-
end
|
23
|
-
|
24
|
-
def reset_length
|
25
|
-
@current_length = calculate_length
|
26
|
-
end
|
27
|
-
|
28
|
-
# This code was copied and modified from Rake, available under MIT-LICENSE
|
29
|
-
# Copyright (c) 2003, 2004 Jim Weirich
|
30
|
-
def terminal_width
|
31
|
-
return 80 unless unix?
|
32
|
-
|
33
|
-
result = dynamic_width
|
34
|
-
(result < 20) ? 80 : result
|
35
|
-
rescue
|
36
|
-
80
|
37
|
-
end
|
38
|
-
|
39
|
-
begin
|
40
|
-
require 'io/console'
|
41
|
-
|
42
|
-
def dynamic_width
|
43
|
-
_rows, columns = IO.console.winsize
|
44
|
-
columns
|
45
|
-
end
|
46
|
-
rescue LoadError
|
47
|
-
def dynamic_width
|
48
|
-
dynamic_width_stty.nonzero? || dynamic_width_tput
|
49
|
-
end
|
50
|
-
|
51
|
-
def dynamic_width_stty
|
52
|
-
%x{stty size 2>/dev/null}.split[1].to_i
|
53
|
-
end
|
54
|
-
|
55
|
-
def dynamic_width_tput
|
56
|
-
%x{tput cols 2>/dev/null}.to_i
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def unix?
|
61
|
-
RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,210 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ProgressBar::Components::Bar do
|
4
|
-
context 'when a new bar is created' do
|
5
|
-
context 'and no parameters are passed' do
|
6
|
-
before { @progressbar = ProgressBar::Components::Bar.new }
|
7
|
-
|
8
|
-
describe '#total' do
|
9
|
-
it 'returns the default total' do
|
10
|
-
expect(@progressbar.total).to eql ProgressBar::Components::Bar::DEFAULT_TOTAL
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '#progress_mark' do
|
15
|
-
it 'returns the default mark' do
|
16
|
-
expect(@progressbar.progress_mark).to eql ProgressBar::Components::Bar::DEFAULT_PROGRESS_MARK
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#remainder_mark' do
|
21
|
-
it 'returns the default remainder mark' do
|
22
|
-
expect(@progressbar.remainder_mark).to eql ProgressBar::Components::Bar::DEFAULT_REMAINDER_MARK
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'and the bar has not been started' do
|
27
|
-
describe '#progress' do
|
28
|
-
it 'returns the default beginning position' do
|
29
|
-
expect(@progressbar.progress).to be_zero
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'and the bar has been started with no starting value given' do
|
35
|
-
before { @progressbar.start }
|
36
|
-
|
37
|
-
describe '#progress' do
|
38
|
-
it 'returns the default starting value' do
|
39
|
-
expect(@progressbar.progress).to eql ProgressBar::Components::Progressable::DEFAULT_BEGINNING_POSITION
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'and the bar has been started with a starting value' do
|
45
|
-
before { @progressbar.start :at => 10 }
|
46
|
-
|
47
|
-
describe '#progress' do
|
48
|
-
it 'returns the given starting value' do
|
49
|
-
expect(@progressbar.progress).to eql 10
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'and options are passed' do
|
56
|
-
before { @progressbar = ProgressBar::Components::Bar.new(:total => 12, :progress_mark => 'x', :remainder_mark => '.') }
|
57
|
-
|
58
|
-
describe '#total' do
|
59
|
-
it 'returns the overridden total' do
|
60
|
-
expect(@progressbar.total).to eql 12
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
describe '#progress_mark' do
|
65
|
-
it 'returns the overridden mark' do
|
66
|
-
expect(@progressbar.progress_mark).to eql 'x'
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe '#remainder_mark' do
|
71
|
-
it 'returns the overridden mark' do
|
72
|
-
expect(@progressbar.remainder_mark).to eql '.'
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'when just begun' do
|
79
|
-
before do
|
80
|
-
@progressbar = ProgressBar::Components::Bar.new(:total => 50)
|
81
|
-
@progressbar.length = 100
|
82
|
-
@progressbar.start
|
83
|
-
end
|
84
|
-
|
85
|
-
describe '#percentage_completed' do
|
86
|
-
it 'calculates the amount' do
|
87
|
-
expect(@progressbar.percentage_completed).to eql 0
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe '#to_s' do
|
92
|
-
it 'displays the bar with no indication of progress' do
|
93
|
-
expect(@progressbar.to_s).to eql ' '
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
context 'when nothing has been completed' do
|
99
|
-
before do
|
100
|
-
@progressbar = ProgressBar::Components::Bar.new(:total => 50)
|
101
|
-
@progressbar.length = 100
|
102
|
-
@progressbar.start
|
103
|
-
end
|
104
|
-
|
105
|
-
context 'and the bar is incremented' do
|
106
|
-
before { @progressbar.increment }
|
107
|
-
|
108
|
-
it 'adds to the progress amount' do
|
109
|
-
expect(@progressbar.progress).to eql 1
|
110
|
-
end
|
111
|
-
|
112
|
-
describe '#percentage_completed' do
|
113
|
-
it 'calculates the amount completed' do
|
114
|
-
expect(@progressbar.percentage_completed).to eql 2
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe '#to_s' do
|
119
|
-
it 'displays the bar with an indication of progress' do
|
120
|
-
expect(@progressbar.to_s).to eql '== '
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe '#percentage_completed' do
|
126
|
-
it 'is zero' do
|
127
|
-
expect(@progressbar.percentage_completed).to eql 0
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
describe '#to_s' do
|
132
|
-
it 'displays the bar with no indication of progress' do
|
133
|
-
expect(@progressbar.to_s).to eql ' '
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context 'when a fraction of a percentage has been completed' do
|
139
|
-
before do
|
140
|
-
@progressbar = ProgressBar::Components::Bar.new(:total => 200)
|
141
|
-
@progressbar.length = 100
|
142
|
-
@progressbar.start :at => 1
|
143
|
-
end
|
144
|
-
|
145
|
-
describe '#percentage_completed' do
|
146
|
-
it 'always rounds down' do
|
147
|
-
expect(@progressbar.percentage_completed).to eql 0
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
describe '#to_s' do
|
152
|
-
it 'displays the bar with no indication of progress' do
|
153
|
-
expect(@progressbar.to_s).to eql ' '
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
context 'when completed' do
|
159
|
-
before do
|
160
|
-
@progressbar = ProgressBar::Components::Bar.new(:total => 50)
|
161
|
-
@progressbar.length = 100
|
162
|
-
@progressbar.start :at => 50
|
163
|
-
end
|
164
|
-
|
165
|
-
context 'and the bar is incremented' do
|
166
|
-
before { @progressbar.increment }
|
167
|
-
|
168
|
-
it 'does not increment past the total' do
|
169
|
-
expect(@progressbar.progress).to eql 50
|
170
|
-
expect(@progressbar.percentage_completed).to eql 100
|
171
|
-
end
|
172
|
-
|
173
|
-
describe '#to_s' do
|
174
|
-
it 'displays the bar as 100% complete' do
|
175
|
-
expect(@progressbar.to_s).to eql '=' * 100
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
context 'and the bar is decremented' do
|
181
|
-
before { @progressbar.decrement }
|
182
|
-
|
183
|
-
it 'removes some progress from the bar' do
|
184
|
-
expect(@progressbar.progress).to eql 49
|
185
|
-
expect(@progressbar.percentage_completed).to eql 98
|
186
|
-
end
|
187
|
-
|
188
|
-
describe '#to_s' do
|
189
|
-
it 'displays the bar as 98% complete' do
|
190
|
-
expect(@progressbar.to_s).to eql "#{'=' * 98} "
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
describe '#to_s' do
|
196
|
-
it 'displays the bar as 100% complete' do
|
197
|
-
expect(@progressbar.to_s).to eql ('=' * 100)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
context "when attempting to set the bar's current value to be greater than the total" do
|
203
|
-
describe '#new' do
|
204
|
-
it 'raises an error' do
|
205
|
-
@progressbar = ProgressBar::Components::Bar.new(:total => 10)
|
206
|
-
expect { @progressbar.start :at => 11 }.to raise_error(ProgressBar::InvalidProgressError, "You can't set the item's current value to be greater than the total.")
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ProgressBar::Components::ElapsedTimer do
|
4
|
-
before { @timer = ProgressBar::Components::ElapsedTimer.new }
|
5
|
-
|
6
|
-
describe '#to_s' do
|
7
|
-
context 'when the timer has not been started' do
|
8
|
-
it 'displays "Time: --:--:--"' do
|
9
|
-
expect(@timer.to_s).to eql 'Time: --:--:--'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
context 'when it has just been started' do
|
14
|
-
it 'displays "Time: 00:00:00"' do
|
15
|
-
@timer.start
|
16
|
-
expect(@timer.to_s).to eql 'Time: 00:00:00'
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'when it was started 4 hours, 28 minutes and 13 seconds ago' do
|
21
|
-
before do
|
22
|
-
Timecop.travel(-16093) do
|
23
|
-
@timer.start
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'and it was stopped 32 seconds ago' do
|
28
|
-
before do
|
29
|
-
Timecop.travel(-32) do
|
30
|
-
@timer.stop
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'and #reset is called' do
|
35
|
-
before { @timer.reset }
|
36
|
-
|
37
|
-
it 'displays "Time: --:--:--"' do
|
38
|
-
expect(@timer.to_s).to eql 'Time: --:--:--'
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'displays "Time: 04:27:41"' do
|
43
|
-
expect(@timer.to_s).to eql 'Time: 04:27:41'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context 'and #reset is called' do
|
48
|
-
before { @timer.reset }
|
49
|
-
|
50
|
-
it 'displays "Time: --:--:--"' do
|
51
|
-
expect(@timer.to_s).to eql 'Time: --:--:--'
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'displays "Time: 04:28:13"' do
|
56
|
-
expect(@timer.to_s).to eql 'Time: 04:28:13'
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe '#stopped?' do
|
62
|
-
context 'when the timer is started' do
|
63
|
-
before { @timer.start }
|
64
|
-
|
65
|
-
context 'and then it is stopped' do
|
66
|
-
before { @timer.stop }
|
67
|
-
|
68
|
-
context 'and then it is restarted' do
|
69
|
-
before { @timer.start }
|
70
|
-
|
71
|
-
it 'is false' do
|
72
|
-
expect(@timer).not_to be_stopped
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context "when the timer has yet to be started" do
|
79
|
-
it 'is false' do
|
80
|
-
expect(@timer).not_to be_stopped
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context "when the timer is stopped without having been started" do
|
85
|
-
before { @timer.stop }
|
86
|
-
it 'is false' do
|
87
|
-
expect(@timer).not_to be_stopped
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
@@ -1,241 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'support/time'
|
3
|
-
|
4
|
-
describe ProgressBar::Components::EstimatedTimer do
|
5
|
-
describe '#progress=' do
|
6
|
-
it 'raises an error when passed a number larger than the total' do
|
7
|
-
@estimated_time = ProgressBar::Components::EstimatedTimer.new(:total => 100)
|
8
|
-
expect { @estimated_time.progress = 101 }.to raise_error(ProgressBar::InvalidProgressError, "You can't set the item's current value to be greater than the total.")
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
describe '#to_s' do
|
13
|
-
context 'when the timer has been started but no progress has been made' do
|
14
|
-
before do
|
15
|
-
@estimated_time = ProgressBar::Components::EstimatedTimer.new(:total => 100)
|
16
|
-
@estimated_time.start
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'displays an unknown time remaining' do
|
20
|
-
expect(@estimated_time.to_s).to eql ' ETA: ??:??:??'
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'and it is incremented' do
|
24
|
-
it 'should not display unknown time remaining' do
|
25
|
-
@estimated_time.increment
|
26
|
-
expect(@estimated_time.to_s).not_to eql ' ETA: ??:??:??'
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context 'when half the progress has been made' do
|
32
|
-
context 'and smoothing is turned off' do
|
33
|
-
let(:smoothing) { 0.0 }
|
34
|
-
|
35
|
-
context 'and it took 3:42:12 to do it' do
|
36
|
-
before do
|
37
|
-
@estimated_time = ProgressBar::Components::EstimatedTimer.new(:starting_at => 0, :total => 100, :smoothing => smoothing)
|
38
|
-
|
39
|
-
Timecop.travel(-13332) do
|
40
|
-
@estimated_time.start
|
41
|
-
50.times { @estimated_time.increment }
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'when #decrement is called' do
|
46
|
-
before { 20.times { @estimated_time.decrement } }
|
47
|
-
|
48
|
-
it 'displays the correct time remaining' do
|
49
|
-
expect(@estimated_time.to_s).to eql ' ETA: 08:38:28'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
context 'when #reset is called' do
|
54
|
-
before { @estimated_time.reset }
|
55
|
-
|
56
|
-
it 'displays unknown time remaining' do
|
57
|
-
expect(@estimated_time.to_s).to eql ' ETA: ??:??:??'
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'displays the correct time remaining' do
|
62
|
-
expect(@estimated_time.to_s).to eql ' ETA: 03:42:12'
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context 'when it is estimated to take longer than 99:59:59' do
|
67
|
-
before do
|
68
|
-
@estimated_time = ProgressBar::Components::EstimatedTimer.new(:starting_at => 0, :total => 100, :smoothing => smoothing)
|
69
|
-
|
70
|
-
Timecop.travel(-120000) do
|
71
|
-
@estimated_time.start
|
72
|
-
25.times { @estimated_time.increment }
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context 'and the out of bounds time format has been set to "friendly"' do
|
77
|
-
before { @estimated_time.out_of_bounds_time_format = :friendly }
|
78
|
-
|
79
|
-
it 'displays "> 4 Days" remaining' do
|
80
|
-
expect(@estimated_time.to_s).to eql ' ETA: > 4 Days'
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context 'and the out of bounds time format has been set to "unknown"' do
|
85
|
-
before { @estimated_time.out_of_bounds_time_format = :unknown }
|
86
|
-
|
87
|
-
it 'displays "??:??:??" remaining' do
|
88
|
-
expect(@estimated_time.to_s).to eql ' ETA: ??:??:??'
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'displays the correct time remaining' do
|
93
|
-
expect(@estimated_time.to_s).to eql ' ETA: 100:00:00'
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
context 'and smoothing is turned on' do
|
99
|
-
let(:smoothing) { 0.5 }
|
100
|
-
|
101
|
-
context 'and it took 3:42:12 to do it' do
|
102
|
-
before do
|
103
|
-
@estimated_time = ProgressBar::Components::EstimatedTimer.new(:starting_at => 0, :total => 100, :smoothing => smoothing)
|
104
|
-
|
105
|
-
Timecop.travel(-13332) do
|
106
|
-
@estimated_time.start
|
107
|
-
50.times { @estimated_time.increment }
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context 'when #decrement is called' do
|
112
|
-
before { 20.times { @estimated_time.decrement } }
|
113
|
-
|
114
|
-
it 'displays the correct time remaining' do
|
115
|
-
expect(@estimated_time.to_s).to eql ' ETA: 08:14:34'
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
context 'when #reset is called' do
|
120
|
-
before { @estimated_time.reset }
|
121
|
-
|
122
|
-
it 'displays unknown time remaining' do
|
123
|
-
expect(@estimated_time.to_s).to eql ' ETA: ??:??:??'
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
it 'displays the correct time remaining' do
|
128
|
-
expect(@estimated_time.to_s).to eql ' ETA: 03:51:16'
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
context 'when it is estimated to take longer than 99:59:59' do
|
133
|
-
before do
|
134
|
-
@estimated_time = ProgressBar::Components::EstimatedTimer.new(:starting_at => 0, :total => 100, :smoothing => smoothing)
|
135
|
-
|
136
|
-
Timecop.travel(-120000) do
|
137
|
-
@estimated_time.start
|
138
|
-
25.times { @estimated_time.increment }
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
context 'and the out of bounds time format has been set to "friendly"' do
|
143
|
-
before { @estimated_time.out_of_bounds_time_format = :friendly }
|
144
|
-
|
145
|
-
it 'displays "> 4 Days" remaining' do
|
146
|
-
expect(@estimated_time.to_s).to eql ' ETA: > 4 Days'
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
context 'and the out of bounds time format has been set to "unknown"' do
|
151
|
-
before { @estimated_time.out_of_bounds_time_format = :unknown }
|
152
|
-
|
153
|
-
it 'displays "??:??:??" remaining' do
|
154
|
-
expect(@estimated_time.to_s).to eql ' ETA: ??:??:??'
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
it 'displays the correct time remaining' do
|
159
|
-
expect(@estimated_time.to_s).to eql ' ETA: 105:33:20'
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
it 'displays a good estimate for regular increments' do
|
166
|
-
begin
|
167
|
-
Timecop.freeze(t = Time.now)
|
168
|
-
n = 10
|
169
|
-
estimated_time = ProgressBar::Components::EstimatedTimer.new(:total => n)
|
170
|
-
estimated_time.start
|
171
|
-
results = (1..n).map do |i|
|
172
|
-
Timecop.freeze(t + 0.5 * i)
|
173
|
-
estimated_time.increment
|
174
|
-
estimated_time.to_s
|
175
|
-
end
|
176
|
-
|
177
|
-
expect(results).to eql([
|
178
|
-
' ETA: 00:00:05',
|
179
|
-
' ETA: 00:00:04',
|
180
|
-
' ETA: 00:00:04',
|
181
|
-
' ETA: 00:00:03',
|
182
|
-
' ETA: 00:00:03',
|
183
|
-
' ETA: 00:00:02',
|
184
|
-
' ETA: 00:00:02',
|
185
|
-
' ETA: 00:00:01',
|
186
|
-
' ETA: 00:00:01',
|
187
|
-
' ETA: 00:00:00',
|
188
|
-
])
|
189
|
-
ensure
|
190
|
-
Timecop.return
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
describe '#out_of_bounds_time_format=' do
|
196
|
-
context 'when set to an invalid format' do
|
197
|
-
it 'raises an exception' do
|
198
|
-
@estimated_time = ProgressBar::Components::EstimatedTimer.new(:total => 100)
|
199
|
-
expect { @estimated_time.out_of_bounds_time_format = :foo }.to raise_error('Invalid Out Of Bounds time format. Valid formats are [:unknown, :friendly, nil]')
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
describe '#start' do
|
205
|
-
|
206
|
-
###
|
207
|
-
# Using ruby-debug under jruby pulls in ruby-debug-base, which defines
|
208
|
-
# Kernel.start. This causes a bug, as EstimatedTimer::As::method_missing calls
|
209
|
-
# Kernel.start instead of EstimatedTimer.start. This spec duplicates the bug.
|
210
|
-
# Without the fix, this results in the following exception:
|
211
|
-
#
|
212
|
-
# 1) ruby-debug-base doesn't stop the progressbar from working
|
213
|
-
# Failure/Error: COUNT.times { bar.increment }
|
214
|
-
# NoMethodError:
|
215
|
-
# undefined method `+' for nil:NilClass
|
216
|
-
# # ./lib/ruby-progressbar/components/progressable.rb:33:in `increment'
|
217
|
-
#
|
218
|
-
it 'properly delegates' do
|
219
|
-
@output = StringIO.new('', 'w+')
|
220
|
-
|
221
|
-
module Kernel
|
222
|
-
def start(options={}, &block)
|
223
|
-
puts "Kernel.start has been called"
|
224
|
-
return nil
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
begin
|
229
|
-
COUNT = 100
|
230
|
-
|
231
|
-
bar = ProgressBar.create(:output => @output, :title => 'ruby-debug-base', :total => COUNT)
|
232
|
-
|
233
|
-
COUNT.times { bar.increment }
|
234
|
-
ensure
|
235
|
-
module Kernel
|
236
|
-
remove_method :start
|
237
|
-
end
|
238
|
-
end
|
239
|
-
end
|
240
|
-
end
|
241
|
-
end
|