tty-progressbar 0.12.0 → 0.12.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11bc77d708ba9f54e6efc5870c1865ce8937a0fc
4
- data.tar.gz: 64d970dec5a9324a5639c5713ab922447afbb1b8
3
+ metadata.gz: 4da140c43179f280941fdc51b4c7927fd9dcd648
4
+ data.tar.gz: 76f93a77ce8edc4ee982476ae19f1c9c2372a5d0
5
5
  SHA512:
6
- metadata.gz: 01ac6ab2668fea2bec216aa095e226e1c08ef388e442ddbe9a72c9772cf19f749a93e54085a5fac9488fc65c5c363e9f4500f2c4f4d01194abc571885ae47ac2
7
- data.tar.gz: 81c443f7bf90e2f14a4ae9cd44e8fb5ea180598cae273000e4b5b335b0302cb911dbf84c440f5559bb5e8b8cd890e12378a32d8a5280a499f51e40b2edc3deab
6
+ metadata.gz: 4478e6b69a5d1531867f16808abd03dfbdfe2a86dc3faf789b94a33dd56d449d7e4058ac58958c994af442002e661be2b932fe72c253d03390c7c4edd04e34c2
7
+ data.tar.gz: cf73492360d38934724f208ef727100444c5e6c73efdebb928edfbaec0ad790d5cf8f40bebb889c9f70136cea8512a29c9e291b91a9e047d28b4528a2f8b186e
data/.travis.yml CHANGED
@@ -2,6 +2,7 @@
2
2
  language: ruby
3
3
  sudo: false
4
4
  cache: bundler
5
+ before_install: "gem update bundler"
5
6
  script: "bundle exec rake ci"
6
7
  rvm:
7
8
  - 1.9.3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.12.1] - 2017-09-09
4
+
5
+ ### Added
6
+ * Add rspec to gem development dependencies
7
+
8
+ ### Changed
9
+ * Change line clearing to rely on tty-cursor
10
+
11
+ ### Fixed
12
+ * Fix multi bar finishing before registered progress bars
13
+
3
14
  ## [v0.12.0] - 2017-09-03
4
15
 
5
16
  ### Added
@@ -127,6 +138,7 @@
127
138
 
128
139
  * Initial implementation and release
129
140
 
141
+ [v0.12.1]: https://github.com/peter-murach/tty-progressbar/compare/v0.12.0...v0.12.1
130
142
  [v0.12.0]: https://github.com/peter-murach/tty-progressbar/compare/v0.11.0...v0.12.0
131
143
  [v0.11.0]: https://github.com/peter-murach/tty-progressbar/compare/v0.10.1...v0.11.0
132
144
  [v0.10.1]: https://github.com/peter-murach/tty-progressbar/compare/v0.10.0...v0.10.1
data/Gemfile CHANGED
@@ -3,7 +3,6 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  group :test do
6
- gem 'rspec', '~> 3.5.0'
7
6
  gem 'timecop', '~> 0.8.1'
8
7
  gem 'pastel', '~> 0.7.0'
9
8
  gem 'coveralls', '~> 0.8.13'
@@ -4,14 +4,14 @@ require 'tty-progressbar'
4
4
 
5
5
  bars = TTY::ProgressBar::Multi.new("main [:bar] :percent")
6
6
 
7
- bar1 = bars.register "foo [:bar] :percent", total: 20
8
- bar2 = bars.register "bar [:bar] :percent", total: 30
9
- bar3 = bars.register "baz [:bar] :percent", total: 10
7
+ bar1 = bars.register "foo [:bar] :percent", total: 15
8
+ bar2 = bars.register "bar [:bar] :percent", total: 15
9
+ bar3 = bars.register "baz [:bar] :percent", total: 45
10
10
 
11
11
  bars.start
12
12
 
