tty-progressbar 0.13.0 → 0.14.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 +3 -3
- data/CHANGELOG.md +10 -0
- data/Gemfile +2 -3
- data/README.md +54 -13
- data/examples/color.rb +2 -3
- data/examples/failure.rb +1 -3
- data/examples/iterator.rb +2 -4
- data/examples/lazy.rb +6 -0
- data/examples/multi/main_bar.rb +1 -3
- data/examples/multi/simple.rb +1 -3
- data/examples/simple.rb +1 -3
- data/examples/slow_process.rb +29 -0
- data/examples/speed.rb +1 -3
- data/examples/threaded.rb +1 -3
- data/examples/tokens.rb +1 -3
- data/lib/tty/progressbar.rb +27 -4
- data/lib/tty/progressbar/version.rb +1 -1
- data/spec/spec_helper.rb +6 -0
- data/spec/unit/iterate_spec.rb +34 -1
- data/tty-progressbar.gemspec +2 -1
- metadata +20 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9e021f67756883c39075abe088ad0861ef85582
|
4
|
+
data.tar.gz: 08b1cd0a9925899b0a7c6ace9dddeef1a1545953
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7719a9ffa8814c51e301dd5e441a4516e87230ee7f66780ba40c3b29556bdd086f5dc18b6ee024b2b54b1344bb52996c51048837bafffcc560164c4b44165f0e
|
7
|
+
data.tar.gz: 98974cccbbad3174dcbf24dfd66957db87aca29f79ba94f4f287c6fff789251130a042c6e2ed8ae9831ea1be95380f433c3b14093a9ae01b282d4a4331f0ef97
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.14.0] - 2017-01-17
|
4
|
+
|
5
|
+
### Changed
|
6
|
+
* Change to only output to a console and stop output to a file, pipe etc...
|
7
|
+
* Change #iterate to accept enumerators as collection type by Victor Shepelev(@zverok)
|
8
|
+
|
9
|
+
### Fixed
|
10
|
+
* Fix #iterate to take into account progress value in total steps calculation
|
11
|
+
|
3
12
|
## [v0.13.0] - 2017-10-29
|
4
13
|
|
5
14
|
### Changed
|
@@ -151,6 +160,7 @@
|
|
151
160
|
|
152
161
|
* Initial implementation and release
|
153
162
|
|
163
|
+
[v0.14.0]: https://github.com/peter-murach/tty-progressbar/compare/v0.13.0...v0.14.0
|
154
164
|
[v0.13.0]: https://github.com/peter-murach/tty-progressbar/compare/v0.12.2...v0.13.0
|
155
165
|
[v0.12.2]: https://github.com/peter-murach/tty-progressbar/compare/v0.12.1...v0.12.2
|
156
166
|
[v0.12.1]: https://github.com/peter-murach/tty-progressbar/compare/v0.12.0...v0.12.1
|
data/Gemfile
CHANGED
@@ -3,13 +3,12 @@ source 'https://rubygems.org'
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
group :test do
|
6
|
-
gem '
|
7
|
-
gem 'pastel', '~> 0.7.0'
|
6
|
+
gem 'pastel', '~> 0.7.2'
|
8
7
|
gem 'coveralls', '~> 0.8.13'
|
9
8
|
gem 'simplecov', '~> 0.11.2'
|
10
9
|
end
|
11
10
|
|
12
11
|
group :metrics do
|
13
|
-
gem 'yard', '~> 0.
|
12
|
+
gem 'yard', '~> 0.9.12'
|
14
13
|
gem 'yardstick', '~> 0.9.9'
|
15
14
|
end
|
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# TTY::ProgressBar [][gitter]
|
2
|
+
|
2
3
|
[][gem]
|
3
4
|
[][travis]
|
4
5
|
[][appveyor]
|
5
|
-
[][codeclimate]
|
6
7
|
[][coverage]
|
7
8
|
[][inchpages]
|
8
9
|
|
@@ -10,7 +11,7 @@
|
|
10
11
|
[gem]: http://badge.fury.io/rb/tty-progressbar
|
11
12
|
[travis]: http://travis-ci.org/piotrmurach/tty-progressbar
|
12
13
|
[appveyor]: https://ci.appveyor.com/project/piotrmurach/tty-progressbar
|
13
|
-
[codeclimate]: https://codeclimate.com/github/piotrmurach/tty-progressbar
|
14
|
+
[codeclimate]: https://codeclimate.com/github/piotrmurach/tty-progressbar/maintainability
|
14
15
|
[coverage]: https://coveralls.io/github/piotrmurach/tty-progressbar
|
15
16
|
[inchpages]: http://inch-ci.org/github/piotrmurach/tty-progressbar
|
16
17
|
|
@@ -62,8 +63,9 @@ Or install it yourself as:
|
|
62
63
|
* [2.13 on](#213-on)
|
63
64
|
* [3. Configuration](#3-configuration)
|
64
65
|
* [3.1 :head](#31-head)
|
65
|
-
* [3.2 :
|
66
|
-
* [3.3 :
|
66
|
+
* [3.2 :output](#32-output)
|
67
|
+
* [3.3 :frequency](#33-frequency)
|
68
|
+
* [3.4 :interval](#34-interval)
|
67
69
|
* [4. Formatting](#4-formatting)
|
68
70
|
* [4.1 Tokens](#41-tokens)
|
69
71
|
* [4.2 Custom Formatters](#42-custom-formatters)
|
@@ -150,7 +152,7 @@ To simplify progressing over an enumerable you can use `iterate` which as a firs
|
|
150
152
|
First, create a progress bar without a total which will be dynamically handled for you:
|
151
153
|
|
152
154
|
```ruby
|
153
|
-
bar = TTY::ProgressBar.new
|
155
|
+
bar = TTY::ProgressBar.new("[:bar]")
|
154
156
|
```
|
155
157
|
|
156
158
|
Then, either directly iterate over a collection by yielding values to a block:
|
@@ -159,7 +161,7 @@ Then, either directly iterate over a collection by yielding values to a block:
|
|
159
161
|
bar.iterate(30.times) { |v| ... }
|
160
162
|
```
|
161
163
|
|
162
|
-
or return an
|
164
|
+
or return an `Enumerator`:
|
163
165
|
|
164
166
|
```ruby
|
165
167
|
progress = bar.iterate(30.times)
|
@@ -172,6 +174,33 @@ By default, progress bar is advanced by `1` but you can change it by passing sec
|
|
172
174
|
bar.iterate(30.times, 5)
|
173
175
|
```
|
174
176
|
|
177
|
+
One particularly useful application of `iterate` are Ruby infamous [lazy enumerators](http://ruby-doc.org/core-2.5.0/Enumerator/Lazy.html), or slowly advancing enumerations, representing complex processes.
|
178
|
+
|
179
|
+
For example, an `Enumerator` that downloads content from a remote server chunk at a time:
|
180
|
+
|
181
|
+
```ruby
|
182
|
+
downloader = Enumerator.new do |y|
|
183
|
+
start = 0
|
184
|
+
loop do
|
185
|
+
yield(download_from_server(start, CHUNK_SIZE))
|
186
|
+
raise StopIteration if download_finished?
|
187
|
+
start += CHUNK_SIZE
|
188
|
+
end
|
189
|
+
end
|
190
|
+
```
|
191
|
+
|
192
|
+
would be used with progress bar with the total size matching the content size like so:
|
193
|
+
|
194
|
+
```ruby
|
195
|
+
bar = TTY::ProgressBar.new("[:bar]", total: content_size)
|
196
|
+
# you need to provide the total for the iterate to avoid calling enumerator.count
|
197
|
+
response = bar.iterate(downloader, CHUNK_SIZE).to_a.join
|
198
|
+
```
|
199
|
+
|
200
|
+
This would result in progress bar advancing after each chunk up until all content has been downloaded, returning the result of the download in `response` variable.
|
201
|
+
|
202
|
+
Please run [slow_process example](examples/slow_process.rb) to see this in action.
|
203
|
+
|
175
204
|
### 2.3 current=
|
176
205
|
|
177
206
|
**TTY::ProgressBar** allows you to set progress to a given value by calling `current=` method.
|
@@ -299,10 +328,10 @@ There are number of configuration options that can be provided:
|
|
299
328
|
* `:width` of the bars display in terminal columns excluding formatting options. Defaults to total steps
|
300
329
|
* `:complete` completion character by default `=`
|
301
330
|
* `:incomplete` incomplete character by default single space
|
302
|
-
* [:head](#
|
303
|
-
*
|
304
|
-
* [:frequency](#
|
305
|
-
* [:interval](#
|
331
|
+
* [:head](#31-head) the head character by default `=`
|
332
|
+
* [:output](#32-output) the output stream defaulting to `stderr`
|
333
|
+
* [:frequency](#33-frequency) used to throttle the output, by default `0`
|
334
|
+
* [:interval](#34-interval) used to measure the speed, by default `1 sec`
|
306
335
|
* `:hide_cursor` to hide display cursor defaulting to `false`
|
307
336
|
* `:clear` to clear the finished bar defaulting to `false`
|
308
337
|
|
@@ -326,7 +355,19 @@ bar = TTY::ProressBar.new("[:bar]", head: '>')
|
|
326
355
|
# [=======> ]
|
327
356
|
```
|
328
357
|
|
329
|
-
### 3.2 :
|
358
|
+
### 3.2 :output
|
359
|
+
|
360
|
+
The progress bar only outputs to a console and when output is redirected to a file or a pipe it does nothing. This is so, for example, your error logs do not overflow with progress bars output.
|
361
|
+
|
362
|
+
You can change where console output is streamed with `:output` option:
|
363
|
+
|
364
|
+
```ruby
|
365
|
+
bar = TTY::ProgressBar.new(output: $stdout)
|
366
|
+
```
|
367
|
+
|
368
|
+
The output stream defaults to `stderr`.
|
369
|
+
|
370
|
+
### 3.3 :frequency
|
330
371
|
|
331
372
|
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.
|
332
373
|
|
@@ -336,7 +377,7 @@ The `frequency` option accepts `integer` representing number of `Hz` units, for
|
|
336
377
|
TTY::ProgressBar.new("[:bar]", total: 30, frequency: 10) # 10 Hz
|
337
378
|
```
|
338
379
|
|
339
|
-
### 3.
|
380
|
+
### 3.4 :interval
|
340
381
|
|
341
382
|
For every call of `advance` method the **ProgressBar** takes a sample for speed measurement. By default the samples are grouped per second but you can change that by passing the `interval` option.
|
342
383
|
|
@@ -633,4 +674,4 @@ This project is intended to be a safe, welcoming space for collaboration, and co
|
|
633
674
|
|
634
675
|
## Copyright
|
635
676
|
|
636
|
-
Copyright (c) 2014-
|
677
|
+
Copyright (c) 2014-2018 Piotr Murach. See LICENSE for further details.
|
data/examples/color.rb
CHANGED
data/examples/failure.rb
CHANGED
data/examples/iterator.rb
CHANGED
data/examples/lazy.rb
ADDED
data/examples/multi/main_bar.rb
CHANGED
data/examples/multi/simple.rb
CHANGED
data/examples/simple.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative '../lib/tty-progressbar'
|
2
|
+
|
3
|
+
CONTENT_SIZE = 2048
|
4
|
+
CHUNK_SIZE = 255
|
5
|
+
|
6
|
+
# Dummy "long responding server"
|
7
|
+
def download_from_server(offset, limit)
|
8
|
+
sleep(0.1)
|
9
|
+
"<chunk #{offset}..#{offset + limit}>"
|
10
|
+
end
|
11
|
+
|
12
|
+
def download_finished?(position)
|
13
|
+
position >= CONTENT_SIZE
|
14
|
+
end
|
15
|
+
|
16
|
+
downloader = Enumerator.new do |y|
|
17
|
+
start = 0
|
18
|
+
loop do
|
19
|
+
y.yield(download_from_server(start, CHUNK_SIZE))
|
20
|
+
start += CHUNK_SIZE
|
21
|
+
raise StopIteration if download_finished?(start)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
bar = TTY::ProgressBar.new("[:bar] :current_byte/:total_byte", total: CONTENT_SIZE)
|
26
|
+
|
27
|
+
response = bar.iterate(downloader, CHUNK_SIZE).to_a.join
|
28
|
+
|
29
|
+
puts response
|
data/examples/speed.rb
CHANGED
data/examples/threaded.rb
CHANGED
data/examples/tokens.rb
CHANGED
data/lib/tty/progressbar.rb
CHANGED
@@ -155,7 +155,19 @@ module TTY
|
|
155
155
|
end
|
156
156
|
|
157
157
|
# Iterate over collection either yielding computation to block
|
158
|
-
# or provided Enumerator.
|
158
|
+
# or provided Enumerator. If the bar's `total` was not set,
|
159
|
+
# it would be taken from `collection.count`, otherwise previously
|
160
|
+
# set `total` would be used. This allows using the progressbar
|
161
|
+
# with infinite, lazy, or slowly-calculated enumerators.
|
162
|
+
#
|
163
|
+
# @note
|
164
|
+
# If `total` is set, iteration will NOT stop after this number of
|
165
|
+
# iterations, only when provided Enumerable is finished. It may
|
166
|
+
# be convenient in "unsure number of iterations" situations
|
167
|
+
# (like downloading in chunks, when server may eventually send
|
168
|
+
# more chunks than predicted), but be careful to not pass infinite
|
169
|
+
# enumerators without previosly doing `.take(some_finite_number)`
|
170
|
+
# on them.
|
159
171
|
#
|
160
172
|
# @example
|
161
173
|
# bar.iterate(30.times) { ... }
|
@@ -170,14 +182,14 @@ module TTY
|
|
170
182
|
#
|
171
183
|
# @api public
|
172
184
|
def iterate(collection, progress = 1, &block)
|
173
|
-
update(total: collection.count)
|
174
|
-
|
185
|
+
update(total: collection.count * progress) unless total
|
186
|
+
progress_enum = Enumerator.new do |iter|
|
175
187
|
collection.each do |elem|
|
176
188
|
advance(progress)
|
177
189
|
iter.yield(elem)
|
178
190
|
end
|
179
191
|
end
|
180
|
-
block_given? ?
|
192
|
+
block_given? ? progress_enum.each(&block) : progress_enum
|
181
193
|
end
|
182
194
|
|
183
195
|
# Update configuration options for this bar
|
@@ -279,6 +291,8 @@ module TTY
|
|
279
291
|
#
|
280
292
|
# @api private
|
281
293
|
def write(data, clear_first = false)
|
294
|
+
return unless tty? # write only to terminal
|
295
|
+
|
282
296
|
move_to_row do
|
283
297
|
output.print(TTY::Cursor.column(1)) if clear_first
|
284
298
|
characters_in = @multibar.line_inset(self) if @multibar
|
@@ -465,5 +479,14 @@ module TTY
|
|
465
479
|
callback.call(*args)
|
466
480
|
end
|
467
481
|
end
|
482
|
+
|
483
|
+
# Check if IO is attached to a terminal
|
484
|
+
#
|
485
|
+
# return [Boolean]
|
486
|
+
#
|
487
|
+
# @api public
|
488
|
+
def tty?
|
489
|
+
output.respond_to?(:tty?) && output.tty?
|
490
|
+
end
|
468
491
|
end # ProgressBar
|
469
492
|
end # TTY
|
data/spec/spec_helper.rb
CHANGED
@@ -16,6 +16,12 @@ end
|
|
16
16
|
require 'timecop'
|
17
17
|
require 'tty-progressbar'
|
18
18
|
|
19
|
+
class StringIO
|
20
|
+
def tty?
|
21
|
+
true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
19
25
|
RSpec.configure do |config|
|
20
26
|
config.expect_with :rspec do |expectations|
|
21
27
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
data/spec/unit/iterate_spec.rb
CHANGED
@@ -20,7 +20,8 @@ RSpec.describe TTY::ProgressBar, '#iterate' do
|
|
20
20
|
|
21
21
|
it "iterates over a collection with a step" do
|
22
22
|
bar = TTY::ProgressBar.new("[:bar]", output: output)
|
23
|
-
|
23
|
+
values = []
|
24
|
+
bar.iterate(4.times, 5) { |val| values << val }
|
24
25
|
|
25
26
|
expect(bar.complete?).to eq(true)
|
26
27
|
output.rewind
|
@@ -30,6 +31,7 @@ RSpec.describe TTY::ProgressBar, '#iterate' do
|
|
30
31
|
"\e[1G[=============== ]",
|
31
32
|
"\e[1G[====================]\n"
|
32
33
|
].join)
|
34
|
+
expect(values).to eq([0, 1, 2, 3])
|
33
35
|
end
|
34
36
|
|
35
37
|
it "iterates over a collection and returns enumerable" do
|
@@ -43,4 +45,35 @@ RSpec.describe TTY::ProgressBar, '#iterate' do
|
|
43
45
|
|
44
46
|
expect(values).to eq([0,1,2,3,4])
|
45
47
|
end
|
48
|
+
|
49
|
+
it "does not uses collection's count if total is provided" do
|
50
|
+
bar = TTY::ProgressBar.new("[:bar]", output: output, total: 5)
|
51
|
+
iterable = 5.times
|
52
|
+
expect(iterable).not_to receive(:count)
|
53
|
+
progress = bar.iterate(iterable)
|
54
|
+
values = []
|
55
|
+
|
56
|
+
progress.each { |v| values << v }
|
57
|
+
|
58
|
+
expect(values).to eq([0,1,2,3,4])
|
59
|
+
end
|
60
|
+
|
61
|
+
it "iterates over an infinite enumerator and renders bar correctly" do
|
62
|
+
bar = TTY::ProgressBar.new("[:bar]", output: output, total: 5)
|
63
|
+
infinite_iter = (1..Float::INFINITY).lazy
|
64
|
+
|
65
|
+
progress = bar.iterate(infinite_iter)
|
66
|
+
|
67
|
+
10.times { progress.next }
|
68
|
+
|
69
|
+
expect(bar.complete?).to eq(true)
|
70
|
+
output.rewind
|
71
|
+
expect(output.read).to eq([
|
72
|
+
"\e[1G[= ]",
|
73
|
+
"\e[1G[== ]",
|
74
|
+
"\e[1G[=== ]",
|
75
|
+
"\e[1G[==== ]",
|
76
|
+
"\e[1G[=====]\n"
|
77
|
+
].join)
|
78
|
+
end
|
46
79
|
end
|
data/tty-progressbar.gemspec
CHANGED
@@ -21,9 +21,10 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.required_ruby_version = '>= 2.0.0'
|
22
22
|
|
23
23
|
spec.add_dependency "tty-cursor", '~> 0.5.0'
|
24
|
-
spec.add_dependency "tty-screen", '~> 0.6.
|
24
|
+
spec.add_dependency "tty-screen", '~> 0.6.4'
|
25
25
|
|
26
26
|
spec.add_development_dependency 'bundler', '>= 1.5.0', '< 2.0'
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
28
|
+
spec.add_development_dependency 'timecop', '~> 0.9.1'
|
28
29
|
spec.add_development_dependency 'rake'
|
29
30
|
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.14.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:
|
11
|
+
date: 2018-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tty-cursor
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.6.
|
33
|
+
version: 0.6.4
|
34
34
|
type: :runtime
|
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: 0.6.
|
40
|
+
version: 0.6.4
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +72,20 @@ dependencies:
|
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '3.1'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: timecop
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.9.1
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.9.1
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
90
|
name: rake
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,9 +121,11 @@ files:
|
|
107
121
|
- examples/color.rb
|
108
122
|
- examples/failure.rb
|
109
123
|
- examples/iterator.rb
|
124
|
+
- examples/lazy.rb
|
110
125
|
- examples/multi/main_bar.rb
|
111
126
|
- examples/multi/simple.rb
|
112
127
|
- examples/simple.rb
|
128
|
+
- examples/slow_process.rb
|
113
129
|
- examples/speed.rb
|
114
130
|
- examples/threaded.rb
|
115
131
|
- examples/tokens.rb
|
@@ -255,4 +271,3 @@ test_files:
|
|
255
271
|
- spec/unit/stop_spec.rb
|
256
272
|
- spec/unit/update_spec.rb
|
257
273
|
- spec/unit/width_spec.rb
|
258
|
-
has_rdoc:
|