ruby-progressbar 1.10.0 → 1.13.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
- checksums.yaml.gz.sig +0 -0
- data/LICENSE.txt +1 -1
- data/README.md +110 -17
- data/lib/ruby-progressbar/base.rb +78 -27
- data/lib/ruby-progressbar/calculators/length.rb +1 -3
- data/lib/ruby-progressbar/components/bar.rb +22 -22
- data/lib/ruby-progressbar/components/percentage.rb +1 -3
- data/lib/ruby-progressbar/components/rate.rb +3 -7
- data/lib/ruby-progressbar/components/time.rb +34 -40
- data/lib/ruby-progressbar/format/formatter.rb +1 -1
- data/lib/ruby-progressbar/format/molecule.rb +21 -20
- data/lib/ruby-progressbar/format/string.rb +5 -3
- data/lib/ruby-progressbar/output.rb +3 -0
- data/lib/ruby-progressbar/outputs/tty.rb +1 -1
- data/lib/ruby-progressbar/progress.rb +6 -16
- data/lib/ruby-progressbar/projector.rb +14 -0
- data/lib/ruby-progressbar/projectors/smoothed_average.rb +71 -0
- data/lib/ruby-progressbar/refinements/progress_enumerator.rb +28 -0
- data/lib/ruby-progressbar/refinements.rb +1 -1
- data/lib/ruby-progressbar/time.rb +8 -10
- data/lib/ruby-progressbar/timer.rb +7 -1
- data/lib/ruby-progressbar/version.rb +1 -1
- data/lib/ruby-progressbar.rb +5 -11
- data.tar.gz.sig +0 -0
- metadata +22 -39
- metadata.gz.sig +0 -0
- data/lib/ruby-progressbar/calculators/running_average.rb +0 -9
- data/lib/ruby-progressbar/components.rb +0 -5
- data/lib/ruby-progressbar/format.rb +0 -3
- data/lib/ruby-progressbar/refinements/enumerator.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a326fec3040bac0fc963d989df67f252d45243a7983184b88f0ccdfda4d0f35c
|
4
|
+
data.tar.gz: 7aaaae56892722f0fc22a440f21f5f13e54f9171fb64b6630386d67ac0515f14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f8d6034719ec5276dee6bb1f11bb14ad4696dcd8dbf6fa88b26eebf6e8e4f658ee2d686f406aa9c25a71b2f0d8ce8dcd22c4b58af5c8cd6cd42f39f88301916
|
7
|
+
data.tar.gz: 14978170664e0308259fad1e4dd9ea11adacf3f48a03c8faf532d3a0691aed7a9fd7a397f7dcc7bea389d0f2716b36e1a77a54c4560593012008ba6811dafb3b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,38 +1,131 @@
|
|
1
1
|
Ruby/ProgressBar
|
2
|
-
|
3
|
-
|
2
|
+
================================================================================
|
3
|
+
|
4
|
+
<div align="center">
|
5
|
+
<a href="https://rubygems.org/gems/ruby-progressbar" alt="RubyGems Version">
|
6
|
+
<img src="https://img.shields.io/gem/v/ruby-progressbar.svg?style=flat-square&label=current-version" alt="RubyGems Version" />
|
7
|
+
</a>
|
8
|
+
|
9
|
+
<a href="https://rubygems.org/gems/ruby-progressbar" alt="RubyGems Rank Overall">
|
10
|
+
<img src="https://img.shields.io/gem/rt/ruby-progressbar.svg?style=flat-square&label=total-rank" alt="RubyGems Rank Overall" />
|
11
|
+
</a>
|
12
|
+
|
13
|
+
<a href="https://rubygems.org/gems/ruby-progressbar" alt="RubyGems Rank Daily">
|
14
|
+
<img src="https://img.shields.io/gem/rd/ruby-progressbar.svg?style=flat-square&label=daily-rank" alt="RubyGems Rank Daily" />
|
15
|
+
</a>
|
16
|
+
|
17
|
+
<a href="https://rubygems.org/gems/ruby-progressbar" alt="RubyGems Downloads">
|
18
|
+
<img src="https://img.shields.io/gem/dt/ruby-progressbar.svg?style=flat-square&label=total-downloads" alt="RubyGems Downloads" />
|
19
|
+
</a>
|
20
|
+
|
21
|
+
<a href="https://github.com/jfelchner/ruby-progressbar/actions?query=workflow%3ABuild" alt="Build Status">
|
22
|
+
<img src="https://img.shields.io/github/workflow/status/jfelchner/ruby-progressbar/Build?label=CI&style=flat-square&logo=github" alt="Build Status" />
|
23
|
+
</a>
|
24
|
+
|
25
|
+
<a href="#" alt="Maintainability">
|
26
|
+
<img src="https://img.shields.io/codeclimate/maintainability/jfelchner/ruby-progressbar?style=flat-square&label=grade" alt="Maintainability" />
|
27
|
+
</a>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<br>
|
4
31
|
|
5
32
|
<img src="https://kompanee-public-assets.s3.amazonaws.com/readmes/ruby-progressbar-cage.png" align="right" />
|
6
33
|
|
7
|
-
The **ultimate** text progress bar library for Ruby! It'll **SMASH YOU OVER THE
|
34
|
+
The **ultimate** text progress bar library for Ruby! It'll **SMASH YOU OVER THE
|
35
|
+
HEAD** with a **PURE RUSH** of progress bar excitement!
|
8
36
|
|
9
|
-
Don't miss out on what all the kids are talking about! If you want everyone to
|
37
|
+
Don't miss out on what all the kids are talking about! If you want everyone to
|
38
|
+
know that your gem or app can survive _in the cage_ then YOU WANT
|
39
|
+
**RUBY-PROGRESSBAR**!
|
10
40
|
|
11
|
-
<br
|
41
|
+
<br>
|
12
42
|
|
13
|
-
|
14
|
-
|
43
|
+
It's Better Than The Other 186,312 Progress Bar Libraries Because
|
44
|
+
--------------------------------------------------------------------------------
|
45
|
+
|
46
|
+
* It has [stood the test of time][history] (2008-today)
|
47
|
+
|
48
|
+
* Full test suite
|
49
|
+
|
50
|
+
* [_**ZERO**_ dependencies][gemspec]
|
51
|
+
|
52
|
+
* Used by [tons of other open source projects][dependencies] (which means we
|
53
|
+
find out about bugs quickly)
|
54
|
+
|
55
|
+
* It's pretty [freakin' sweet](https://www.youtube.com/watch?v=On3IoVhf_GM)
|
56
|
+
|
57
|
+
* And most importantly... our awesome [contributors][contributors]
|
58
|
+
|
59
|
+
Basic Usage
|
60
|
+
--------------------------------------------------------------------------------
|
15
61
|
|
16
|
-
|
62
|
+
### Creation
|
17
63
|
|
18
|
-
|
64
|
+
It's simple to get started:
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
progressbar = ProgressBar.create
|
68
|
+
```
|
69
|
+
|
70
|
+
Creates a basic progress bar beginning at `0`, a maximum capacity of `100` and
|
71
|
+
tells it to start.
|
72
|
+
|
73
|
+
```text
|
74
|
+
Progress: | |
|
75
|
+
```
|
76
|
+
|
77
|
+
### Marking Progress
|
78
|
+
|
79
|
+
Every call to `#increment` will advance the bar by `1`. Therefore:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
50.times { progressbar.increment }
|
83
|
+
```
|
84
|
+
|
85
|
+
Would output an advancing line which would end up here:
|
86
|
+
|
87
|
+
```text
|
88
|
+
Progress: |=================================== |
|
89
|
+
```
|
90
|
+
|
91
|
+
### Animation
|
92
|
+
|
93
|
+

|
94
|
+
|
95
|
+
Full Reference
|
96
|
+
--------------------------------------------------------------------------------
|
97
|
+
|
98
|
+
There's gotten to be too much awesome to pack into one page. Visit the
|
99
|
+
[wiki][wiki] for the full documentation.
|
19
100
|
|
20
101
|
Issues
|
21
|
-
|
102
|
+
--------------------------------------------------------------------------------
|
22
103
|
|
23
|
-
If you have problems, please create a [Github issue]
|
104
|
+
If you have problems, please create a [Github issue][issues].
|
24
105
|
|
25
106
|
Credits
|
26
|
-
|
107
|
+
--------------------------------------------------------------------------------
|
27
108
|
|
28
|
-
![The Kompanee]
|
109
|
+
![The Kompanee][kompanee-logo]
|
29
110
|
|
30
|
-
ruby-progressbar is maintained by [The Kompanee, Ltd.]
|
111
|
+
ruby-progressbar is maintained by [The Kompanee, Ltd.][kompanee-site]
|
31
112
|
|
32
113
|
The names and logos for The Kompanee are trademarks of The Kompanee, Ltd.
|
33
114
|
|
34
115
|
License
|
35
|
-
|
116
|
+
--------------------------------------------------------------------------------
|
117
|
+
|
118
|
+
ruby-progressbar 1.0 is Copyright © 2011-2021 The Kompanee. It is free
|
119
|
+
software, and may be redistributed under the terms specified in the LICENSE
|
120
|
+
file.
|
121
|
+
ruby-progressbar 0.9.0 is Copyright © 2008 [Satoru Takabayashi][satoru]
|
36
122
|
|
37
|
-
ruby-progressbar
|
38
|
-
|
123
|
+
[contributors]: https://github.com/jfelchner/ruby-progressbar/graphs/contributors
|
124
|
+
[dependencies]: https://github.com/jfelchner/ruby-progressbar/network/dependents
|
125
|
+
[gemspec]: https://github.com/jfelchner/ruby-progressbar/blob/master/ruby-progressbar.gemspec
|
126
|
+
[history]: https://github.com/jfelchner/ruby-progressbar/wiki/History
|
127
|
+
[issues]: https://github.com/jfelchner/ruby-progressbar/issues
|
128
|
+
[kompanee-logo]: https://kompanee-public-assets.s3.amazonaws.com/readmes/kompanee-horizontal-black.png
|
129
|
+
[kompanee-site]: http://www.thekompanee.com
|
130
|
+
[satoru]: http://0xcc.net
|
131
|
+
[wiki]: https://github.com/jfelchner/ruby-progressbar/wiki
|
@@ -1,9 +1,38 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
|
3
|
+
require 'ruby-progressbar/components/bar'
|
4
|
+
require 'ruby-progressbar/components/percentage'
|
5
|
+
require 'ruby-progressbar/components/rate'
|
6
|
+
require 'ruby-progressbar/components/time'
|
7
|
+
require 'ruby-progressbar/components/title'
|
8
|
+
require 'ruby-progressbar/format/formatter'
|
9
|
+
require 'ruby-progressbar/format/string'
|
10
|
+
require 'ruby-progressbar/outputs/non_tty'
|
11
|
+
require 'ruby-progressbar/outputs/tty'
|
12
|
+
require 'ruby-progressbar/progress'
|
13
|
+
require 'ruby-progressbar/projector'
|
14
|
+
require 'ruby-progressbar/timer'
|
15
|
+
|
3
16
|
class ProgressBar
|
4
17
|
class Base
|
5
18
|
extend Forwardable
|
6
19
|
|
20
|
+
# rubocop:disable Layout/HeredocIndentation
|
21
|
+
SMOOTHING_DEPRECATION_WARNING = <<-HEREDOC.tr("\n", ' ')
|
22
|
+
WARNING: Passing the 'smoothing' option is deprecated and will be removed
|
23
|
+
in version 2.0. Please pass { projector: { type: 'smoothing', strength: 0.x }}.
|
24
|
+
For more information on why this change is happening, visit
|
25
|
+
https://github.com/jfelchner/ruby-progressbar/wiki/Upgrading
|
26
|
+
HEREDOC
|
27
|
+
|
28
|
+
RUNNING_AVERAGE_RATE_DEPRECATION_WARNING = <<-HEREDOC.tr("\n", ' ')
|
29
|
+
WARNING: Passing the 'running_average_rate' option is deprecated and will be removed
|
30
|
+
in version 2.0. Please pass { projector: { type: 'smoothing', strength: 0.x }}.
|
31
|
+
For more information on why this change is happening, visit
|
32
|
+
https://github.com/jfelchner/ruby-progressbar/wiki/Upgrading
|
33
|
+
HEREDOC
|
34
|
+
# rubocop:enable Layout/HeredocIndentation
|
35
|
+
|
7
36
|
def_delegators :output,
|
8
37
|
:clear,
|
9
38
|
:log,
|
@@ -13,22 +42,41 @@ class Base
|
|
13
42
|
:progress,
|
14
43
|
:total
|
15
44
|
|
16
|
-
def initialize(options = {})
|
45
|
+
def initialize(options = {}) # rubocop:disable Metrics/AbcSize
|
46
|
+
options[:projector] ||= {}
|
47
|
+
|
17
48
|
self.autostart = options.fetch(:autostart, true)
|
18
49
|
self.autofinish = options.fetch(:autofinish, true)
|
19
50
|
self.finished = false
|
20
51
|
|
21
52
|
self.timer = Timer.new(options)
|
53
|
+
projector_opts = if options[:projector].any?
|
54
|
+
options[:projector]
|
55
|
+
elsif options[:smoothing]
|
56
|
+
warn SMOOTHING_DEPRECATION_WARNING
|
57
|
+
|
58
|
+
{ :strength => options[:smoothing] }
|
59
|
+
elsif options[:running_average_rate]
|
60
|
+
warn RUNNING_AVERAGE_RATE_DEPRECATION_WARNING
|
61
|
+
|
62
|
+
{ :strength => options[:smoothing] }
|
63
|
+
else
|
64
|
+
{}
|
65
|
+
end
|
66
|
+
self.projector = Projector.
|
67
|
+
from_type(options[:projector][:type]).
|
68
|
+
new(projector_opts)
|
22
69
|
self.progressable = Progress.new(options)
|
23
70
|
|
24
|
-
options
|
25
|
-
|
71
|
+
options = options.merge(:progress => progressable,
|
72
|
+
:projector => projector,
|
73
|
+
:timer => timer)
|
26
74
|
|
27
|
-
self.
|
28
|
-
self.
|
29
|
-
self.
|
30
|
-
self.
|
31
|
-
self.
|
75
|
+
self.title_component = Components::Title.new(options)
|
76
|
+
self.bar_component = Components::Bar.new(options)
|
77
|
+
self.percentage_component = Components::Percentage.new(options)
|
78
|
+
self.rate_component = Components::Rate.new(options)
|
79
|
+
self.time_component = Components::Time.new(options)
|
32
80
|
|
33
81
|
self.output = Output.detect(options.merge(:bar => self))
|
34
82
|
@format = Format::String.new(output.resolve_format(options[:format]))
|
@@ -67,6 +115,7 @@ class Base
|
|
67
115
|
output.with_refresh do
|
68
116
|
self.finished = false
|
69
117
|
progressable.reset
|
118
|
+
projector.reset
|
70
119
|
timer.reset
|
71
120
|
end
|
72
121
|
end
|
@@ -102,19 +151,19 @@ class Base
|
|
102
151
|
end
|
103
152
|
|
104
153
|
def progress_mark=(mark)
|
105
|
-
output.refresh_with_format_change {
|
154
|
+
output.refresh_with_format_change { bar_component.progress_mark = mark }
|
106
155
|
end
|
107
156
|
|
108
157
|
def remainder_mark=(mark)
|
109
|
-
output.refresh_with_format_change {
|
158
|
+
output.refresh_with_format_change { bar_component.remainder_mark = mark }
|
110
159
|
end
|
111
160
|
|
112
161
|
def title
|
113
|
-
|
162
|
+
title_component.title
|
114
163
|
end
|
115
164
|
|
116
165
|
def title=(title)
|
117
|
-
output.refresh_with_format_change {
|
166
|
+
output.refresh_with_format_change { title_component.title = title }
|
118
167
|
end
|
119
168
|
|
120
169
|
def to_s(new_format = nil)
|
@@ -123,29 +172,29 @@ class Base
|
|
123
172
|
Format::Formatter.process(@format, output.length, self)
|
124
173
|
end
|
125
174
|
|
126
|
-
# rubocop:disable Metrics/AbcSize,
|
175
|
+
# rubocop:disable Metrics/AbcSize, Layout/LineLength
|
127
176
|
def to_h
|
128
177
|
{
|
129
178
|
'output_stream' => output.__send__(:stream),
|
130
179
|
'length' => output.length,
|
131
|
-
'title' =>
|
132
|
-
'progress_mark' =>
|
133
|
-
'remainder_mark' =>
|
180
|
+
'title' => title_component.title,
|
181
|
+
'progress_mark' => bar_component.progress_mark,
|
182
|
+
'remainder_mark' => bar_component.remainder_mark,
|
134
183
|
'progress' => progressable.progress,
|
135
184
|
'total' => progressable.total,
|
136
185
|
'percentage' => progressable.percentage_completed_with_precision.to_f,
|
137
|
-
'elapsed_time_in_seconds' =>
|
138
|
-
'estimated_time_remaining_in_seconds' =>
|
139
|
-
'base_rate_of_change' =>
|
140
|
-
'scaled_rate_of_change' =>
|
141
|
-
'unknown_progress_animation_steps' =>
|
186
|
+
'elapsed_time_in_seconds' => time_component.__send__(:timer).elapsed_seconds,
|
187
|
+
'estimated_time_remaining_in_seconds' => time_component.__send__(:estimated_seconds_remaining),
|
188
|
+
'base_rate_of_change' => rate_component.__send__(:base_rate),
|
189
|
+
'scaled_rate_of_change' => rate_component.__send__(:scaled_rate),
|
190
|
+
'unknown_progress_animation_steps' => bar_component.upa_steps,
|
142
191
|
'throttle_rate' => output.__send__(:throttle).rate,
|
143
192
|
'started?' => started?,
|
144
193
|
'stopped?' => stopped?,
|
145
194
|
'finished?' => finished?
|
146
195
|
}
|
147
196
|
end
|
148
|
-
# rubocop:enable Metrics/AbcSize,
|
197
|
+
# rubocop:enable Metrics/AbcSize, Layout/LineLength
|
149
198
|
|
150
199
|
def inspect
|
151
200
|
"#<ProgressBar:#{progress}/#{total || 'unknown'}>"
|
@@ -162,13 +211,14 @@ class Base
|
|
162
211
|
protected
|
163
212
|
|
164
213
|
attr_accessor :output,
|
214
|
+
:projector,
|
165
215
|
:timer,
|
166
216
|
:progressable,
|
167
|
-
:
|
168
|
-
:
|
169
|
-
:
|
170
|
-
:
|
171
|
-
:
|
217
|
+
:title_component,
|
218
|
+
:bar_component,
|
219
|
+
:percentage_component,
|
220
|
+
:rate_component,
|
221
|
+
:time_component,
|
172
222
|
:autostart,
|
173
223
|
:autofinish,
|
174
224
|
:finished
|
@@ -176,6 +226,7 @@ class Base
|
|
176
226
|
def update_progress(*args)
|
177
227
|
output.with_refresh do
|
178
228
|
progressable.__send__(*args)
|
229
|
+
projector.__send__(*args)
|
179
230
|
timer.stop if finished?
|
180
231
|
end
|
181
232
|
end
|
@@ -50,12 +50,11 @@ class Length
|
|
50
50
|
end
|
51
51
|
# rubocop:enable Style/RescueStandardError
|
52
52
|
|
53
|
-
# rubocop:disable Lint/DuplicateMethods
|
54
53
|
begin
|
55
54
|
require 'io/console'
|
56
55
|
|
57
56
|
def dynamic_width
|
58
|
-
if output && output.tty?
|
57
|
+
if output && output.tty? && output.respond_to?(:winsize)
|
59
58
|
dynamic_width_via_output_stream_object
|
60
59
|
elsif IO.console
|
61
60
|
dynamic_width_via_io_object
|
@@ -68,7 +67,6 @@ class Length
|
|
68
67
|
dynamic_width_via_system_calls
|
69
68
|
end
|
70
69
|
end
|
71
|
-
# rubocop:enable Lint/DuplicateMethods
|
72
70
|
|
73
71
|
def dynamic_width_via_output_stream_object
|
74
72
|
_rows, columns = output.winsize
|
@@ -32,22 +32,6 @@ class Bar
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
private
|
36
|
-
|
37
|
-
def integrated_percentage_complete_string
|
38
|
-
return standard_complete_string if completed_length < 5
|
39
|
-
|
40
|
-
" #{progress.percentage_completed} ".to_s.center(completed_length, progress_mark)
|
41
|
-
end
|
42
|
-
|
43
|
-
def standard_complete_string
|
44
|
-
progress_mark * completed_length
|
45
|
-
end
|
46
|
-
|
47
|
-
def incomplete_string
|
48
|
-
remainder_mark * (length - completed_length)
|
49
|
-
end
|
50
|
-
|
51
35
|
def bar(length)
|
52
36
|
self.length = length
|
53
37
|
|
@@ -66,12 +50,6 @@ class Bar
|
|
66
50
|
to_s(:format => :integrated_percentage)
|
67
51
|
end
|
68
52
|
|
69
|
-
def unknown_string
|
70
|
-
unknown_frame_string = unknown_progress_frame * ((length / upa_steps.size) + 2)
|
71
|
-
|
72
|
-
unknown_frame_string[0, length]
|
73
|
-
end
|
74
|
-
|
75
53
|
def incomplete_space(length)
|
76
54
|
self.length = length
|
77
55
|
|
@@ -88,6 +66,28 @@ class Bar
|
|
88
66
|
integrated_percentage_complete_string
|
89
67
|
end
|
90
68
|
|
69
|
+
private
|
70
|
+
|
71
|
+
def integrated_percentage_complete_string
|
72
|
+
return standard_complete_string if completed_length < 5
|
73
|
+
|
74
|
+
" #{progress.percentage_completed} ".to_s.center(completed_length, progress_mark)
|
75
|
+
end
|
76
|
+
|
77
|
+
def standard_complete_string
|
78
|
+
progress_mark * completed_length
|
79
|
+
end
|
80
|
+
|
81
|
+
def incomplete_string
|
82
|
+
remainder_mark * (length - completed_length)
|
83
|
+
end
|
84
|
+
|
85
|
+
def unknown_string
|
86
|
+
unknown_frame_string = unknown_progress_frame * ((length / upa_steps.size) + 2)
|
87
|
+
|
88
|
+
unknown_frame_string[0, length]
|
89
|
+
end
|
90
|
+
|
91
91
|
def completed_length
|
92
92
|
(length * progress.percentage_completed / 100).floor
|
93
93
|
end
|
@@ -2,23 +2,17 @@ class ProgressBar
|
|
2
2
|
module Components
|
3
3
|
class Rate
|
4
4
|
attr_accessor :rate_scale,
|
5
|
-
:started_at,
|
6
|
-
:stopped_at,
|
7
5
|
:timer,
|
8
6
|
:progress
|
9
7
|
|
10
8
|
def initialize(options = {})
|
11
9
|
self.rate_scale = options[:rate_scale] || lambda { |x| x }
|
12
|
-
self.started_at = nil
|
13
|
-
self.stopped_at = nil
|
14
10
|
self.timer = options[:timer]
|
15
11
|
self.progress = options[:progress]
|
16
12
|
end
|
17
13
|
|
18
|
-
private
|
19
|
-
|
20
14
|
def rate_of_change(format_string = '%i')
|
21
|
-
return 0
|
15
|
+
return '0' if elapsed_seconds <= 0
|
22
16
|
|
23
17
|
format_string % scaled_rate
|
24
18
|
end
|
@@ -27,6 +21,8 @@ class Rate
|
|
27
21
|
rate_of_change('%.2f')
|
28
22
|
end
|
29
23
|
|
24
|
+
private
|
25
|
+
|
30
26
|
def scaled_rate
|
31
27
|
rate_scale.call(base_rate)
|
32
28
|
end
|
@@ -12,57 +12,58 @@ class Time
|
|
12
12
|
NO_TIME_ELAPSED_TEXT = '--:--:--'.freeze
|
13
13
|
ESTIMATED_LABEL = ' ETA'.freeze
|
14
14
|
ELAPSED_LABEL = 'Time'.freeze
|
15
|
+
WALL_CLOCK_FORMAT = '%H:%M:%S'.freeze
|
16
|
+
OOB_TEXT_TO_FORMAT = {
|
17
|
+
:unknown => OOB_UNKNOWN_TIME_TEXT,
|
18
|
+
:friendly => OOB_FRIENDLY_TIME_TEXT
|
19
|
+
}.freeze
|
15
20
|
|
16
21
|
def initialize(options = {})
|
17
|
-
self.
|
18
|
-
self.
|
19
|
-
self.
|
22
|
+
self.timer = options[:timer]
|
23
|
+
self.progress = options[:progress]
|
24
|
+
self.projector = options[:projector]
|
20
25
|
end
|
21
26
|
|
22
|
-
def estimated_with_label
|
23
|
-
"#{ESTIMATED_LABEL}: #{estimated}"
|
27
|
+
def estimated_with_label(out_of_bounds_time_format = nil)
|
28
|
+
"#{ESTIMATED_LABEL}: #{estimated(out_of_bounds_time_format)}"
|
24
29
|
end
|
25
30
|
|
26
31
|
def elapsed_with_label
|
27
32
|
"#{ELAPSED_LABEL}: #{elapsed}"
|
28
33
|
end
|
29
34
|
|
30
|
-
protected
|
31
|
-
|
32
35
|
def estimated_with_no_oob
|
33
|
-
|
34
|
-
|
35
|
-
estimated_with_elapsed_fallback
|
36
|
+
estimated_with_elapsed_fallback(nil)
|
36
37
|
end
|
37
38
|
|
38
39
|
def estimated_with_unknown_oob
|
39
|
-
|
40
|
-
|
41
|
-
estimated_with_elapsed_fallback
|
40
|
+
estimated_with_elapsed_fallback(:unknown)
|
42
41
|
end
|
43
42
|
|
44
43
|
def estimated_with_friendly_oob
|
45
|
-
|
46
|
-
|
47
|
-
estimated_with_elapsed_fallback
|
44
|
+
estimated_with_elapsed_fallback(:friendly)
|
48
45
|
end
|
49
46
|
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
def estimated_wall_clock
|
48
|
+
return timer.stopped_at.strftime(WALL_CLOCK_FORMAT) if progress.finished?
|
49
|
+
return NO_TIME_ELAPSED_TEXT unless timer.started?
|
53
50
|
|
54
|
-
|
55
|
-
unless
|
56
|
-
fail 'Invalid Out Of Bounds time format. Valid formats are ' +
|
57
|
-
OOB_TIME_FORMATS.inspect
|
58
|
-
end
|
51
|
+
memo_estimated_seconds_remaining = estimated_seconds_remaining
|
52
|
+
return NO_TIME_ELAPSED_TEXT unless memo_estimated_seconds_remaining
|
59
53
|
|
60
|
-
|
54
|
+
(timer.now + memo_estimated_seconds_remaining).
|
55
|
+
strftime(WALL_CLOCK_FORMAT)
|
61
56
|
end
|
62
57
|
|
58
|
+
protected
|
59
|
+
|
60
|
+
attr_accessor :timer,
|
61
|
+
:progress,
|
62
|
+
:projector
|
63
|
+
|
63
64
|
private
|
64
65
|
|
65
|
-
def estimated
|
66
|
+
def estimated(out_of_bounds_time_format)
|
66
67
|
memo_estimated_seconds_remaining = estimated_seconds_remaining
|
67
68
|
|
68
69
|
return OOB_UNKNOWN_TIME_TEXT unless memo_estimated_seconds_remaining
|
@@ -70,7 +71,7 @@ class Time
|
|
70
71
|
hours, minutes, seconds = timer.divide_seconds(memo_estimated_seconds_remaining)
|
71
72
|
|
72
73
|
if hours > OOB_LIMIT_IN_HOURS && out_of_bounds_time_format
|
73
|
-
|
74
|
+
OOB_TEXT_TO_FORMAT.fetch(out_of_bounds_time_format)
|
74
75
|
else
|
75
76
|
TIME_FORMAT % [hours, minutes, seconds]
|
76
77
|
end
|
@@ -84,23 +85,16 @@ class Time
|
|
84
85
|
TIME_FORMAT % [hours, minutes, seconds]
|
85
86
|
end
|
86
87
|
|
87
|
-
def estimated_with_elapsed_fallback
|
88
|
-
progress.finished?
|
88
|
+
def estimated_with_elapsed_fallback(out_of_bounds_time_format)
|
89
|
+
return elapsed_with_label if progress.finished?
|
90
|
+
|
91
|
+
estimated_with_label(out_of_bounds_time_format)
|
89
92
|
end
|
90
93
|
|
91
94
|
def estimated_seconds_remaining
|
92
|
-
return if progress.unknown? || progress.none? || timer.stopped?
|
93
|
-
|
94
|
-
(timer.elapsed_seconds * (progress.total / progress.running_average - 1)).round
|
95
|
-
end
|
95
|
+
return if progress.unknown? || projector.none? || progress.none? || timer.stopped? || timer.reset?
|
96
96
|
|
97
|
-
|
98
|
-
case out_of_bounds_time_format
|
99
|
-
when :unknown
|
100
|
-
OOB_UNKNOWN_TIME_TEXT
|
101
|
-
when :friendly
|
102
|
-
OOB_FRIENDLY_TIME_TEXT
|
103
|
-
end
|
97
|
+
(timer.elapsed_seconds * ((progress.total / projector.projection) - 1)).round
|
104
98
|
end
|
105
99
|
end
|
106
100
|
end
|
@@ -13,7 +13,7 @@ class Formatter
|
|
13
13
|
bar_length = max_length -
|
14
14
|
processed_string.displayable_length +
|
15
15
|
format_string.bar_molecule_placeholder_length
|
16
|
-
bar_length =
|
16
|
+
bar_length = 0 if bar_length < 0
|
17
17
|
|
18
18
|
format_string.bar_molecules.each do |molecule|
|
19
19
|
processed_string.gsub!(molecule.full_key,
|
@@ -2,26 +2,27 @@ class ProgressBar
|
|
2
2
|
module Format
|
3
3
|
class Molecule
|
4
4
|
MOLECULES = {
|
5
|
-
:t => [:
|
6
|
-
:T => [:
|
7
|
-
:c => [:progressable,
|
8
|
-
:C => [:progressable,
|
9
|
-
:u => [:progressable,
|
10
|
-
:p => [:
|
11
|
-
:P => [:
|
12
|
-
:j => [:
|
13
|
-
:J => [:
|
14
|
-
:a => [:
|
15
|
-
:e => [:
|
16
|
-
:E => [:
|
17
|
-
:f => [:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
5
|
+
:t => [:title_component, :title],
|
6
|
+
:T => [:title_component, :title],
|
7
|
+
:c => [:progressable, :progress],
|
8
|
+
:C => [:progressable, :total],
|
9
|
+
:u => [:progressable, :total_with_unknown_indicator],
|
10
|
+
:p => [:percentage_component, :percentage],
|
11
|
+
:P => [:percentage_component, :percentage_with_precision],
|
12
|
+
:j => [:percentage_component, :justified_percentage],
|
13
|
+
:J => [:percentage_component, :justified_percentage_with_precision],
|
14
|
+
:a => [:time_component, :elapsed_with_label],
|
15
|
+
:e => [:time_component, :estimated_with_unknown_oob],
|
16
|
+
:E => [:time_component, :estimated_with_friendly_oob],
|
17
|
+
:f => [:time_component, :estimated_with_no_oob],
|
18
|
+
:l => [:time_component, :estimated_wall_clock],
|
19
|
+
:B => [:bar_component, :complete_bar],
|
20
|
+
:b => [:bar_component, :bar],
|
21
|
+
:W => [:bar_component, :complete_bar_with_percentage],
|
22
|
+
:w => [:bar_component, :bar_with_percentage],
|
23
|
+
:i => [:bar_component, :incomplete_space],
|
24
|
+
:r => [:rate_component, :rate_of_change],
|
25
|
+
:R => [:rate_component, :rate_of_change_with_precision]
|
25
26
|
}.freeze
|
26
27
|
|
27
28
|
BAR_MOLECULES = %w{W w B b i}.freeze
|
@@ -1,8 +1,10 @@
|
|
1
|
+
require 'ruby-progressbar/format/molecule'
|
2
|
+
|
1
3
|
class ProgressBar
|
2
4
|
module Format
|
3
5
|
class String < ::String
|
4
|
-
MOLECULE_PATTERN = /%[a-zA-Z]
|
5
|
-
ANSI_SGR_PATTERN = /\e\[[\d;]+m
|
6
|
+
MOLECULE_PATTERN = /%[a-zA-Z]/.freeze
|
7
|
+
ANSI_SGR_PATTERN = /\e\[[\d;]+m/.freeze
|
6
8
|
|
7
9
|
def displayable_length
|
8
10
|
gsub(ANSI_SGR_PATTERN, '').length
|
@@ -29,7 +31,7 @@ class String < ::String
|
|
29
31
|
end
|
30
32
|
|
31
33
|
molecules
|
32
|
-
|
34
|
+
end
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
@@ -4,25 +4,19 @@ class ProgressBar
|
|
4
4
|
class Progress
|
5
5
|
DEFAULT_TOTAL = 100
|
6
6
|
DEFAULT_BEGINNING_POSITION = 0
|
7
|
-
DEFAULT_SMOOTHING = 0.1
|
8
7
|
|
9
8
|
attr_reader :total,
|
10
9
|
:progress
|
11
|
-
|
12
|
-
attr_accessor :starting_position,
|
13
|
-
:running_average,
|
14
|
-
:smoothing
|
10
|
+
attr_accessor :starting_position
|
15
11
|
|
16
12
|
def initialize(options = {})
|
17
|
-
self.total
|
18
|
-
self.smoothing = options[:smoothing] || DEFAULT_SMOOTHING
|
13
|
+
self.total = options.fetch(:total, DEFAULT_TOTAL)
|
19
14
|
|
20
|
-
start
|
15
|
+
start(:at => DEFAULT_BEGINNING_POSITION)
|
21
16
|
end
|
22
17
|
|
23
18
|
def start(options = {})
|
24
|
-
self.
|
25
|
-
self.progress = \
|
19
|
+
self.progress = \
|
26
20
|
self.starting_position = options[:at] || progress
|
27
21
|
end
|
28
22
|
|
@@ -55,7 +49,7 @@ class Progress
|
|
55
49
|
end
|
56
50
|
|
57
51
|
def reset
|
58
|
-
start
|
52
|
+
start(:at => starting_position)
|
59
53
|
end
|
60
54
|
|
61
55
|
def progress=(new_progress)
|
@@ -65,10 +59,6 @@ class Progress
|
|
65
59
|
end
|
66
60
|
|
67
61
|
@progress = new_progress
|
68
|
-
|
69
|
-
self.running_average = Calculators::RunningAverage.calculate(running_average,
|
70
|
-
absolute,
|
71
|
-
smoothing)
|
72
62
|
end
|
73
63
|
|
74
64
|
def total=(new_total)
|
@@ -93,7 +83,7 @@ class Progress
|
|
93
83
|
end
|
94
84
|
|
95
85
|
def none?
|
96
|
-
|
86
|
+
progress.zero?
|
97
87
|
end
|
98
88
|
|
99
89
|
def unknown?
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'ruby-progressbar/projectors/smoothed_average'
|
2
|
+
|
3
|
+
class ProgressBar
|
4
|
+
class Projector
|
5
|
+
DEFAULT_PROJECTOR = ProgressBar::Projectors::SmoothedAverage
|
6
|
+
NAME_TO_PROJECTOR_MAP = {
|
7
|
+
'smoothed' => ProgressBar::Projectors::SmoothedAverage
|
8
|
+
}.freeze
|
9
|
+
|
10
|
+
def self.from_type(name)
|
11
|
+
NAME_TO_PROJECTOR_MAP.fetch(name, DEFAULT_PROJECTOR)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
class ProgressBar
|
2
|
+
module Projectors
|
3
|
+
class SmoothedAverage
|
4
|
+
DEFAULT_STRENGTH = 0.1
|
5
|
+
DEFAULT_BEGINNING_POSITION = 0
|
6
|
+
|
7
|
+
attr_accessor :samples,
|
8
|
+
:strength
|
9
|
+
attr_reader :projection
|
10
|
+
|
11
|
+
def initialize(options = {})
|
12
|
+
self.samples = []
|
13
|
+
self.projection = 0.0
|
14
|
+
self.strength = options[:strength] || DEFAULT_STRENGTH
|
15
|
+
|
16
|
+
start(:at => DEFAULT_BEGINNING_POSITION)
|
17
|
+
end
|
18
|
+
|
19
|
+
def start(options = {})
|
20
|
+
self.projection = 0.0
|
21
|
+
self.progress = samples[0] = (options[:at] || progress)
|
22
|
+
end
|
23
|
+
|
24
|
+
def decrement
|
25
|
+
self.progress -= 1
|
26
|
+
end
|
27
|
+
|
28
|
+
def increment
|
29
|
+
self.progress += 1
|
30
|
+
end
|
31
|
+
|
32
|
+
def progress
|
33
|
+
samples[1]
|
34
|
+
end
|
35
|
+
|
36
|
+
def total=(_new_total); end
|
37
|
+
|
38
|
+
def reset
|
39
|
+
start(:at => samples[0])
|
40
|
+
end
|
41
|
+
|
42
|
+
def progress=(new_progress)
|
43
|
+
samples[1] = new_progress
|
44
|
+
self.projection = \
|
45
|
+
self.class.calculate(
|
46
|
+
@projection,
|
47
|
+
absolute,
|
48
|
+
strength
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def none?
|
53
|
+
projection.zero?
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.calculate(current_projection, new_value, rate)
|
57
|
+
(new_value * (1.0 - rate)) + (current_projection * rate)
|
58
|
+
end
|
59
|
+
|
60
|
+
protected
|
61
|
+
|
62
|
+
attr_writer :projection
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def absolute
|
67
|
+
samples[1] - samples[0]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class ProgressBar
|
2
|
+
module Refinements
|
3
|
+
module Enumerator
|
4
|
+
ARITY_ERROR_MESSAGE = 'Only two arguments allowed to be passed to ' \
|
5
|
+
'with_progressbar (item, progress_bar)'.freeze
|
6
|
+
|
7
|
+
refine ::Enumerator do
|
8
|
+
def with_progressbar(options = {}, &block)
|
9
|
+
progress_bar = ProgressBar.create(options.merge(:starting_at => 0, :total => size))
|
10
|
+
|
11
|
+
each do |item|
|
12
|
+
progress_bar.increment
|
13
|
+
|
14
|
+
next unless block
|
15
|
+
|
16
|
+
yielded_args = []
|
17
|
+
yielded_args << item if block.arity > 0
|
18
|
+
yielded_args << progress_bar if block.arity > 1
|
19
|
+
|
20
|
+
fail ::ArgumentError, ARITY_ERROR_MESSAGE if block.arity > 2
|
21
|
+
|
22
|
+
yield(*yielded_args)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1 +1 @@
|
|
1
|
-
require 'ruby-progressbar/refinements/
|
1
|
+
require 'ruby-progressbar/refinements/progress_enumerator'
|
@@ -2,10 +2,10 @@
|
|
2
2
|
class ProgressBar
|
3
3
|
class Time
|
4
4
|
TIME_MOCKING_LIBRARY_METHODS = [
|
5
|
-
:__simple_stub__now,
|
6
|
-
:now_without_mock_time,
|
7
|
-
:now_without_delorean,
|
8
|
-
:now
|
5
|
+
:__simple_stub__now, # ActiveSupport
|
6
|
+
:now_without_mock_time, # Timecop
|
7
|
+
:now_without_delorean, # Delorean
|
8
|
+
:now # Unmocked
|
9
9
|
].freeze
|
10
10
|
|
11
11
|
def initialize(time = ::Time)
|
@@ -13,15 +13,13 @@ class Time
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def now
|
16
|
-
time.__send__
|
16
|
+
time.__send__(unmocked_time_method)
|
17
17
|
end
|
18
18
|
|
19
19
|
def unmocked_time_method
|
20
|
-
@unmocked_time_method ||=
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
20
|
+
@unmocked_time_method ||= TIME_MOCKING_LIBRARY_METHODS.find do |method|
|
21
|
+
time.respond_to? method
|
22
|
+
end
|
25
23
|
end
|
26
24
|
|
27
25
|
protected
|
@@ -6,7 +6,7 @@ class Timer
|
|
6
6
|
:stopped_at
|
7
7
|
|
8
8
|
def initialize(options = {})
|
9
|
-
self.time = options[:time] || Time.new
|
9
|
+
self.time = options[:time] || ::ProgressBar::Time.new
|
10
10
|
end
|
11
11
|
|
12
12
|
def start
|
@@ -28,6 +28,10 @@ class Timer
|
|
28
28
|
start
|
29
29
|
end
|
30
30
|
|
31
|
+
def now
|
32
|
+
time.now
|
33
|
+
end
|
34
|
+
|
31
35
|
def started?
|
32
36
|
started_at
|
33
37
|
end
|
@@ -51,6 +55,8 @@ class Timer
|
|
51
55
|
end
|
52
56
|
|
53
57
|
def elapsed_seconds
|
58
|
+
return 0 unless started?
|
59
|
+
|
54
60
|
((stopped_at || time.now) - started_at)
|
55
61
|
end
|
56
62
|
|
data/lib/ruby-progressbar.rb
CHANGED
@@ -1,15 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'ruby-progressbar/outputs/non_tty'
|
4
|
-
require 'ruby-progressbar/timer'
|
5
|
-
require 'ruby-progressbar/progress'
|
6
|
-
require 'ruby-progressbar/throttle'
|
7
|
-
require 'ruby-progressbar/calculators/length'
|
8
|
-
require 'ruby-progressbar/calculators/running_average'
|
9
|
-
require 'ruby-progressbar/components'
|
10
|
-
require 'ruby-progressbar/format'
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
11
3
|
require 'ruby-progressbar/base'
|
12
|
-
require 'ruby-progressbar/refinements'
|
4
|
+
require 'ruby-progressbar/refinements' if Module.
|
5
|
+
private_instance_methods.
|
6
|
+
include?(:using)
|
13
7
|
|
14
8
|
class ProgressBar
|
15
9
|
def self.create(*args)
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-progressbar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thekompanee
|
@@ -12,8 +12,8 @@ cert_chain:
|
|
12
12
|
- |
|
13
13
|
-----BEGIN CERTIFICATE-----
|
14
14
|
MIIEdjCCAt6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAyMTAwLgYDVQQDDCdhY2Nv
|
15
|
-
|
16
|
-
|
15
|
+
dW50c19ydWJ5Z2Vtcy9EQz10aGVrb21wYW5lZS9EQz1jb20wHhcNMjMwMjI2MTcx
|
16
|
+
MDI1WhcNMjYwMjI1MTcxMDI1WjAyMTAwLgYDVQQDDCdhY2NvdW50c19ydWJ5Z2Vt
|
17
17
|
cy9EQz10aGVrb21wYW5lZS9EQz1jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw
|
18
18
|
ggGKAoIBgQCqhYn5ODEoLvuBIF2M1GzoaZU28+ntP5QApvDE0Te04n0JbBC1cNYH
|
19
19
|
mr71neeSx7tlZ9w9kJ/8GNcY5bm7pNJqhyhfc+uG9M7FttcxM8AYXogjcdUDP234
|
@@ -26,17 +26,17 @@ cert_chain:
|
|
26
26
|
GoP81fN6l88CAwEAAaOBljCBkzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNV
|
27
27
|
HQ4EFgQUL4eV4OM9h7fkM27qf9p4ragHi6AwLAYDVR0RBCUwI4EhYWNjb3VudHMr
|
28
28
|
cnVieWdlbXNAdGhla29tcGFuZWUuY29tMCwGA1UdEgQlMCOBIWFjY291bnRzK3J1
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
29
|
+
YnlnZW1zQHRoZWtvbXBhbmVlLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAD/tBN1cM
|
30
|
+
8Qu6u+rPM3SEtlEK/ZdVY0IowXtXMskkderNBJ4HY+xBfIWyAXLTr3Fy6xscVZ95
|
31
|
+
raFCiWHqvR577u3/BsVZ5BoQ0g25oY2bwoamQSdx71ygs25Q+UFbg6lHq6olszj0
|
32
|
+
HqKXUy/iPFb+OzGq7NOtKOD5pHl3ew8H7U5tfh0kx6B5TdL9BZLurjskW0n2G+kY
|
33
|
+
NSGCTGYU8wY4Bsk/AmfoFT/ATwmrf68CTD+IBY5yvt2DGvcyuSrX1RQP8Vk//0EP
|
34
|
+
J2ezTNGIBeQFcyyo09gMfy1yxv9XAvwmy6pAx7/m/F2XzTiXuzmJ7zJ6J0OaHUG4
|
35
|
+
svJgf3o9Eor2okQND60Qdpdl4qdSy3KaNqvQQbTRB96e/+K8ksz4rras5jPaAs0p
|
36
|
+
DV37k4cni6c/jUm2CqepsJ/dbzeWdkhcuO6hwEQV0jvFky5C6d5hHcrbJwxl1sTL
|
37
|
+
V+pWW6L9MSZzKkjWVJXD43B3tWBjIDthQVTzS4j90PUkUXgBXjS7Jxj/
|
38
38
|
-----END CERTIFICATE-----
|
39
|
-
date:
|
39
|
+
date: 2023-03-04 00:00:00.000000000 Z
|
40
40
|
dependencies:
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
@@ -81,33 +81,19 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '2.3'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: timecop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
89
|
+
version: '0.9'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: timecop
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - '='
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 0.6.0
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - '='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 0.6.0
|
96
|
+
version: '0.9'
|
111
97
|
description: 'Ruby/ProgressBar is an extremely flexible text progress bar library
|
112
98
|
for Ruby. The output can be customized with a flexible formatting system including:
|
113
99
|
percentage, bars of various formats, elapsed time and estimated time remaining.'
|
@@ -123,15 +109,12 @@ files:
|
|
123
109
|
- lib/ruby-progressbar.rb
|
124
110
|
- lib/ruby-progressbar/base.rb
|
125
111
|
- lib/ruby-progressbar/calculators/length.rb
|
126
|
-
- lib/ruby-progressbar/calculators/running_average.rb
|
127
|
-
- lib/ruby-progressbar/components.rb
|
128
112
|
- lib/ruby-progressbar/components/bar.rb
|
129
113
|
- lib/ruby-progressbar/components/percentage.rb
|
130
114
|
- lib/ruby-progressbar/components/rate.rb
|
131
115
|
- lib/ruby-progressbar/components/time.rb
|
132
116
|
- lib/ruby-progressbar/components/title.rb
|
133
117
|
- lib/ruby-progressbar/errors/invalid_progress_error.rb
|
134
|
-
- lib/ruby-progressbar/format.rb
|
135
118
|
- lib/ruby-progressbar/format/formatter.rb
|
136
119
|
- lib/ruby-progressbar/format/molecule.rb
|
137
120
|
- lib/ruby-progressbar/format/string.rb
|
@@ -140,8 +123,10 @@ files:
|
|
140
123
|
- lib/ruby-progressbar/outputs/null.rb
|
141
124
|
- lib/ruby-progressbar/outputs/tty.rb
|
142
125
|
- lib/ruby-progressbar/progress.rb
|
126
|
+
- lib/ruby-progressbar/projector.rb
|
127
|
+
- lib/ruby-progressbar/projectors/smoothed_average.rb
|
143
128
|
- lib/ruby-progressbar/refinements.rb
|
144
|
-
- lib/ruby-progressbar/refinements/
|
129
|
+
- lib/ruby-progressbar/refinements/progress_enumerator.rb
|
145
130
|
- lib/ruby-progressbar/throttle.rb
|
146
131
|
- lib/ruby-progressbar/time.rb
|
147
132
|
- lib/ruby-progressbar/timer.rb
|
@@ -150,10 +135,9 @@ homepage: https://github.com/jfelchner/ruby-progressbar
|
|
150
135
|
licenses:
|
151
136
|
- MIT
|
152
137
|
metadata:
|
153
|
-
allowed_push_host: https://rubygems.org
|
154
138
|
bug_tracker_uri: https://github.com/jfelchner/ruby-progressbar/issues
|
155
|
-
changelog_uri: https://github.com/jfelchner/ruby-progressbar/CHANGELOG.md
|
156
|
-
documentation_uri: https://github.com/jfelchner/ruby-progressbar/tree/releases/v1.
|
139
|
+
changelog_uri: https://github.com/jfelchner/ruby-progressbar/blob/master/CHANGELOG.md
|
140
|
+
documentation_uri: https://github.com/jfelchner/ruby-progressbar/tree/releases/v1.13.0
|
157
141
|
homepage_uri: https://github.com/jfelchner/ruby-progressbar
|
158
142
|
source_code_uri: https://github.com/jfelchner/ruby-progressbar
|
159
143
|
wiki_uri: https://github.com/jfelchner/ruby-progressbar/wiki
|
@@ -172,8 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
156
|
- !ruby/object:Gem::Version
|
173
157
|
version: '0'
|
174
158
|
requirements: []
|
175
|
-
|
176
|
-
rubygems_version: 2.7.7
|
159
|
+
rubygems_version: 3.1.6
|
177
160
|
signing_key:
|
178
161
|
specification_version: 4
|
179
162
|
summary: Ruby/ProgressBar is a flexible text progress bar library for Ruby.
|
metadata.gz.sig
CHANGED
Binary file
|
@@ -1,23 +0,0 @@
|
|
1
|
-
class ProgressBar
|
2
|
-
module Refinements
|
3
|
-
module Enumerator
|
4
|
-
refine ::Enumerator do
|
5
|
-
def with_progressbar(options = {}, &block)
|
6
|
-
chain = ::Enumerator.new do |yielder|
|
7
|
-
progress_bar = ProgressBar.create(options.merge(:starting_at => 0, :total => size))
|
8
|
-
|
9
|
-
each do |*args|
|
10
|
-
yielder.yield(*args).tap do
|
11
|
-
progress_bar.increment
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
return chain unless block_given?
|
17
|
-
|
18
|
-
chain.each(&block)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|