progress_bar 0.1.0 → 0.2.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.
@@ -1,3 +1,3 @@
1
1
  module ProgressBar
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/progress_bar.rb CHANGED
@@ -2,26 +2,27 @@
2
2
  require 'options'
3
3
  require 'highline'
4
4
 
5
- require File.join(File.dirname(__FILE__), 'progress_bar', 'time_formatter')
6
- require File.join(File.dirname(__FILE__), 'progress_bar', 'meter')
7
- require File.join(File.dirname(__FILE__), 'progress_bar', 'meters')
8
-
9
5
  class ProgressBar
10
6
 
11
- attr_accessor :count, :max, :start
7
+ attr_accessor :count, :max, :start, :meters
8
+
9
+ def initialize(max = 100, meters = :all)
12
10
 
13
- def initialize *args, &block
14
- args, options = Options.parse args
11
+ @count = 0
12
+ @max = max
13
+ @start = Time.now
15
14
 
16
- @count = options[:count] || 0
17
- @max = options[:max] || 100
18
- @start = Time.now
15
+ if meters == :all
16
+ @meters = [:bar, :counter, :percentage, :elapsed, :eta, :rate]
17
+ else
18
+ @meters = meters
19
+ end
19
20
 
20
21
  @hl = HighLine.new
21
22
  end
22
23
 
23
- def increment!
24
- self.count = count.succ
24
+ def increment!(count = 1)
25
+ self.count += count
25
26
  write
26
27
  end
27
28
 
@@ -30,33 +31,38 @@ class ProgressBar
30
31
  print to_s
31
32
  end
32
33
 
33
- def bar(width = terminal_width)
34
- Bar.new(count, max, width)
34
+ def remaining
35
+ max - count
35
36
  end
36
37
 
37
- def counter
38
- Counter.new(count, max)
38
+ def ratio
39
+ count.to_f / max
39
40
  end
40
41
 
41
42
  def percentage
42
- Percentage.new(count, max)
43
+ ratio * 100
43
44
  end
44
45
 
45
46
  def elapsed
46
- Elapsed.new(start)
47
+ Time.now - start
48
+ end
49
+
50
+ def rate
51
+ if count > 0
52
+ count / elapsed
53
+ else
54
+ 0
55
+ end
47
56
  end
48
57
 
49
58
  def eta
50
- ETA.new(start, count, max)
59
+ remaining / rate
51
60
  end
52
61
 
53
62
  def to_s
54
- width = terminal_width -
55
- (counter.width + 1) -
56
- (percentage.width + 1) -
57
- (elapsed.width + 1) -
58
- (eta.width + 1)
59
- "#{bar(width)} #{counter} #{percentage} #{elapsed} #{eta}"
63
+ meters.inject("") do |text, meter|
64
+ text << render(meter) + " "
65
+ end.strip
60
66
  end
61
67
 
62
68
  protected
@@ -65,8 +71,86 @@ class ProgressBar
65
71
  print "\r"
66
72
  end
67
73
 
74
+ def render(meter)
75
+ send(:"render_#{meter}")
76
+ end
77
+
78
+ def width_of(meter)
79
+ send(:"#{meter}_width")
80
+ end
81
+
82
+ def render_bar
83
+ "[" +
84
+ "#" * (ratio * (bar_width - 2)).ceil +
85
+ " " * ((1-ratio) * (bar_width - 2)).floor +
86
+ "]"
87
+ end
88
+
89
+ def render_counter
90
+ "[%#{max.to_s.length}i/%i]" % [count, max]
91
+ end
92
+
93
+ def render_percentage
94
+ format = (max % 10 == 0 ? "%3i" : "%6.2f")
95
+ "[#{format}%%]" % percentage
96
+ end
97
+
98
+ def render_elapsed
99
+ "[#{format_interval(elapsed)}]"
100
+ end
101
+
102
+ def render_eta
103
+ "[#{format_interval(eta)}]"
104
+ end
105
+
106
+ def render_rate
107
+ "[%.2f/s]" % rate
108
+ end
109
+
68
110
  def terminal_width
69
111
  @hl.output_cols.to_i
70
112
  end
71
113
 
114
+ def bar_width
115
+ terminal_width - non_bar_width
116
+ end
117
+
118
+ def non_bar_width
119
+ meters.reject { |m| m == :bar }.inject(0) do |width, meter|
120
+ width += width_of(meter) + 1
121
+ end
122
+ end
123
+
124
+ def counter_width # [ 1/100]
125
+ max.to_s.length * 2 + 3
126
+ end
127
+
128
+ def percentage_width
129
+ if max == 100 # [ 24%]
130
+ 6
131
+ else # [ 24.0%]
132
+ 8
133
+ end
134
+ end
135
+
136
+ def elapsed_width
137
+ format_interval(elapsed).length + 2
138
+ end
139
+
140
+ def eta_width
141
+ format_interval(eta).length + 2
142
+ end
143
+
144
+ def rate_width # [ 23.45/s]
145
+ render_rate.length
146
+ end
147
+
148
+ def format_interval(interval)
149
+ if interval > 3600
150
+ "%02i:%02i:%02i" % [interval/3600, interval%3600/60, interval%60]
151
+ else
152
+ "%02i:%02i" % [interval/60, interval%60]
153
+ end
154
+ end
155
+
72
156
  end
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: progress_bar
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease:
5
- version: 0.1.0
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
6
11
  platform: ruby
7
12
  authors:
8
13
  - Paul Sasauskas
