progress-monitor 2.0.2 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/progress-bar.rb +77 -0
  2. data/lib/progress-monitor.rb +169 -238
  3. metadata +20 -7
@@ -0,0 +1,77 @@
1
+ module Progress
2
+ class Progress::Bar
3
+
4
+ # Creates a new instance. Max is the total number of iterations of the
5
+ # loop. The depth represents how many other loops are above this one,
6
+ # this information is used to find the place to print the progress
7
+ # report.
8
+ #
9
+ def initialize(max,depth, num_reports, desc)
10
+ @max = max
11
+ @max = 1 if @max < 1
12
+ @current = 0
13
+ @time = Time.now
14
+ @last_report = -1
15
+ @num_reports = num_reports
16
+ @depth = depth
17
+ @desc = desc
18
+ end
19
+
20
+ # Used to register a new completed loop iteration.
21
+ #
22
+ def tick(step = nil)
23
+
24
+ if step.nil?
25
+ @current += 1
26
+ else
27
+ @current = step
28
+ end
29
+
30
+ percent = @current.to_f/ @max.to_f
31
+ if percent - @last_report > 1.to_f/@num_reports.to_f
32
+ report
33
+ @last_report=percent
34
+ end
35
+
36
+ nil
37
+ end
38
+
39
+ # Prints de progress report. It backs up as many lines as the meters
40
+ # depth. Prints the progress as a line of dots, a percentage, time
41
+ # spent, and time left. And then goes moves the cursor back to its
42
+ # original line. Everything is printed to stderr.
43
+ #
44
+ def report
45
+
46
+ percent = @current.to_f/ @max.to_f
47
+ percent = 0.001 if percent < 0.001
48
+ if @desc != ""
49
+ indicator = @desc + ": "
50
+ else
51
+ indicator = "Progress "
52
+ end
53
+ indicator += "["
54
+ 10.times{|i|
55
+ if i < percent * 10 then
56
+ indicator += "."
57
+ else
58
+ indicator += " "
59
+ end
60
+ }
61
+ indicator += "] done #{(percent * 100).to_i}% "
62
+
63
+ eta = (Time.now - @time)/percent * (1-percent)
64
+ eta = eta.to_i
65
+ eta = [eta/3600, eta/60 % 60, eta % 60].map{|t| t.to_s.rjust(2, '0')}.join(':')
66
+
67
+ used = (Time.now - @time).to_i
68
+ used = [used/3600, used/60 % 60, used % 60].map{|t| t.to_s.rjust(2, '0')}.join(':')
69
+
70
+ indicator += " (Time left #{eta} seconds) (Started #{used} seconds ago)"
71
+
72
+ STDERR.print("\033[#{@depth + 1}F\033[2K" + indicator + "\n\033[#{@depth + 2}E")
73
+ end
74
+ end
75
+ end
76
+
77
+
@@ -6,247 +6,178 @@
6
6
  # License:: MIT
7
7
  #
8
8
 
9
+ require 'progress-bar'
10
+
9
11
  # Tracks the progress of a loop. It holds information about how many
10
12
  # iterations it has to go through and how many have been executed
11
13
  # already. Every now and then, it prints the progress report.