13
- th1 = Thread.new { 20.times { sleep(0.2); bar1.advance } }
14
- th2 = Thread.new { 30.times { sleep(0.1); bar2.advance } }
15
- th3 = Thread.new { 10.times { sleep(0.3); bar3.advance } }
13
+ th1 = Thread.new { 15.times { sleep(0.1); bar1.advance } }
14
+ th2 = Thread.new { 15.times { sleep(0.1); bar2.advance } }
15
+ th3 = Thread.new { 45.times { sleep(0.1); bar3.advance } }
16
16
 
17
17
  [th1, th2, th3].each(&:join)
@@ -20,13 +20,7 @@ module TTY
20
20
  extend Forwardable
21
21
  include MonitorMixin
22
22
 
23
- ECMA_ESC = "\e".freeze
24
23
  ECMA_CSI = "\e[".freeze
25
- ECMA_CLR = 'K'.freeze
26
-
27
- DEC_RST = 'l'.freeze
28
- DEC_SET = 'h'.freeze
29
- DEC_TCEM = '?25'.freeze
30
24
 
31
25
  CURSOR_LOCK = Monitor.new
32
26
 
@@ -242,7 +236,7 @@ module TTY
242
236
  def render
243
237
  return if done?
244
238
  if hide_cursor && @last_render_width == 0 && !(@current >= total)
245
- write(ECMA_CSI + DEC_TCEM + DEC_RST)
239
+ write(TTY::Cursor.hide)
246
240
  end
247
241
 
248
242
  formatted = @formatter.decorate(self, @format)
@@ -316,7 +310,7 @@ module TTY
316
310
  def finish
317
311
  # reenable cursor if it is turned off
318
312
  if hide_cursor && @last_render_width != 0
319
- write(ECMA_CSI + DEC_TCEM + DEC_SET, false)
313
+ write(TTY::Cursor.show, false)
320
314
  end
321
315
  return if done?
322
316
  @current = total unless no_width
@@ -334,7 +328,7 @@ module TTY
334
328
  def stop
335
329
  # reenable cursor if it is turned off
336
330
  if hide_cursor && @last_render_width != 0
337
- write(ECMA_CSI + DEC_TCEM + DEC_SET, false)
331
+ write(TTY::Cursor.show, false)
338
332
  end
339
333
  return if done?
340
334
  render
@@ -349,7 +343,7 @@ module TTY
349
343
  #
350
344
  # @api public
351
345
  def clear_line
352
- output.print(ECMA_CSI + '0m' + ECMA_CSI + '1000D' + ECMA_CSI + ECMA_CLR)
346
+ output.print(ECMA_CSI + '0m' + TTY::Cursor.clear_line)
353
347
  end
354
348
 
355
349
  # Check if progress is finised
@@ -50,7 +50,7 @@ module TTY
50
50
  @bars = []
51
51
  @rows = 0
52
52
  @top_bar = nil
53
- @top_bar = register(format) if format
53
+ @top_bar = register(format, observable: false) if format
54
54
 
