tty-progressbar 0.17.0 → 0.18.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.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +492 -126
  5. data/lib/tty-progressbar.rb +2 -2
  6. data/lib/tty/progressbar.rb +168 -68
  7. data/lib/tty/progressbar/configuration.rb +121 -27
  8. data/lib/tty/progressbar/converter.rb +16 -19
  9. data/lib/tty/progressbar/formats.rb +120 -0
  10. data/lib/tty/progressbar/formatter.rb +33 -38
  11. data/lib/tty/progressbar/formatter/bar.rb +74 -27
  12. data/lib/tty/progressbar/formatter/byte_rate.rb +6 -20
  13. data/lib/tty/progressbar/formatter/current.rb +4 -19
  14. data/lib/tty/progressbar/formatter/current_byte.rb +9 -17
  15. data/lib/tty/progressbar/formatter/elapsed.rb +9 -18
  16. data/lib/tty/progressbar/formatter/estimated.rb +14 -18
  17. data/lib/tty/progressbar/formatter/estimated_time.rb +37 -0
  18. data/lib/tty/progressbar/formatter/mean_byte.rb +6 -20
  19. data/lib/tty/progressbar/formatter/mean_rate.rb +6 -20
  20. data/lib/tty/progressbar/formatter/percent.rb +10 -16
  21. data/lib/tty/progressbar/formatter/rate.rb +5 -19
  22. data/lib/tty/progressbar/formatter/total.rb +10 -16
  23. data/lib/tty/progressbar/formatter/total_byte.rb +14 -18
  24. data/lib/tty/progressbar/formatters.rb +53 -0
  25. data/lib/tty/progressbar/meter.rb +2 -2
  26. data/lib/tty/progressbar/multi.rb +61 -21
  27. data/lib/tty/progressbar/pipeline.rb +13 -6
  28. data/lib/tty/progressbar/timer.rb +89 -0
  29. data/lib/tty/progressbar/version.rb +1 -1
  30. metadata +44 -103
  31. data/Rakefile +0 -8
  32. data/examples/color.rb +0 -18
  33. data/examples/failure.rb +0 -12
  34. data/examples/iterator.rb +0 -5
  35. data/examples/lazy.rb +0 -6
  36. data/examples/multi/main_bar.rb +0 -13
  37. data/examples/multi/simple.rb +0 -13
  38. data/examples/multi/width.rb +0 -13
  39. data/examples/simple.rb +0 -7
  40. data/examples/slow_process.rb +0 -29
  41. data/examples/speed.rb +0 -11
  42. data/examples/threaded.rb +0 -14
  43. data/examples/tokens.rb +0 -12
  44. data/examples/unicode.rb +0 -7
  45. data/spec/spec_helper.rb +0 -53
  46. data/spec/unit/advance_spec.rb +0 -25
  47. data/spec/unit/clear_spec.rb +0 -17
  48. data/spec/unit/complete_spec.rb +0 -16
  49. data/spec/unit/converter/to_bytes_spec.rb +0 -47
  50. data/spec/unit/converter/to_seconds_spec.rb +0 -15
  51. data/spec/unit/converter/to_time_spec.rb +0 -19
  52. data/spec/unit/custom_formatter_spec.rb +0 -26
  53. data/spec/unit/custom_token_spec.rb +0 -14
  54. data/spec/unit/events_spec.rb +0 -33
  55. data/spec/unit/finish_spec.rb +0 -15
  56. data/spec/unit/formatter/bar_spec.rb +0 -33
  57. data/spec/unit/formatter/byte_rate_spec.rb +0 -32
  58. data/spec/unit/formatter/current_byte_spec.rb +0 -16
  59. data/spec/unit/formatter/current_spec.rb +0 -14
  60. data/spec/unit/formatter/elapsed_spec.rb +0 -58
  61. data/spec/unit/formatter/estimated_spec.rb +0 -27
  62. data/spec/unit/formatter/mean_byte_spec.rb +0 -32
  63. data/spec/unit/formatter/mean_rate_spec.rb +0 -31
  64. data/spec/unit/formatter/percent_spec.rb +0 -16
  65. data/spec/unit/formatter/rate_spec.rb +0 -31
  66. data/spec/unit/formatter/total_byte_spec.rb +0 -16
  67. data/spec/unit/formatter/total_spec.rb +0 -16
  68. data/spec/unit/frequency_spec.rb +0 -27
  69. data/spec/unit/head_spec.rb +0 -32
  70. data/spec/unit/hide_cursor_spec.rb +0 -27
  71. data/spec/unit/inspect_spec.rb +0 -11
  72. data/spec/unit/iterate_spec.rb +0 -79
  73. data/spec/unit/log_spec.rb +0 -29
  74. data/spec/unit/meter_spec.rb +0 -70
  75. data/spec/unit/multi/advance_spec.rb +0 -123
  76. data/spec/unit/multi/events_spec.rb +0 -115
  77. data/spec/unit/multi/finish_spec.rb +0 -41
  78. data/spec/unit/multi/line_inset_spec.rb +0 -65
  79. data/spec/unit/multi/register_spec.rb +0 -35
  80. data/spec/unit/multi/reset_spec.rb +0 -28
  81. data/spec/unit/multi/stop_spec.rb +0 -15
  82. data/spec/unit/multi/width_spec.rb +0 -118
  83. data/spec/unit/new_spec.rb +0 -76
  84. data/spec/unit/pipeline_spec.rb +0 -19
  85. data/spec/unit/ratio_spec.rb +0 -31
  86. data/spec/unit/render_spec.rb +0 -25
  87. data/spec/unit/reset_spec.rb +0 -31
  88. data/spec/unit/resize_spec.rb +0 -35
  89. data/spec/unit/set_current_spec.rb +0 -43
  90. data/spec/unit/start_spec.rb +0 -14
  91. data/spec/unit/stop_spec.rb +0 -19
  92. data/spec/unit/update_spec.rb +0 -22
  93. data/spec/unit/width_spec.rb +0 -86
  94. data/tasks/console.rake +0 -9
  95. data/tasks/coverage.rake +0 -9
  96. data/tasks/spec.rake +0 -27
  97. data/tty-progressbar.gemspec +0 -32
