ruby-progressbar 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/lib/ruby-progressbar.rb +8 -3
  4. data/lib/ruby-progressbar/base.rb +121 -177
  5. data/lib/ruby-progressbar/calculators/length.rb +75 -0
  6. data/lib/ruby-progressbar/calculators/length_spec.rb +9 -0
  7. data/lib/ruby-progressbar/calculators/running_average.rb +9 -0
  8. data/lib/ruby-progressbar/components.rb +3 -5
  9. data/lib/ruby-progressbar/components/bar.rb +79 -43
  10. data/lib/ruby-progressbar/components/percentage.rb +29 -0
  11. data/lib/ruby-progressbar/components/rate.rb +34 -62
  12. data/lib/ruby-progressbar/components/time.rb +103 -0
  13. data/lib/ruby-progressbar/components/title.rb +13 -0
  14. data/lib/ruby-progressbar/format.rb +2 -1
  15. data/lib/ruby-progressbar/format/formatter.rb +27 -0
  16. data/lib/ruby-progressbar/format/molecule.rb +55 -37
  17. data/lib/ruby-progressbar/format/string.rb +36 -0
  18. data/lib/ruby-progressbar/output.rb +61 -0
  19. data/lib/ruby-progressbar/outputs/non_tty.rb +47 -0
  20. data/lib/ruby-progressbar/outputs/tty.rb +32 -0
  21. data/lib/ruby-progressbar/progress.rb +110 -0
  22. data/lib/ruby-progressbar/throttle.rb +25 -0
  23. data/lib/ruby-progressbar/time.rb +20 -17
  24. data/lib/ruby-progressbar/timer.rb +72 -0
  25. data/lib/ruby-progressbar/version.rb +2 -2
  26. data/spec/fixtures/benchmark.rb +21 -4
  27. data/spec/{lib/ruby-progressbar → ruby-progressbar}/base_spec.rb +55 -62
  28. data/spec/ruby-progressbar/calculators/running_average_spec.rb +19 -0
  29. data/spec/ruby-progressbar/components/bar_spec.rb +234 -0
  30. data/spec/ruby-progressbar/components/percentage_spec.rb +9 -0
  31. data/spec/ruby-progressbar/components/rate_spec.rb +9 -0
  32. data/spec/ruby-progressbar/components/throttle_spec.rb +157 -0
  33. data/spec/ruby-progressbar/components/time_spec.rb +308 -0
  34. data/spec/ruby-progressbar/components/title_spec.rb +12 -0
  35. data/spec/ruby-progressbar/format/formatter_spec.rb +9 -0
  36. data/spec/ruby-progressbar/format/molecule_spec.rb +30 -0
  37. data/spec/ruby-progressbar/format/string_spec.rb +9 -0
  38. data/spec/ruby-progressbar/output_spec.rb +7 -0
  39. data/spec/ruby-progressbar/outputs/non_tty_spec.rb +9 -0
  40. data/spec/ruby-progressbar/outputs/tty_spec.rb +9 -0
  41. data/spec/ruby-progressbar/progress_spec.rb +150 -0
  42. data/spec/ruby-progressbar/time_spec.rb +37 -0
  43. data/spec/ruby-progressbar/timer_spec.rb +7 -0
  44. data/spec/spec_helper.rb +2 -2
  45. data/spec/support/time.rb +3 -1
  46. metadata +55 -35
  47. data/lib/ruby-progressbar/components/elapsed_timer.rb +0 -25
  48. data/lib/ruby-progressbar/components/estimated_timer.rb +0 -90
  49. data/lib/ruby-progressbar/components/progressable.rb +0 -112
  50. data/lib/ruby-progressbar/components/throttle.rb +0 -21
  51. data/lib/ruby-progressbar/components/timer.rb +0 -69
  52. data/lib/ruby-progressbar/format/base.rb +0 -55
  53. data/lib/ruby-progressbar/formatter.rb +0 -112
  54. data/lib/ruby-progressbar/length_calculator.rb +0 -64
  55. data/lib/ruby-progressbar/running_average_calculator.rb +0 -7
  56. data/spec/lib/ruby-progressbar/components/bar_spec.rb +0 -210
  57. data/spec/lib/ruby-progressbar/components/elapsed_timer_spec.rb +0 -91
  58. data/spec/lib/ruby-progressbar/components/estimated_timer_spec.rb +0 -241
  59. data/spec/lib/ruby-progressbar/components/progressable_spec.rb +0 -47
  60. data/spec/lib/ruby-progressbar/components/throttle_spec.rb +0 -100
  61. data/spec/lib/ruby-progressbar/format/molecule_spec.rb +0 -22
  62. data/spec/lib/ruby-progressbar/running_average_calculator_spec.rb +0 -11
  63. data/spec/lib/ruby-progressbar/time_spec.rb +0 -49
