averager 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +2 -1
- data/Rakefile +1 -1
- data/lib/averager.rb +71 -14
- data/spec/averager_spec.rb +73 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/time_travel.rb +29 -0
- metadata +5 -4
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
data/lib/averager.rb
CHANGED
@@ -2,37 +2,94 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
4
|
class Averager
|
5
|
-
VERSION = '0.0.
|
5
|
+
VERSION = '0.0.3'
|
6
6
|
|
7
7
|
def initialize(options = {})
|
8
8
|
@started = Time.now
|
9
9
|
@every = options[:every] || 1000
|
10
|
-
if @
|
11
|
-
@digits = @
|
10
|
+
if @expected = options[:expected]
|
11
|
+
@digits = @expected.to_i.to_s.length
|
12
12
|
end
|
13
13
|
if options[:digits]
|
14
14
|
@digits = options[:digits]
|
15
15
|
else
|
16
16
|
@digits ||= 7
|
17
17
|
end
|
18
|
+
@log_path = options[:log_path]
|
18
19
|
@stream = options[:stream] || STDOUT
|
20
|
+
flush_stream_for_progress
|
21
|
+
@progress_bar = options[:progress_bar] == true
|
22
|
+
@i = 0
|
23
|
+
if block_given?
|
24
|
+
yield(self)
|
25
|
+
self.finish
|
26
|
+
end
|
19
27
|
end
|
20
|
-
|
21
|
-
def
|
22
|
-
if
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
|
29
|
+
def flush_stream_for_progress
|
30
|
+
if @log_path
|
31
|
+
FileUtils.mkdir_p(File.dirname(@log_path))
|
32
|
+
@stream = File.open(@log_path, "w")
|
33
|
+
else
|
34
|
+
@stream.print "\r"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def print_current?
|
39
|
+
@i % @every == 0
|
40
|
+
end
|
41
|
+
|
42
|
+
def print_current(status = nil)
|
43
|
+
per_second = @i / (Time.now - @started)
|
44
|
+
out = nil
|
45
|
+
if block_given?
|
46
|
+
out = yield(:digits => @digits, :iteration => @i, :per_second => per_second, :status => status)
|
47
|
+
else
|
48
|
+
out = "%#{@digits}d" % @i
|
49
|
+
if @expected
|
50
|
+
out << "/#{@expected}"
|
51
|
+
out << " %3.1f%" % (100 * (@i / @expected.to_f)) if @i <= @expected
|
30
52
|
end
|
53
|
+
out << " (%.1f)" % per_second
|
54
|
+
out << ": #{status}" if status
|
55
|
+
end
|
56
|
+
if @progress_bar
|
57
|
+
flush_stream_for_progress
|
58
|
+
@stream.print out
|
59
|
+
else
|
31
60
|
@stream.puts out
|
32
|
-
|
61
|
+
end
|
62
|
+
@stream.flush
|
63
|
+
end
|
64
|
+
|
65
|
+
def avg(*args)
|
66
|
+
status = nil
|
67
|
+
i_or_status = args.shift
|
68
|
+
if args.any?
|
69
|
+
status = args.shift
|
70
|
+
end
|
71
|
+
if i_or_status.is_a?(Numeric)
|
72
|
+
@i = i_or_status
|
73
|
+
else
|
74
|
+
if i_or_status.is_a?(String)
|
75
|
+
status = i_or_status
|
76
|
+
end
|
77
|
+
@i += 1
|
78
|
+
end
|
79
|
+
if print_current?
|
80
|
+
print_current(status)
|
33
81
|
true
|
34
82
|
else
|
35
83
|
false
|
36
84
|
end
|
37
85
|
end
|
86
|
+
|
87
|
+
def finish
|
88
|
+
if !print_current?
|
89
|
+
print_current
|
90
|
+
end
|
91
|
+
@stream.puts "\n" if @progress_bar
|
92
|
+
@stream.puts "finished in #{Time.now - @started}"
|
93
|
+
@stream.close
|
94
|
+
end
|
38
95
|
end
|
data/spec/averager_spec.rb
CHANGED
@@ -3,9 +3,80 @@ require File.dirname(__FILE__) + '/spec_helper.rb'
|
|
3
3
|
# Time to add your specs!
|
4
4
|
# http://rspec.info/
|
5
5
|
describe "Place your specs here" do
|
6
|
+
before(:each) do
|
7
|
+
@log_path = File.expand_path(File.dirname("#{__FILE__}") + "/../tmp/status.log")
|
8
|
+
FileUtils.rm_f(@log_path)
|
9
|
+
TimeTravel.freeze_to Time.local(2009, 9, 9, 11, 20, 0)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should log to a specific logfile" do
|
13
|
+
avg = Averager.new(:log_path => @log_path, :every => 1, :digits => 3)
|
14
|
+
TimeTravel.jump(1)
|
15
|
+
avg.avg(100, "test")
|
16
|
+
TimeTravel.jump(1)
|
17
|
+
avg.avg(300, "test")
|
18
|
+
File.read(@log_path).should == %(100 (100.0): test\n300 (150.0): test\n)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should only log every x time" do
|
22
|
+
avg = Averager.new(:log_path => @log_path, :every => 600)
|
23
|
+
TimeTravel.jump(1)
|
24
|
+
avg.avg(100, "100")
|
25
|
+
TimeTravel.jump(1)
|
26
|
+
avg.avg(300, "300")
|
27
|
+
TimeTravel.jump(1)
|
28
|
+
avg.avg(600, "600")
|
29
|
+
avg.avg(601, "601")
|
30
|
+
File.read(@log_path).should == %( 600 (200.0): 600\n)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should include a percentage and estimated end time" do
|
34
|
+
avg = Averager.new(:log_path => @log_path, :expected => 1000, :every => 250)
|
35
|
+
TimeTravel.jump(1)
|
36
|
+
avg.avg(500, "500")
|
37
|
+
TimeTravel.jump(1)
|
38
|
+
avg.avg(750, "750")
|
39
|
+
File.read(@log_path).should == %( 500/1000 50.0% (500.0): 500\n 750/1000 75.0% (375.0): 750\n)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should print a progress when asked for" do
|
43
|
+
avg = Averager.new(:log_path => @log_path, :expected => 1000, :every => 250, :progress_bar => true)
|
44
|
+
TimeTravel.jump(1)
|
45
|
+
avg.avg(500, "500")
|
46
|
+
File.read(@log_path).should == %( 500/1000 50.0% (500.0): 500)
|
47
|
+
TimeTravel.jump(1)
|
48
|
+
avg.avg(750, "750")
|
49
|
+
File.read(@log_path).should == %( 750/1000 75.0% (375.0): 750)
|
50
|
+
end
|
6
51
|
|
7
|
-
it "
|
8
|
-
|
52
|
+
it "should not be mandatory to call with integer" do
|
53
|
+
avg = Averager.new(:log_path => @log_path, :expected => 2, :every => 1)
|
54
|
+
TimeTravel.jump(1)
|
55
|
+
avg.avg
|
56
|
+
TimeTravel.jump(1)
|
57
|
+
avg.avg
|
58
|
+
File.read(@log_path).should == %(1/2 50.0% (1.0)\n2/2 100.0% (1.0)\n)
|
9
59
|
end
|
10
60
|
|
61
|
+
it "should be able to be called with a block" do
|
62
|
+
Averager.new(:log_path => @log_path, :expected => 2, :every => 1) do |avg|
|
63
|
+
TimeTravel.jump(1)
|
64
|
+
avg.avg
|
65
|
+
TimeTravel.jump(1)
|
66
|
+
avg.avg
|
67
|
+
end
|
68
|
+
File.read(@log_path).should == %(1/2 50.0% (1.0)\n2/2 100.0% (1.0)\nfinished in 2.0\n)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should print the last status when finished before" do
|
72
|
+
Averager.new(:log_path => @log_path, :expected => 3, :every => 4) do |avg|
|
73
|
+
TimeTravel.jump(1)
|
74
|
+
avg.avg
|
75
|
+
TimeTravel.jump(1)
|
76
|
+
avg.avg
|
77
|
+
TimeTravel.jump(1)
|
78
|
+
avg.avg
|
79
|
+
end
|
80
|
+
File.read(@log_path).should == %(3/3 100.0% (1.0)\nfinished in 3.0\n)
|
81
|
+
end
|
11
82
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/time_travel.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module TimeTravel
|
2
|
+
@@offset = 0
|
3
|
+
|
4
|
+
def self.now
|
5
|
+
if @@frozen_time
|
6
|
+
@@frozen_time + offset
|
7
|
+
else
|
8
|
+
Time.now_without_time_travel + offset
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.freeze_to(time)
|
13
|
+
@@frozen_time = time
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.jump(seconds)
|
17
|
+
@@offset = offset + seconds
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.offset
|
21
|
+
@@offset
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
class << Time
|
27
|
+
alias_method :now_without_time_travel, :now
|
28
|
+
def now; TimeTravel.now; end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: averager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tobias Schwab
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-06 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -74,6 +74,7 @@ files:
|
|
74
74
|
- spec/averager_spec.rb
|
75
75
|
- spec/spec.opts
|
76
76
|
- spec/spec_helper.rb
|
77
|
+
- spec/time_travel.rb
|
77
78
|
- tasks/rspec.rake
|
78
79
|
has_rdoc: true
|
79
80
|
homepage: http://github.com/tobstarr/averager
|