55
55
  @callbacks = {
56
56
  progress: [],
@@ -66,15 +66,15 @@ module TTY
66
66
  #
67
67
  # @api public
68
68
  def register(format, options = {})
69
+ observable = options.delete(:observable) { true }
69
70
  bar = TTY::ProgressBar.new(format, @options.merge(options))
70
71
 
71
72
  synchronize do
72
73
  bar.attach_to(self)
73
74
  @bars << bar
74
-
75
+ observe(bar) if observable
75
76
  if @top_bar
76
77
  @top_bar.update(total: total, width: total)
77
- observe(bar)
78
78
  end
79
79
  end
80
80
 
@@ -95,11 +95,21 @@ module TTY
95
95
  # @param [TTY::ProgressBar] bar
96
96
  # the bar to observe for events
97
97
  #
98
- # @api public
98
+ # @api private
99
99
  def observe(bar)
100
- bar.on(:progress) { top_bar.current = current; emit(:progress) }
101
- .on(:done) { top_bar.finish; emit(:done) if complete? }
102
- .on(:stopped) { top_bar.stop; emit(:stopped) if stopped? }
100
+ bar.on(:progress, &progress_handler)
101
+ .on(:done) { emit(:done) if complete? }
102
+ .on(:stopped) { emit(:stopped) if stopped? }
103
+ end
104
+
105
+ # Handle the progress event
106
+ #
107
+ # @api private
108
+ def progress_handler
109
+ proc do
110
+ @top_bar.current = current if @top_bar
111
+ emit(:progress)
112
+ end
103
113
  end
104
114
 
105
115
  # Get the top level bar if it exists
@@ -123,7 +133,9 @@ module TTY
123
133
  #
124
134
  # @api public
125
135
  def total
126
- (@bars - [@top_bar]).dup.map(&:total).reduce(&:+)
136
+ synchronize do
137
+ (@bars - [@top_bar]).dup.map(&:total).reduce(&:+)
138
+ end
127
139
  end
128
140
 
129
141
  # Calculate total current progress of all bars
@@ -132,7 +144,9 @@ module TTY
132
144
  #
133
145
  # @api public
134
146
  def current
135
- (@bars - [@top_bar]).dup.map(&:current).reduce(&:+)
147
+ synchronize do
148
+ (@bars - [@top_bar]).dup.map(&:current).reduce(&:+)
149
+ end
136
150
  end
137
151
 
138
152
  # Check if all progress bars are complete
@@ -141,7 +155,9 @@ module TTY
141
155
  #
142
156
  # @api public
143
157
  def complete?
144
- (@bars - [@top_bar]).dup.all?(&:complete?)
158
+ synchronize do
159
+ (@bars - [@top_bar]).dup.all?(&:complete?)
160
+ end
145
161
  end
146
162
 
147
163
  # Check if any of the registered progress bars is stopped
@@ -150,7 +166,9 @@ module TTY
150
166
  #
151
167
  # @api public
152
168
  def stopped?
153
- (@bars - [@top_bar]).dup.any?(&:stopped?)
169
+ synchronize do
170
+ (@bars - [@top_bar]).dup.any?(&:stopped?)
171
+ end
154
172
  end
155
173
 
156
174
  # Stop all progress bars
@@ -164,7 +182,6 @@ module TTY
164
182
  #
165
183
  # @api public
166
184
  def finish
167
- @top_bar.finish if @top_bar
168
185
  @bars.dup.each(&:finish)
169
186
  end
170
187
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module TTY
4
4
  class ProgressBar
5
- VERSION = '0.12.0'
5
+ VERSION = '0.12.1'
6
6
  end # ProgressBar
7
7
  end # TTY
@@ -13,7 +13,7 @@ RSpec.describe TTY::ProgressBar, 'clear' do
13
13
  "\e[1G[== ]",
14
14
  "\e[1G[=== ]",
15
15
  "\e[1G[==== ]",
16
- "\e[1G[=====]\e[0m\e[1000D\e[K"
16
+ "\e[1G[=====]\e[0m\e[2K\e[1G"
17
17
  ].join)
18
18
  end
19
19
  end
@@ -3,7 +3,7 @@
3
3
  RSpec.describe TTY::ProgressBar::Multi, 'events' do
4
4
  let(:output) { StringIO.new('', 'w+') }
5
5
 
6
- it "emits :progress eent when any of the registerd bars advances" do
6
+ it "emits :progress event when any of the registerd bars advances" do
7
7
  events = []
8
8
  bars = TTY::ProgressBar::Multi.new("[:bar]", output: output, total: 5)
9
9
  bars.on(:progress) { events << :progress }
@@ -14,31 +14,57 @@ RSpec.describe TTY::ProgressBar::Multi, 'events' do
14
14
  expect(events).to eq([:progress])
15
15
  end
16
16
 