12
- class Progress
13
-
14
- module Progress::MonitorableProgress
15
-
16
- def monitorable1(method_name)
17
- module_eval{
18
- orig_name = ('orig_' + method_name.to_s).to_sym
19
-
20
- eval "alias #{ orig_name } #{ method_name }"
21
-
22
- define_method(method_name) do |&block|
23
- if Progress.active?
24
- progress_meter = Progress.add_progress_meter(self.monitor_size) if Progress.monitor?
25
- announcement = Progress.get_announcement if Progress.announce?
26
-
27
- monitor_step = nil unless defined? monitor_step
28
-
29
- res = self.send(orig_name.to_sym) {|v|
30
- progress_meter.tick(monitor_step) if progress_meter
31
- Progress.print_announcement(announcement.call(v)) if announcement
32
- block.call(v)
33
- }
34
-
35
- Progress.remove_last_meter
36
- res
37
- else
38
- self.send(orig_name.to_sym) {|v| block.call(v)}
39
- end
40
-
41
- end
42
- }
43
- end
44
-
45
- def monitorable2(method_name)
46
- module_eval{
47
- orig_name = ('orig_' + method_name.to_s).to_sym
48
-
49
- eval "alias #{ orig_name } #{ method_name }"
50
-
51
- define_method(method_name) do |&block|
52
- if Progress.active?
53
- progress_meter = Progress.add_progress_meter(self.monitor_size) if Progress.monitor?
54
- announcement = Progress.get_announcement if Progress.announce?
55
-
56
- monitor_step = nil unless defined? monitor_step
57
-
58
- res = self.send(orig_name.to_sym) {|v1,v2|
59
- progress_meter.tick(monitor_step) if progress_meter
60
- Progress.print_announcement(announcement.call(v1,v2)) if announcement
61
- block.call(v1,v2);
62
- }
63
-
64
- Progress.remove_last_meter
65
- res
66
- else
67
- self.send(orig_name.to_sym) {|v1,v2| block.call(v1,v2) }
68
- end
69
-
70
- end
71
- }
72
- end
73
- end
74
-
75
-
76
- @@progress_meters = Array.new
77
- def self.progress_meters
78
- @@progress_meters
79
- end
80
-
81
- def self.caller_info(callers, depth = 0)
82
- return [nil, nil] if callers.length <= depth
83
-
84
- line = callers[depth]
85
- if line.match(/(.*):\d+(?::in `(.*)')/)
86
- return [$1, $2]
87
- end
88
-
89
- if line.match(/(.*):\d+/)
90
- return [$1, nil ]
91
- end
92
-
93
- info
94
- end
95
-
96
- @@monitor = false
97
- @@announce = false
98
-
99
- def self.process_options(options)
100
- @@stack_depth = options[:stack_depth]
101
- @@skip = options[:skip] || 0
102
-
103
- if options[:announcement]
104
- @@announce = true
105
- @@announcement = options[:announcement]
106
- end
107
- end
108
-
109
- # This function will activate monitoring of the next _supported_ loop.
110
- #
111
- # If a description is given as a parameter it will show at the
112
- # beginning of the progress report.
113
- def self.monitor(desc = "", options = {})
114
- @@monitor = true
115
- @@desc = desc
116
- @@num_reports = options[:num_reports] || 100
117
- @@call_info = caller_info(caller)
118
- process_options(options)
119
- end
120
-
121
- def self.announce(announcement, options = {})
122
- @@announce = true
123
- @@call_info = caller_info(caller)
124
- @@announcement = announcement
125
- process_options(options)
126
- end
127
-
128
- def self.get_announcement
129
- @@announce = false
130
- @@announcement
131
- end
132
-
133
- def self.this_loop?
134
- if @@stack_depth != nil
135
- call_info = caller_info(caller, @@stack_depth + 2)
136
- return false if call_info != @@call_info
137
- end
138
-
139
- if @@skip > 0
140
- @@skip -= 1
141
- return false
142
- else
143
- return true
144
- end
145
- end
146
-
147
- # Returns true if next loop must be monitored.
148
- #
149
- def self.monitor?
150
- return @@monitor
151
- end
152
-
153
- def self.announce?
154
- return @@announce
155
- end
156
-
157
- def self.active?
158
- return (monitor? || announce?) && this_loop?
159
- end
160
-
161
- def self.add_progress_meter(max)
162
- progress_meter = self.new(max, progress_meters.size)
163
-
164
- progress_meters.push(progress_meter)
165
-
166
- progress_meter
167
- end
168
-
169
- def self.remove_last_meter
170
- progress_meters.pop
171
- end
172
-
173
- # Creates a new instance. Max is the total number of iterations of the
174
- # loop. The depth represents how many other loops are above this one,
175
- # this information is used to find the place to print the progress
176
- # report.
177
- #
178
- def initialize(max,depth)
179
- @max = max
180
- @max = 1 if @max < 1
181
- @current = 0
182
- @time = Time.now
183
- @last_report = -1
184
- @num_reports = @@num_reports
185
- @depth = depth
186
- @desc = @@desc
187
- @@monitor = false
188
- end
189
-
190
- # Used to register a new completed loop iteration.
191
- #
192
- def tick(step = nil)
193
-
194
- if step.nil?
195
- @current += 1
196
- else
197
- @current = step
198
- end
199
-
200
- percent = @current.to_f/ @max.to_f
201
- if percent - @last_report > 1.to_f/@num_reports.to_f
202
- report
203
- @last_report=percent
204
- end
205
-
206
- nil
207
- end
208
-
209
- # Prints de progress report. It backs up as many lines as the meters
210
- # depth. Prints the progress as a line of dots, a percentage, time
211
- # spent, and time left. And then goes moves the cursor back to its
212
- # original line. Everything is printed to stderr.
213
- #
214
- def report
215
-
216
- percent = @current.to_f/ @max.to_f
217
- percent = 0.001 if percent < 0.001
218
- if @desc != ""
219
- indicator = @desc + ": "
220
- else
221
- indicator = "Progress "
222
- end
223
- indicator += "["
224
- 10.times{|i|
225
- if i < percent * 10 then
226
- indicator += "."
227
- else
228
- indicator += " "
229
- end
230
- }
231
- indicator += "] done #{(percent * 100).to_i}% "
232
-
233
- eta = (Time.now - @time)/percent * (1-percent)
234
- eta = eta.to_i
235
- eta = [eta/3600, eta/60 % 60, eta % 60].map{|t| t.to_s.rjust(2, '0')}.join(':')
236
-
237
- used = (Time.now - @time).to_i
238
- used = [used/3600, used/60 % 60, used % 60].map{|t| t.to_s.rjust(2, '0')}.join(':')
239
-
240
- indicator += " (Time left #{eta} seconds) (Started #{used} seconds ago)"
241
-
242
- $stderr.print("\033[#{@depth + 1}F\033[2K" + indicator + "\033[#{@depth + 1}E")
243
- end
244
-
245
- def self.print_announcement(message = nil)
246
- return if message.nil?
247
- total_depth = @@progress_meters.length + 1
248
- $stderr.print("\033[#{total_depth}F\033[2K" + message + "\033[#{total_depth}E")
249
- end
14
+ module Progress
15
+
16
+ module Progress::MonitorableProgress
17
+
18
+ def monitorable1(method_name)
19
+ module_eval{
20
+ orig_name = ('orig_' + method_name.to_s).to_sym
21
+
22
+ eval "alias #{ orig_name } #{ method_name }"
23
+
24
+ define_method(method_name) do |&block|
25
+ if Progress.active?
26
+ progress_meter = Progress.add_progress_meter(self.monitor_size) if Progress.monitor?
27
+ announcement = Progress.get_announcement if Progress.announce?
28
+
29
+ monitor_step = nil unless defined? monitor_step
30
+
31
+ res = self.send(orig_name.to_sym) {|v|
32
+ progress_meter.tick(monitor_step) if progress_meter
33
+ Progress.print_announcement(announcement.call(v)) if announcement
34
+ block.call(v)
35
+ }
36
+
37
+ Progress.remove_last_meter
38
+ res
39
+ else
40
+ self.send(orig_name.to_sym) {|v| block.call(v)}
41
+ end
42
+
43
+ end
44
+ }
45
+ end
46
+
47
+ def monitorable2(method_name)
48
+ module_eval{
49
+ orig_name = ('orig_' + method_name.to_s).to_sym
50
+
51
+ eval "alias #{ orig_name } #{ method_name }"
52
+
53
+ define_method(method_name) do |&block|
54
+ if Progress.active?
55
+ progress_meter = Progress.add_progress_meter(self.monitor_size) if Progress.monitor?
56
+ announcement = Progress.get_announcement if Progress.announce?
57
+
58
+ monitor_step = nil unless defined? monitor_step
59
+
60
+ res = self.send(orig_name.to_sym) {|v1,v2|
61
+ progress_meter.tick(monitor_step) if progress_meter
62
+ Progress.print_announcement(announcement.call(v1,v2)) if announcement
63
+ block.call(v1,v2);
64
+ }
65
+
66
+ Progress.remove_last_meter
67
+ res
68
+ else
69
+ self.send(orig_name.to_sym) {|v1,v2| block.call(v1,v2) }
70
+ end
71
+
72
+ end
73
+ }
74
+ end
75
+ end
76
+
77
+
78
+ @@progress_meters = Array.new
79
+ def self.progress_meters
80
+ @@progress_meters
81
+ end
82
+
83
+ def self.caller_info(callers, depth = 0)
84
+ return [nil, nil] if callers.length <= depth
85
+
86
+ line = callers[depth]
87
+ if line.match(/(.*):\d+(?::in `(.*)')/)
88
+ return [$1, $2]
89
+ end
90
+
91
+ if line.match(/(.*):\d+/)
92
+ return [$1, nil ]
93
+ end
94
+
95
+ info
96
+ end
97
+
98
+ @@monitor = false
99
+ @@announce = false
100
+
101
+ def self.process_options(options)
102
+ @@stack_depth = options[:stack_depth]
103
+ @@skip = options[:skip] || 0
104
+
105
+ if options[:announcement]
106
+ @@announce = true
107
+ @@announcement = options[:announcement]
108
+ end
109
+ end
110
+
111
+ # This function will activate monitoring of the next _supported_ loop.
112
+ #
113
+ # If a description is given as a parameter it will show at the
114
+ # beginning of the progress report.
115
+ def self.monitor(desc = "", options = {})
116
+ @@monitor = true
117
+ @@desc = desc
118
+ @@num_reports = options[:num_reports] || 100
119
+ @@call_info = caller_info(caller)
120
+ process_options(options)
121
+ end
122
+
123
+ def self.announce(announcement, options = {})
124
+ @@announce = true
125
+ @@call_info = caller_info(caller)
126
+ @@announcement = announcement
127
+ process_options(options)
128
+ end
129
+
130
+ def self.get_announcement
131
+ @@announce = false
132
+ @@announcement
133
+ end
134
+
135
+ def self.this_loop?
136
+ if @@stack_depth != nil
137
+ call_info = caller_info(caller, @@stack_depth + 2)
138
+ return false if call_info != @@call_info
139
+ end
140
+
141
+ if @@skip > 0
142
+ @@skip -= 1
143
+ return false
144
+ else
145
+ return true
146
+ end
147
+ end
148
+
149
+ # Returns true if next loop must be monitored.
150
+ #
151
+ def self.monitor?
152
+ return @@monitor
153
+ end
154
+
155
+ def self.announce?
156
+ return @@announce
157
+ end
158
+
159
+ def self.active?
160
+ return (monitor? || announce?) && this_loop?
161
+ end
162
+
163
+ def self.add_progress_meter(max)
164
+ progress_meter = Bar.new(max, progress_meters.size, @@num_reports, @@desc)
165
+ @@monitor = false
166
+
167
+ progress_meters.push(progress_meter)
168
+
169
+ progress_meter
170
+ end
171
+
172
+ def self.remove_last_meter
173
+ progress_meters.pop
174
+ end
175
+
176
+ def self.print_announcement(message = nil)
177
+ return if message.nil?
178
+ total_depth = @@progress_meters.length + 1
179
+ $stderr.print("\033[#{total_depth}F\033[2K" + message + "\033[#{total_depth}E")
180
+ end
250
181
  end
251
182
 
252
183
  class Integer
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: progress-monitor
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ hash: 15
5
+ prerelease:
6
+ segments:
7
+ - 2
8
+ - 1
9
+ - 2
10
+ version: 2.1.2
5
11
  platform: ruby
6
12
  authors:
7
13
  - Miguel Vazquez
@@ -9,7 +15,7 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-02-14 00:00:00 +01:00
18
+ date: 2011-10-03 00:00:00 +02:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
@@ -23,6 +29,7 @@ extra_rdoc_files:
23
29
  - LICENSE
24
30
  - README.rdoc
25
31
  files:
32
+ - lib/progress-bar.rb
26
33
  - lib/progress-monitor.rb
27
34
  - samples/announce.rb
28
35
  - samples/announce_monitor.rb
@@ -40,26 +47,32 @@ homepage: http://github.com/mikisvaz/progress-monitor
40
47
  licenses: []
41
48
 
42
49
  post_install_message:
43
- rdoc_options:
44
- - --charset=UTF-8
50
+ rdoc_options: []
51
+
45
52
  require_paths:
46
53
  - lib
47
54
  required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
48
56
  requirements:
49
57
  - - ">="
50
58
  - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
51
62
  version: "0"
52
- version:
53
63
  required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
54
65
  requirements:
55
66
  - - ">="
56
67
  - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
57
71
  version: "0"
58
- version:
59
72
  requirements: []
60
73
 
61
74
  rubyforge_project:
62
- rubygems_version: 1.3.5
75
+ rubygems_version: 1.6.2
63
76
  signing_key:
64
77
  specification_version: 3
65
78
  summary: Monitor Progress in the Command Line