@@ -0,0 +1,72 @@
1
+ require 'ruby-progressbar/time'
2
+
3
+ class ProgressBar
4
+ class Timer
5
+ attr_accessor :started_at,
6
+ :stopped_at
7
+
8
+ def initialize(options = {})
9
+ self.time = options[:time] || Time
10
+ end
11
+
12
+ def start
13
+ self.started_at = stopped? ? time.now - (stopped_at - started_at) : time.now
14
+ self.stopped_at = nil
15
+ end
16
+
17
+ def stop
18
+ return unless started?
19
+
20
+ self.stopped_at = time.now
21
+ end
22
+
23
+ def pause
24
+ stop
25
+ end
26
+
27
+ def resume
28
+ start
29
+ end
30
+
31
+ def started?
32
+ started_at
33
+ end
34
+
35
+ def stopped?
36
+ stopped_at
37
+ end
38
+
39
+ def reset
40
+ self.started_at = nil
41
+ self.stopped_at = nil
42
+ end
43
+
44
+ def reset?
45
+ !started_at
46
+ end
47
+
48
+ def restart
49
+ reset
50
+ start
51
+ end
52
+
53
+ def elapsed_seconds
54
+ ((stopped_at || time.now) - started_at)
55
+ end
56
+
57
+ def elapsed_whole_seconds
58
+ elapsed_seconds.floor
59
+ end
60
+
61
+ def divide_seconds(seconds)
62
+ hours, seconds = seconds.divmod(3600)
63
+ minutes, seconds = seconds.divmod(60)
64
+
65
+ [hours, minutes, seconds]
66
+ end
67
+
68
+ protected
69
+
70
+ attr_accessor :time
71
+ end
72
+ end
@@ -1,3 +1,3 @@
1
- class ProgressBar
2
- VERSION = '1.6.1'
1
+ class ProgressBar
2
+ VERSION = '1.7.0'
3
3
  end
@@ -1,11 +1,28 @@
1
- # bundle exec ruby-prof --printer=graph_html --file=../results.html --require 'ruby-progressbar' --sort=total ./spec/fixtures/benchmark.rb
1
+ # bundle exec ruby-prof --printer=graph_html
2
+ # --file=../results.html
3
+ # --require 'ruby-progressbar'
4
+ # --sort=total ./spec/fixtures/benchmark.rb
2
5
 
3
- total = 10
6
+ total = 100_000
4
7
  # output = File.open('/Users/jfelchner/Downloads/benchmark.txt', 'w+')
5
8
  output = $stdout
6
- bar = ProgressBar.create(:output => output, :length => 80, :start => 0, :total => total)
9
+
10
+ # Progressbar gem
11
+ # bar = ProgressBar.new('Progress', total)
12
+ #
13
+ # total.times do |i|
14
+ # bar.inc
15
+ # end
16
+ #
17
+ # bar.finish
18
+
19
+ # Ruby/ProgressBar
20
+ bar = ProgressBar.create(:output => output,
21
+ :length => 80,
22
+ :start => 0,
23
+ :total => total)
7
24
 
8
25
  total.times do |i|
9
- bar.log i
26
+ # bar.log i
10
27
  bar.increment
11
28
  end
