tty-progressbar 0.14.0 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +98 -21
- data/LICENSE.txt +1 -1
- data/README.md +511 -119
- data/lib/tty-progressbar.rb +2 -2
- data/lib/tty/progressbar.rb +216 -87
- data/lib/tty/progressbar/configuration.rb +124 -16
- data/lib/tty/progressbar/converter.rb +16 -19
- data/lib/tty/progressbar/formats.rb +120 -0
- data/lib/tty/progressbar/formatter.rb +33 -38
- data/lib/tty/progressbar/formatter/bar.rb +87 -29
- data/lib/tty/progressbar/formatter/byte_rate.rb +6 -20
- data/lib/tty/progressbar/formatter/current.rb +4 -19
- data/lib/tty/progressbar/formatter/current_byte.rb +9 -17
- data/lib/tty/progressbar/formatter/elapsed.rb +9 -18
- data/lib/tty/progressbar/formatter/estimated.rb +14 -18
- data/lib/tty/progressbar/formatter/estimated_time.rb +37 -0
- data/lib/tty/progressbar/formatter/mean_byte.rb +6 -20
- data/lib/tty/progressbar/formatter/mean_rate.rb +6 -20
- data/lib/tty/progressbar/formatter/percent.rb +10 -16
- data/lib/tty/progressbar/formatter/rate.rb +5 -19
- data/lib/tty/progressbar/formatter/total.rb +10 -16
- data/lib/tty/progressbar/formatter/total_byte.rb +14 -18
- data/lib/tty/progressbar/formatters.rb +53 -0
- data/lib/tty/progressbar/meter.rb +2 -2
- data/lib/tty/progressbar/multi.rb +69 -23
- data/lib/tty/progressbar/pipeline.rb +13 -6
- data/lib/tty/progressbar/timer.rb +89 -0
- data/lib/tty/progressbar/version.rb +3 -1
- metadata +65 -151
- data/.codeclimate.yml +0 -11
- data/.gitignore +0 -14
- data/.rspec +0 -3
- data/.travis.yml +0 -25
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile +0 -14
- data/Rakefile +0 -8
- data/appveyor.yml +0 -21
- data/examples/color.rb +0 -18
- data/examples/failure.rb +0 -12
- data/examples/iterator.rb +0 -5
- data/examples/lazy.rb +0 -6
- data/examples/multi/main_bar.rb +0 -13
- data/examples/multi/simple.rb +0 -13
- data/examples/simple.rb +0 -7
- data/examples/slow_process.rb +0 -29
- data/examples/speed.rb +0 -11
- data/examples/threaded.rb +0 -14
- data/examples/tokens.rb +0 -12
- data/spec/spec_helper.rb +0 -50
- data/spec/unit/advance_spec.rb +0 -25
- data/spec/unit/clear_spec.rb +0 -17
- data/spec/unit/complete_spec.rb +0 -16
- data/spec/unit/converter/to_bytes_spec.rb +0 -47
- data/spec/unit/converter/to_seconds_spec.rb +0 -15
- data/spec/unit/converter/to_time_spec.rb +0 -19
- data/spec/unit/custom_formatter_spec.rb +0 -26
- data/spec/unit/custom_token_spec.rb +0 -14
- data/spec/unit/events_spec.rb +0 -33
- data/spec/unit/finish_spec.rb +0 -15
- data/spec/unit/formatter/bar_spec.rb +0 -16
- data/spec/unit/formatter/byte_rate_spec.rb +0 -32
- data/spec/unit/formatter/current_byte_spec.rb +0 -16
- data/spec/unit/formatter/current_spec.rb +0 -14
- data/spec/unit/formatter/elapsed_spec.rb +0 -58
- data/spec/unit/formatter/estimated_spec.rb +0 -27
- data/spec/unit/formatter/mean_byte_spec.rb +0 -32
- data/spec/unit/formatter/mean_rate_spec.rb +0 -31
- data/spec/unit/formatter/percent_spec.rb +0 -16
- data/spec/unit/formatter/rate_spec.rb +0 -31
- data/spec/unit/formatter/total_byte_spec.rb +0 -16
- data/spec/unit/formatter/total_spec.rb +0 -16
- data/spec/unit/frequency_spec.rb +0 -27
- data/spec/unit/head_spec.rb +0 -32
- data/spec/unit/hide_cursor_spec.rb +0 -27
- data/spec/unit/inspect_spec.rb +0 -11
- data/spec/unit/iterate_spec.rb +0 -79
- data/spec/unit/log_spec.rb +0 -29
- data/spec/unit/meter_spec.rb +0 -70
- data/spec/unit/multi/advance_spec.rb +0 -123
- data/spec/unit/multi/events_spec.rb +0 -115
- data/spec/unit/multi/finish_spec.rb +0 -41
- data/spec/unit/multi/line_inset_spec.rb +0 -65
- data/spec/unit/multi/register_spec.rb +0 -35
- data/spec/unit/multi/stop_spec.rb +0 -15
- data/spec/unit/new_spec.rb +0 -66
- data/spec/unit/pipeline_spec.rb +0 -19
- data/spec/unit/ratio_spec.rb +0 -31
- data/spec/unit/reset_spec.rb +0 -31
- data/spec/unit/resize_spec.rb +0 -35
- data/spec/unit/set_current_spec.rb +0 -43
- data/spec/unit/start_spec.rb +0 -14
- data/spec/unit/stop_spec.rb +0 -19
- data/spec/unit/update_spec.rb +0 -22
- data/spec/unit/width_spec.rb +0 -21
- data/tasks/console.rake +0 -9
- data/tasks/coverage.rake +0 -9
- data/tasks/spec.rake +0 -27
- data/tty-progressbar.gemspec +0 -30
data/lib/tty-progressbar.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require_relative
|
2
|
-
require_relative
|
1
|
+
require_relative "tty/progressbar"
|
2
|
+
require_relative "tty/progressbar/multi"
|
data/lib/tty/progressbar.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
require_relative
|
12
|
-
require_relative
|
3
|
+
require "io/console"
|
4
|
+
require "forwardable"
|
5
|
+
require "monitor"
|
6
|
+
require "tty-cursor"
|
7
|
+
require "tty-screen"
|
8
|
+
require "strings-ansi"
|
9
|
+
require "unicode/display_width"
|
10
|
+
|
11
|
+
require_relative "progressbar/timer"
|
12
|
+
require_relative "progressbar/configuration"
|
13
|
+
require_relative "progressbar/formatters"
|
14
|
+
require_relative "progressbar/meter"
|
15
|
+
require_relative "progressbar/version"
|
13
16
|
|
14
17
|
module TTY
|
15
18
|
# Used for creating terminal progress bar
|
@@ -19,28 +22,55 @@ module TTY
|
|
19
22
|
extend Forwardable
|
20
23
|
include MonitorMixin
|
21
24
|
|
22
|
-
ECMA_CSI = "\e["
|
25
|
+
ECMA_CSI = "\e["
|
26
|
+
|
27
|
+
NEWLINE = "\n"
|
23
28
|
|
24
29
|
CURSOR_LOCK = Monitor.new
|
25
30
|
|
26
|
-
|
31
|
+
attr_accessor :format
|
27
32
|
|
28
33
|
attr_reader :current
|
29
34
|
|
30
|
-
attr_reader :start_at
|
31
|
-
|
32
35
|
attr_reader :row
|
33
36
|
|
34
|
-
def_delegators :@configuration, :total, :width, :
|
35
|
-
:
|
36
|
-
:
|
37
|
+
def_delegators :@configuration, :total, :width, :complete, :incomplete,
|
38
|
+
:head, :clear_head, :hide_cursor, :clear, :output,
|
39
|
+
:frequency, :interval, :inset, :width=, :unknown, :bar_format
|
37
40
|
|
38
41
|
def_delegators :@meter, :rate, :mean_rate
|
39
42
|
|
40
|
-
|
43
|
+
def_delegators :@timer, :elapsed_time, :start_time
|
44
|
+
|
45
|
+
# Determine terminal width
|
46
|
+
#
|
47
|
+
# @return [Integer]
|
48
|
+
#
|
49
|
+
# @api public
|
50
|
+
def self.max_columns
|
51
|
+
TTY::Screen.width
|
52
|
+
end
|
53
|
+
|
54
|
+
# Determine the monospace display width of a string
|
55
|
+
#
|
56
|
+
# @param [String] value
|
57
|
+
# the value to determine width of
|
58
|
+
#
|
59
|
+
# @return [Integer]
|
60
|
+
#
|
61
|
+
# @api public
|
62
|
+
def self.display_columns(value)
|
63
|
+
Unicode::DisplayWidth.of(Strings::ANSI.sanitize(value))
|
64
|
+
end
|
41
65
|
|
42
66
|
# Create progress bar
|
43
67
|
#
|
68
|
+
# @example
|
69
|
+
# bar = TTY::Progressbar.new
|
70
|
+
# bar.configure do |config|
|
71
|
+
# config.total = 20
|
72
|
+
# end
|
73
|
+
#
|
44
74
|
# @param [String] format
|
45
75
|
# the tokenized string that displays the output
|
46
76
|
#
|
@@ -48,20 +78,29 @@ module TTY
|
|
48
78
|
# @option options [Numeric] :total
|
49
79
|
# the total number of steps to completion
|
50
80
|
# @option options [Numeric] :width
|
51
|
-
# the maximum width for the
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
81
|
+
# the maximum width for the progress bar except all formatting tokens
|
82
|
+
# @option option [String] :complete
|
83
|
+
# the complete character in progress animation
|
84
|
+
# @option options [String] :incomplete
|
85
|
+
# the incomplete character in progress animation
|
86
|
+
# @option options [String] :head
|
87
|
+
# the head character, defaults to complete
|
88
|
+
# @option options [String] :unknown
|
89
|
+
# the unknown character for indeterminate progress animation
|
90
|
+
# @option options [Boolean] :bar_format
|
91
|
+
# the preconfigured bar format name, defaults to :classic
|
59
92
|
# @option options [Object] :output
|
60
|
-
# the object that responds to print call
|
93
|
+
# the object that responds to print call, defaults to stderr
|
61
94
|
# @option options [Number] :frequency
|
62
|
-
# the frequency with which to display
|
95
|
+
# the frequency with which to display a progress bar per second
|
63
96
|
# @option options [Number] :interval
|
64
|
-
# the
|
97
|
+
# the time interval for sampling of speed measurement, defaults to 1 second
|
98
|
+
# @option options [Boolean] :hide_cursor
|
99
|
+
# whether or not to hide the cursor, defaults to false
|
100
|
+
# @option options [Boolean] :clear
|
101
|
+
# whether or not to clear the progress line, defaults to false
|
102
|
+
# @option options [Boolean] :clear_head
|
103
|
+
# whether or not to replace head character with complete, defaults to false
|
65
104
|
#
|
66
105
|
# @api public
|
67
106
|
def initialize(format, options = {})
|
@@ -74,33 +113,52 @@ module TTY
|
|
74
113
|
@configuration = TTY::ProgressBar::Configuration.new(options)
|
75
114
|
yield @configuration if block_given?
|
76
115
|
|
77
|
-
@
|
78
|
-
@meter
|
116
|
+
@formatters = TTY::ProgressBar::Formatters.new
|
117
|
+
@meter = TTY::ProgressBar::Meter.new(interval)
|
118
|
+
@timer = TTY::ProgressBar::Timer.new
|
79
119
|
@callbacks = Hash.new { |h, k| h[k] = [] }
|
80
120
|
|
81
|
-
@
|
121
|
+
@formatters.load(self)
|
82
122
|
reset
|
123
|
+
|
124
|
+
@first_render = true
|
125
|
+
@multibar = nil
|
126
|
+
@row = nil
|
83
127
|
end
|
84
128
|
|
85
129
|
# Reset progress to default configuration
|
86
130
|
#
|
87
131
|
# @api public
|
88
132
|
def reset
|
89
|
-
@width = 0 if
|
133
|
+
@width = 0 if indeterminate?
|
90
134
|
@render_period = frequency == 0 ? 0 : 1.0 / frequency
|
91
135
|
@current = 0
|
136
|
+
@unknown = 0
|
92
137
|
@last_render_time = Time.now
|
93
138
|
@last_render_width = 0
|
94
139
|
@done = false
|
95
140
|
@stopped = false
|
96
|
-
@
|
97
|
-
@started = false
|
141
|
+
@paused = false
|
98
142
|
@tokens = {}
|
99
|
-
@multibar = nil
|
100
|
-
@row = nil
|
101
|
-
@first_render = true
|
102
143
|
|
103
144
|
@meter.clear
|
145
|
+
@timer.reset
|
146
|
+
end
|
147
|
+
|
148
|
+
# Access instance configuration
|
149
|
+
#
|
150
|
+
# @api public
|
151
|
+
def configure
|
152
|
+
yield @configuration
|
153
|
+
end
|
154
|
+
|
155
|
+
# Check if progress can be determined or not
|
156
|
+
#
|
157
|
+
# @return [Boolean]
|
158
|
+
#
|
159
|
+
# @api public
|
160
|
+
def indeterminate?
|
161
|
+
total.nil?
|
104
162
|
end
|
105
163
|
|
106
164
|
# Attach this bar to multi bar
|
@@ -113,13 +171,26 @@ module TTY
|
|
113
171
|
@multibar = multibar
|
114
172
|
end
|
115
173
|
|
174
|
+
# Use custom token formatter
|
175
|
+
#
|
176
|
+
# @param [Object] formatter_class
|
177
|
+
# the formatter class to add to formatting pipeline
|
178
|
+
#
|
179
|
+
# @api public
|
180
|
+
def use(formatter_class)
|
181
|
+
unless formatter_class.is_a?(Class)
|
182
|
+
raise ArgumentError, "Formatter needs to be a class"
|
183
|
+
end
|
184
|
+
|
185
|
+
@formatters.use(formatter_class.new(self))
|
186
|
+
end
|
187
|
+
|
116
188
|
# Start progression by drawing bar and setting time
|
117
189
|
#
|
118
190
|
# @api public
|
119
191
|
def start
|
120
192
|
synchronize do
|
121
|
-
@
|
122
|
-
@start_at = Time.now
|
193
|
+
@timer.start
|
123
194
|
@meter.start
|
124
195
|
end
|
125
196
|
|
@@ -135,21 +206,25 @@ module TTY
|
|
135
206
|
return if done?
|
136
207
|
|
137
208
|
synchronize do
|
138
|
-
emit(:progress)
|
209
|
+
emit(:progress, progress)
|
139
210
|
if progress.respond_to?(:to_hash)
|
140
211
|
tokens, progress = progress, 1
|
141
212
|
end
|
142
|
-
@
|
143
|
-
@current
|
144
|
-
|
213
|
+
@timer.start
|
214
|
+
@current += progress
|
215
|
+
# When progress is unknown increase by 2% up to max 200%, after
|
216
|
+
# that reset back to 0%
|
217
|
+
@unknown += 2 if indeterminate?
|
218
|
+
@unknown = 0 if @unknown > 199
|
219
|
+
@tokens = tokens
|
145
220
|
@meter.sample(Time.now, progress)
|
146
221
|
|
147
|
-
if !
|
222
|
+
if !indeterminate? && @current >= total
|
148
223
|
finish && return
|
149
224
|
end
|
150
225
|
|
151
|
-
|
152
|
-
|
226
|
+
return if (Time.now - @last_render_time) < @render_period
|
227
|
+
|
153
228
|
render
|
154
229
|
end
|
155
230
|
end
|
@@ -166,7 +241,7 @@ module TTY
|
|
166
241
|
# be convenient in "unsure number of iterations" situations
|
167
242
|
# (like downloading in chunks, when server may eventually send
|
168
243
|
# more chunks than predicted), but be careful to not pass infinite
|
169
|
-
# enumerators without
|
244
|
+
# enumerators without previously doing `.take(some_finite_number)`
|
170
245
|
# on them.
|
171
246
|
#
|
172
247
|
# @example
|
@@ -201,7 +276,9 @@ module TTY
|
|
201
276
|
def update(options = {})
|
202
277
|
synchronize do
|
203
278
|
options.each do |name, val|
|
204
|
-
@configuration.
|
279
|
+
if @configuration.respond_to?("#{name}=")
|
280
|
+
@configuration.public_send("#{name}=", val)
|
281
|
+
end
|
205
282
|
end
|
206
283
|
end
|
207
284
|
end
|
@@ -231,12 +308,20 @@ module TTY
|
|
231
308
|
|
232
309
|
# Ratio of completed over total steps
|
233
310
|
#
|
311
|
+
# When the total is unknown the progress ratio oscillates
|
312
|
+
# by going up from 0 to 1 and then down from 1 to 0 and
|
313
|
+
# up again to infinity.
|
314
|
+
#
|
234
315
|
# @return [Float]
|
235
316
|
#
|
236
317
|
# @api public
|
237
318
|
def ratio
|
238
319
|
synchronize do
|
239
|
-
proportion =
|
320
|
+
proportion = if total
|
321
|
+
total > 0 ? (@current.to_f / total) : 0
|
322
|
+
else
|
323
|
+
(@unknown > 100 ? 200 - @unknown : @unknown).to_f / 100
|
324
|
+
end
|
240
325
|
[[proportion, 0].max, 1].min
|
241
326
|
end
|
242
327
|
end
|
@@ -246,18 +331,28 @@ module TTY
|
|
246
331
|
# @api private
|
247
332
|
def render
|
248
333
|
return if done?
|
249
|
-
|
334
|
+
|
335
|
+
if hide_cursor && @last_render_width == 0 &&
|
336
|
+
(indeterminate? || @current < total)
|
250
337
|
write(TTY::Cursor.hide)
|
251
338
|
end
|
252
339
|
|
253
|
-
|
340
|
+
if @multibar
|
341
|
+
characters_in = @multibar.line_inset(self)
|
342
|
+
update(inset: self.class.display_columns(characters_in))
|
343
|
+
end
|
344
|
+
|
345
|
+
formatted = @formatters.decorate(@format)
|
254
346
|
@tokens.each do |token, val|
|
255
347
|
formatted = formatted.gsub(":#{token}", val)
|
256
348
|
end
|
257
|
-
|
349
|
+
|
350
|
+
padded = padout(formatted)
|
351
|
+
|
352
|
+
write(padded, true)
|
258
353
|
|
259
354
|
@last_render_time = Time.now
|
260
|
-
@last_render_width = formatted
|
355
|
+
@last_render_width = self.class.display_columns(formatted)
|
261
356
|
end
|
262
357
|
|
263
358
|
# Move cursor to a row of the current bar if the bar is rendered
|
@@ -270,7 +365,7 @@ module TTY
|
|
270
365
|
if @first_render
|
271
366
|
@row = @multibar.next_row
|
272
367
|
yield if block_given?
|
273
|
-
output.print
|
368
|
+
output.print NEWLINE
|
274
369
|
@first_render = false
|
275
370
|
else
|
276
371
|
lines_up = (@multibar.rows + 1) - @row
|
@@ -309,6 +404,7 @@ module TTY
|
|
309
404
|
# @api public
|
310
405
|
def resize(new_width = nil)
|
311
406
|
return if done?
|
407
|
+
|
312
408
|
synchronize do
|
313
409
|
clear_line
|
314
410
|
if new_width
|
@@ -321,45 +417,75 @@ module TTY
|
|
321
417
|
#
|
322
418
|
# @api public
|
323
419
|
def finish
|
324
|
-
# reenable cursor if it is turned off
|
325
|
-
if hide_cursor && @last_render_width != 0
|
326
|
-
write(TTY::Cursor.show, false)
|
327
|
-
end
|
328
420
|
return if done?
|
329
|
-
|
421
|
+
|
422
|
+
@current = total unless indeterminate?
|
330
423
|
render
|
331
|
-
clear ? clear_line : write(
|
424
|
+
clear ? clear_line : write(NEWLINE, false)
|
332
425
|
ensure
|
333
426
|
@meter.clear
|
334
427
|
@done = true
|
428
|
+
@timer.stop
|
429
|
+
|
430
|
+
# reenable cursor if it is turned off
|
431
|
+
if hide_cursor && @last_render_width != 0
|
432
|
+
write(TTY::Cursor.show, false)
|
433
|
+
end
|
434
|
+
|
335
435
|
emit(:done)
|
336
436
|
end
|
337
437
|
|
438
|
+
# Resume rendering when bar is done, stopped or paused
|
439
|
+
#
|
440
|
+
# @api public
|
441
|
+
def resume
|
442
|
+
synchronize do
|
443
|
+
@done = false
|
444
|
+
@stopped = false
|
445
|
+
@paused = false
|
446
|
+
end
|
447
|
+
end
|
448
|
+
|
338
449
|
# Stop and cancel the progress at the current position
|
339
450
|
#
|
340
451
|
# @api public
|
341
452
|
def stop
|
342
|
-
# reenable cursor if it is turned off
|
343
|
-
if hide_cursor && @last_render_width != 0
|
344
|
-
write(TTY::Cursor.show, false)
|
345
|
-
end
|
346
453
|
return if done?
|
454
|
+
|
347
455
|
render
|
348
|
-
clear ? clear_line : write(
|
456
|
+
clear ? clear_line : write(NEWLINE, false)
|
349
457
|
ensure
|
350
458
|
@meter.clear
|
351
459
|
@stopped = true
|
460
|
+
@timer.stop
|
461
|
+
|
462
|
+
# reenable cursor if it is turned off
|
463
|
+
if hide_cursor && @last_render_width != 0
|
464
|
+
write(TTY::Cursor.show, false)
|
465
|
+
end
|
466
|
+
|
352
467
|
emit(:stopped)
|
353
468
|
end
|
354
469
|
|
470
|
+
# Pause the progress at the current position
|
471
|
+
#
|
472
|
+
# @api public
|
473
|
+
def pause
|
474
|
+
synchronize do
|
475
|
+
@paused = true
|
476
|
+
@timer.stop
|
477
|
+
emit(:paused)
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
355
481
|
# Clear current line
|
356
482
|
#
|
357
483
|
# @api public
|
358
484
|
def clear_line
|
359
|
-
output.print(ECMA_CSI
|
485
|
+
output.print("#{ECMA_CSI}0m#{TTY::Cursor.clear_line}")
|
360
486
|
end
|
361
487
|
|
362
|
-
# Check if progress is
|
488
|
+
# Check if progress is finished
|
363
489
|
#
|
364
490
|
# @return [Boolean]
|
365
491
|
# true when progress finished, false otherwise
|
@@ -378,13 +504,22 @@ module TTY
|
|
378
504
|
@stopped
|
379
505
|
end
|
380
506
|
|
381
|
-
# Check if progress is
|
507
|
+
# Check if progress is paused
|
508
|
+
#
|
509
|
+
# @return [Boolean]
|
510
|
+
#
|
511
|
+
# @api public
|
512
|
+
def paused?
|
513
|
+
@paused
|
514
|
+
end
|
515
|
+
|
516
|
+
# Check if progress is finished, stopped or paused
|
382
517
|
#
|
383
518
|
# @return [Boolean]
|
384
519
|
#
|
385
520
|
# @api public
|
386
521
|
def done?
|
387
|
-
@done || @stopped
|
522
|
+
@done || @stopped || @paused
|
388
523
|
end
|
389
524
|
|
390
525
|
# Register callback with this bar
|
@@ -409,26 +544,17 @@ module TTY
|
|
409
544
|
#
|
410
545
|
# @api public
|
411
546
|
def log(message)
|
412
|
-
sanitized_message = message.gsub(/\r|\n/,
|
547
|
+
sanitized_message = message.gsub(/\r|\n/, " ")
|
413
548
|
if done?
|
414
|
-
write(sanitized_message
|
549
|
+
write("#{sanitized_message}#{NEWLINE}", false)
|
415
550
|
return
|
416
551
|
end
|
417
552
|
sanitized_message = padout(sanitized_message)
|
418
553
|
|
419
|
-
write(sanitized_message
|
554
|
+
write("#{sanitized_message}#{NEWLINE}", true)
|
420
555
|
render
|
421
556
|
end
|
422
557
|
|
423
|
-
# Determine terminal width
|
424
|
-
#
|
425
|
-
# @return [Integer]
|
426
|
-
#
|
427
|
-
# @api public
|
428
|
-
def max_columns
|
429
|
-
TTY::Screen.width
|
430
|
-
end
|
431
|
-
|
432
558
|
# Show bar format
|
433
559
|
#
|
434
560
|
# @return [String]
|
@@ -445,13 +571,14 @@ module TTY
|
|
445
571
|
# @api public
|
446
572
|
def inspect
|
447
573
|
"#<#{self.class.name} " \
|
448
|
-
"@format=\"#{format}\", " \
|
574
|
+
"@format=\"#{@format}\", " \
|
449
575
|
"@current=\"#{@current}\", " \
|
450
576
|
"@total=\"#{total}\", " \
|
451
577
|
"@width=\"#{width}\", " \
|
452
578
|
"@complete=\"#{complete}\", " \
|
453
579
|
"@head=\"#{head}\", " \
|
454
580
|
"@incomplete=\"#{incomplete}\", " \
|
581
|
+
"@unknown=\"#{unknown}\", " \
|
455
582
|
"@interval=\"#{interval}\">"
|
456
583
|
end
|
457
584
|
|
@@ -461,9 +588,11 @@ module TTY
|
|
461
588
|
#
|
462
589
|
# @api private
|
463
590
|
def padout(message)
|
464
|
-
|
465
|
-
|
466
|
-
|
591
|
+
message_length = self.class.display_columns(message)
|
592
|
+
|
593
|
+
if @last_render_width > message_length
|
594
|
+
remaining_width = @last_render_width - message_length
|
595
|
+
message += " " * remaining_width
|
467
596
|
end
|
468
597
|
message
|
469
598
|
end
|
@@ -476,7 +605,7 @@ module TTY
|
|
476
605
|
# @api private
|
477
606
|
def emit(name, *args)
|
478
607
|
@callbacks[name].each do |callback|
|
479
|
-
callback.
|
608
|
+
callback.(*args)
|
480
609
|
end
|
481
610
|
end
|
482
611
|
|