tty-progressbar 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +24 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +1 -0
- data/README.md +95 -9
- data/examples/color.rb +17 -0
- data/examples/simple.rb +1 -1
- data/lib/tty/progressbar.rb +47 -15
- data/lib/tty/progressbar/current_formatter.rb +4 -1
- data/lib/tty/progressbar/elapsed_formatter.rb +3 -0
- data/lib/tty/progressbar/estimated_formatter.rb +22 -0
- data/lib/tty/progressbar/percent_formatter.rb +3 -0
- data/lib/tty/progressbar/version.rb +1 -1
- data/spec/spec_helper.rb +15 -0
- data/spec/unit/advance_spec.rb +23 -0
- data/spec/unit/complete_spec.rb +20 -0
- data/spec/unit/estimated_formatter_spec.rb +31 -0
- data/spec/unit/frequency_spec.rb +29 -0
- data/spec/unit/hide_cursor_spec.rb +31 -0
- data/spec/unit/log_spec.rb +33 -0
- data/spec/unit/pipeline_spec.rb +8 -0
- data/tty-progressbar.gemspec +1 -1
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 434eb41ca96e22fc08eec8d921a1e58926bcdc53
|
4
|
+
data.tar.gz: b7cc419624722fd02b25a6de8b2bb9ec781df647
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae0c2edda8fc6eac3577a1a4c74a55b3e5cd01759e13a5978786a5777c4ebb4292bb89daa62da7e2043932d352cdb1af28eef579f0f4eae8025a5c433e5bd16c
|
7
|
+
data.tar.gz: 9b3bf8f4bae6156ff201ea8f1382c6097d2ba033cd8378832081018efe0c57d90913a77c6053b423460bc961b9f071a4f217990a8441a51e354553d01a36fecd
|
data/.travis.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
language: ruby
|
2
|
+
bundler_args: --without yard benchmarks
|
3
|
+
script: "bundle exec rake ci"
|
4
|
+
rvm:
|
5
|
+
- 1.9.3
|
6
|
+
- 2.0.0
|
7
|
+
- 2.1.0
|
8
|
+
- ruby-head
|
9
|
+
matrix:
|
10
|
+
include:
|
11
|
+
- rvm: jruby-19mode
|
12
|
+
- rvm: jruby-20mode
|
13
|
+
- rvm: jruby-21mode
|
14
|
+
- rvm: jruby-head
|
15
|
+
- rvm: rbx-2
|
16
|
+
allow_failures:
|
17
|
+
- rvm: ruby-head
|
18
|
+
- rvm: jruby-head
|
19
|
+
- rvm: jruby-19mode
|
20
|
+
- rvm: jruby-20mode
|
21
|
+
- rvm: jruby-21mode
|
22
|
+
fast_finish: true
|
23
|
+
branches:
|
24
|
+
only: master
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
0.2.0 (November 9, 2014)
|
2
|
+
|
3
|
+
* Add estimated time formatter.
|
4
|
+
* Add frequency option to limit repainting of progress.
|
5
|
+
* Add log method for printing out during progress rendering.
|
6
|
+
* Add complete? for checking progress bar state
|
7
|
+
* Fix bug with hide_cursor option
|
8
|
+
* Increase test coverage
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
-
# TTY::
|
1
|
+
# TTY::ProgressBar
|
2
2
|
[][gem]
|
3
3
|
[][travis]
|
4
4
|
[][codeclimate]
|
5
|
+
[][coverage]
|
5
6
|
|
6
7
|
[gem]: http://badge.fury.io/rb/tty-progressbar
|
7
8
|
[travis]: http://travis-ci.org/peter-murach/tty-progressbar
|
8
9
|
[codeclimate]: https://codeclimate.com/github/peter-murach/tty-progressbar
|
10
|
+
[coverage]: https://coveralls.io/r/peter-murach/tty-progressbar
|
9
11
|
|
10
12
|
A flexible progress bars drawing in terminal emulators.
|
11
13
|
|
14
|
+
**TTY::ProgressBar** provides independent progress bars component for [TTY](https://github.com/peter-murach/tty) toolkit.
|
15
|
+
|
12
16
|
## Features
|
13
17
|
|
14
18
|
* Extremly flexible progress display formatting
|
@@ -35,11 +39,15 @@ Or install it yourself as:
|
|
35
39
|
|
36
40
|
* [1. Usage](#1-usage)
|
37
41
|
* [1.1 advance](#11-advance)
|
38
|
-
* [1.
|
42
|
+
* [1.2 finish](#12-finish)
|
43
|
+
* [1.3 complete?](#13-complete)
|
39
44
|
* [2. Configuration](#2-configuration)
|
45
|
+
* [2.1 Frequency](#21-frequency)
|
40
46
|
* [3. Formatting](#3-formatting)
|
41
47
|
* [3.1 Tokens](#31-tokens)
|
42
|
-
* [3.2 Custom
|
48
|
+
* [3.2 Custom Formatters](#31-custom-formatters)
|
49
|
+
* [4. Logging](#4-logging)
|
50
|
+
* [5. Examples](#5-examples)
|
43
51
|
|
44
52
|
## 1. Usage
|
45
53
|
|
@@ -53,7 +61,7 @@ bar = TTY::ProgressBar.new("downloading [:bar]", total: 30)
|
|
53
61
|
end
|
54
62
|
```
|
55
63
|
|
56
|
-
This would produce
|
64
|
+
This would produce animation in your terminal:
|
57
65
|
|
58
66
|
```ruby
|
59
67
|
downloading [======================= ]
|
@@ -67,14 +75,30 @@ Once you have **ProgressBar** instance, you can progress the display by calling
|
|
67
75
|
bar.advance(1000)
|
68
76
|
```
|
69
77
|
|
78
|
+
You can also pass negative steps if you wish to backtrack the progress:
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
bar.advance(-1)
|
82
|
+
```
|
83
|
+
|
84
|
+
Note: If a progress bar has already finished then negative steps will not set it back to desired value.
|
85
|
+
|
70
86
|
### 1.2 finish
|
71
87
|
|
72
|
-
In order to immediately stop and finish the
|
88
|
+
In order to immediately stop and finish the progress call `finish`. This will finish drawing the progress and return to new line.
|
73
89
|
|
74
90
|
```ruby
|
75
91
|
bar.finish
|
76
92
|
```
|
77
93
|
|
94
|
+
### 1.3 complete?
|
95
|
+
|
96
|
+
During progresion you can check if bar is finished or not by calling `complete?`.
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
bar.complete? # => false
|
100
|
+
```
|
101
|
+
|
78
102
|
## 2. Configuration
|
79
103
|
|
80
104
|
There are number of configuration options that can be provided:
|
@@ -84,9 +108,19 @@ There are number of configuration options that can be provided:
|
|
84
108
|
* `complete` completion character by default `=`
|
85
109
|
* `incomplete` incomplete character by default single space
|
86
110
|
* `output` the output stream defaulting to `stderr`
|
87
|
-
* `frequency` used to throttle the output, by default `
|
111
|
+
* `frequency` used to throttle the output, by default `0` (see [Frequency](#21-frequency))
|
88
112
|
* `hide_cursor` to hide display cursor defaulting to `false`
|
89
113
|
|
114
|
+
### 2.1 Frequency
|
115
|
+
|
116
|
+
Each time the `advance` is called it causes the progress bar to repaint. In cases when there is a huge number of updates per second, you may need to limit the rendering process by using the `frequency` option.
|
117
|
+
|
118
|
+
The `frequency` option accepts `integer` representing number of `Hz` units, for instance, frequency of 2 will mean that the progress will be updated maximum 2 times per second.
|
119
|
+
|
120
|
+
```ruby
|
121
|
+
TTY::ProgressBar.new("[:bar]", total: 30, frequency: 10) # 10 Hz
|
122
|
+
```
|
123
|
+
|
90
124
|
## 3. Formatting
|
91
125
|
|
92
126
|
Every **TTY::ProgressBar** instance requires a format string, which apart from regular characters accepts special tokens to display dynamic information. For instance, a format to measure download progress could be:
|
@@ -104,14 +138,15 @@ These are the tokens that are currently supported:
|
|
104
138
|
* `:total` the total progress number
|
105
139
|
* `:percent` the completion percentage
|
106
140
|
* `:elapsed` the elapsed time in seconds
|
141
|
+
* `:eta` the esitmated time to completion in seconds
|
107
142
|
|
108
|
-
### 3.2 Custom
|
143
|
+
### 3.2 Custom Formatters
|
109
144
|
|
110
|
-
If the provided tokens do not meet your needs, you can instrument formatting pipeline to use a
|
145
|
+
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.
|
111
146
|
|
112
147
|
For example, begin by creating custom formatter called `TimeFormatter` that will dynamicly update `:time` token in format string as follows:
|
113
148
|
|
114
|
-
```
|
149
|
+
```ruby
|
115
150
|
class TimeFormatter
|
116
151
|
def initialize(progress)
|
117
152
|
@progress = progress
|
@@ -144,6 +179,57 @@ Then add `TimeFormatter` to the pipeline like so:
|
|
144
179
|
bar.use TimeFormatter
|
145
180
|
```
|
146
181
|
|
182
|
+
## 4. Logging
|
183
|
+
|
184
|
+
If you want to print messages out to terminal along with the progress bar use the `log` method. The messages will appear above the progress bar and will continue scrolling up as more are logged out.
|
185
|
+
|
186
|
+
```ruby
|
187
|
+
bar.log('Piotrrrrr')
|
188
|
+
bar.advance
|
189
|
+
```
|
190
|
+
|
191
|
+
will result in:
|
192
|
+
|
193
|
+
```ruby
|
194
|
+
Piotrrrrr
|
195
|
+
downloading [======================= ]
|
196
|
+
```
|
197
|
+
|
198
|
+
## 5. Examples
|
199
|
+
|
200
|
+
This section demonstrates some of the possible uses for the **TTY::ProgressBar**, for more please see examples folder in the source directory.
|
201
|
+
|
202
|
+
### 5.1 Colors
|
203
|
+
|
204
|
+
Creating a progress bar that displays in color is as simple as coloring the `:complete` and `:incomplete` character options. In order to help with coloring you can use [pastel](https://github.com/peter-murach/pastel) library like so:
|
205
|
+
|
206
|
+
```ruby
|
207
|
+
require 'pastel'
|
208
|
+
|
209
|
+
pastel = Pastel.new
|
210
|
+
green = pastel.on_green(" ")
|
211
|
+
red = pastel.on_red(" ")
|
212
|
+
```
|
213
|
+
|
214
|
+
And then pass in the colored strings as options to **TTY::ProgressBar**:
|
215
|
+
|
216
|
+
```ruby
|
217
|
+
bar = TTY::ProgressBar.new("|:bar|",
|
218
|
+
total: 30,
|
219
|
+
complete: green,
|
220
|
+
incomplete: red
|
221
|
+
)
|
222
|
+
```
|
223
|
+
|
224
|
+
To see how a progress bar is reported in terminal you can do:
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
30.times do
|
228
|
+
sleep(0.1)
|
229
|
+
bar.advance
|
230
|
+
end
|
231
|
+
```
|
232
|
+
|
147
233
|
## Contributing
|
148
234
|
|
149
235
|
1. Fork it ( https://github.com/peter-murach/tty-progressbar/fork )
|
data/examples/color.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'tty-progressbar'
|
2
|
+
require 'pastel'
|
3
|
+
|
4
|
+
pastel = Pastel.new
|
5
|
+
green = pastel.on_green(" ")
|
6
|
+
red = pastel.on_red(" ")
|
7
|
+
|
8
|
+
bar = TTY::ProgressBar.new("|:bar|",
|
9
|
+
total: 30,
|
10
|
+
complete: green,
|
11
|
+
incomplete: red
|
12
|
+
)
|
13
|
+
|
14
|
+
30.times do
|
15
|
+
sleep(0.1)
|
16
|
+
bar.advance
|
17
|
+
end
|
data/examples/simple.rb
CHANGED
data/lib/tty/progressbar.rb
CHANGED
@@ -9,6 +9,7 @@ require 'tty/progressbar/pipeline'
|
|
9
9
|
require 'tty/progressbar/bar_formatter'
|
10
10
|
require 'tty/progressbar/current_formatter'
|
11
11
|
require 'tty/progressbar/elapsed_formatter'
|
12
|
+
require 'tty/progressbar/estimated_formatter'
|
12
13
|
require 'tty/progressbar/percent_formatter'
|
13
14
|
require 'tty/progressbar/total_formatter'
|
14
15
|
|
@@ -45,6 +46,8 @@ module TTY
|
|
45
46
|
|
46
47
|
attr_reader :hide_cursor
|
47
48
|
|
49
|
+
attr_reader :output
|
50
|
+
|
48
51
|
def_delegator :@pipeline, :use
|
49
52
|
|
50
53
|
# Create progress bar
|
@@ -89,6 +92,7 @@ module TTY
|
|
89
92
|
@last_render_time = Time.now
|
90
93
|
@last_render_width = 0
|
91
94
|
@done = false
|
95
|
+
@start_at = Time.now
|
92
96
|
@pipeline = TTY::ProgressBar::Pipeline.new
|
93
97
|
|
94
98
|
default_pipeline
|
@@ -138,21 +142,14 @@ module TTY
|
|
138
142
|
# @api private
|
139
143
|
def render
|
140
144
|
return if @done
|
141
|
-
|
142
|
-
|
143
|
-
if @hide_cursor && @last_render_time == 0
|
144
|
-
write(ECMA_CSI + DEC_RST + DEC_TCEM)
|
145
|
+
if @hide_cursor && @last_render_width == 0 && !(@current >= total)
|
146
|
+
write(ECMA_CSI + DEC_TCEM + DEC_RST)
|
145
147
|
end
|
146
148
|
|
147
|
-
# Setup formatting values
|
148
|
-
percent = width == 0 ? 100 : (ratio * 100).to_i
|
149
|
-
elapsed = (now - @start_at) * 1000.0
|
150
|
-
estimated = (percent == 100) ? 0 : elapsed * (total / @current - 1)
|
151
|
-
|
152
149
|
formatted = @pipeline.decorate(self, @format)
|
153
150
|
write(formatted, true)
|
154
151
|
|
155
|
-
@last_render_time
|
152
|
+
@last_render_time = Time.now
|
156
153
|
@last_render_width = formatted.length
|
157
154
|
end
|
158
155
|
|
@@ -189,7 +186,9 @@ module TTY
|
|
189
186
|
# @api public
|
190
187
|
def finish
|
191
188
|
# reenable cursor if it is turned off
|
192
|
-
|
189
|
+
if @hide_cursor && @last_render_width != 0
|
190
|
+
write(ECMA_CSI + DEC_TCEM + DEC_SET, false)
|
191
|
+
end
|
193
192
|
return if @done
|
194
193
|
@current = @width if @no_width
|
195
194
|
render
|
@@ -197,15 +196,47 @@ module TTY
|
|
197
196
|
@done = true
|
198
197
|
end
|
199
198
|
|
200
|
-
#
|
199
|
+
# Check if progress is finised
|
200
|
+
#
|
201
|
+
# @return [Boolean]
|
202
|
+
# true when progress finished, false otherwise
|
201
203
|
#
|
202
204
|
# @api public
|
203
|
-
def
|
204
|
-
@done
|
205
|
+
def complete?
|
206
|
+
@done
|
207
|
+
end
|
208
|
+
|
209
|
+
# Log message above the current progress bar
|
210
|
+
#
|
211
|
+
# @param [String] message
|
212
|
+
# the message to log out
|
213
|
+
#
|
214
|
+
# @api public
|
215
|
+
def log(message)
|
216
|
+
sanitized_message = message.gsub(/\r|\n/, ' ')
|
217
|
+
if @done
|
218
|
+
write(sanitized_message + "\n", false)
|
219
|
+
return
|
220
|
+
end
|
221
|
+
sanitized_message = padout(sanitized_message)
|
222
|
+
|
223
|
+
write(sanitized_message + "\n", true)
|
224
|
+
render
|
205
225
|
end
|
206
226
|
|
207
227
|
private
|
208
228
|
|
229
|
+
# Pad message out with spaces
|
230
|
+
#
|
231
|
+
# @api private
|
232
|
+
def padout(message)
|
233
|
+
if @last_render_width > message.length
|
234
|
+
remaining_width = @last_render_width - message.length
|
235
|
+
message += ' ' * remaining_width
|
236
|
+
end
|
237
|
+
message
|
238
|
+
end
|
239
|
+
|
209
240
|
# Prepare default pipeline formatters
|
210
241
|
#
|
211
242
|
# @api private
|
@@ -213,6 +244,7 @@ module TTY
|
|
213
244
|
@pipeline.use TTY::ProgressBar::CurrentFormatter
|
214
245
|
@pipeline.use TTY::ProgressBar::TotalFormatter
|
215
246
|
@pipeline.use TTY::ProgressBar::ElapsedFormatter
|
247
|
+
@pipeline.use TTY::ProgressBar::EstimatedFormatter
|
216
248
|
@pipeline.use TTY::ProgressBar::PercentFormatter
|
217
249
|
@pipeline.use TTY::ProgressBar::BarFormatter
|
218
250
|
end
|
@@ -224,7 +256,7 @@ module TTY
|
|
224
256
|
callback = proc { send(:resize, max_columns) }
|
225
257
|
Signal.trap('SIGWINCH', &callback)
|
226
258
|
|
227
|
-
Signal.trap('KILL') { @
|
259
|
+
Signal.trap('KILL') { @finish }
|
228
260
|
end
|
229
261
|
end # ProgressBar
|
230
262
|
end # TTY
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class ProgressBar
|
5
|
+
# Used by {Pipeline} to format :eta token
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
class EstimatedFormatter
|
9
|
+
def initialize(progress)
|
10
|
+
@progress = progress
|
11
|
+
@converter = TTY::ProgressBar::Converter.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def format(value)
|
15
|
+
elapsed = Time.now - @progress.start_at
|
16
|
+
estimated = (elapsed / @progress.ratio).to_f - elapsed
|
17
|
+
estimated = (estimated.infinite? || estimated < 0) ? 0.0 : estimated
|
18
|
+
value.gsub(/:eta/, @converter.to_time(estimated))
|
19
|
+
end
|
20
|
+
end # ElapsedFormatter
|
21
|
+
end # ProgressBar
|
22
|
+
end # TTY
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
if RUBY_VERSION > '1.9' and (ENV['COVERAGE'] || ENV['TRAVIS'])
|
4
|
+
require 'simplecov'
|
5
|
+
require 'coveralls'
|
6
|
+
|
7
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
8
|
+
SimpleCov::Formatter::HTMLFormatter,
|
9
|
+
Coveralls::SimpleCov::Formatter
|
10
|
+
]
|
11
|
+
|
12
|
+
SimpleCov.start do
|
13
|
+
command_name 'spec'
|
14
|
+
add_filter 'spec'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
3
18
|
require 'timecop'
|
4
19
|
require 'tty-progressbar'
|
5
20
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar, '.advance' do
|
6
|
+
let(:output) { StringIO.new('', 'w+') }
|
7
|
+
|
8
|
+
it "allows to go back" do
|
9
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
|
10
|
+
5.times { progress.advance(1) }
|
11
|
+
expect(progress.current).to eq(5)
|
12
|
+
5.times { progress.advance(-1) }
|
13
|
+
expect(progress.current).to eq(0)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "cannot backtrack on finished" do
|
17
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
|
18
|
+
10.times { progress.advance(1) }
|
19
|
+
expect(progress.current).to eq(10)
|
20
|
+
5.times { progress.advance(-1) }
|
21
|
+
expect(progress.current).to eq(10)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar, '.complete?' do
|
6
|
+
let(:output) { StringIO.new('', 'w+') }
|
7
|
+
|
8
|
+
it "checks for completness" do
|
9
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 3)
|
10
|
+
completes = []
|
11
|
+
3.times do
|
12
|
+
completes << progress.complete?
|
13
|
+
progress.advance
|
14
|
+
end
|
15
|
+
completes << progress.complete?
|
16
|
+
expect(completes).to eq([
|
17
|
+
false, false, false, true
|
18
|
+
])
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
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
|
+
before { Timecop.safe_mode = false }
|
9
|
+
|
10
|
+
it "displays elapsed time" do
|
11
|
+
time_now = Time.local(2014, 10, 5, 12, 0, 0)
|
12
|
+
Timecop.freeze(time_now)
|
13
|
+
progress = TTY::ProgressBar.new(":eta", output: output, total: 5)
|
14
|
+
|
15
|
+
5.times do |sec|
|
16
|
+
time_now = Time.local(2014, 10, 5, 12, 0, sec)
|
17
|
+
Timecop.freeze(time_now)
|
18
|
+
progress.advance
|
19
|
+
end
|
20
|
+
|
21
|
+
output.rewind
|
22
|
+
expect(output.read).to eq([
|
23
|
+
"\e[1G 0s",
|
24
|
+
"\e[1G 1s",
|
25
|
+
"\e[1G 1s",
|
26
|
+
"\e[1G 0s",
|
27
|
+
"\e[1G 0s\n"
|
28
|
+
].join)
|
29
|
+
Timecop.return
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe TTY::ProgressBar, 'frequency' do
|
4
|
+
let(:output) { StringIO.new('', 'w+') }
|
5
|
+
|
6
|
+
before { Timecop.safe_mode = false }
|
7
|
+
|
8
|
+
it "limits frequency to 500Hz, permiting every second one" do
|
9
|
+
time_now = Time.local(2014, 10, 5, 12, 0, 0, 0)
|
10
|
+
Timecop.freeze(time_now)
|
11
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10, frequency: 500)
|
12
|
+
|
13
|
+
10.times do |sec|
|
14
|
+
time_now = Time.local(2014, 10, 5, 12, 0, 0, sec * 1000)
|
15
|
+
Timecop.freeze(time_now)
|
16
|
+
progress.advance
|
17
|
+
end
|
18
|
+
|
19
|
+
output.rewind
|
20
|
+
expect(output.read).to eq([
|
21
|
+
"\e[1G[=== ]",
|
22
|
+
"\e[1G[===== ]",
|
23
|
+
"\e[1G[======= ]",
|
24
|
+
"\e[1G[========= ]",
|
25
|
+
"\e[1G[==========]\n"
|
26
|
+
].join)
|
27
|
+
Timecop.return
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar, 'hide_cursor' do
|
6
|
+
let(:output) { StringIO.new('', 'w+') }
|
7
|
+
|
8
|
+
it "hides cursor" do
|
9
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output,
|
10
|
+
total: 5, hide_cursor: true)
|
11
|
+
5.times { progress.advance }
|
12
|
+
output.rewind
|
13
|
+
expect(output.read).to eq([
|
14
|
+
"\e[?25l\e[1G[= ]",
|
15
|
+
"\e[1G[== ]",
|
16
|
+
"\e[1G[=== ]",
|
17
|
+
"\e[1G[==== ]",
|
18
|
+
"\e[?25h\e[1G[=====]\n"
|
19
|
+
].join)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "reenables cursor on finish" do
|
23
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output,
|
24
|
+
total: 5, hide_cursor: true)
|
25
|
+
|
26
|
+
progress.advance(6)
|
27
|
+
expect(progress.complete?).to eq(true)
|
28
|
+
output.rewind
|
29
|
+
expect(output.read).to eq("\e[1G[=====]\n")
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe TTY::ProgressBar, '.log' do
|
6
|
+
let(:output) { StringIO.new('', 'w+') }
|
7
|
+
|
8
|
+
it "logs message" do
|
9
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
|
10
|
+
2.times {
|
11
|
+
progress.log 'foo bar'
|
12
|
+
progress.advance
|
13
|
+
}
|
14
|
+
output.rewind
|
15
|
+
expect(output.read).to eq([
|
16
|
+
"\e[1Gfoo bar\n",
|
17
|
+
"\e[1G[ ]",
|
18
|
+
"\e[1G[= ]",
|
19
|
+
"\e[1Gfoo bar \n",
|
20
|
+
"\e[1G[= ]",
|
21
|
+
"\e[1G[== ]",
|
22
|
+
].join)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "logs message under when complete" do
|
26
|
+
progress = TTY::ProgressBar.new("[:bar]", output: output, total: 10)
|
27
|
+
progress.advance(10)
|
28
|
+
expect(progress.complete?).to eq(true)
|
29
|
+
progress.log 'foo bar'
|
30
|
+
output.rewind
|
31
|
+
expect(output.read).to eq("\e[1G[==========]\nfoo bar\n")
|
32
|
+
end
|
33
|
+
end
|
data/spec/unit/pipeline_spec.rb
CHANGED
@@ -12,4 +12,12 @@ RSpec.describe TTY::ProgressBar::Pipeline, '.decorate' do
|
|
12
12
|
tokenized = "[:current/:total]"
|
13
13
|
expect(pipeline.decorate(progress_bar, tokenized)).to eq("[3/10]")
|
14
14
|
end
|
15
|
+
|
16
|
+
it "enumerates pipeline formatters" do
|
17
|
+
pipeline.use TTY::ProgressBar::CurrentFormatter
|
18
|
+
pipeline.use TTY::ProgressBar::TotalFormatter
|
19
|
+
yielded = []
|
20
|
+
pipeline.each { |formatter| yielded << formatter }
|
21
|
+
expect(yielded.size).to eq(2)
|
22
|
+
end
|
15
23
|
end
|
data/tty-progressbar.gemspec
CHANGED
@@ -18,6 +18,6 @@ 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.add_development_dependency "bundler", "~> 1.
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
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.
|
4
|
+
version: 0.2.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-
|
11
|
+
date: 2014-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.6'
|
20
20
|
type: :development
|
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: '1.
|
26
|
+
version: '1.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -48,10 +48,13 @@ files:
|
|
48
48
|
- .gitignore
|
49
49
|
- .rspec
|
50
50
|
- .ruby-version
|
51
|
+
- .travis.yml
|
52
|
+
- CHANGELOG.md
|
51
53
|
- Gemfile
|
52
54
|
- LICENSE.txt
|
53
55
|
- README.md
|
54
56
|
- Rakefile
|
57
|
+
- examples/color.rb
|
55
58
|
- examples/simple.rb
|
56
59
|
- lib/tty-progressbar.rb
|
57
60
|
- lib/tty/progressbar.rb
|
@@ -59,16 +62,23 @@ files:
|
|
59
62
|
- lib/tty/progressbar/converter.rb
|
60
63
|
- lib/tty/progressbar/current_formatter.rb
|
61
64
|
- lib/tty/progressbar/elapsed_formatter.rb
|
65
|
+
- lib/tty/progressbar/estimated_formatter.rb
|
62
66
|
- lib/tty/progressbar/percent_formatter.rb
|
63
67
|
- lib/tty/progressbar/pipeline.rb
|
64
68
|
- lib/tty/progressbar/total_formatter.rb
|
65
69
|
- lib/tty/progressbar/version.rb
|
66
70
|
- spec/spec_helper.rb
|
71
|
+
- spec/unit/advance_spec.rb
|
67
72
|
- spec/unit/bar_formatter_spec.rb
|
73
|
+
- spec/unit/complete_spec.rb
|
68
74
|
- spec/unit/converter_spec.rb
|
69
75
|
- spec/unit/current_formatter_spec.rb
|
70
76
|
- spec/unit/custom_formatter_spec.rb
|
71
77
|
- spec/unit/elapsed_formatter_spec.rb
|
78
|
+
- spec/unit/estimated_formatter_spec.rb
|
79
|
+
- spec/unit/frequency_spec.rb
|
80
|
+
- spec/unit/hide_cursor_spec.rb
|
81
|
+
- spec/unit/log_spec.rb
|
72
82
|
- spec/unit/new_spec.rb
|
73
83
|
- spec/unit/percent_formatter_spec.rb
|
74
84
|
- spec/unit/pipeline_spec.rb
|
@@ -102,11 +112,17 @@ specification_version: 4
|
|
102
112
|
summary: A flexible progress bars drawing in terminal emulators.
|
103
113
|
test_files:
|
104
114
|
- spec/spec_helper.rb
|
115
|
+
- spec/unit/advance_spec.rb
|
105
116
|
- spec/unit/bar_formatter_spec.rb
|
117
|
+
- spec/unit/complete_spec.rb
|
106
118
|
- spec/unit/converter_spec.rb
|
107
119
|
- spec/unit/current_formatter_spec.rb
|
108
120
|
- spec/unit/custom_formatter_spec.rb
|
109
121
|
- spec/unit/elapsed_formatter_spec.rb
|
122
|
+
- spec/unit/estimated_formatter_spec.rb
|
123
|
+
- spec/unit/frequency_spec.rb
|
124
|
+
- spec/unit/hide_cursor_spec.rb
|
125
|
+
- spec/unit/log_spec.rb
|
110
126
|
- spec/unit/new_spec.rb
|
111
127
|
- spec/unit/percent_formatter_spec.rb
|
112
128
|
- spec/unit/pipeline_spec.rb
|