17
- it "emits :done event when all progress bars finished" do
17
+ it "emits :done event when all progress bars finished under top level" do
18
18
  events = []
19
19
  bars = TTY::ProgressBar::Multi.new("[:bar]", output: output, total: 5)
20
20
  bars.on(:done) { events << :done }
21
-
22
21
  bar = bars.register "one [:bar]"
23
22
 
24
23
  bar.finish
25
24
 
26
25
  expect(events).to eq([:done])
26
+ expect(bar.complete?).to eq(true)
27
27
  end
28
28
 
29
- it "emits :done event when top level bar finished" do
29
+ it "emits :done event when all progress bars finished without top level" do
30
+ events = []
31
+ bars = TTY::ProgressBar::Multi.new(output: output)
32
+ bars.on(:done) { events << :done }
33
+ bar = bars.register "one [:bar]", total: 5
34
+
35
+ bar.finish
36
+
37
+ expect(events).to eq([:done])
38
+ expect(bars.complete?).to eq(true)
39
+ end
40
+
41
+ it "emits :done event when top level registered bar finished" do
30
42
  events = []
31
43
  bars = TTY::ProgressBar::Multi.new("[:bar]", output: output, total: 5)
32
44
  bars.on(:done) { events << :done }
33
45
 
34
- bars.register "one [:bar]"
46
+ bar = bars.register "one [:bar]", total: 5
35
47
 
36
48
  bars.finish
37
49
 
38
50
  expect(events).to eq([:done])
51
+ expect(bar.complete?).to eq(true)
39
52
  end
40
53
 
41
- it "emits :stopped event when all registerd bars are stopped" do
54
+ it "emits :done event when top level bar finished" do
55
+ events = []
56
+ bars = TTY::ProgressBar::Multi.new(output: output)
57
+ bars.on(:done) { events << :done }
58
+
59
+ bar = bars.register "one [:bar]", total: 5
60
+
61
+ bars.finish
62
+
63
+ expect(events).to eq([:done])
64
+ expect(bar.complete?).to eq(true)
65
+ end
66
+
67
+ it "emits :stopped event when all registerd bars are stopped under top level" do
42
68
  events = []
43
69
  bars = TTY::ProgressBar::Multi.new("[:bar]", output: output, total: 5)
44
70
  bars.on(:stopped) { events << :stopped }
@@ -48,9 +74,23 @@ RSpec.describe TTY::ProgressBar::Multi, 'events' do
48
74
  bar.stop
49
75
 
50
76
  expect(events).to eq([:stopped])
77
+ expect(bars.stopped?).to eq(true)
78
+ end
79
+
80
+ it "emits :stopped event when all registerd bars are stopped without top level" do
81
+ events = []
82
+ bars = TTY::ProgressBar::Multi.new(output: output)
83
+ bars.on(:stopped) { events << :stopped }
84
+
85
+ bar = bars.register "one [:bar]", total: 5
86
+
87
+ bar.stop
88
+
89
+ expect(events).to eq([:stopped])
90
+ expect(bars.stopped?).to eq(true)
51
91
  end
52
92
 
53
- it "emits :stopped event when top level bar finished" do
93
+ it "emits :stopped event when registerd multi bar finished" do
54
94
  events = []
55
95
  bars = TTY::ProgressBar::Multi.new("[:bar]", output: output, total: 5)
56
96
  bars.on(:stopped) { events << :stopped }
@@ -61,4 +101,17 @@ RSpec.describe TTY::ProgressBar::Multi, 'events' do
61
101
 
62
102
  expect(events).to eq([:stopped])
63
103
  end
104
+
105
+ it "emits :stopped event when multi bar finished" do
106
+ events = []
107
+ bars = TTY::ProgressBar::Multi.new(output: output)
108
+ bars.on(:stopped) { events << :stopped }
109
+
110
+ bars.register "one [:bar]", total: 5
111
+
112
+ bars.stop
113
+
114
+ expect(events).to eq([:stopped])
115
+ expect(bars.stopped?).to eq(true)
116
+ end
64
117
  end
