progressbar 0.21.0 → 1.8.1

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE.txt +19 -0
  5. data/README.md +38 -0
  6. data/Rakefile +2 -14
  7. data/lib/progressbar.rb +14 -284
  8. data/lib/ruby-progressbar/base.rb +161 -0
  9. data/lib/ruby-progressbar/calculators/length.rb +88 -0
  10. data/lib/ruby-progressbar/calculators/length_spec.rb +9 -0
  11. data/lib/ruby-progressbar/calculators/running_average.rb +9 -0
  12. data/lib/ruby-progressbar/components.rb +5 -0
  13. data/lib/ruby-progressbar/components/bar.rb +96 -0
  14. data/lib/ruby-progressbar/components/percentage.rb +29 -0
  15. data/lib/ruby-progressbar/components/rate.rb +43 -0
  16. data/lib/ruby-progressbar/components/time.rb +103 -0
  17. data/lib/ruby-progressbar/components/title.rb +13 -0
  18. data/lib/ruby-progressbar/errors/invalid_progress_error.rb +4 -0
  19. data/lib/ruby-progressbar/format.rb +3 -0
  20. data/lib/ruby-progressbar/format/formatter.rb +27 -0
  21. data/lib/ruby-progressbar/format/molecule.rb +58 -0
  22. data/lib/ruby-progressbar/format/string.rb +36 -0
  23. data/lib/ruby-progressbar/output.rb +61 -0
  24. data/lib/ruby-progressbar/outputs/non_tty.rb +47 -0
  25. data/lib/ruby-progressbar/outputs/tty.rb +32 -0
  26. data/lib/ruby-progressbar/progress.rb +114 -0
  27. data/lib/ruby-progressbar/throttle.rb +25 -0
  28. data/lib/ruby-progressbar/time.rb +30 -0
  29. data/lib/ruby-progressbar/timer.rb +72 -0
  30. data/lib/ruby-progressbar/version.rb +3 -0
  31. data/spec/fixtures/benchmark.rb +28 -0
  32. data/spec/ruby-progressbar/base_spec.rb +949 -0
  33. data/spec/ruby-progressbar/calculators/length_calculator_spec.rb +17 -0
  34. data/spec/ruby-progressbar/calculators/running_average_spec.rb +19 -0
  35. data/spec/ruby-progressbar/components/bar_spec.rb +234 -0
  36. data/spec/ruby-progressbar/components/percentage_spec.rb +9 -0
  37. data/spec/ruby-progressbar/components/rate_spec.rb +9 -0
  38. data/spec/ruby-progressbar/components/throttle_spec.rb +157 -0
  39. data/spec/ruby-progressbar/components/time_spec.rb +307 -0
  40. data/spec/ruby-progressbar/components/title_spec.rb +12 -0
  41. data/spec/ruby-progressbar/format/formatter_spec.rb +9 -0
  42. data/spec/ruby-progressbar/format/molecule_spec.rb +30 -0
  43. data/spec/ruby-progressbar/format/string_spec.rb +9 -0
  44. data/spec/ruby-progressbar/output_spec.rb +7 -0
  45. data/spec/ruby-progressbar/outputs/non_tty_spec.rb +9 -0
  46. data/spec/ruby-progressbar/outputs/tty_spec.rb +9 -0
  47. data/spec/ruby-progressbar/progress_spec.rb +156 -0
  48. data/spec/ruby-progressbar/time_spec.rb +45 -0
  49. data/spec/ruby-progressbar/timer_spec.rb +7 -0
  50. data/spec/spec_helper.rb +6 -0
  51. data/spec/support/time.rb +17 -0
  52. metadata +134 -69
  53. metadata.gz.sig +3 -0
  54. data/.gitignore +0 -23
  55. data/.ruby-version +0 -1
  56. data/.travis.yml +0 -6
  57. data/ChangeLog +0 -113
  58. data/Gemfile +0 -4
  59. data/Gemfile.lock +0 -27
  60. data/LICENSE +0 -1
  61. data/README.rdoc +0 -116
  62. data/progressbar.gemspec +0 -29
  63. data/test/test.rb +0 -125
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b33b35967bde2d97d385a221d1967fe21fa57856
4
- data.tar.gz: 776f253cb483eb64048ad53e83c3dcef3c15a037
3
+ metadata.gz: 961db6323b945f7b6373152fb44363bfd8a6ac51
4
+ data.tar.gz: 379bef4d424ce616f2f7b98e0de4881474d3c636
5
5
  SHA512:
6
- metadata.gz: a3903d317334071b929b8b54bb1235e80a04a09ef1f18e7dcb889e085790f1dcdaf3f0cd209926d8212655a5aff2ab041a6f52a1cdbafbc31800271425dd4e42
7
- data.tar.gz: 58b62e68e5d88d86638f0b30b7894240833e11dace0a423f561489ef6671b97f2dc6807c27b15ee3c86eccf2cb59b9cad61ecd79d3f397b91a5bebbe2f750b83
6
+ metadata.gz: 45799ecf9e67670603bb0cbeb959508fbe148a30681d07c5dff599b8fb3ee9aefa06d1ac24f42552977b463760340d83724b0d4193297ffa60dcf49654d10084
7
+ data.tar.gz: 60430265e9174a0fe0a1484986d956683b8dea789683fb78c7956852bf9c5759b569d6e476ad0c6871084f32ee27ff43fd274a598985722e0d1d870870c6c90d
checksums.yaml.gz.sig ADDED
Binary file
data.tar.gz.sig ADDED
Binary file
data/LICENSE.txt ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2010-2016 The Kompanee, Ltd
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,38 @@
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)
4
+
5
+ <img src="https://www.dropbox.com/s/pe9o1yobxtubof8/ruby-progressbar-cage.png?dl=1" align="right" />
6
+
7
+ The **ultimate** text progress bar library for Ruby! It'll **SMASH YOU OVER THE HEAD** with a **PURE RUSH** of progress bar excitement!
8
+
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**!
10
+
11
+ &nbsp;
12
+
13
+ Full Reference
14
+ --------------------------------
15
+
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.
17
+
18
+ Here's a [quick link](https://github.com/jfelchner/ruby-progressbar/wiki/Basic-Usage) to the 'Basic Usage' section.
19
+
20
+ Issues
21
+ --------------------------------
22
+
23
+ If you have problems, please create a [Github issue](https://github.com/jfelchner/ruby-progressbar/issues).
24
+
25
+ Credits
26
+ --------------------------------
27
+
28
+ ![The Kompanee](https://www.dropbox.com/s/86jfka1d6bhv8as/kompanee-text-black.png?dl=1)
29
+
30
+ ruby-progressbar is maintained by [The Kompanee, Ltd.](http://www.thekompanee.com)
31
+
32
+ The names and logos for The Kompanee are trademarks of The Kompanee, Ltd.
33
+
34
+ License
35
+ --------------------------------
36
+
37
+ ruby-progressbar 1.0 is Copyright &copy; 2011-2016 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://namazu.org/~satoru/)
data/Rakefile CHANGED
@@ -1,14 +1,2 @@
1
- require 'bundler'
2
- Bundler::GemHelper.install_tasks
3
-
4
- task :default => :test
5
-
6
- require 'rake/testtask'
7
- Rake::TestTask.new(:test) do |test|
8
- test.libs << 'lib' << 'test'
9
- test.pattern = 'test/test.rb'
10
- test.verbose = true
11
- end
12
-
13
- require 'yard'
14
- YARD::Rake::YardocTask.new
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
data/lib/progressbar.rb CHANGED
@@ -1,288 +1,18 @@
1
- #
2
- # Ruby/ProgressBar - a text progress bar library
3
- #
4
- # Copyright (C) 2001-2005 Satoru Takabayashi <satoru@namazu.org>
5
- # All rights reserved.
6
- # This is free software with ABSOLUTELY NO WARRANTY.
7
- #
8
- # You can redistribute it and/or modify it under the terms
9
- # of Ruby's license.
10
- #
1
+ # frozen_string_literal: true
2
+ require 'ruby-progressbar/output'
3
+ require 'ruby-progressbar/outputs/tty'
4
+ require 'ruby-progressbar/outputs/non_tty'
5
+ require 'ruby-progressbar/timer'
6
+ require 'ruby-progressbar/progress'
7
+ require 'ruby-progressbar/throttle'
8
+ require 'ruby-progressbar/calculators/length'
9
+ require 'ruby-progressbar/calculators/running_average'
10
+ require 'ruby-progressbar/components'
11
+ require 'ruby-progressbar/format'
12
+ require 'ruby-progressbar/base'
11
13
 
12
14
  class ProgressBar
13
- VERSION = "0.21.0"
14
-
15
- def initialize (title, total, out = STDERR)
16
- @title = title
17
- @total = total
18
- @out = out
19
- @terminal_width = 80
20
- @bar_mark = "o"
21
- @current = 0
22
- @previous = 0
23
- @finished_p = false
24
- @start_time = Time.now
25
- @previous_time = @start_time
26
- @title_width = 14
27
- @format = "%-#{@title_width}s %3d%% %s %s"
28
- @format_arguments = [:title, :percentage, :bar, :stat]
29
- clear
30
- show
31
- if block_given?
32
- yield(self)
33
- finish
34
- end
35
- end
36
-
37
- attr_reader :title
38
- attr_reader :current
39
- attr_reader :total
40
- attr_accessor :start_time
41
- attr_writer :bar_mark
42
-
43
- private
44
-
45
- def fmt_bar
46
- bar_width = do_percentage * @terminal_width / 100
47
- sprintf("|%s%s|",
48
- @bar_mark * bar_width,
49
- " " * (@terminal_width - bar_width))
50
- end
51
-
52
- def fmt_percentage
53
- do_percentage
54
- end
55
-
56
- def fmt_stat
57
- if @finished_p then elapsed else eta end
58
- end
59
-
60
- def fmt_stat_for_long_run
61
- if @finished_p then elapsed else eta_running_average end
62
- end
63
-
64
- def fmt_stat_for_file_transfer
65
- if @finished_p then
66
- sprintf("%s %s %s", bytes, transfer_rate, elapsed)
67
- else
68
- sprintf("%s %s %s", bytes, transfer_rate, eta)
69
- end
70
- end
71
-
72
- def fmt_title
73
- @title[0,(@title_width - 1)] + ":"
74
- end
75
-
76
- def convert_bytes (bytes)
77
- if bytes < 1024
78
- sprintf("%6dB", bytes)
79
- elsif bytes < 1024 * 1000 # 1000kb
80
- sprintf("%5.1fKB", bytes.to_f / 1024)
81
- elsif bytes < 1024 * 1024 * 1000 # 1000mb
82
- sprintf("%5.1fMB", bytes.to_f / 1024 / 1024)
83
- else
84
- sprintf("%5.1fGB", bytes.to_f / 1024 / 1024 / 1024)
85
- end
86
- end
87
-
88
- def transfer_rate
89
- bytes_per_second = @current.to_f / (Time.now - @start_time)
90
- sprintf("%s/s", convert_bytes(bytes_per_second))
91
- end
92
-
93
- def bytes
94
- convert_bytes(@current)
95
- end
96
-
97
- def format_time (t)
98
- t = t.to_i
99
- sec = t % 60
100
- min = (t / 60) % 60
101
- hour = t / 3600
102
- sprintf("% 3d:%02d:%02d", hour, min, sec);
103
- end
104
-
105
- # ETA stands for Estimated Time of Arrival.
106
- def eta
107
- if @current == 0
108
- "ETA: --:--:--"
109
- else
110
- elapsed = Time.now - @start_time
111
- eta = elapsed * @total / @current - elapsed;
112
- sprintf("ETA: %s", format_time(eta))
113
- end
114
- end
115
-
116
- # Compute ETA with running average (better suited to long running tasks)
117
- def eta_running_average
118
- now = Time.now
119
-
120
- # update throughput running average
121
- if @total > 0 && @eta_previous && @eta_previous_time
122
- current_elapsed = @current - @eta_previous
123
- alpha = 0.9 ** current_elapsed
124
- current_progress = 1.0 * current_elapsed
125
- current_throughput = current_progress / (now - @eta_previous_time)
126
- if @eta_throughput
127
- @eta_throughput = @eta_throughput * alpha + current_throughput * (1-alpha)
128
- else
129
- @eta_throughput = current_throughput
130
- end
131
- end
132
-
133
- @eta_previous = @current
134
- @eta_previous_time = now
135
-
136
- if @eta_throughput && @eta_throughput > 0
137
- eta = (@total - @current) / @eta_throughput;
138
- sprintf("ETA: %s", format_time(eta))
139
- else
140
- "ETA: --:--:--"
141
- end
142
- end
143
-
144
- def elapsed
145
- elapsed = Time.now - @start_time
146
- sprintf("Time: %s", format_time(elapsed))
147
- end
148
-
149
- def eol
150
- if @finished_p then "\n" else "\r" end
151
- end
152
-
153
- def do_percentage
154
- if @total.zero?
155
- 100
156
- else
157
- @current * 100 / @total
158
- end
159
- end
160
-
161
- DEFAULT_WIDTH = 80
162
- def get_term_width
163
- term_width = if ENV['COLUMNS'] =~ /^\d+$/
164
- ENV['COLUMNS'].to_i
165
- elsif (RUBY_PLATFORM =~ /java/ || (!STDIN.tty? && ENV['TERM'])) && shell_command_exists?('tput')
166
- `tput cols`.to_i
167
- elsif STDIN.tty? && shell_command_exists?('stty')
168
- `stty size`.scan(/\d+/).map { |s| s.to_i }[1]
169
- else
170
- DEFAULT_WIDTH
171
- end
172
-
173
- if term_width > 0
174
- term_width
175
- else
176
- DEFAULT_WIDTH
177
- end
178
- rescue
179
- DEFAULT_WIDTH
180
- end
181
-
182
- def shell_command_exists?(command)
183
- ENV['PATH'].split(File::PATH_SEPARATOR).any?{|d| File.exists? File.join(d, command) }
184
- end
185
-
186
- def show
187
- arguments = @format_arguments.map {|method|
188
- method = sprintf("fmt_%s", method)
189
- send(method)
190
- }
191
- line = sprintf(@format, *arguments)
192
-
193
- width = get_term_width
194
- if line.length == width - 1
195
- @out.print(line + eol)
196
- @out.flush
197
- elsif line.length >= width
198
- @terminal_width = [@terminal_width - (line.length - width + 1), 0].max
199
- if @terminal_width == 0 then @out.print(line + eol) else show end
200
- else # line.length < width - 1
201
- @terminal_width += width - line.length + 1
202
- show
203
- end
204
- @previous_time = Time.now
205
- end
206
-
207
- def show_if_needed
208
- if @total.zero?
209
- cur_percentage = 100
210
- prev_percentage = 0
211
- else
212
- cur_percentage = (@current * 100 / @total).to_i
213
- prev_percentage = (@previous * 100 / @total).to_i
214
- end
215
-
216
- # Use "!=" instead of ">" to support negative changes
217
- if cur_percentage != prev_percentage ||
218
- Time.now - @previous_time >= 1 || @finished_p
219
- show
220
- end
221
- end
222
-
223
- public
224
-
225
- def clear
226
- @out.print "\r"
227
- @out.print(" " * (get_term_width - 1))
228
- @out.print "\r"
229
- end
230
-
231
- def finish
232
- @current = @total
233
- @finished_p = true
234
- show
235
- end
236
-
237
- def finished?
238
- @finished_p
239
- end
240
-
241
- def file_transfer_mode
242
- @format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer]
243
- end
244
-
245
- def long_running
246
- @format_arguments = [:title, :percentage, :bar, :stat_for_long_run]
247
- end
248
-
249
- def format= (format)
250
- @format = format
251
- end
252
-
253
- def format_arguments= (arguments)
254
- @format_arguments = arguments
255
- end
256
-
257
- def halt
258
- @finished_p = true
259
- show
260
- end
261
-
262
- def inc (step = 1)
263
- @current += step
264
- @current = @total if @current > @total
265
- show_if_needed
266
- @previous = @current
267
- end
268
-
269
- def set (count)
270
- if count < 0 || count > @total
271
- raise "invalid count: #{count} (total: #{@total})"
272
- end
273
- @current = count
274
- show_if_needed
275
- @previous = @current
276
- end
277
-
278
- def inspect
279
- "#<ProgressBar:#{@current}/#{@total}>"
280
- end
281
-
282
- end
283
-
284
- class ReversedProgressBar < ProgressBar
285
- def do_percentage
286
- 100 - super
15
+ def self.create(*args)
16
+ ProgressBar::Base.new(*args)
287
17
  end
288
18
  end
@@ -0,0 +1,161 @@
1
+ require 'forwardable'
2
+
3
+ class ProgressBar
4
+ class Base
5
+ extend Forwardable
6
+
7
+ def_delegators :output,
8
+ :clear,
9
+ :log,
10
+ :refresh
11
+
12
+ def_delegators :progressable,
13
+ :progress,
14
+ :total
15
+
16
+ def initialize(options = {})
17
+ self.autostart = options.fetch(:autostart, true)
18
+ self.autofinish = options.fetch(:autofinish, true)
19
+ self.finished = false
20
+
21
+ self.timer = Timer.new(options)
22
+ self.progressable = Progress.new(options)
23
+
24
+ options = options.merge(:timer => timer,
25
+ :progress => progressable)
26
+
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)
32
+
33
+ self.output = Output.detect(options.merge(:bar => self))
34
+ @format = Format::String.new(output.resolve_format(options[:format]))
35
+
36
+ start :at => options[:starting_at] if autostart
37
+ end
38
+
39
+ def start(options = {})
40
+ clear
41
+
42
+ timer.start
43
+ update_progress(:start, options)
44
+ end
45
+
46
+ def finish
47
+ return if finished?
48
+
49
+ output.with_refresh do
50
+ self.finished = true
51
+ progressable.finish
52
+ timer.stop
53
+ end
54
+ end
55
+
56
+ def pause
57
+ output.with_refresh { timer.pause } unless paused?
58
+ end
59
+
60
+ def stop
61
+ output.with_refresh { timer.stop } unless stopped?
62
+ end
63
+
64
+ def resume
65
+ output.with_refresh { timer.resume } if stopped?
66
+ end
67
+
68
+ def reset
69
+ output.with_refresh do
70
+ self.finished = false
71
+ progressable.reset
72
+ timer.reset
73
+ end
74
+ end
75
+
76
+ def stopped?
77
+ timer.stopped? || finished?
78
+ end
79
+
80
+ alias paused? stopped?
81
+
82
+ def finished?
83
+ finished || (autofinish && progressable.finished?)
84
+ end
85
+
86
+ def started?
87
+ timer.started?
88
+ end
89
+
90
+ def decrement
91
+ update_progress(:decrement)
92
+ end
93
+
94
+ def increment
95
+ update_progress(:increment)
96
+ end
97
+
98
+ def progress=(new_progress)
99
+ update_progress(:progress=, new_progress)
100
+ end
101
+
102
+ def total=(new_total)
103
+ update_progress(:total=, new_total)
104
+ end
105
+
106
+ def progress_mark=(mark)
107
+ output.refresh_with_format_change { bar.progress_mark = mark }
108
+ end
109
+
110
+ def remainder_mark=(mark)
111
+ output.refresh_with_format_change { bar.remainder_mark = mark }
112
+ end
113
+
114
+ def title
115
+ title_comp.title
116
+ end
117
+
118
+ def title=(title)
119
+ output.refresh_with_format_change { title_comp.title = title }
120
+ end
121
+
122
+ def to_s(new_format = nil)
123
+ self.format = new_format if new_format
124
+
125
+ Format::Formatter.process(@format, output.length, self)
126
+ end
127
+
128
+ def inspect
129
+ "#<ProgressBar:#{progress}/#{total || 'unknown'}>"
130
+ end
131
+
132
+ def format=(other)
133
+ output.refresh_with_format_change do
134
+ @format = Format::String.new(other || output.default_format)
135
+ end
136
+ end
137
+
138
+ alias format format=
139
+
140
+ protected
141
+
142
+ attr_accessor :output,
143
+ :timer,
144
+ :progressable,
145
+ :title_comp,
146
+ :bar,
147
+ :percentage,
148
+ :rate,
149
+ :time,
150
+ :autostart,
151
+ :autofinish,
152
+ :finished
153
+
154
+ def update_progress(*args)
155
+ output.with_refresh do
156
+ progressable.__send__(*args)
157
+ timer.stop if finished?
158
+ end
159
+ end
160
+ end
161
+ end