@@ -10,7 +15,7 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-04-06 00:00:00 -06:00
18
+ date: 2011-04-08 00:00:00 -06:00
14
19
  default_executable:
15
20
  dependencies: []
16
21
 
@@ -29,19 +34,13 @@ files:
29
34
  - README.mkd
30
35
  - Rakefile
31
36
  - lib/progress_bar.rb
32
- - lib/progress_bar/meter.rb
33
- - lib/progress_bar/meters.rb
34
37
  - lib/progress_bar/meters/bar.rb
35
38
  - lib/progress_bar/meters/counter.rb
36
39
  - lib/progress_bar/meters/elapsed.rb
37
40
  - lib/progress_bar/meters/eta.rb
38
41
  - lib/progress_bar/meters/percentage.rb
39
- - lib/progress_bar/time_formatter.rb
40
42
  - lib/progress_bar/version.rb
41
43
  - progress_bar.gemspec
42
- - test/counter_test.rb
43
- - test/elapsed_test.rb
44
- - test/eta_test.rb
45
44
  - test/progres_bar_test.rb
46
45
  - test/test_helper.rb
47
46
  has_rdoc: true
@@ -58,23 +57,26 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - ">="
60
59
  - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
61
63
  version: "0"
62
64
  required_rubygems_version: !ruby/object:Gem::Requirement
63
65
  none: false
64
66
  requirements:
65
67
  - - ">="
66
68
  - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
67
72
  version: "0"
68
73
  requirements: []
69
74
 
70
75
  rubyforge_project: progress_bar
71
- rubygems_version: 1.6.2
76
+ rubygems_version: 1.5.2
72
77
  signing_key:
73
78
  specification_version: 3
74
79
  summary: Simple Progress Bar for output to a terminal
75
80
  test_files:
76
- - test/counter_test.rb
77
- - test/elapsed_test.rb
78
- - test/eta_test.rb
79
81
  - test/progres_bar_test.rb
80
82
  - test/test_helper.rb
@@ -1,5 +0,0 @@
1
-
2
- class ProgressBar
3
- class Meter
4
- end
5
- end
@@ -1,10 +0,0 @@
1
-
2
- %w[
3
- counter
4
- bar
5
- percentage
6
- elapsed
7
- eta
8
- ].each do |meter|
9
- require File.join(File.dirname(__FILE__), 'meters', meter)
10
- end
@@ -1,15 +0,0 @@
1
-
2
- class ProgressBar
3
- module TimeFormatter
4
-
5
- def format_interval(interval)
6
- if interval > 3600
7
- "%02i:%02i:%02i" % [interval/3600, interval%3600/60, interval%60]
8
- else
9
- "%02i:%02i" % [interval/60, interval%60]
10
- end
11
- end
12
-
13
- end
14
- end
15
-
data/test/counter_test.rb DELETED
@@ -1,15 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
-
3
- describe "Counter formatter" do
4
- before do
5
- @counter = ProgressBar::Counter.new(50, 100)
6
- end
7
-
8
- it 'should format properly' do
9
- @counter.to_s.must_equal "[ 50/100]"
10
- end
11
-
12
- it 'should have the correct width' do
13
- @counter.width.must_equal 9
14
- end
15
- end
data/test/elapsed_test.rb DELETED
@@ -1,33 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
-
3
- describe "Elapsed formatter" do
4
- before do
5
- start = Time.now - 60
6
- @elapsed = ProgressBar::Elapsed.new(start)
7
- end
8
-
9
- it 'should format properly' do
10
- @elapsed.to_s.must_equal "[01:00]"
11
- end
12
-
13
- it 'should have the correct width' do
14
- @elapsed.width.must_equal 7
15
- end
16
-
17
- describe "long running tasks" do
18
- before do
19
- start = Time.now - 6*3600
20
- @elapsed = ProgressBar::Elapsed.new(start)
21
- end
22
-
23
- it 'should format properly' do
24
- @elapsed.to_s.must_equal "[06:00:00]"
25
- end
26
-
27
- it 'should have the correct width' do
28
- @elapsed.width.must_equal 10
29
- end
30
-
31
- end
32
-
33
- end
data/test/eta_test.rb DELETED
@@ -1,44 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
-
3
- describe "ETA formatter" do
4
- before do
5
- start = Time.now - 60
6
- @eta = ProgressBar::ETA.new(start, 50, 100)
7
- end
8
-
9
- it 'should format properly' do
10
- @eta.to_s.must_equal "[ETA: 01:00]"
11
- end
12
-
13
- it 'should have the correct width' do
14
- @eta.width.must_equal 12
15
- end
16
-
17
- it 'should be 0 at the end' do
18
- eta = ProgressBar::ETA.new(Time.now - 5, 100, 100)
19
- eta.remaining.must_equal 0
20
- end
21
-
22
- it 'should not have an error at the start' do
23
- eta = ProgressBar::ETA.new(Time.now, 0, 100)
24
- eta.remaining.must_equal 0
25
- eta.to_s.must_equal "[ETA: 00:00]"
26
- end
27
-
28
- describe "long running tasks" do
29
- before do
30
- start = Time.now - 6*3600
31
- @eta = ProgressBar::ETA.new(start, 50, 100)
32
- end
33
-
34
- it 'should format properly' do
35
- @eta.to_s.must_equal "[ETA: 06:00:00]"
36
- end
37
-
38
- it 'should have the correct width' do
39
- @eta.width.must_equal 15
40
- end
41
-
42
- end
43
-
44
- end