@@ -1,35 +0,0 @@
1
- RSpec.describe TTY::ProgressBar::Multi, '#register' do
2
- let(:output) { StringIO.new('', 'w+') }
3
-
4
- it "registers a TTY::ProgressBar instance" do
5
- bars = TTY::ProgressBar::Multi.new(output: output)
6
- allow_any_instance_of(TTY::ProgressBar).to receive(:attach_to)
7
- expect_any_instance_of(TTY::ProgressBar).to receive(:attach_to)
8
-
9
- bar = bars.register("[:bar]")
10
-
11
- expect(bar).to be_instance_of(TTY::ProgressBar)
12
- expect(bars.length).to eq(1)
13
- end
14
-
15
- it "uses global options to register instance" do
16
- bars = TTY::ProgressBar::Multi.new(output: output, total: 100)
17
- bar = double(:bar, attach_to: nil)
18
- allow(bar).to receive(:on).and_return(bar)
19
- allow(TTY::ProgressBar).to receive(:new).and_return(bar)
20
-
21
- bars.register("[:bar]")
22
-
23
- expect(TTY::ProgressBar).to have_received(:new).with("[:bar]", {total: 100, output: output})
24
- end
25
-
26
- it "registers bars with top level" do
27
- bars = TTY::ProgressBar::Multi.new("main [:bar]", output: output)
28
-
29
- bars.register("[:bar]", total: 5)
30
- bars.register("[:bar]", total: 10)
31
-
32
- expect(bars.total).to eq(15)
33
- expect(bars.current).to eq(0)
34
- end
35
- end
@@ -1,28 +0,0 @@
1
- RSpec.describe TTY::ProgressBar::Multi, '#reset' do
2
- let(:output) { StringIO.new('', 'w+') }
3
-
4
- it "leaves multibar state alone" do
5
- main = TTY::ProgressBar::Multi.new("", output: output, total: 10)
6
- progress = main.register("[:bar]")
7
- progress.advance(10)
8
- expect(progress.complete?).to be(true)
9
- progress.reset
10
- expect(progress.complete?).to be(false)
11
- progress.advance(10)
12
- output.rewind
13
-
14
- top = TTY::ProgressBar::Multi::DEFAULT_INSET[:top]
15
- bottom = TTY::ProgressBar::Multi::DEFAULT_INSET[:bottom]
16
-
17
- progress_updates =
18
- output.read.scan(/#{Regexp.escape top}|#{Regexp.escape bottom}/)
19
- expect(progress_updates.shift).to match(top)
20
- expect(progress_updates.shift).to match(top)
21
- expect(progress_updates.shift).to match(bottom)
22
- expect(progress_updates.shift).to match(bottom)
23
- expect(progress_updates.shift).to match(bottom)
24
- expect(progress_updates.shift).to match(bottom)
25
-
26
- expect(progress_updates).to be_empty
27
- end
28
- end
@@ -1,15 +0,0 @@
1
- RSpec.describe TTY::ProgressBar::Multi, '#stop' do
2
- let(:output) { StringIO.new('', 'w+') }
3
-
4
- it "stops all bars when top level stops" do
5
- bars = TTY::ProgressBar::Multi.new("main [:bar]", output: output)
6
-
7
- bar1 = bars.register("[:bar]", total: 5)
8
- bar2 = bars.register("[:bar]", total: 10)
9
-
10
- bars.stop
11
-
12
- expect(bar1.stopped?).to eq(true)
13
- expect(bar2.stopped?).to eq(true)
14
- end
15
- end
@@ -1,118 +0,0 @@
1
- RSpec.describe TTY::ProgressBar::Multi, 'width' do
2
- let(:output) { StringIO.new('', 'w+') }
3
- let(:save) { TTY::Cursor.save }
4
- let(:restore) { TTY::Cursor.restore }
5
- let(:top) { TTY::ProgressBar::Multi::DEFAULT_INSET[:top] }
6
- let(:middle) { TTY::ProgressBar::Multi::DEFAULT_INSET[:middle] }
7
- let(:bottom) { TTY::ProgressBar::Multi::DEFAULT_INSET[:bottom] }
8
-
9
- it "sets top level bar width to maximum columns when exceeds terminal width" do
10
- allow(TTY::Screen).to receive(:width).and_return(15)
11
-
12
- bars = TTY::ProgressBar::Multi.new("[:bar] main", output: output)
13
-
14
- bar1 = bars.register("[:bar] one", total: 20)
15
- bar2 = bars.register("[:bar] two", total: 20)
16
-
17
- bar1.advance(10)
18
- bar2.advance(10)
19
-
20
- output.rewind
21
- expect(output.read).to eq([
22
- "\e[1G#{top}[== ] main\n",
23
- "\e[1G#{bottom}[=== ] one\n",
24
- save,
25
- "\e[2A", # up 2 lines
26
- "\e[1G#{top}[=== ] main",
27
- restore,
28
- "\e[1G#{bottom}[=== ] two\n"
29
- ].join)
30
-
31
- bar1.advance(10)
32
-
33
- output.rewind
34
- expect(output.read).to eq([
35
- "\e[1G#{top}[== ] main\n",
36
- "\e[1G#{bottom}[=== ] one\n",
37
- save,
38
- "\e[2A", # up 2 lines
39
- "\e[1G#{top}[=== ] main",
40
- restore,
41
- "\e[1G#{bottom}[=== ] two\n",
42
- save,
43
- "\e[3A", # up 3 lines
44
- "\e[1G#{top}[===== ] main",
45
- restore,
46
- save,
47
- "\e[2A", # up 2 lines
48
- "\e[1G#{middle}[=====] one",
49
- restore,
50
- save,
51
- "\e[2A", # up 2 lines
52
- "#{middle}\n", # bar finished
53
- restore
54
- ].join)
55
-
56
- bar2.advance(10)
57
-
58
- output.rewind
59
- expect(output.read).to eq([
60
- "\e[1G#{top}[== ] main\n",
61
- "\e[1G#{bottom}[=== ] one\n",
62
- save,
63
- "\e[2A", # up 2 lines
64
- "\e[1G#{top}[=== ] main",
65
- restore,
66
- "\e[1G#{bottom}[=== ] two\n",
67
- save,
68
- "\e[3A", # up 3 lines
69
- "\e[1G#{top}[===== ] main",
70
- restore,
71
- save,
72
- "\e[2A", # up 2 lines
73
- "\e[1G#{middle}[=====] one",
74
- restore,
75
- save,
76
- "\e[2A", # up 2 lines
77
- "#{middle}\n", # bar finished
78
- restore,
79
- save,
80
- "\e[3A", # up 3 lines
81
- "\e[1G#{top}[======] main",
82
- restore,
83
- save,
84
- "\e[3A", # up 1 line
85
- "#{top}\n",
86
- restore,
87
- save,
88
- "\e[1A", # up 1 line
89
- "\e[1G#{bottom}[=====] two",
90
- restore,
91
- save,
92
- "\e[1A", # up 1 line
93
- "#{bottom}\n",
94
- restore
95
- ].join)
96
- end
97
-
98
- it "sets top level bar width to a custom value" do
99
- bars = TTY::ProgressBar::Multi.new("[:bar] main", output: output, width: 20)
100
-
101
- bar1 = bars.register("[:bar] one", total: 20)
102
- bar2 = bars.register("[:bar] two", total: 20)
103
-
104
- bar1.advance(10)
105
- bar2.advance(10)
106
-
107
- output.rewind
108
- expect(output.read).to eq([
109
- "\e[1G#{top}[===== ] main\n",
110
- "\e[1G#{bottom}[========== ] one\n",
111
- save,
112
- "\e[2A", # up 2 lines
113
- "\e[1G#{top}[========== ] main",
114
- restore,
115
- "\e[1G#{bottom}[========== ] two\n"
116
- ].join)
117
- end
118
- end
@@ -1,76 +0,0 @@
1
- RSpec.describe TTY::ProgressBar, '::new' do
2
- let(:output) { StringIO.new('', 'w+') }
3
-
4
- it "fails to initialize without formatting string" do
5
- expect {
6
- TTY::ProgressBar.new(output: output)
7
- }.to raise_error(ArgumentError, /Expected bar formatting string, got `{:output=>#{output}}` instead\./)
8
- end
9
-
10
- it "allows to change formatting string" do
11
- bar = TTY::ProgressBar.new("[:bar]", output: output, total: 4)
12
- bar.advance(2)
13
- bar.format = "(:bar)"
14
- bar.advance(2)
15
- output.rewind
16
-
17
- expect(output.read).to eq("\e[1G[== ]\e[1G(====)\n")
18
- end
19
-
20
- it "displays output where width == total" do
21
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
22
- progress.advance
23
- output.rewind
24
- expect(output.read).to eq("\e[1G[= ]")
25
- end
26
-
27
- it "yields configuration to block" do
28
- progress = TTY::ProgressBar.new "[:bar]" do |config|
29
- config.output = output
30
- config.total = 10
31
- config.clear = true
32
- end
33
- expect(progress.output).to eq(output)
34
- expect(progress.total).to eq(10)
35
- expect(progress.width).to eq(10)
36
- expect(progress.clear).to eq(true)
37
- end
38
-
39
- it "displays output where width > total" do
40
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 5, width: 10)
41
- 5.times { progress.advance }
42
- output.rewind
43
- expect(output.read).to eq([
44
- "\e[1G[== ]",
45
- "\e[1G[==== ]",
46
- "\e[1G[====== ]",
47
- "\e[1G[======== ]",
48
- "\e[1G[==========]\n"
49
- ].join)
50
- end
51
-
52
- it "displays output where width < total" do
53
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10, width: 5)
54
- 10.times { progress.advance }
55
- output.rewind
56
- expect(output.read).to eq([
57
- "\e[1G[= ]",
58
- "\e[1G[= ]",
59
- "\e[1G[== ]",
60
- "\e[1G[== ]",
61
- "\e[1G[=== ]",
62
- "\e[1G[=== ]",
63
- "\e[1G[==== ]",
64
- "\e[1G[==== ]",
65
- "\e[1G[=====]",
66
- "\e[1G[=====]\n"
67
- ].join)
68
- end
69
-
70
- it "displays total value" do
71
- progress = TTY::ProgressBar.new("|:total|", output: output, total: 10)
72
- progress.advance(3)
73
- output.rewind
74
- expect(output.read).to eq("\e[1G|10|")
75
- end
76
- end
@@ -1,19 +0,0 @@
1
- RSpec.describe TTY::ProgressBar::Pipeline, '#decorate' do
2
- subject(:pipeline) { described_class.new }
3
-
4
- it "decorates tokenized string with pipeline formatters" do
5
- pipeline.use TTY::ProgressBar::CurrentFormatter
6
- pipeline.use TTY::ProgressBar::TotalFormatter
7
- progress_bar = double(current: '3', total: '10')
8
- tokenized = "[:current/:total]"
9
- expect(pipeline.decorate(progress_bar, tokenized)).to eq("[3/10]")
10
- end
11
-
12
- it "enumerates pipeline formatters" do
13
- pipeline.use TTY::ProgressBar::CurrentFormatter
14
- pipeline.use TTY::ProgressBar::TotalFormatter
15
- yielded = []
16
- pipeline.each { |formatter| yielded << formatter }
17
- expect(yielded.size).to eq(2)
18
- end
19
- end
@@ -1,31 +0,0 @@
1
- RSpec.describe TTY::ProgressBar, '#ratio=' do
2
- let(:output) { StringIO.new('', 'w+') }
3
-
4
- it "allows to set ratio" do
5
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
6
- progress.ratio = 0.7
7
- expect(progress.current).to eq(7)
8
- output.rewind
9
- expect(output.read).to eq([
10
- "\e[1G[======= ]"
11
- ].join)
12
- end
13
-
14
- it "finds closest available step from the ratio" do
15
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 3)
16
- progress.ratio = 0.5
17
- expect(progress.current).to eq(1)
18
- end
19
-
20
- it "doesn't allow to set wrong ratio" do
21
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 3)
22
- progress.ratio = 3.2
23
- expect(progress.current).to eq(3)
24
- expect(progress.complete?).to eq(true)
25
- end
26
-
27
- it "avoids division by zero" do
28
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 0)
29
- expect(progress.ratio).to eq(0)
30
- end
31
- end
@@ -1,25 +0,0 @@
1
- RSpec.describe TTY::ProgressBar, "#render" do
2
- let(:output) { StringIO.new("", "w+") }
3
-
4
- it "pads out longer previous lines" do
5
- progress = TTY::ProgressBar.new ":current_byte" do |config|
6
- config.no_width = true
7
- config.output = output
8
- config.total = 1_048_577
9
- end
10
-
11
- progress.advance(1)
12
- progress.advance(1_048_574)
13
- progress.advance(1)
14
- progress.advance(1)
15
-
16
- output.rewind
17
-
18
- expect(output.read).to eq([
19
- "\e[1G1B",
20
- "\e[1G1024.00KB", # must not pad, line is longer
21
- "\e[1G1.00MB ", # must pad out "0KB"
22
- "\e[1G1.00MB", # must not pad, line is equal
23
- ].join)
24
- end
25
- end
@@ -1,31 +0,0 @@
1
- RSpec.describe TTY::ProgressBar, '#reset' do
2
- let(:output) { StringIO.new('', 'w+') }
3
-
4
- it "resets current progress" do
5
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
6
- progress.advance(5)
7
- progress.reset
8
- 2.times { progress.advance(3) }
9
- output.rewind
10
- expect(output.read).to eq([
11
- "\e[1G[===== ]",
12
- "\e[1G[=== ]",
13
- "\e[1G[====== ]"
14
- ].join)
15
- end
16
-
17
- it "resets finished progress" do
18
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
19
- progress.advance(10)
20
- expect(progress.complete?).to be(true)
21
- progress.reset
22
- expect(progress.complete?).to be(false)
23
- 2.times { progress.advance(3) }
24
- output.rewind
25
- expect(output.read).to eq([
26
- "\e[1G[==========]\n",
27
- "\e[1G[=== ]",
28
- "\e[1G[====== ]"
29
- ].join)
30
- end
31
- end
@@ -1,35 +0,0 @@
1
- RSpec.describe TTY::ProgressBar, '#resize' do
2
- let(:output) { StringIO.new('', 'w+') }
3
-
4
- it "resizes output down by x2" do
5
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 5, width: 10)
6
- 2.times { progress.advance }
7
- progress.resize(5)
8
- 3.times { progress.advance }
9
- output.rewind
10
- expect(output.read).to eq([
11
- "\e[1G[== ]",
12
- "\e[1G[==== ]",
13
- "\e[0m\e[2K\e[1G",
14
- "\e[1G[=== ] ",
15
- "\e[1G[==== ]",
16
- "\e[1G[=====]\n"
17
- ].join)
18
- end
19
-
20
- it "resizes output up by x2" do
21
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 5, width: 10)
22
- 2.times { progress.advance }
23
- progress.resize(20)
24
- 3.times { progress.advance }
25
- output.rewind
26
- expect(output.read).to eq([
27
- "\e[1G[== ]",
28
- "\e[1G[==== ]",
29
- "\e[0m\e[2K\e[1G",
30
- "\e[1G[============ ]",
31
- "\e[1G[================ ]",
32
- "\e[1G[====================]\n"
33
- ].join)
34
- end
35
- end
@@ -1,43 +0,0 @@
1
- RSpec.describe TTY::ProgressBar, '#current=' do
2
- let(:output) { StringIO.new('', 'w+') }
3
-
4
- it "allows to go back" do
5
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
6
- 3.times { progress.advance }
7
- progress.current = 5
8
- expect(progress.current).to eq(5)
9
- output.rewind
10
- expect(output.read).to eq([
11
- "\e[1G[= ]",
12
- "\e[1G[== ]",
13
- "\e[1G[=== ]",
14
- "\e[1G[===== ]"
15
- ].join)
16
- progress.current = 0
17
- expect(progress.current).to eq(0)
18
- end
19
-
20
- it "doesn't allow to go over total" do
21
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
22
- progress.current = 12
23
- expect(progress.current).to eq(10)
24
- output.rewind
25
- expect(output.read).to eq("\e[1G[==========]\n")
26
- end
27
-
28
- it "doesn't allow to go below 0" do
29
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
30
- progress.current = -1
31
- expect(progress.current).to eq(0)
32
- end
33
-
34
- it "cannot backtrack on finished" do
35
- progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
36
- progress.current = 10
37
- expect(progress.current).to eq(10)
38
- progress.current = 5
39
- expect(progress.current).to eq(10)
40
- output.rewind
41
- expect(output.read).to eq("\e[1G[==========]\n")
42
- end
43
- end