@@ -3,7 +3,7 @@
3
3
  RSpec.describe TTY::ProgressBar::Multi, '#finish' do
4
4
  let(:output) { StringIO.new('', 'w+') }
5
5
 
6
- it "finishes all bars" do
6
+ it "finishes all bars with top level" do
7
7
  bars = TTY::ProgressBar::Multi.new("main [:bar]", output: output)
8
8
 
9
9
  bar1 = bars.register("[:bar]", total: 5)
@@ -16,4 +16,28 @@ RSpec.describe TTY::ProgressBar::Multi, '#finish' do
16
16
 
17
17
  expect(bars.complete?).to eq(true)
18
18
  end
19
+
20
+ it "finishes all bars without top level" do
21
+ bars = TTY::ProgressBar::Multi.new(output: output)
22
+
23
+ bar1 = bars.register("[:bar]", total: 5)
24
+ bar2 = bars.register("[:bar]", total: 10)
25
+
26
+ bar1.finish
27
+ bar2.finish
28
+
29
+ expect(bars.complete?).to eq(true)
30
+ end
31
+
32
+ it "finishes top level" do
33
+ bars = TTY::ProgressBar::Multi.new(output: output)
34
+
35
+ bar1 = bars.register("[:bar]", total: 5)
36
+ bar2 = bars.register("[:bar]", total: 10)
37
+
38
+ bars.finish
39
+
40
+ expect(bar1.complete?).to eq(true)
41
+ expect(bar2.complete?).to eq(true)
42
+ end
19
43
  end
@@ -17,6 +17,7 @@ RSpec.describe TTY::ProgressBar::Multi, '#register' do
17
17
  it "uses global options to register instance" do
18
18
  bars = TTY::ProgressBar::Multi.new(output: output, total: 100)
19
19
  bar = double(:bar, attach_to: nil)
20
+ allow(bar).to receive(:on).and_return(bar)
20
21
  allow(TTY::ProgressBar).to receive(:new).and_return(bar)
21
22
 
22
23
  bars.register("[:bar]")
@@ -12,7 +12,7 @@ RSpec.describe TTY::ProgressBar, '#resize' do
12
12
  expect(output.read).to eq([
13
13
  "\e[1G[== ]",
14
14
  "\e[1G[==== ]",
15
- "\e[0m\e[1000D\e[K",
15
+ "\e[0m\e[2K\e[1G",
16
16
  "\e[1G[=== ]",
17
17
  "\e[1G[==== ]",
18
18
  "\e[1G[=====]\n"
@@ -28,7 +28,7 @@ RSpec.describe TTY::ProgressBar, '#resize' do
28
28
  expect(output.read).to eq([
29
29
  "\e[1G[== ]",
30
30
  "\e[1G[==== ]",
31
- "\e[0m\e[1000D\e[K",
31
+ "\e[0m\e[2K\e[1G",
32
32
  "\e[1G[============ ]",
33
33
  "\e[1G[================ ]",
34
34
  "\e[1G[====================]\n"
@@ -22,5 +22,6 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency "tty-screen", '~> 0.5.0'
23
23
 
24
24
  spec.add_development_dependency 'bundler', '>= 1.5.0', '< 2.0'
25
+ spec.add_development_dependency 'rspec', '~> 3.1'
25
26
  spec.add_development_dependency 'rake'
26
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tty-progressbar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-03 00:00:00.000000000 Z
11
+ date: 2017-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-cursor
@@ -58,6 +58,20 @@ dependencies:
58
58
  - - "<"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '2.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.1'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.1'
61
75
  - !ruby/object:Gem::Dependency
62
76
  name: rake
63
77
  requirement: !ruby/object:Gem::Requirement