@@ -21,13 +21,13 @@ describe ProgressBar::Base do
21
21
  it 'can properly handle outputting the bar when the length changes on the fly to less than the minimum width' do
22
22
  progressbar = ProgressBar::Base.new(:output => output, :title => 'a' * 25, :format => '%t%B', :throttle_rate => 0.0)
23
23
 
24
- allow(progressbar).to receive(:terminal_width).
25
- and_return 30
24
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:terminal_width).
25
+ and_return 30
26
26
 
27
27
  progressbar.start
28
28
 
29
- allow(progressbar).to receive(:terminal_width).
30
- and_return 20
29
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:terminal_width).
30
+ and_return 20
31
31
 
32
32
  progressbar.increment
33
33
 
@@ -39,8 +39,8 @@ describe ProgressBar::Base do
39
39
  it 'returns the proper string' do
40
40
  progressbar = ProgressBar::Base.new(:output => output, :title => ('*' * 21), :starting_at => 5, :total => 10, :autostart => false)
41
41
 
42
- allow(progressbar).to receive(:terminal_width).
43
- and_return 20
42
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:terminal_width).
43
+ and_return 20
44
44
 
45
45
  expect(progressbar.to_s('%t%w')).to eql '*********************'
46
46
  end
@@ -50,8 +50,8 @@ describe ProgressBar::Base do
50
50
  it 'returns the proper string' do
51
51
  progressbar = ProgressBar::Base.new(:output => output, :title => ('*' * 21), :autostart => false)
52
52
 
53
- allow(progressbar).to receive(:terminal_width).
54
- and_return 20
53
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:terminal_width).
54
+ and_return 20
55
55
 
56
56
  expect(progressbar.to_s('%t%i')).to eql '*********************'
57
57
  end
@@ -59,8 +59,8 @@ describe ProgressBar::Base do
59
59
  it 'returns the proper string' do
60
60
  progressbar = ProgressBar::Base.new(:output => output, :title => ('*' * 21), :starting_at => 5, :total => 10, :autostart => false)
61
61
 
62
- allow(progressbar).to receive(:terminal_width).
63
- and_return 20
62
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:terminal_width).
63
+ and_return 20
64
64
 
65
65
  expect(progressbar.to_s('%t%i')).to eql '*********************'
66
66
  end
@@ -70,8 +70,8 @@ describe ProgressBar::Base do
70
70
  it 'returns the proper string' do
71
71
  progressbar = ProgressBar::Base.new(:output => output, :title => ('*' * 19), :starting_at => 5, :total => 10, :autostart => false)
72
72
 
73
- allow(progressbar).to receive(:terminal_width).
74
- and_return 20
73
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:terminal_width).
74
+ and_return 20
75
75
 
76
76
  expect(progressbar.to_s('%t%B')).to eql '******************* '
77
77
  end
@@ -79,8 +79,8 @@ describe ProgressBar::Base do
79
79
  it 'returns the proper string' do
80
80
  progressbar = ProgressBar::Base.new(:output => output, :title => ('*' * 19), :starting_at => 5, :total => 10, :autostart => false)
81
81
 
82
- allow(progressbar).to receive(:terminal_width).
83
- and_return 20
82
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:terminal_width).
83
+ and_return 20
84
84
 
85
85
  expect(progressbar.to_s('%t%w%i')).to eql '******************* '
86
86
  end
@@ -93,13 +93,13 @@ describe ProgressBar::Base do
93
93
 
94
94
  describe '#title' do
95
95
  it 'returns the default title' do
96
- expect(progressbar.send(:title).to_s).to eql ProgressBar::Base::DEFAULT_TITLE
96
+ expect(progressbar.send(:title).to_s).to eql ProgressBar::Components::Title::DEFAULT_TITLE
97
97
  end
98
98
  end
99
99
 
100
100
  describe '#output' do
101
101
  it 'returns the default output stream' do
102
- expect(progressbar.send(:output)).to eql ProgressBar::Base::DEFAULT_OUTPUT_STREAM
102
+ expect(progressbar.send(:output).send(:stream)).to eql ProgressBar::Output::DEFAULT_OUTPUT_STREAM
103
103
  end
