progress 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/lib/progress.rb +25 -7
- data/lib/progress/enumerable.rb +2 -2
- data/lib/progress/with_progress.rb +14 -16
- data/progress.gemspec +1 -1
- data/spec/progress_spec.rb +43 -0
- metadata +5 -5
data/lib/progress.rb
CHANGED
@@ -76,12 +76,7 @@ class Progress
|
|
76
76
|
@started_at = Time.now
|
77
77
|
@eta = nil
|
78
78
|
@semaphore = Mutex.new
|
79
|
-
|
80
|
-
loop do
|
81
|
-
sleep 1
|
82
|
-
print_message
|
83
|
-
end
|
84
|
-
end
|
79
|
+
start_beeper
|
85
80
|
end
|
86
81
|
levels << new(title, total)
|
87
82
|
print_message true
|
@@ -129,7 +124,7 @@ class Progress
|
|
129
124
|
end
|
130
125
|
levels.pop
|
131
126
|
if levels.empty?
|
132
|
-
|
127
|
+
stop_beeper
|
133
128
|
io.puts
|
134
129
|
end
|
135
130
|
end
|
@@ -217,8 +212,31 @@ class Progress
|
|
217
212
|
end
|
218
213
|
end
|
219
214
|
|
215
|
+
def start_beeper
|
216
|
+
@beeper = Thread.new do
|
217
|
+
loop do
|
218
|
+
sleep 10
|
219
|
+
print_message unless Thread.current[:skip]
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def stop_beeper
|
225
|
+
@beeper.kill
|
226
|
+
@beeper = nil
|
227
|
+
end
|
228
|
+
|
229
|
+
def restart_beeper
|
230
|
+
if @beeper
|
231
|
+
@beeper[:skip] = true
|
232
|
+
@beeper.run
|
233
|
+
@beeper[:skip] = false
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
220
237
|
def print_message(force = false)
|
221
238
|
lock force do
|
239
|
+
restart_beeper
|
222
240
|
if force || time_to_print?
|
223
241
|
inner = 0
|
224
242
|
parts, parts_cl = [], []
|
data/lib/progress/enumerable.rb
CHANGED
@@ -20,7 +20,7 @@ module Enumerable
|
|
20
20
|
# (0...100).with_progress('Numbers').all? do |numbers|
|
21
21
|
# # code
|
22
22
|
# end
|
23
|
-
def with_progress(title = nil, &block)
|
24
|
-
Progress::WithProgress.new(self, title, &block)
|
23
|
+
def with_progress(title = nil, length = nil, &block)
|
24
|
+
Progress::WithProgress.new(self, title, length, &block)
|
25
25
|
end
|
26
26
|
end
|
@@ -15,31 +15,29 @@ class Progress
|
|
15
15
|
|
16
16
|
# each object with progress
|
17
17
|
def each
|
18
|
+
enumerable, length = case
|
19
|
+
when @length
|
20
|
+
[@enumerable, @length]
|
21
|
+
when !@enumerable.respond_to?(:length) || @enumerable.is_a?(String) || (defined?(StringIO) && @enumerable.is_a?(StringIO)) || (defined?(TempFile) && @enumerable.is_a?(TempFile))
|
22
|
+
elements = @enumerable.each.to_a
|
23
|
+
[elements, elements.length]
|
24
|
+
else
|
25
|
+
[@enumerable, @enumerable.length]
|
26
|
+
end
|
27
|
+
|
18
28
|
Progress.start(@title, length) do
|
19
|
-
|
29
|
+
enumerable.each do |object|
|
20
30
|
Progress.step do
|
21
31
|
yield object
|
22
32
|
end
|
23
33
|
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
# determine number of objects
|
28
|
-
def length
|
29
|
-
@length ||= if @enumerable.respond_to?(:length) && !@enumerable.is_a?(String)
|
30
|
-
@enumerable.length
|
31
|
-
elsif @enumerable.respond_to?(:count)
|
32
|
-
@enumerable.count
|
33
|
-
elsif @enumerable.respond_to?(:to_a)
|
34
|
-
@enumerable.to_a.length
|
35
|
-
else
|
36
|
-
@enumerable.inject(0){ |length, obj| length + 1 }
|
34
|
+
@enumerable
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
40
38
|
# returns self but changes title
|
41
|
-
def with_progress(title = nil, &block)
|
42
|
-
self.class.new(@enumerable, title, @length, &block)
|
39
|
+
def with_progress(title = nil, length = nil, &block)
|
40
|
+
self.class.new(@enumerable, title, length || @length, &block)
|
43
41
|
end
|
44
42
|
end
|
45
43
|
end
|
data/progress.gemspec
CHANGED
data/spec/progress_spec.rb
CHANGED
@@ -247,6 +247,49 @@ describe Progress do
|
|
247
247
|
wp_wp.enumerable.should == wp.enumerable
|
248
248
|
end
|
249
249
|
end
|
250
|
+
|
251
|
+
describe "calls to each" do
|
252
|
+
class CallsToEach
|
253
|
+
include Enumerable
|
254
|
+
|
255
|
+
COUNT = 100
|
256
|
+
end
|
257
|
+
|
258
|
+
def init_calls_to_each
|
259
|
+
@enum = CallsToEach.new
|
260
|
+
@objects = 10.times.to_a
|
261
|
+
@enum.should_receive(:each).once{ |&block|
|
262
|
+
@objects.each(&block)
|
263
|
+
}
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should call each only one time for object with length" do
|
267
|
+
init_calls_to_each
|
268
|
+
@enum.should_receive(:length).and_return(10)
|
269
|
+
got = []
|
270
|
+
@enum.with_progress.each{ |o| got << o }.should == @enum
|
271
|
+
got.should == @objects
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should call each only one time for object without length" do
|
275
|
+
init_calls_to_each
|
276
|
+
got = []
|
277
|
+
@enum.with_progress.each{ |o| got << o }.should == @enum
|
278
|
+
got.should == @objects
|
279
|
+
end
|
280
|
+
|
281
|
+
it "should call each only one time for String" do
|
282
|
+
@objects = ('a'..'z').map{ |c| "#{c}\n" }
|
283
|
+
str = @objects.join('')
|
284
|
+
str.should_not_receive(:length)
|
285
|
+
str.should_receive(:each).once{ |&block|
|
286
|
+
@objects.each(&block)
|
287
|
+
}
|
288
|
+
got = []
|
289
|
+
str.with_progress.each{ |o| got << o }.should == str
|
290
|
+
got.should == @objects
|
291
|
+
end
|
292
|
+
end
|
250
293
|
end
|
251
294
|
end
|
252
295
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: progress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 2.
|
10
|
+
version: 2.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ivan Kuchin
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-12-
|
18
|
+
date: 2011-12-25 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rspec
|
@@ -80,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
80
|
requirements: []
|
81
81
|
|
82
82
|
rubyforge_project: progress
|
83
|
-
rubygems_version: 1.8.
|
83
|
+
rubygems_version: 1.8.12
|
84
84
|
signing_key:
|
85
85
|
specification_version: 3
|
86
86
|
summary: Show progress of long running tasks
|