tty-progressbar 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -3
- data/CHANGELOG.md +9 -0
- data/README.md +32 -6
- data/lib/tty-progressbar.rb +2 -0
- data/lib/tty/progressbar.rb +63 -76
- data/lib/tty/progressbar/configuration.rb +44 -0
- data/lib/tty/progressbar/converter.rb +34 -2
- data/lib/tty/progressbar/formatter.rb +29 -0
- data/lib/tty/progressbar/{bar_formatter.rb → formatter/bar.rb} +14 -1
- data/lib/tty/progressbar/formatter/byte.rb +32 -0
- data/lib/tty/progressbar/{current_formatter.rb → formatter/current.rb} +14 -1
- data/lib/tty/progressbar/formatter/elapsed.rb +33 -0
- data/lib/tty/progressbar/{estimated_formatter.rb → formatter/estimated.rb} +16 -3
- data/lib/tty/progressbar/{percent_formatter.rb → formatter/percent.rb} +14 -1
- data/lib/tty/progressbar/formatter/total.rb +28 -0
- data/lib/tty/progressbar/pipeline.rb +6 -1
- data/lib/tty/progressbar/version.rb +1 -1
- data/spec/unit/clear_spec.rb +21 -0
- data/spec/unit/converter/to_bytes_spec.rb +27 -0
- data/spec/unit/{converter_spec.rb → converter/to_time_spec.rb} +0 -0
- data/spec/unit/custom_formatter_spec.rb +4 -0
- data/spec/unit/{bar_formatter_spec.rb → formatter/bar_spec.rb} +0 -0
- data/spec/unit/formatter/byte_spec.rb +20 -0
- data/spec/unit/{current_formatter_spec.rb → formatter/current_spec.rb} +0 -0
- data/spec/unit/{elapsed_formatter_spec.rb → formatter/elapsed_spec.rb} +1 -1
- data/spec/unit/{estimated_formatter_spec.rb → formatter/estimated_spec.rb} +0 -0
- data/spec/unit/{percent_formatter_spec.rb → formatter/percent_spec.rb} +0 -0
- data/spec/unit/new_spec.rb +12 -0
- data/spec/unit/resize_spec.rb +39 -0
- data/spec/unit/width_spec.rb +26 -0
- data/tasks/console.rake +1 -1
- data/tty-progressbar.gemspec +3 -2
- metadata +40 -27
- data/lib/tty/progressbar/elapsed_formatter.rb +0 -20
- data/lib/tty/progressbar/total_formatter.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f04f4c768fd866bf975c789315865b20506ee916
|
4
|
+
data.tar.gz: c50d09a231f989552fb19baa5ea81bcb5cc49a5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3aa6b1cbcb9d6310900ddadf151cc53147dafbba951d34cca60996c30319df9c3d73a1f9c1cac2547c5c64c921b45cc14137cb880dad69c8b473d55f46d0b957
|
7
|
+
data.tar.gz: bddfaf5c090ef9f0552c1e3162ddc150467496aeb4d93103aafa44b71376e633c96687749d6cce3a7bca4a0cafdf38a84af99fddd0b8f2dea673d48b7dba72c7
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
0.3.0 (December 21, 2014)
|
2
|
+
|
3
|
+
* Catch INT signal and cleanly end progress
|
4
|
+
* Add tty-screen dependency for terminal size detection
|
5
|
+
* Add to_bytes converter
|
6
|
+
* Add formatter for managing formats pipeline
|
7
|
+
* Change to add matching condition to formatter
|
8
|
+
* Add block configuration
|
9
|
+
|
1
10
|
0.2.0 (November 9, 2014)
|
2
11
|
|
3
12
|
* Add estimated time formatter.
|
data/README.md
CHANGED
@@ -9,14 +9,15 @@
|
|
9
9
|
[codeclimate]: https://codeclimate.com/github/peter-murach/tty-progressbar
|
10
10
|
[coverage]: https://coveralls.io/r/peter-murach/tty-progressbar
|
11
11
|
|
12
|
-
A flexible progress bars drawing in terminal emulators.
|
12
|
+
> A flexible progress bars drawing in terminal emulators.
|
13
13
|
|
14
14
|
**TTY::ProgressBar** provides independent progress bars component for [TTY](https://github.com/peter-murach/tty) toolkit.
|
15
15
|
|
16
16
|
## Features
|
17
17
|
|
18
|
-
*
|
19
|
-
*
|
18
|
+
* Fully [configurable](#2-configuration)
|
19
|
+
* Extremly flexible progress display [formatting](#3-formatting)
|
20
|
+
* Ability to define your custom format [tokens](#31-tokens)
|
20
21
|
* Works on all ECMA-48 compatible terminals
|
21
22
|
|
22
23
|
## Installation
|
@@ -41,6 +42,7 @@ Or install it yourself as:
|
|
41
42
|
* [1.1 advance](#11-advance)
|
42
43
|
* [1.2 finish](#12-finish)
|
43
44
|
* [1.3 complete?](#13-complete)
|
45
|
+
* [1.4 resize](#14-resize)
|
44
46
|
* [2. Configuration](#2-configuration)
|
45
47
|
* [2.1 Frequency](#21-frequency)
|
46
48
|
* [3. Formatting](#3-formatting)
|
@@ -69,7 +71,7 @@ downloading [======================= ]
|
|
69
71
|
|
70
72
|
### 1.1 advance
|
71
73
|
|
72
|
-
Once you have **ProgressBar** instance, you can progress the display by calling `advance` method. By default it will increase by `1`
|
74
|
+
Once you have **TTY::ProgressBar** instance, you can progress the display by calling `advance` method. By default it will increase by `1` but you can pass any number of steps, for instance, when used to advance number of bytes of downloaded file.
|
73
75
|
|
74
76
|
```ruby
|
75
77
|
bar.advance(1000)
|
@@ -99,6 +101,14 @@ During progresion you can check if bar is finished or not by calling `complete?`
|
|
99
101
|
bar.complete? # => false
|
100
102
|
```
|
101
103
|
|
104
|
+
### 1.4 resize
|
105
|
+
|
106
|
+
If you wish for a progress bar to change it's current width, you can use `resize` by passing in a new desired length:
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
bar.resize(50) # => will resize bar proportionately from this point onwards
|
110
|
+
```
|
111
|
+
|
102
112
|
## 2. Configuration
|
103
113
|
|
104
114
|
There are number of configuration options that can be provided:
|
@@ -110,6 +120,17 @@ There are number of configuration options that can be provided:
|
|
110
120
|
* `output` the output stream defaulting to `stderr`
|
111
121
|
* `frequency` used to throttle the output, by default `0` (see [Frequency](#21-frequency))
|
112
122
|
* `hide_cursor` to hide display cursor defaulting to `false`
|
123
|
+
* `clear` to clear the finished bar defaulting to `false`
|
124
|
+
|
125
|
+
All the above options can be passed in as hash options or block parameters:
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
TTY::ProgressBar.new "[:bar]" do |config|
|
129
|
+
config.total = 30
|
130
|
+
config.frequency = 10
|
131
|
+
config.clear = true
|
132
|
+
end
|
133
|
+
```
|
113
134
|
|
114
135
|
### 2.1 Frequency
|
115
136
|
|
@@ -134,6 +155,7 @@ Every **TTY::ProgressBar** instance requires a format string, which apart from r
|
|
134
155
|
These are the tokens that are currently supported:
|
135
156
|
|
136
157
|
* `:bar` the progress bar
|
158
|
+
* `:byte` the current progress in bytes
|
137
159
|
* `:current` the current progress number
|
138
160
|
* `:total` the total progress number
|
139
161
|
* `:percent` the completion percentage
|
@@ -144,7 +166,7 @@ These are the tokens that are currently supported:
|
|
144
166
|
|
145
167
|
If the provided tokens do not meet your needs, you can write your own formatter and instrument formatting pipeline to use a formatter you prefer.
|
146
168
|
|
147
|
-
For example, begin by creating custom formatter called `TimeFormatter` that will dynamicly update `:time` token in format string
|
169
|
+
For example, begin by creating custom formatter called `TimeFormatter` that will dynamicly update `:time` token in format string. The methods that you need to specify are `initialize`, `matches?` and `format` like follows:
|
148
170
|
|
149
171
|
```ruby
|
150
172
|
class TimeFormatter
|
@@ -152,7 +174,11 @@ class TimeFormatter
|
|
152
174
|
@progress = progress
|
153
175
|
end
|
154
176
|
|
155
|
-
def
|
177
|
+
def matches?(value) # specify condition to match for
|
178
|
+
value.to_s =~ /:time/
|
179
|
+
end
|
180
|
+
|
181
|
+
def format(value) # specify how value is formatted
|
156
182
|
transformed = transform(value)
|
157
183
|
value.gsub(/:time/, transformed.to_s) # => :time token
|
158
184
|
end
|
data/lib/tty-progressbar.rb
CHANGED
data/lib/tty/progressbar.rb
CHANGED
@@ -2,16 +2,21 @@
|
|
2
2
|
|
3
3
|
require 'io/console'
|
4
4
|
require 'forwardable'
|
5
|
+
require 'tty-screen'
|
5
6
|
|
7
|
+
require 'tty/progressbar/configuration'
|
6
8
|
require 'tty/progressbar/converter'
|
7
9
|
require 'tty/progressbar/version'
|
8
10
|
require 'tty/progressbar/pipeline'
|
9
|
-
require 'tty/progressbar/
|
10
|
-
|
11
|
-
require 'tty/progressbar/
|
12
|
-
require 'tty/progressbar/
|
13
|
-
require 'tty/progressbar/
|
14
|
-
require 'tty/progressbar/
|
11
|
+
require 'tty/progressbar/formatter'
|
12
|
+
|
13
|
+
require 'tty/progressbar/formatter/bar'
|
14
|
+
require 'tty/progressbar/formatter/byte'
|
15
|
+
require 'tty/progressbar/formatter/current'
|
16
|
+
require 'tty/progressbar/formatter/elapsed'
|
17
|
+
require 'tty/progressbar/formatter/estimated'
|
18
|
+
require 'tty/progressbar/formatter/percent'
|
19
|
+
require 'tty/progressbar/formatter/total'
|
15
20
|
|
16
21
|
module TTY
|
17
22
|
# Used for creating terminal progress bar
|
@@ -20,35 +25,26 @@ module TTY
|
|
20
25
|
class ProgressBar
|
21
26
|
extend Forwardable
|
22
27
|
|
23
|
-
ECMA_ESC = "\
|
24
|
-
ECMA_CSI = "\
|
25
|
-
ECMA_CHA = 'G'
|
28
|
+
ECMA_ESC = "\e".freeze
|
29
|
+
ECMA_CSI = "\e[".freeze
|
30
|
+
ECMA_CHA = 'G'.freeze
|
31
|
+
ECMA_CLR = 'K'.freeze
|
26
32
|
|
27
|
-
DEC_RST
|
28
|
-
DEC_SET
|
29
|
-
DEC_TCEM = '?25'
|
33
|
+
DEC_RST = 'l'.freeze
|
34
|
+
DEC_SET = 'h'.freeze
|
35
|
+
DEC_TCEM = '?25'.freeze
|
30
36
|
|
31
37
|
attr_reader :format
|
32
38
|
|
33
|
-
attr_reader :total
|
34
|
-
|
35
|
-
attr_reader :width
|
36
|
-
|
37
|
-
attr_reader :no_width
|
38
|
-
|
39
39
|
attr_reader :current
|
40
40
|
|
41
41
|
attr_reader :start_at
|
42
42
|
|
43
|
-
|
43
|
+
def_delegators :@configuration, :total, :width, :no_width,
|
44
|
+
:complete, :incomplete, :hide_cursor, :clear,
|
45
|
+
:output, :frequency
|
44
46
|
|
45
|
-
|
46
|
-
|
47
|
-
attr_reader :hide_cursor
|
48
|
-
|
49
|
-
attr_reader :output
|
50
|
-
|
51
|
-
def_delegator :@pipeline, :use
|
47
|
+
def_delegator :@formatter, :use
|
52
48
|
|
53
49
|
# Create progress bar
|
54
50
|
#
|
@@ -74,28 +70,21 @@ module TTY
|
|
74
70
|
#
|
75
71
|
# @api public
|
76
72
|
def initialize(format, options = {})
|
77
|
-
@format
|
78
|
-
@
|
79
|
-
@
|
80
|
-
|
81
|
-
@
|
82
|
-
@
|
83
|
-
@complete = options.fetch(:complete) { '=' }
|
84
|
-
@hide_cursor = options.fetch(:hide_cursor) { false }
|
85
|
-
@output = options.fetch(:output) { $stderr }
|
86
|
-
@frequency = options.fetch(:frequency) { 0 } # 0Hz
|
87
|
-
|
88
|
-
@width = 0 if @no_width
|
89
|
-
@render_period = @frequency == 0 ? 0 : 1.0 / @frequency
|
73
|
+
@format = format
|
74
|
+
@configuration = Configuration.new(options)
|
75
|
+
yield @configuration if block_given?
|
76
|
+
|
77
|
+
@width = 0 if no_width
|
78
|
+
@render_period = frequency == 0 ? 0 : 1.0 / frequency
|
90
79
|
@current = 0
|
91
80
|
@readings = 0
|
92
81
|
@last_render_time = Time.now
|
93
82
|
@last_render_width = 0
|
94
83
|
@done = false
|
95
84
|
@start_at = Time.now
|
96
|
-
@
|
85
|
+
@formatter = TTY::ProgressBar::Formatter.new
|
97
86
|
|
98
|
-
|
87
|
+
@formatter.load
|
99
88
|
register_callbacks
|
100
89
|
end
|
101
90
|
|
@@ -126,27 +115,20 @@ module TTY
|
|
126
115
|
#
|
127
116
|
# @api public
|
128
117
|
def ratio
|
129
|
-
proportion = (@current.to_f /
|
118
|
+
proportion = (@current.to_f / total)
|
130
119
|
[[proportion, 0].max, 1].min
|
131
120
|
end
|
132
121
|
|
133
|
-
# Determine terminal width
|
134
|
-
#
|
135
|
-
# @api public
|
136
|
-
def max_columns
|
137
|
-
IO.console.winsize.last
|
138
|
-
end
|
139
|
-
|
140
122
|
# Render progress to the output
|
141
123
|
#
|
142
124
|
# @api private
|
143
125
|
def render
|
144
126
|
return if @done
|
145
|
-
if
|
127
|
+
if hide_cursor && @last_render_width == 0 && !(@current >= total)
|
146
128
|
write(ECMA_CSI + DEC_TCEM + DEC_RST)
|
147
129
|
end
|
148
130
|
|
149
|
-
formatted = @
|
131
|
+
formatted = @formatter.decorate(self, @format)
|
150
132
|
write(formatted, true)
|
151
133
|
|
152
134
|
@last_render_time = Time.now
|
@@ -159,9 +141,9 @@ module TTY
|
|
159
141
|
#
|
160
142
|
# @api private
|
161
143
|
def write(data, clear_first = false)
|
162
|
-
|
163
|
-
|
164
|
-
|
144
|
+
output.print(ECMA_CSI + '1' + ECMA_CHA) if clear_first
|
145
|
+
output.print(data)
|
146
|
+
output.flush
|
165
147
|
end
|
166
148
|
|
167
149
|
# Resize progress bar with new configuration
|
@@ -171,11 +153,11 @@ module TTY
|
|
171
153
|
fail 'Cannot resize finished progress bar' if @done
|
172
154
|
|
173
155
|
if new_width
|
174
|
-
@no_width = false
|
175
|
-
@width = new_width
|
156
|
+
@configuration.no_width = false
|
157
|
+
@configuration.width = new_width
|
176
158
|
else
|
177
|
-
@no_width = true
|
178
|
-
@width = 0
|
159
|
+
@configuration.no_width = true
|
160
|
+
@configuration.width = 0
|
179
161
|
end
|
180
162
|
|
181
163
|
advance(0) # rerender with new configuration
|
@@ -186,16 +168,23 @@ module TTY
|
|
186
168
|
# @api public
|
187
169
|
def finish
|
188
170
|
# reenable cursor if it is turned off
|
189
|
-
if
|
171
|
+
if hide_cursor && @last_render_width != 0
|
190
172
|
write(ECMA_CSI + DEC_TCEM + DEC_SET, false)
|
191
173
|
end
|
192
174
|
return if @done
|
193
|
-
@current =
|
175
|
+
@current = width if no_width
|
194
176
|
render
|
195
|
-
write("\n", false)
|
177
|
+
clear ? clear_line : write("\n", false)
|
196
178
|
@done = true
|
197
179
|
end
|
198
180
|
|
181
|
+
# Clear current line
|
182
|
+
#
|
183
|
+
# @api public
|
184
|
+
def clear_line
|
185
|
+
output.print(ECMA_CSI + '0m' + ECMA_CSI + '1000D' + ECMA_CSI + ECMA_CLR)
|
186
|
+
end
|
187
|
+
|
199
188
|
# Check if progress is finised
|
200
189
|
#
|
201
190
|
# @return [Boolean]
|
@@ -224,6 +213,13 @@ module TTY
|
|
224
213
|
render
|
225
214
|
end
|
226
215
|
|
216
|
+
# Determine terminal width
|
217
|
+
#
|
218
|
+
# @api public
|
219
|
+
def max_columns
|
220
|
+
TTY::Screen.new.width
|
221
|
+
end
|
222
|
+
|
227
223
|
private
|
228
224
|
|
229
225
|
# Pad message out with spaces
|
@@ -237,26 +233,17 @@ module TTY
|
|
237
233
|
message
|
238
234
|
end
|
239
235
|
|
240
|
-
# Prepare default pipeline formatters
|
241
|
-
#
|
242
|
-
# @api private
|
243
|
-
def default_pipeline
|
244
|
-
@pipeline.use TTY::ProgressBar::CurrentFormatter
|
245
|
-
@pipeline.use TTY::ProgressBar::TotalFormatter
|
246
|
-
@pipeline.use TTY::ProgressBar::ElapsedFormatter
|
247
|
-
@pipeline.use TTY::ProgressBar::EstimatedFormatter
|
248
|
-
@pipeline.use TTY::ProgressBar::PercentFormatter
|
249
|
-
@pipeline.use TTY::ProgressBar::BarFormatter
|
250
|
-
end
|
251
|
-
|
252
236
|
# Handle resize and kill signals
|
253
237
|
#
|
254
238
|
# @api private
|
255
239
|
def register_callbacks
|
256
|
-
callback = proc
|
257
|
-
|
240
|
+
callback = proc do
|
241
|
+
adjusted_width = width < max_columns ? width : max_columns
|
242
|
+
send(:resize, adjusted_width)
|
243
|
+
end
|
244
|
+
Signal.trap('WINCH', &callback)
|
258
245
|
|
259
|
-
Signal.trap('
|
246
|
+
Signal.trap('INT') { finish }
|
260
247
|
end
|
261
248
|
end # ProgressBar
|
262
249
|
end # TTY
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class ProgressBar
|
5
|
+
class Configuration
|
6
|
+
|
7
|
+
attr_accessor :total
|
8
|
+
|
9
|
+
attr_accessor :width
|
10
|
+
|
11
|
+
attr_accessor :no_width
|
12
|
+
|
13
|
+
attr_accessor :incomplete
|
14
|
+
|
15
|
+
attr_accessor :complete
|
16
|
+
|
17
|
+
attr_accessor :hide_cursor
|
18
|
+
|
19
|
+
attr_accessor :clear
|
20
|
+
|
21
|
+
attr_accessor :output
|
22
|
+
|
23
|
+
attr_accessor :frequency
|
24
|
+
|
25
|
+
def initialize(options)
|
26
|
+
self.total = options[:total] if options[:total]
|
27
|
+
@width = options.fetch(:width) { total }
|
28
|
+
@no_width = options.fetch(:no_width) { false }
|
29
|
+
@incomplete = options.fetch(:incomplete) { ' ' }
|
30
|
+
@complete = options.fetch(:complete) { '=' }
|
31
|
+
@hide_cursor = options.fetch(:hide_cursor) { false }
|
32
|
+
@clear = options.fetch(:clear) { false }
|
33
|
+
@output = options.fetch(:output) { $stderr }
|
34
|
+
@frequency = options.fetch(:frequency) { 0 } # 0Hz
|
35
|
+
end
|
36
|
+
|
37
|
+
def total=(value)
|
38
|
+
fail ArgumentError unless value
|
39
|
+
@total = value
|
40
|
+
@width = value unless width
|
41
|
+
end
|
42
|
+
end # Configuration
|
43
|
+
end # ProgressBar
|
44
|
+
end # TTY
|
@@ -6,9 +6,17 @@ module TTY
|
|
6
6
|
#
|
7
7
|
# @api public
|
8
8
|
class Converter
|
9
|
+
HOURSECONDS = 3600
|
10
|
+
|
11
|
+
# Convert seconds to time notation
|
12
|
+
#
|
13
|
+
# @param [Numeric] seconds
|
14
|
+
# the seconds to convert to time
|
15
|
+
#
|
16
|
+
# @api public
|
9
17
|
def to_time(seconds)
|
10
|
-
hours = (seconds /
|
11
|
-
seconds -= hours *
|
18
|
+
hours = (seconds / HOURSECONDS.to_f).floor
|
19
|
+
seconds -= hours * HOURSECONDS
|
12
20
|
minutes = (seconds / 60).floor
|
13
21
|
seconds -= minutes * 60
|
14
22
|
|
@@ -22,6 +30,30 @@ module TTY
|
|
22
30
|
sprintf('%2ds', seconds)
|
23
31
|
end
|
24
32
|
end
|
33
|
+
|
34
|
+
KILOBYTE = 1024
|
35
|
+
MEGABYTE = KILOBYTE * 1024
|
36
|
+
GIGABYTE = MEGABYTE * 1024
|
37
|
+
|
38
|
+
# Convert value to bytes
|
39
|
+
#
|
40
|
+
# @param [Numeric] value
|
41
|
+
# the value to convert to bytes
|
42
|
+
#
|
43
|
+
# @return [String]
|
44
|
+
#
|
45
|
+
# @api public
|
46
|
+
def to_bytes(value)
|
47
|
+
if value >= GIGABYTE
|
48
|
+
sprintf('%.2f', value / GIGABYTE.to_f) + 'GB'
|
49
|
+
elsif value >= MEGABYTE
|
50
|
+
sprintf('%.2f', value / MEGABYTE.to_f) + 'MB'
|
51
|
+
elsif value >= KILOBYTE
|
52
|
+
sprintf('%.2f', value / KILOBYTE.to_f) + 'KB'
|
53
|
+
else
|
54
|
+
value.to_s + 'B'
|
55
|
+
end
|
56
|
+
end
|
25
57
|
end # Converter
|
26
58
|
end # ProgressBar
|
27
59
|
end # TTY
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class ProgressBar
|
5
|
+
class Formatter
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def_delegators :@pipeline, :decorate, :use
|
9
|
+
|
10
|
+
# @api private
|
11
|
+
def initialize(pipeline = nil)
|
12
|
+
@pipeline = TTY::ProgressBar::Pipeline.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# Prepare default pipeline formatters
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
def load
|
19
|
+
@pipeline.use TTY::ProgressBar::CurrentFormatter
|
20
|
+
@pipeline.use TTY::ProgressBar::TotalFormatter
|
21
|
+
@pipeline.use TTY::ProgressBar::ElapsedFormatter
|
22
|
+
@pipeline.use TTY::ProgressBar::EstimatedFormatter
|
23
|
+
@pipeline.use TTY::ProgressBar::PercentFormatter
|
24
|
+
@pipeline.use TTY::ProgressBar::ByteFormatter
|
25
|
+
@pipeline.use TTY::ProgressBar::BarFormatter
|
26
|
+
end
|
27
|
+
end # Formatter
|
28
|
+
end # ProgressBar
|
29
|
+
end # TTY
|
@@ -6,10 +6,23 @@ module TTY
|
|
6
6
|
#
|
7
7
|
# @api private
|
8
8
|
class BarFormatter
|
9
|
+
MATCHER = /:bar/.freeze
|
10
|
+
|
9
11
|
def initialize(progress, *args, &block)
|
10
12
|
@progress = progress
|
11
13
|
end
|
12
14
|
|
15
|
+
# Determines whether this formatter is applied or not.
|
16
|
+
#
|
17
|
+
# @param [Object] value
|
18
|
+
#
|
19
|
+
# @return [Boolean]
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
def matches?(value)
|
23
|
+
!!(value.to_s =~ MATCHER)
|
24
|
+
end
|
25
|
+
|
13
26
|
# Format :bar token
|
14
27
|
#
|
15
28
|
# @param [String] value
|
@@ -27,7 +40,7 @@ module TTY
|
|
27
40
|
bar += complete.join
|
28
41
|
bar += incomplete.join
|
29
42
|
|
30
|
-
value.gsub(
|
43
|
+
value.gsub(MATCHER, bar)
|
31
44
|
end
|
32
45
|
end # BarFormatter
|
33
46
|
end # ProgressBar
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class ProgressBar
|
5
|
+
class ByteFormatter
|
6
|
+
MATCHER = /:byte/.freeze
|
7
|
+
# Used by {Pipeline} to format :byte token
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
def initialize(progress)
|
11
|
+
@progress = progress
|
12
|
+
@converter = Converter.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# Determines whether this formatter is applied or not.
|
16
|
+
#
|
17
|
+
# @param [Object] value
|
18
|
+
#
|
19
|
+
# @return [Boolean]
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
def matches?(value)
|
23
|
+
!!(value.to_s =~ MATCHER)
|
24
|
+
end
|
25
|
+
|
26
|
+
def format(value)
|
27
|
+
bytes = @converter.to_bytes(@progress.current)
|
28
|
+
value.gsub(MATCHER, bytes)
|
29
|
+
end
|
30
|
+
end # ByteFormatter
|
31
|
+
end # ProgressBar
|
32
|
+
end # TTY
|
@@ -6,10 +6,23 @@ module TTY
|
|
6
6
|
#
|
7
7
|
# @api private
|
8
8
|
class CurrentFormatter
|
9
|
+
MATCHER = /:current/
|
10
|
+
|
9
11
|
def initialize(progress)
|
10
12
|
@progress = progress
|
11
13
|
end
|
12
14
|
|
15
|
+
# Determines whether this formatter is applied or not.
|
16
|
+
#
|
17
|
+
# @param [Object] value
|
18
|
+
#
|
19
|
+
# @return [Boolean]
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
def matches?(value)
|
23
|
+
!!(value.to_s =~ MATCHER)
|
24
|
+
end
|
25
|
+
|
13
26
|
# Format :current token
|
14
27
|
#
|
15
28
|
# @param [String] value
|
@@ -17,7 +30,7 @@ module TTY
|
|
17
30
|
#
|
18
31
|
# @api public
|
19
32
|
def format(value)
|
20
|
-
value.gsub(
|
33
|
+
value.gsub(MATCHER, @progress.current.to_s)
|
21
34
|
end
|
22
35
|
end # CurrentFormatter
|
23
36
|
end # ProgressBar
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class ProgressBar
|
5
|
+
# Used by {Pipeline} to format :elapsed token
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
class ElapsedFormatter
|
9
|
+
MATCHER = /:elapsed/.freeze
|
10
|
+
|
11
|
+
def initialize(progress, *args, &block)
|
12
|
+
@progress = progress
|
13
|
+
@converter = Converter.new
|
14
|
+
end
|
15
|
+
|
16
|
+
# Determines whether this formatter is applied or not.
|
17
|
+
#
|
18
|
+
# @param [Object] value
|
19
|
+
#
|
20
|
+
# @return [Boolean]
|
21
|
+
#
|
22
|
+
# @api private
|
23
|
+
def matches?(value)
|
24
|
+
!!(value.to_s =~ MATCHER)
|
25
|
+
end
|
26
|
+
|
27
|
+
def format(value)
|
28
|
+
elapsed = (Time.now - @progress.start_at)
|
29
|
+
value.gsub(MATCHER, @converter.to_time(elapsed))
|
30
|
+
end
|
31
|
+
end # ElapsedFormatter
|
32
|
+
end # ProgressBar
|
33
|
+
end # TTY
|
@@ -6,16 +6,29 @@ module TTY
|
|
6
6
|
#
|
7
7
|
# @api private
|
8
8
|
class EstimatedFormatter
|
9
|
+
MATCHER = /:eta/.freeze
|
10
|
+
|
9
11
|
def initialize(progress)
|
10
|
-
@progress
|
11
|
-
@converter =
|
12
|
+
@progress = progress
|
13
|
+
@converter = Converter.new
|
14
|
+
end
|
15
|
+
|
16
|
+
# Determines whether this formatter is applied or not.
|
17
|
+
#
|
18
|
+
# @param [Object] value
|
19
|
+
#
|
20
|
+
# @return [Boolean]
|
21
|
+
#
|
22
|
+
# @api private
|
23
|
+
def matches?(value)
|
24
|
+
!!(value.to_s =~ MATCHER)
|
12
25
|
end
|
13
26
|
|
14
27
|
def format(value)
|
15
28
|
elapsed = Time.now - @progress.start_at
|
16
29
|
estimated = (elapsed / @progress.ratio).to_f - elapsed
|
17
30
|
estimated = (estimated.infinite? || estimated < 0) ? 0.0 : estimated
|
18
|
-
value.gsub(
|
31
|
+
value.gsub(MATCHER, @converter.to_time(estimated))
|
19
32
|
end
|
20
33
|
end # ElapsedFormatter
|
21
34
|
end # ProgressBar
|
@@ -6,13 +6,26 @@ module TTY
|
|
6
6
|
#
|
7
7
|
# @api private
|
8
8
|
class PercentFormatter
|
9
|
+
MATCHER = /:percent/.freeze
|
10
|
+
|
9
11
|
def initialize(progress, *args, &block)
|
10
12
|
@progress = progress
|
11
13
|
end
|
12
14
|
|
15
|
+
# Determines whether this formatter is applied or not.
|
16
|
+
#
|
17
|
+
# @param [Object] value
|
18
|
+
#
|
19
|
+
# @return [Boolean]
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
def matches?(value)
|
23
|
+
!!(value.to_s =~ MATCHER)
|
24
|
+
end
|
25
|
+
|
13
26
|
def format(value)
|
14
27
|
percent = @progress.width == 0 ? 100 : (@progress.ratio * 100).to_i
|
15
|
-
value.gsub(
|
28
|
+
value.gsub(MATCHER, percent.to_s + '%')
|
16
29
|
end
|
17
30
|
end # PercentFormatter
|
18
31
|
end # ProgressBar
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class ProgressBar
|
5
|
+
class TotalFormatter
|
6
|
+
MATCHER = /:total/.freeze
|
7
|
+
|
8
|
+
def initialize(progress, *args, &block)
|
9
|
+
@progress = progress
|
10
|
+
end
|
11
|
+
|
12
|
+
# Determines whether this formatter is applied or not.
|
13
|
+
#
|
14
|
+
# @param [Object] value
|
15
|
+
#
|
16
|
+
# @return [Boolean]
|
17
|
+
#
|
18
|
+
# @api private
|
19
|
+
def matches?(value)
|
20
|
+
!!(value.to_s =~ MATCHER)
|
21
|
+
end
|
22
|
+
|
23
|
+
def format(value)
|
24
|
+
value.gsub(MATCHER, @progress.total.to_s)
|
25
|
+
end
|
26
|
+
end # TotalFormatter
|
27
|
+
end # ProgressBar
|
28
|
+
end # TTY
|
@@ -22,7 +22,12 @@ module TTY
|
|
22
22
|
def decorate(progress, tokenized)
|
23
23
|
base = tokenized.dup
|
24
24
|
formatters.inject(base) do |formatted, formatter|
|
25
|
-
formatter.call(progress)
|
25
|
+
instance = formatter.call(progress)
|
26
|
+
if instance.respond_to?(:matches?) && instance.matches?(formatted)
|
27
|
+
instance.format(formatted)
|
28
|
+
else
|
29
|
+
formatted
|
30
|
+
end
|
26
31
|
end
|
27
32
|
end
|
28
33
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar, 'clear' do
|
6
|
+
let(:output) { StringIO.new('', 'w+') }
|
7
|
+
|
8
|
+
it "clears progress bar when finished" do
|
9
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 5,
|
10
|
+
clear: true)
|
11
|
+
5.times { progress.advance }
|
12
|
+
output.rewind
|
13
|
+
expect(output.read).to eq([
|
14
|
+
"\e[1G[= ]",
|
15
|
+
"\e[1G[== ]",
|
16
|
+
"\e[1G[=== ]",
|
17
|
+
"\e[1G[==== ]",
|
18
|
+
"\e[1G[=====]\e[0m\e[1000D\e[K"
|
19
|
+
].join)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar::Converter, '.to_bytes' do
|
6
|
+
subject(:converter) { described_class.new }
|
7
|
+
|
8
|
+
it "converts 1000 to bytes" do
|
9
|
+
expect(converter.to_bytes(1000)).to eq('1000B')
|
10
|
+
end
|
11
|
+
|
12
|
+
it "converts 1024 to bytes" do
|
13
|
+
expect(converter.to_bytes(1024)).to eq('1.00KB')
|
14
|
+
end
|
15
|
+
|
16
|
+
it "converts 2000 to bytes" do
|
17
|
+
expect(converter.to_bytes(2000)).to eq('1.95KB')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "converts 10_000_000 to bytes" do
|
21
|
+
expect(converter.to_bytes(10_000_000)).to eq('9.54MB')
|
22
|
+
end
|
23
|
+
|
24
|
+
it "convert 10_000_000_000 to bytes" do
|
25
|
+
expect(converter.to_bytes(10_000_000_000)).to eq('9.31GB')
|
26
|
+
end
|
27
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar, '.new' do
|
6
|
+
let(:output) { StringIO.new('', 'w+') }
|
7
|
+
|
8
|
+
it "displays bytes processed" do
|
9
|
+
progress = described_class.new(":byte", output: output, total: 102_400)
|
10
|
+
5.times { progress.advance(20_480) }
|
11
|
+
output.rewind
|
12
|
+
expect(output.read).to eq([
|
13
|
+
"\e[1G20.00KB",
|
14
|
+
"\e[1G40.00KB",
|
15
|
+
"\e[1G60.00KB",
|
16
|
+
"\e[1G80.00KB",
|
17
|
+
"\e[1G100.00KB\n"
|
18
|
+
].join)
|
19
|
+
end
|
20
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/spec/unit/new_spec.rb
CHANGED
@@ -12,6 +12,18 @@ RSpec.describe TTY::ProgressBar, '.new' do
|
|
12
12
|
expect(output.read).to eq("\e[1G[= ]")
|
13
13
|
end
|
14
14
|
|
15
|
+
it "yields configuration to block" do
|
16
|
+
progress = TTY::ProgressBar.new "[:bar]" do |config|
|
17
|
+
config.output = output
|
18
|
+
config.total = 10
|
19
|
+
config.clear = true
|
20
|
+
end
|
21
|
+
expect(progress.output).to eq(output)
|
22
|
+
expect(progress.total).to eq(10)
|
23
|
+
expect(progress.width).to eq(10)
|
24
|
+
expect(progress.clear).to eq(true)
|
25
|
+
end
|
26
|
+
|
15
27
|
it "displays output where width > total" do
|
16
28
|
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 5, width: 10)
|
17
29
|
5.times { progress.advance }
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar, '.resize' do
|
6
|
+
let(:output) { StringIO.new('', 'w+') }
|
7
|
+
|
8
|
+
it "resizes output down by x2" do
|
9
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 5, width: 10)
|
10
|
+
2.times { progress.advance }
|
11
|
+
progress.resize(5)
|
12
|
+
3.times { progress.advance }
|
13
|
+
output.rewind
|
14
|
+
expect(output.read).to eq([
|
15
|
+
"\e[1G[== ]",
|
16
|
+
"\e[1G[==== ]",
|
17
|
+
"\e[1G[== ]",
|
18
|
+
"\e[1G[=== ]",
|
19
|
+
"\e[1G[==== ]",
|
20
|
+
"\e[1G[=====]\n"
|
21
|
+
].join)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "resizes output up by x2" do
|
25
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 5, width: 10)
|
26
|
+
2.times { progress.advance }
|
27
|
+
progress.resize(20)
|
28
|
+
3.times { progress.advance }
|
29
|
+
output.rewind
|
30
|
+
expect(output.read).to eq([
|
31
|
+
"\e[1G[== ]",
|
32
|
+
"\e[1G[==== ]",
|
33
|
+
"\e[1G[======== ]",
|
34
|
+
"\e[1G[============ ]",
|
35
|
+
"\e[1G[================ ]",
|
36
|
+
"\e[1G[====================]\n"
|
37
|
+
].join)
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar, 'width' do
|
6
|
+
let(:output) { StringIO.new('', 'w+') }
|
7
|
+
|
8
|
+
it "handles width exceeding terminal width" do
|
9
|
+
progress = TTY::ProgressBar.new "[:bar]" do |config|
|
10
|
+
config.output = output
|
11
|
+
config.total = 5
|
12
|
+
config.width = 1024
|
13
|
+
end
|
14
|
+
screen = double(:screen, width: 20)
|
15
|
+
allow(TTY::Screen).to receive(:new).and_return(screen)
|
16
|
+
5.times { progress.advance }
|
17
|
+
output.rewind
|
18
|
+
expect(output.read).to eq([
|
19
|
+
"\e[1G[==== ]",
|
20
|
+
"\e[1G[======= ]",
|
21
|
+
"\e[1G[=========== ]",
|
22
|
+
"\e[1G[============== ]",
|
23
|
+
"\e[1G[==================]\n"
|
24
|
+
].join)
|
25
|
+
end
|
26
|
+
end
|
data/tasks/console.rake
CHANGED
data/tty-progressbar.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.
|
22
|
-
|
21
|
+
spec.add_dependency "tty-screen", '~> 0.1.0'
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
23
24
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty-progressbar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: tty-screen
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
type: :
|
19
|
+
version: 0.1.0
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.6'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.6'
|
41
41
|
description: A flexible progress bars drawing in terminal emulators.
|
42
42
|
email:
|
43
43
|
- ''
|
@@ -58,30 +58,38 @@ files:
|
|
58
58
|
- examples/simple.rb
|
59
59
|
- lib/tty-progressbar.rb
|
60
60
|
- lib/tty/progressbar.rb
|
61
|
-
- lib/tty/progressbar/
|
61
|
+
- lib/tty/progressbar/configuration.rb
|
62
62
|
- lib/tty/progressbar/converter.rb
|
63
|
-
- lib/tty/progressbar/
|
64
|
-
- lib/tty/progressbar/
|
65
|
-
- lib/tty/progressbar/
|
66
|
-
- lib/tty/progressbar/
|
63
|
+
- lib/tty/progressbar/formatter.rb
|
64
|
+
- lib/tty/progressbar/formatter/bar.rb
|
65
|
+
- lib/tty/progressbar/formatter/byte.rb
|
66
|
+
- lib/tty/progressbar/formatter/current.rb
|
67
|
+
- lib/tty/progressbar/formatter/elapsed.rb
|
68
|
+
- lib/tty/progressbar/formatter/estimated.rb
|
69
|
+
- lib/tty/progressbar/formatter/percent.rb
|
70
|
+
- lib/tty/progressbar/formatter/total.rb
|
67
71
|
- lib/tty/progressbar/pipeline.rb
|
68
|
-
- lib/tty/progressbar/total_formatter.rb
|
69
72
|
- lib/tty/progressbar/version.rb
|
70
73
|
- spec/spec_helper.rb
|
71
74
|
- spec/unit/advance_spec.rb
|
72
|
-
- spec/unit/
|
75
|
+
- spec/unit/clear_spec.rb
|
73
76
|
- spec/unit/complete_spec.rb
|
74
|
-
- spec/unit/
|
75
|
-
- spec/unit/
|
77
|
+
- spec/unit/converter/to_bytes_spec.rb
|
78
|
+
- spec/unit/converter/to_time_spec.rb
|
76
79
|
- spec/unit/custom_formatter_spec.rb
|
77
|
-
- spec/unit/
|
78
|
-
- spec/unit/
|
80
|
+
- spec/unit/formatter/bar_spec.rb
|
81
|
+
- spec/unit/formatter/byte_spec.rb
|
82
|
+
- spec/unit/formatter/current_spec.rb
|
83
|
+
- spec/unit/formatter/elapsed_spec.rb
|
84
|
+
- spec/unit/formatter/estimated_spec.rb
|
85
|
+
- spec/unit/formatter/percent_spec.rb
|
79
86
|
- spec/unit/frequency_spec.rb
|
80
87
|
- spec/unit/hide_cursor_spec.rb
|
81
88
|
- spec/unit/log_spec.rb
|
82
89
|
- spec/unit/new_spec.rb
|
83
|
-
- spec/unit/percent_formatter_spec.rb
|
84
90
|
- spec/unit/pipeline_spec.rb
|
91
|
+
- spec/unit/resize_spec.rb
|
92
|
+
- spec/unit/width_spec.rb
|
85
93
|
- tasks/console.rake
|
86
94
|
- tasks/coverage.rake
|
87
95
|
- tasks/spec.rake
|
@@ -113,17 +121,22 @@ summary: A flexible progress bars drawing in terminal emulators.
|
|
113
121
|
test_files:
|
114
122
|
- spec/spec_helper.rb
|
115
123
|
- spec/unit/advance_spec.rb
|
116
|
-
- spec/unit/
|
124
|
+
- spec/unit/clear_spec.rb
|
117
125
|
- spec/unit/complete_spec.rb
|
118
|
-
- spec/unit/
|
119
|
-
- spec/unit/
|
126
|
+
- spec/unit/converter/to_bytes_spec.rb
|
127
|
+
- spec/unit/converter/to_time_spec.rb
|
120
128
|
- spec/unit/custom_formatter_spec.rb
|
121
|
-
- spec/unit/
|
122
|
-
- spec/unit/
|
129
|
+
- spec/unit/formatter/bar_spec.rb
|
130
|
+
- spec/unit/formatter/byte_spec.rb
|
131
|
+
- spec/unit/formatter/current_spec.rb
|
132
|
+
- spec/unit/formatter/elapsed_spec.rb
|
133
|
+
- spec/unit/formatter/estimated_spec.rb
|
134
|
+
- spec/unit/formatter/percent_spec.rb
|
123
135
|
- spec/unit/frequency_spec.rb
|
124
136
|
- spec/unit/hide_cursor_spec.rb
|
125
137
|
- spec/unit/log_spec.rb
|
126
138
|
- spec/unit/new_spec.rb
|
127
|
-
- spec/unit/percent_formatter_spec.rb
|
128
139
|
- spec/unit/pipeline_spec.rb
|
140
|
+
- spec/unit/resize_spec.rb
|
141
|
+
- spec/unit/width_spec.rb
|
129
142
|
has_rdoc:
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module TTY
|
4
|
-
class ProgressBar
|
5
|
-
# Used by {Pipeline} to format :elapsed token
|
6
|
-
#
|
7
|
-
# @api private
|
8
|
-
class ElapsedFormatter
|
9
|
-
def initialize(progress, *args, &block)
|
10
|
-
@progress = progress
|
11
|
-
@converter = TTY::ProgressBar::Converter.new
|
12
|
-
end
|
13
|
-
|
14
|
-
def format(value)
|
15
|
-
elapsed = (Time.now - @progress.start_at)
|
16
|
-
value.gsub(/:elapsed/, @converter.to_time(elapsed))
|
17
|
-
end
|
18
|
-
end # ElapsedFormatter
|
19
|
-
end # ProgressBar
|
20
|
-
end # TTY
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module TTY
|
4
|
-
class ProgressBar
|
5
|
-
class TotalFormatter
|
6
|
-
def initialize(progress, *args, &block)
|
7
|
-
@progress = progress
|
8
|
-
end
|
9
|
-
|
10
|
-
def format(value)
|
11
|
-
value.gsub(/:total/, @progress.total.to_s)
|
12
|
-
end
|
13
|
-
end # TotalFormatter
|
14
|
-
end # ProgressBar
|
15
|
-
end # TTY
|