tty-progressbar 0.1.0 → 0.2.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 +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 Version](https://badge.fury.io/rb/tty-progressbar.png)][gem]
|
3
3
|
[![Build Status](https://secure.travis-ci.org/peter-murach/tty-progressbar.png?branch=master)][travis]
|
4
4
|
[![Code Climate](https://codeclimate.com/github/peter-murach/tty-progressbar.png)][codeclimate]
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/peter-murach/tty-progressbar/badge.png)][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
|