progressbar 1.10.1 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67fc001f8d824714d07ba5104ff443279d56278237ef0dd3a38a4c37c14ea439
4
- data.tar.gz: ababf036ac5d1dfab51a1bf81bf5ad6c20392c7076cb50bdc7243d4e12f6e47d
3
+ metadata.gz: fed7ad39c43e9cf2fc85b87d1ffa94981e94e7e796ab8526f1357be3e186eab2
4
+ data.tar.gz: 91f458a9dc472ffad2bc83bcc5c9d65902c90dc9a4cf4587da51bcdd5874f37c
5
5
  SHA512:
6
- metadata.gz: 42b2df9371280cb1d2b49514f90902ee3da921fe7ec9cc50f5fc3e41f6fd4691cc0f64353c3b4f96cc8c74593b88a7060090a5f01eb59567685a3a32481b885a
7
- data.tar.gz: 2af0570d34f69df8d82314840fe90da1348328648da99d80e0056fe9ae55a18821980b79c2cd3d8e1d47fee1a986d25430f2a1c3d8592221d8e8714ccf298498
6
+ metadata.gz: 5c708755ac0db269805376f4f4285377b24cbbc78e765a9ef7f83fe469bc9f85cdd552c4d62f76fc4005e70b8e7b5e4517aa945fcd0adbeedef1d93c983baff2
7
+ data.tar.gz: a9d7ebd15e82250a46cf6dd8c41c88e239aa5fbf43c1544b6f629aa3b383c28f3984aba1ff3b7b3d255058237bce401a7092f1b1ac026b04d8a832ad2063c819
checksums.yaml.gz.sig CHANGED
Binary file
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2016 The Kompanee, Ltd
1
+ Copyright (c) 2010-2019 The Kompanee, Ltd
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,38 +1,131 @@
1
1
  Ruby/ProgressBar
