progress_bar 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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