104
104
  end
105
105
 
@@ -110,7 +110,7 @@ describe ProgressBar::Base do
110
110
 
111
111
  it 'returns the length of the environment variable as an integer' do
112
112
  progressbar = ProgressBar::Base.new
113
- expect(progressbar.send(:length)).to eql 44
113
+ expect(progressbar.send(:output).send(:length_calculator).send(:length)).to eql 44
114
114
  end
115
115
  end
116
116
 
@@ -120,21 +120,21 @@ describe ProgressBar::Base do
120
120
  context 'but the length option was passed in' do
121
121
  it 'returns the length specified in the option' do
122
122
  progressbar = ProgressBar::Base.new(:length => 88)
123
- expect(progressbar.send(:length)).to eql 88
123
+ expect(progressbar.send(:output).send(:length_calculator).send(:length)).to eql 88
124
124
  end
125
125
  end
126
126
 
127
127
  context 'and no length option was passed in' do
128
128
  it 'returns the width of the terminal if it is a Unix environment' do
129
- allow(progressbar).to receive(:terminal_width).and_return(99)
130
- progressbar.send(:reset_length)
131
- expect(progressbar.send(:length)).to eql 99
129
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:terminal_width).and_return(99)
130
+ progressbar.send(:output).send(:length_calculator).send(:reset_length)
131
+ expect(progressbar.send(:output).send(:length_calculator).send(:length)).to eql 99
132
132
  end
133
133
 
134
134
  it 'returns 80 if it is not a Unix environment' do
135
- allow(progressbar).to receive(:unix?).and_return(false)
136
- progressbar.send(:reset_length)
137
- expect(progressbar.send(:length)).to eql 80
135
+ allow(progressbar.send(:output).send(:length_calculator)).to receive(:unix?).and_return(false)
136
+ progressbar.send(:output).send(:length_calculator).send(:reset_length)
137
+ expect(progressbar.send(:output).send(:length_calculator).send(:length)).to eql 80
138
138
  end
139
139
  end
140
140
  end
@@ -152,13 +152,13 @@ describe ProgressBar::Base do
152
152
 
153
153
  describe '#output' do
154
154
  it 'returns the overridden output stream' do
155
- expect(progressbar.send(:output)).to eql STDOUT
155
+ expect(progressbar.send(:output).send(:stream)).to eql STDOUT
156
156
  end
157
157
  end
158
158
 
159
159
  describe '#length' do
160
160
  it 'returns the overridden length' do
161
- expect(progressbar.send(:length)).to eql 88
161
+ expect(progressbar.send(:output).send(:length_calculator).send(:length)).to eql 88
162
162
  end
163
163
  end
164
164
  end
@@ -202,16 +202,16 @@ describe ProgressBar::Base do
202
202
 
203
203
  context 'which includes ANSI SGR codes in the format string' do
204
204
  it 'properly calculates the length of the bar by removing the long version of the ANSI codes from the calculated length' do
205
- @color_code = "\e[0m\e[32m\e[7m\e[1m"
206
- @reset_code = "\e[0m"
207
- @progress_mark = "#{@color_code} #{@reset_code}"
205
+ @color_code = "\e[0m\e[32m\e[7m\e[1m"
206
+ @reset_code = "\e[0m"
207
+ @progress_mark = "#{@color_code} #{@reset_code}"
208
208
  progressbar = ProgressBar::Base.new(:format => "#{@color_code}Processing... %b%i#{@reset_code}#{@color_code} %p%%#{@reset_code}",
209
- :progress_mark => @progress_mark,
210
- :output => output,
211
- :length => 24,
212
- :starting_at => 3,
213
- :total => 6,
214
- :throttle_rate => 0.0)
209
+ :progress_mark => @progress_mark,
210
+ :output => output,
211
+ :length => 24,
212
+ :starting_at => 3,
213
+ :total => 6,
214
+ :throttle_rate => 0.0)
215
215
 