2
- ================================
3
- [![Gem Version](https://img.shields.io/gem/v/ruby-progressbar.svg)](https://rubygems.org/gems/ruby-progressbar) ![Rubygems Rank Overall](https://img.shields.io/gem/rt/ruby-progressbar.svg) ![Rubygems Rank Daily](https://img.shields.io/gem/rd/ruby-progressbar.svg) ![Rubygems Downloads](https://img.shields.io/gem/dv/ruby-progressbar/stable.svg) [![Build Status](https://img.shields.io/travis/jfelchner/ruby-progressbar/master.svg)](http://travis-ci.org/jfelchner/ruby-progressbar) [![Code Climate](https://codeclimate.com/github/jfelchner/ruby-progressbar.svg)](https://codeclimate.com/github/jfelchner/ruby-progressbar) [![Code Climate](https://codeclimate.com/github/jfelchner/ruby-progressbar/coverage.svg)](https://codeclimate.com/github/jfelchner/ruby-progressbar)
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 HEAD** with a **PURE RUSH** of progress bar excitement!
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 know that your gem or app can survive _in the cage_ then YOU WANT **RUBY-PROGRESSBAR**!
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><br><br>
41
+ <br>
12
42
 
13
- Full Reference
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
- There's gotten to be too much awesome to pack into one page. Visit the [wiki](https://github.com/jfelchner/ruby-progressbar/wiki) for the full documentation.
62
+ ### Creation
17
63
 
18
- Here's a [quick link](https://github.com/jfelchner/ruby-progressbar/wiki/Basic-Usage) to the 'Basic Usage' section.
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
+ ![Basic Usage Marking Progress](http://kompanee-public-assets.s3.amazonaws.com/readmes/ruby-progressbar-basic-usage-marking-progress-2.gif)
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](https://github.com/jfelchner/ruby-progressbar/issues).
104
+ If you have problems, please create a [Github issue][issues].
24
105
 
25
106
  Credits
26
- --------------------------------
107
+ --------------------------------------------------------------------------------
27
108
 
28
- ![The Kompanee](https://kompanee-public-assets.s3.amazonaws.com/readmes/kompanee-horizontal-black.png)
109
+ ![The Kompanee][kompanee-logo]
29
110
 
30
- ruby-progressbar is maintained by [The Kompanee, Ltd.](http://www.thekompanee.com)
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 &copy; 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 &copy; 2008 [Satoru Takabayashi][satoru]
36
122
 
37
- ruby-progressbar 1.0 is Copyright &copy; 2011-2019 The Kompanee. It is free software, and may be redistributed under the terms specified in the LICENSE file.
38
- ruby-progressbar 0.9.0 is Copyright &copy; 2008 [Satoru Takabayashi](http://0xcc.net)
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
data/lib/progressbar.rb CHANGED
@@ -1,15 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ruby-progressbar/output'
4
- require 'ruby-progressbar/outputs/tty'
5
- require 'ruby-progressbar/outputs/non_tty'
6
- require 'ruby-progressbar/timer'
7
- require 'ruby-progressbar/progress'
8
- require 'ruby-progressbar/throttle'
9
- require 'ruby-progressbar/calculators/length'
10
- require 'ruby-progressbar/calculators/running_average'
11
- require 'ruby-progressbar/components'
12
- require 'ruby-progressbar/format'
13
3
  require 'ruby-progressbar/base'
14
4
  require 'ruby-progressbar/refinements' if Module.
15
5
  private_instance_methods.
@@ -1,5 +1,17 @@
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/timer'
14
+
3
15
  class ProgressBar
4
16
  class Base
5
17
  extend Forwardable
@@ -13,7 +25,7 @@ class Base
13
25
  :progress,
14
26
  :total
15
27
 
16
- def initialize(options = {})
28
+ def initialize(options = {}) # rubocop:disable Metrics/AbcSize
17
29
  self.autostart = options.fetch(:autostart, true)
18
30
  self.autofinish = options.fetch(:autofinish, true)
19
31
  self.finished = false
@@ -21,14 +33,14 @@ class Base
21
33
  self.timer = Timer.new(options)
22
34
  self.progressable = Progress.new(options)
23
35
 
24
- options = options.merge(:timer => timer,
25
- :progress => progressable)
36
+ options = options.merge(:progress => progressable,
37
+ :timer => timer)
26
38
 
27
- self.title_comp = Components::Title.new(options)
28
- self.bar = Components::Bar.new(options)
29
- self.percentage = Components::Percentage.new(options)
30
- self.rate = Components::Rate.new(options)
31
- self.time = Components::Time.new(options)
39
+ self.title_component = Components::Title.new(options)
40
+ self.bar_component = Components::Bar.new(options)
41
+ self.percentage_component = Components::Percentage.new(options)
42
+ self.rate_component = Components::Rate.new(options)
43
+ self.time_component = Components::Time.new(options)
32
44
 
33
45
  self.output = Output.detect(options.merge(:bar => self))
34
46
  @format = Format::String.new(output.resolve_format(options[:format]))
@@ -102,19 +114,19 @@ class Base
102
114
  end
103
115
 
104
116
  def progress_mark=(mark)
105
- output.refresh_with_format_change { bar.progress_mark = mark }
117
+ output.refresh_with_format_change { bar_component.progress_mark = mark }
106
118
  end
107
119
 
108
120
  def remainder_mark=(mark)
109
- output.refresh_with_format_change { bar.remainder_mark = mark }
121
+ output.refresh_with_format_change { bar_component.remainder_mark = mark }
110
122
  end
111
123
 
112
124
  def title
113
- title_comp.title
125
+ title_component.title
114
126
  end
115
127
 
116
128
  def title=(title)
117
- output.refresh_with_format_change { title_comp.title = title }
129
+ output.refresh_with_format_change { title_component.title = title }
118
130
  end
119
131
 
120
132
  def to_s(new_format = nil)
@@ -123,29 +135,29 @@ class Base
123
135
  Format::Formatter.process(@format, output.length, self)
124
136
  end
125
137
 
126
- # rubocop:disable Metrics/AbcSize, Metrics/LineLength
138
+ # rubocop:disable Metrics/AbcSize, Layout/LineLength
127
139
  def to_h
128
140
  {
129
141
  'output_stream' => output.__send__(:stream),
130
142
  'length' => output.length,
131
- 'title' => title_comp.title,
132
- 'progress_mark' => bar.progress_mark,
133
- 'remainder_mark' => bar.remainder_mark,
143
+ 'title' => title_component.title,
144
+ 'progress_mark' => bar_component.progress_mark,
145
+ 'remainder_mark' => bar_component.remainder_mark,
134
146
  'progress' => progressable.progress,
135
147
  'total' => progressable.total,
136
148
  'percentage' => progressable.percentage_completed_with_precision.to_f,
137
- 'elapsed_time_in_seconds' => time.__send__(:timer).elapsed_seconds,
138
- 'estimated_time_remaining_in_seconds' => time.__send__(:estimated_seconds_remaining),
139
- 'base_rate_of_change' => rate.__send__(:base_rate),
140
- 'scaled_rate_of_change' => rate.__send__(:scaled_rate),
141
- 'unknown_progress_animation_steps' => bar.upa_steps,
149
+ 'elapsed_time_in_seconds' => time_component.__send__(:timer).elapsed_seconds,
150
+ 'estimated_time_remaining_in_seconds' => time_component.__send__(:estimated_seconds_remaining),
151
+ 'base_rate_of_change' => rate_component.__send__(:base_rate),
152
+ 'scaled_rate_of_change' => rate_component.__send__(:scaled_rate),
153
+ 'unknown_progress_animation_steps' => bar_component.upa_steps,
142
154
  'throttle_rate' => output.__send__(:throttle).rate,
143
155
  'started?' => started?,
144
156
  'stopped?' => stopped?,
145
157
  'finished?' => finished?
146
158
  }
147
159
  end
148
- # rubocop:enable Metrics/AbcSize, Metrics/LineLength
160
+ # rubocop:enable Metrics/AbcSize, Layout/LineLength
149
161
 
150
162
  def inspect
151
163
  "#<ProgressBar:#{progress}/#{total || 'unknown'}>"
@@ -164,11 +176,11 @@ class Base
164
176
  attr_accessor :output,
165
177
  :timer,
166
178
  :progressable,
167
- :title_comp,
168
- :bar,
169
- :percentage,
170
- :rate,
171
- :time,
179
+ :title_component,
180
+ :bar_component,
181
+ :percentage_component,
182
+ :rate_component,
183
+ :time_component,
172
184
  :autostart,
173
185
  :autofinish,
174
186
  :finished
@@ -50,7 +50,6 @@ 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
 
@@ -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
@@ -0,0 +1,9 @@
1
+ class ProgressBar
2
+ module Calculators
3
+ class SmoothedAverage
4
+ def self.calculate(current_average, new_value_to_average, rate)
5
+ (new_value_to_average * (1.0 - rate)) + (current_average * rate)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -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
@@ -7,10 +7,8 @@ class Percentage
7
7
  self.progress = options[:progress]
8
8
  end
9
9
 
10
- private
11
-
12
10
  def percentage
13
- progress.percentage_completed
11
+ progress.percentage_completed.to_s
14
12
  end
15
13
 
16
14
  def justified_percentage
@@ -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 unless elapsed_seconds > 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,56 @@ 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.out_of_bounds_time_format = options[:out_of_bounds_time_format]
18
- self.timer = options[:timer]
19
- self.progress = options[:progress]
22
+ self.timer = options[:timer]
23
+ self.progress = options[:progress]
20
24
  end
21
25
 
22
- def estimated_with_label
23
- "#{ESTIMATED_LABEL}: #{estimated}"
26
+ def estimated_with_label(out_of_bounds_time_format = nil)
27
+ "#{ESTIMATED_LABEL}: #{estimated(out_of_bounds_time_format)}"
24
28
  end
25
29
 
26
30
  def elapsed_with_label
27
31
  "#{ELAPSED_LABEL}: #{elapsed}"
28
32
  end
29
33
 
30
- protected
31
-
32
34
  def estimated_with_no_oob
33
- self.out_of_bounds_time_format = nil
34
-
35
- estimated_with_elapsed_fallback
35
+ estimated_with_elapsed_fallback(nil)
36
36
  end
37
37
 
38
38
  def estimated_with_unknown_oob
39
- self.out_of_bounds_time_format = :unknown
40
-
41
- estimated_with_elapsed_fallback
39
+ estimated_with_elapsed_fallback(:unknown)
42
40
  end
43
41
 
44
42
  def estimated_with_friendly_oob
45
- self.out_of_bounds_time_format = :friendly
46
-
47
- estimated_with_elapsed_fallback
43
+ estimated_with_elapsed_fallback(:friendly)
48
44
  end
49
45
 
50
- attr_reader :out_of_bounds_time_format
51
- attr_accessor :timer,
52
- :progress
46
+ def estimated_wall_clock
47
+ return timer.stopped_at.strftime(WALL_CLOCK_FORMAT) if progress.finished?
48
+ return NO_TIME_ELAPSED_TEXT unless timer.started?
53
49
 
54
- def out_of_bounds_time_format=(format)
55
- unless OOB_TIME_FORMATS.include? format
56
- fail 'Invalid Out Of Bounds time format. Valid formats are ' +
57
- OOB_TIME_FORMATS.inspect
58
- end
50
+ memo_estimated_seconds_remaining = estimated_seconds_remaining
51
+ return NO_TIME_ELAPSED_TEXT unless memo_estimated_seconds_remaining
59
52
 
60
- @out_of_bounds_time_format = format
53
+ (timer.now + memo_estimated_seconds_remaining).
54
+ strftime(WALL_CLOCK_FORMAT)
61
55
  end
62
56
 
57
+ protected
58
+
59
+ attr_accessor :timer,
60
+ :progress
61
+
63
62
  private
64
63
 
65
- def estimated
64
+ def estimated(out_of_bounds_time_format)
66
65
  memo_estimated_seconds_remaining = estimated_seconds_remaining
67
66
 
68
67
  return OOB_UNKNOWN_TIME_TEXT unless memo_estimated_seconds_remaining
@@ -70,7 +69,7 @@ class Time
70
69
  hours, minutes, seconds = timer.divide_seconds(memo_estimated_seconds_remaining)
71
70
 
72
71
  if hours > OOB_LIMIT_IN_HOURS && out_of_bounds_time_format
73
- out_of_bounds_time
72
+ OOB_TEXT_TO_FORMAT.fetch(out_of_bounds_time_format)
74
73
  else
75
74
  TIME_FORMAT % [hours, minutes, seconds]
76
75
  end
@@ -84,23 +83,16 @@ class Time
84
83
  TIME_FORMAT % [hours, minutes, seconds]
85
84
  end
86
85
 
87
- def estimated_with_elapsed_fallback
88
- progress.finished? ? elapsed_with_label : estimated_with_label
86
+ def estimated_with_elapsed_fallback(out_of_bounds_time_format)
87
+ return elapsed_with_label if progress.finished?
88
+
89
+ estimated_with_label(out_of_bounds_time_format)
89
90
  end
90
91
 
91
92
  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
93
+ return if progress.unknown? || progress.none? || timer.stopped? || timer.reset?
96
94
 
97
- def out_of_bounds_time
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
95
+ (timer.elapsed_seconds * ((progress.total / progress.running_average) - 1)).round
104
96
  end
105
97
  end
106
98
  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 = (bar_length < 0) ? 0 : 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 => [:title_comp, :title],
6
- :T => [:title_comp, :title],
7
- :c => [:progressable, :progress],
8
- :C => [:progressable, :total],
9
- :u => [:progressable, :total_with_unknown_indicator],
10
- :p => [:percentage, :percentage],
11
- :P => [:percentage, :percentage_with_precision],
12
- :j => [:percentage, :justified_percentage],
13
- :J => [:percentage, :justified_percentage_with_precision],
14
- :a => [:time, :elapsed_with_label],
15
- :e => [:time, :estimated_with_unknown_oob],
16
- :E => [:time, :estimated_with_friendly_oob],
17
- :f => [:time, :estimated_with_no_oob],
18
- :B => [:bar, :complete_bar],
19
- :b => [:bar, :bar],
20
- :W => [:bar, :complete_bar_with_percentage],
21
- :w => [:bar, :bar_with_percentage],
22
- :i => [:bar, :incomplete_space],
23
- :r => [:rate, :rate_of_change],
24
- :R => [:rate, :rate_of_change_with_precision]
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,3 +1,5 @@
1
+ require 'ruby-progressbar/format/molecule'
2
+
1
3
  class ProgressBar
2
4
  module Format
3
5
  class String < ::String
@@ -29,7 +31,7 @@ class String < ::String
29
31
  end
30
32
 
31
33
  molecules
32
- end
34
+ end
33
35
  end
34
36
  end
35
37
  end
@@ -1,3 +1,6 @@
1
+ require 'ruby-progressbar/calculators/length'
2
+ require 'ruby-progressbar/throttle'
3
+
1
4
  class ProgressBar
2
5
  class Output
3
6
  DEFAULT_OUTPUT_STREAM = $stdout
@@ -17,7 +17,7 @@ class Tty < Output
17
17
  end
18
18
 
19
19
  def default_format
20
- DEFAULT_FORMAT_STRING
20
+ ENV['RUBY_PROGRESS_BAR_FORMAT'] || DEFAULT_FORMAT_STRING
21
21
  end
22
22
 
23
23
  def resolve_format(other_format)
@@ -1,21 +1,33 @@
1
1
  require 'ruby-progressbar/errors/invalid_progress_error'
2
+ require 'ruby-progressbar/calculators/smoothed_average'
2
3
 
3
4
  class ProgressBar
4
5
  class Progress
5
- DEFAULT_TOTAL = 100
6
- DEFAULT_BEGINNING_POSITION = 0
7
- DEFAULT_SMOOTHING = 0.1
6
+ DEFAULT_TOTAL = 100
7
+ DEFAULT_BEGINNING_POSITION = 0
8
+ DEFAULT_RUNNING_AVERAGE_RATE = 0.1
9
+ DEFAULT_RUNNING_AVERAGE_CALCULATOR = ProgressBar::Calculators::SmoothedAverage
10
+
11
+ RUNNING_AVERAGE_CALCULATOR_MAP = {
12
+ 'smoothing' => ProgressBar::Calculators::SmoothedAverage
13
+ }.freeze
8
14
 
9
15
  attr_reader :total,
10
16
  :progress
11
17
 
12
18
  attr_accessor :starting_position,
13
19
  :running_average,
14
- :smoothing
20
+ :running_average_calculator,
21
+ :running_average_rate
15
22
 
16
23
  def initialize(options = {})
17
- self.total = options.fetch(:total, DEFAULT_TOTAL)
18
- self.smoothing = options[:smoothing] || DEFAULT_SMOOTHING
24
+ self.total = options.fetch(:total, DEFAULT_TOTAL)
25
+ self.running_average_rate = options[:smoothing] ||
26
+ options[:running_average_rate] ||
27
+ DEFAULT_RUNNING_AVERAGE_RATE
28
+ self.running_average_calculator = RUNNING_AVERAGE_CALCULATOR_MAP.
29
+ fetch(options[:running_average_calculator],
30
+ DEFAULT_RUNNING_AVERAGE_CALCULATOR)
19
31
 
20
32
  start :at => DEFAULT_BEGINNING_POSITION
21
33
  end
@@ -66,9 +78,9 @@ class Progress
66
78
 
67
79
  @progress = new_progress
68
80
 
69
- self.running_average = Calculators::RunningAverage.calculate(running_average,
70
- absolute,
71
- smoothing)
81
+ self.running_average = running_average_calculator.calculate(running_average,
82
+ absolute,
83
+ running_average_rate)
72
84
  end
73
85
 
74
86
  def total=(new_total)
@@ -13,7 +13,7 @@ refine ::Enumerator do
13
13
  end
14
14
  end
15
15
 
16
- return chain unless block_given?
16
+ return chain unless block
17
17
 
18
18
  chain.each(&block)
19
19
  end
@@ -17,11 +17,9 @@ class Time
17
17
  end
18
18
 
19
19
  def unmocked_time_method
20
- @unmocked_time_method ||= begin
21
- TIME_MOCKING_LIBRARY_METHODS.find do |method|
22
- time.respond_to? method
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
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  class ProgressBar
2
- VERSION = '1.10.1'.freeze
2
+ VERSION = '1.12.0'.freeze
3
3
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: progressbar
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.1
4
+ version: 1.12.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
- dW50c19ydWJ5Z2Vtcy9EQz10aGVrb21wYW5lZS9EQz1jb20wHhcNMTgwODAzMjEz
16
- NDA1WhcNMTkwODAzMjEzNDA1WjAyMTAwLgYDVQQDDCdhY2NvdW50c19ydWJ5Z2Vt
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
- YnlnZW1zQHRoZWtvbXBhbmVlLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEANh9Y8ccw
30
- o3/+ZNjNhewsxip/oj8NZHRBLfrSXNT8nIxlB/CrHXHJ5UvJmsH45MYnU8Blsm04
31
- T6PNtZIh8sPWF0ByU/gJhs23C2CGgeDrijZWL/VcOK8ErhLd92lrtXiCei4mexo5
32
- flFW1vLZVTJRiXzVSmuBLkrhQE7BqSHvUTz2vkyf4f/G9jnqp+8Tf0IRZiPGFi82
33
- 2qI/IOGmCb8Oqybt4lcHymLZBYPmj1hb/HVxEWTmQ9Y6ePHSonoK+QZf6Vi+wKga
34
- JxeLxFp0fQc+Mfjx+bFdJgOhcXMjLnDtAaQoDkQfRvQmCTKkXUhNRoTiWtxojkjX
35
- 8mN+AQ66SKTSztEZRZWizqWmTUtkSG+IKlL5E9fUkLYsKV3xgiuwgh+3vSdz398u
36
- KuaMSG4L1U+uHNl3upTjh6wZjzKptsxE0eHSeTlt74ei2EZ4XpDQgMAdxnG19eUY
37
- Ew38fD/eb7KjFt6HWjaE88pp12uYoAUV0xTysHhml+rk1/rn/h3T1Exa
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: 2019-05-28 00:00:00.000000000 Z
39
+ date: 2023-03-01 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: warning_filter
84
+ name: timecop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.0.6
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.0.6
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,13 @@ files:
123
109
  - lib/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
112
+ - lib/ruby-progressbar/calculators/smoothed_average.rb
128
113
  - lib/ruby-progressbar/components/bar.rb
129
114
  - lib/ruby-progressbar/components/percentage.rb
130
115
  - lib/ruby-progressbar/components/rate.rb
131
116
  - lib/ruby-progressbar/components/time.rb
132
117
  - lib/ruby-progressbar/components/title.rb
133
118
  - lib/ruby-progressbar/errors/invalid_progress_error.rb
134
- - lib/ruby-progressbar/format.rb
135
119
  - lib/ruby-progressbar/format/formatter.rb
136
120
  - lib/ruby-progressbar/format/molecule.rb
137
121
  - lib/ruby-progressbar/format/string.rb
@@ -152,7 +136,7 @@ licenses:
152
136
  metadata:
153
137
  bug_tracker_uri: https://github.com/jfelchner/ruby-progressbar/issues
154
138
  changelog_uri: https://github.com/jfelchner/ruby-progressbar/blob/master/CHANGELOG.md
155
- documentation_uri: https://github.com/jfelchner/ruby-progressbar/tree/releases/v1.10.1
139
+ documentation_uri: https://github.com/jfelchner/ruby-progressbar/tree/releases/v1.12.0
156
140
  homepage_uri: https://github.com/jfelchner/ruby-progressbar
157
141
  source_code_uri: https://github.com/jfelchner/ruby-progressbar
158
142
  wiki_uri: https://github.com/jfelchner/ruby-progressbar/wiki
@@ -171,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
171
155
  - !ruby/object:Gem::Version
172
156
  version: '0'
173
157
  requirements: []
174
- rubygems_version: 3.0.3
158
+ rubygems_version: 3.1.6
175
159
  signing_key:
176
160
  specification_version: 4
177
161
  summary: Ruby/ProgressBar is a flexible text progress bar library for Ruby.
metadata.gz.sig CHANGED
Binary file
@@ -1,9 +0,0 @@
1
- class ProgressBar
2
- module Calculators
3
- class RunningAverage
4
- def self.calculate(current_average, new_value_to_average, smoothing_factor)
5
- new_value_to_average * (1.0 - smoothing_factor) + current_average * smoothing_factor
6
- end
7
- end
8
- end
9
- end
@@ -1,5 +0,0 @@
1
- require 'ruby-progressbar/components/bar'
2
- require 'ruby-progressbar/components/percentage'
3
- require 'ruby-progressbar/components/rate'
4
- require 'ruby-progressbar/components/time'
5
- require 'ruby-progressbar/components/title'
@@ -1,3 +0,0 @@
1
- require 'ruby-progressbar/format/molecule'
2
- require 'ruby-progressbar/format/formatter'
3
- require 'ruby-progressbar/format/string'