216
216
  progressbar.increment
217
217
  progressbar.increment
@@ -221,16 +221,16 @@ describe ProgressBar::Base do
221
221
  end
222
222
 
223
223
  it 'properly calculates the length of the bar by removing the short version of the ANSI codes from the calculated length' do
224
- @color_code = "\e[0;32;7;1m"
225
- @reset_code = "\e[0m"
226
- @progress_mark = "#{@color_code} #{@reset_code}"
224
+ @color_code = "\e[0;32;7;1m"
225
+ @reset_code = "\e[0m"
226
+ @progress_mark = "#{@color_code} #{@reset_code}"
227
227
  progressbar = ProgressBar::Base.new(:format => "#{@color_code}Processing... %b%i#{@reset_code}#{@color_code} %p%%#{@reset_code}",
228
- :progress_mark => @progress_mark,
229
- :output => output,
230
- :length => 24,
231
- :starting_at => 3,
232
- :total => 6,
233
- :throttle_rate => 0.0)
228
+ :progress_mark => @progress_mark,
229
+ :output => output,
230
+ :length => 24,
231
+ :starting_at => 3,
232
+ :total => 6,
233
+ :throttle_rate => 0.0)
234
234
 
235
235
  progressbar.increment
236
236
  progressbar.increment
@@ -300,7 +300,7 @@ describe ProgressBar::Base do
300
300
 
301
301
  3.times { progressbar.increment }
302
302
 
303
- progressbar.title = "Testing"
303
+ progressbar.title = 'Testing'
304
304
  progressbar.stop
305
305
 
306
306
  non_tty_output.rewind
@@ -323,7 +323,7 @@ describe ProgressBar::Base do
323
323
  end
324
324
 
325
325
  context 'when a bar is about to be completed' do
326
- let(:progressbar) { ProgressBar::Base.new(:starting_at => 5, :total => 6, :output => output, :length => 20) }
326
+ let(:progressbar) { ProgressBar::Base.new(:starting_at => 5, :total => 6, :output => output, :length => 20, :throttle_rate => 0.0) }
327
327
 
328
328
  context 'and it is incremented' do
329
329
  before { progressbar.increment }
@@ -347,7 +347,7 @@ describe ProgressBar::Base do
347
347
  end
348
348
 
349
349
  context 'when a bar with autofinish=false is about to be completed' do
350
- let(:progressbar) { ProgressBar::Base.new(:autofinish => false, :starting_at => 5, :total => 6, :output => output, :length => 20) }
350
+ let(:progressbar) { ProgressBar::Base.new(:autofinish => false, :starting_at => 5, :total => 6, :output => output, :length => 20, :throttle_rate => 0.0) }
351
351
 
352
352
  context 'and it is incremented' do
353
353
  before { progressbar.increment }
@@ -385,7 +385,7 @@ describe ProgressBar::Base do
385
385
 
386
386
  output.rewind
387
387
 
388
- expect(output.read).to end_with " \rProgress: |====== |\rProgress: |========|\n"
388
+ expect(output.read).to end_with " \rProgress: |====== |\rProgress: |========|\rProgress: |========|\n"
389
389
  end
390
390
  end
391
391
  end
@@ -509,7 +509,7 @@ describe ProgressBar::Base do
509
509
  progressbar.clear
510
510
 
511
511
  output.rewind
512
- expect(output.read).to match(/^#{progressbar.send(:clear_string)}/)
512
+ expect(output.read).to match(/^#{progressbar.send(:output).send(:clear_string)}/)
513
513
  end
514
514
  end
515
515
 
@@ -518,7 +518,7 @@ describe ProgressBar::Base do
518
518
  progressbar.start
519
519
 
520
520
  output.rewind
521
- expect(output.read).to match(/^#{progressbar.send(:clear_string)}/)
521
+ expect(output.read).to match(/^#{progressbar.send(:output).send(:clear_string)}/)
522
522
  end
523
523
 
524
524
  it 'prints the bar for the first time' do
@@ -554,7 +554,7 @@ describe ProgressBar::Base do
554
554
  let(:progressbar) { ProgressBar::Base.new(:format => '%B %p%%') }
555
555
 
556
556
  context 'if called with no arguments' do
557
- before { progressbar.format }
557
+ before { progressbar.format = nil }
558
558
 
559
559
  it 'resets the format back to the default' do
560
560
  expect(progressbar.to_s).to match(/^Progress: \|\s+\|\z/)
@@ -562,7 +562,7 @@ describe ProgressBar::Base do
562
562
  end
563
563
 
564
564
  context 'if called with a specific format string' do
565
- before { progressbar.format '%t' }
565
+ before { progressbar.format = '%t' }
566
566
 
567
567
  it 'sets it as the new format for the bar' do
568
568
  expect(progressbar.to_s).to match(/^Progress\z/)
@@ -841,16 +841,9 @@ describe ProgressBar::Base do
841
841
  expect(progressbar.to_s('%%')).to match(/^%\z/)
842
842
  end
843
843
 
844
- # Autostarting for now. This will be applicable later.
845
- # context "when called before #start" do
846
- # it "displays unknown time elapsed when using the %a flag" do
847
- # expect(progressbar.to_s('%a')).to match(/^Time: --:--:--\z/)
848
- # end
849
- # end
850
-
851
844
  context 'when called after #start' do
852
845
  before do
853
- Timecop.travel(-3723) do
846
+ Timecop.travel(-3_723) do
854
847
  progressbar.start
855
848
  end
856
849
  end
@@ -877,7 +870,7 @@ describe ProgressBar::Base do
877
870
 
878
871
  context 'when called after #start' do
879
872
  let(:progressbar) do
880
- Timecop.travel(-3723) do
873
+ Timecop.travel(-3_723) do
881
874
  progressbar = ProgressBar::Base.new(:starting_at => 0, :output => output, :smoothing => 0.0)
882
875
  progressbar.start
883
876
  progressbar.progress = 50
@@ -900,7 +893,7 @@ describe ProgressBar::Base do
900
893
 
901
894
  context 'when it could take 100 hours or longer to finish' do
902
895
  let(:progressbar) do
903
- Timecop.travel(-120000) do
896
+ Timecop.travel(-120_000) do
904
897
  progressbar = ProgressBar::Base.new(:starting_at => 0, :total => 100, :output => output, :smoothing => 0.0)
905
898
  progressbar.start
906
899
  progressbar.progress = 25
@@ -0,0 +1,19 @@
1
+ require 'rspectacular'
2
+ require 'ruby-progressbar/calculators/running_average'
3
+
4
+ class ProgressBar
5
+ module Calculators
6
+ describe RunningAverage do
7
+ it 'can properly calculate a running average' do
8
+ first_average = RunningAverage.calculate(4.5, 12, 0.1)
9
+ expect(first_average).to be_within(0.001).of 11.25
10
+
11
+ second_average = RunningAverage.calculate(8.2, 51, 0.7)
12
+ expect(second_average).to be_within(0.001).of 21.04
13
+
14
+ third_average = RunningAverage.calculate(41.8, 100, 0.59)
15
+ expect(third_average).to be_within(0.001).of 65.662
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,234 @@
1
+ require 'rspectacular'
2
+ require 'ruby-progressbar/components/bar'
3
+
4
+ class ProgressBar
5
+ module Components
6
+ describe Bar do
7
+ it 'has a default mark when a new bar is created and no parameters are passed' do
8
+ expect(Bar.new.progress_mark).to eql Bar::DEFAULT_PROGRESS_MARK
9
+ end
10
+
11
+ it 'has a default remainder mark when a new bar is created and no parameters ' \
12
+ 'are passed' do
13
+
14
+ expect(Bar.new.remainder_mark).to eql Bar::DEFAULT_REMAINDER_MARK
15
+ end
16
+
17
+ it 'returns the overridden mark when a new bar is created and options are passed' do
18
+ progressbar = Bar.new(:progress_mark => 'x')
19
+
20
+ expect(progressbar.progress_mark).to eql 'x'
21
+ end
22
+
23
+ it 'returns the overridden remainder mark when a new bar is created and options ' \
24
+ 'are passed' do
25
+
26
+ progressbar = Bar.new(:remainder_mark => 'o')
27
+
28
+ expect(progressbar.remainder_mark).to eql 'o'
29
+ end
30
+
31
+ it 'displays the bar with no indication of progress when just begun' do
32
+ progress = Progress.new(:total => 50)
33
+ progressbar = Bar.new(:progress => progress,
34
+ :length => 100)
35
+
36
+ expect(progressbar.to_s).to eql ' ' * 100
37
+ end
38
+
39
+ it 'displays the bar with an indication of progress when nothing has been ' \
40
+ 'completed and the bar is incremented' do
41
+
42
+ progress = Progress.new :total => 50
43
+ progressbar = Bar.new :progress => progress,
44
+ :length => 100
45
+ progress.increment
46
+
47
+ expect(progressbar.to_s).to eql '==' + (' ' * 98)
48
+ end
49
+
50
+ it 'displays the bar with no indication of progress when nothing has been ' \
51
+ 'completed and the bar is incremented' do
52
+
53
+ progress = Progress.new :total => 50
54
+ progressbar = Bar.new :progress => progress,
55
+ :length => 100
56
+
57
+ expect(progressbar.to_s).to eql ' ' * 100
58
+ end
59
+
60
+ it 'displays the bar with no indication of progress when a fraction of a percentage ' \
61
+ 'has been completed' do
62
+
63
+ progress = Progress.new :total => 200
64
+ progressbar = Bar.new :progress => progress,
65
+ :length => 100
66
+ progress.start :at => 1
67
+
68
+ expect(progressbar.to_s).to eql(' ' * 100)
69
+ end
70
+
71
+ it 'displays the bar as 100% complete when completed' do
72
+ progress = Progress.new :total => 50
73
+ progressbar = Bar.new :progress => progress,
74
+ :length => 100
75
+ progress.start :at => 50
76
+ progress.increment
77
+
78
+ expect(progressbar.to_s).to eql '=' * 100
79
+ end
80
+
81
+ it 'displays the bar as 100% complete when completed and the bar is incremented' do
82
+ progress = Progress.new :total => 50
83
+ progressbar = Bar.new :progress => progress,
84
+ :length => 100
85
+ progress.start :at => 50
86
+ progress.increment
87
+
88
+ expect(progressbar.to_s).to eql '=' * 100
89
+ end
90
+
91
+ it 'displays the bar as 98% complete when completed and the bar is decremented' do
92
+ progress = Progress.new :total => 50
93
+ progressbar = Bar.new :progress => progress,
94
+ :length => 100
95
+ progress.start :at => 50
96
+ progress.decrement
97
+
98
+ expect(progressbar.to_s).to eql(('=' * 98) + (' ' * 2))
99
+ end
100
+
101
+ it 'is represented correctly when a bar has an unknown amount to completion' do
102
+ progress = Progress.new :total => nil
103
+ progressbar = Bar.new :progress => progress,
104
+ :length => 80
105
+
106
+ expect(progressbar.to_s).to eql('=---' * 20)
107
+ end
108
+
109
+ it 'is represented after being incremented once when a bar has an unknown amount ' \
110
+ 'to completion' do
111
+
112
+ progress = Progress.new :total => nil
113
+ progressbar = Bar.new :progress => progress,
114
+ :length => 80
115
+
116
+ progress.increment
117
+
118
+ expect(progressbar.to_s).to eql('-=--' * 20)
119
+ end
120
+
121
+ it 'is represented after being incremented twice when a bar has an unknown amount ' \
122
+ 'to completion' do
123
+
124
+ progress = Progress.new :total => nil
125
+ progressbar = Bar.new :progress => progress,
126
+ :length => 80
127
+
128
+ 2.times { progress.increment }
129
+
130
+ expect(progressbar.to_s).to eql('--=-' * 20)
131
+ end
132
+
133
+ it 'is represented correctly when a bar has a customized unknown animation' do
134
+ progress = Progress.new :total => nil
135
+ progressbar = Bar.new :progress => progress,
136
+ :unknown_progress_animation_steps => ['*--', '-*-', '--*'],
137
+ :length => 80
138
+
139
+ expect(progressbar.to_s).to eql(('*--' * 26) + '*-')
140
+ end
141
+
142
+ it 'displays the bar with an integrated percentage properly when empty' do
143
+ progress = Progress.new :total => 100
144
+ progressbar = Bar.new :progress => progress,
145
+ :length => 100
146
+
147
+ bar_text = progressbar.to_s(:format => :integrated_percentage)
148
+ expect(bar_text).to eql ' ' * 100
149
+ end
150
+
151
+ it 'displays the bar with an integrated percentage properly just before' \
152
+ 'the percentage is displayed' do
153
+
154
+ progress = Progress.new :total => 100
155
+ progressbar = Bar.new :progress => progress,
156
+ :length => 100
157
+
158
+ 4.times { progress.increment }
159
+
160
+ bar_text = progressbar.to_s(:format => :integrated_percentage)
161
+ expect(bar_text).to eql '====' + (' ' * 96)
162
+ end
163
+
164
+ it 'displays the bar with an integrated percentage properly immediately after' \
165
+ 'the percentage is displayed' do
166
+
167
+ progress = Progress.new :total => 100
168
+ progressbar = Bar.new :progress => progress,
169
+ :length => 100
170
+
171
+ 5.times { progress.increment }
172
+
173
+ bar_text = progressbar.to_s(:format => :integrated_percentage)
174
+ expect(bar_text).to eql '= 5 =' + (' ' * 95)
175
+ end
176
+
177
+ it 'displays the bar with an integrated percentage properly on double digit' \
178
+ 'percentage' do
179
+
180
+ progress = Progress.new :total => 100
181
+ progressbar = Bar.new :progress => progress,
182
+ :length => 100
183
+
184
+ 10.times { progress.increment }
185
+
186
+ bar_text = progressbar.to_s(:format => :integrated_percentage)
187
+ expect(bar_text).to eql '=== 10 ===' + (' ' * 90)
188
+ end
189
+
190
+ it 'displays the bar with an integrated percentage properly when finished' do
191
+
192
+ progress = Progress.new :total => 100
193
+ progressbar = Bar.new :progress => progress,
194
+ :length => 100
195
+ progress.finish
196
+
197
+ bar_text = progressbar.to_s(:format => :integrated_percentage)
198
+ expect(bar_text).to eql(('=' * 47) + ' 100 ' + ('=' * 48))
199
+ end
200
+
201
+ it 'calculates the remaining negative space properly with an integrated percentage ' \
202
+ 'bar of 0 percent' do
203
+
204
+ progress = Progress.new :total => 200
205
+ progressbar = Bar.new :progress => progress,
206
+ :length => 100
207
+
208
+ bar_text = progressbar.to_s(:format => :integrated_percentage)
209
+ expect(bar_text).to eql ' ' * 100
210
+
211
+ 9.times { progress.increment }
212
+
213
+ bar_text = progressbar.to_s(:format => :integrated_percentage)
214
+ expect(bar_text).to eql '====' + (' ' * 96)
215
+
216
+ progress.increment
217
+
218
+ bar_text = progressbar.to_s(:format => :integrated_percentage)
219
+ expect(bar_text).to eql '= 5 =' + (' ' * 95)
220
+ end
221
+
222
+ it 'raises an error when attempting to set the current value of the bar to be ' \
223
+ 'greater than the total' do
224
+
225
+ progress = Progress.new :total => 10
226
+ _progressbar = Bar.new :progress => progress
227
+
228
+ expect { progress.start :at => 11 }.to \
229
+ raise_error(InvalidProgressError,
230
+ "You can't set the item's current value to be greater than the total.")
231
+ end
232
+ end
233
+ end
234
+ end