averager 0.2.0 → 0.2.1
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.
- data/.autotest +22 -0
- data/Gemfile +4 -1
- data/Gemfile.lock +8 -0
- data/VERSION +1 -1
- data/autotest/discover.rb +1 -0
- data/averager.gemspec +15 -6
- data/lib/averager.rb +44 -35
- data/spec/averager_spec.rb +207 -47
- data/spec/spec_helper.rb +5 -1
- metadata +64 -22
- data/spec/time_travel.rb +0 -30
data/.autotest
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
if Gem.available?("autotest-fsevent")
|
2
|
+
require 'autotest/fsevent'
|
3
|
+
end
|
4
|
+
|
5
|
+
Autotest.add_hook :initialize do |at|
|
6
|
+
at.add_exception(%r{^\./\.git})
|
7
|
+
at.add_exception(%r{^\./db})
|
8
|
+
at.add_exception(%r{^\./log})
|
9
|
+
at.add_exception(%r{^\./tmp})
|
10
|
+
at.add_exception(%r{^\./rerun.txt})
|
11
|
+
at.add_exception(%r{^\./Gemfile.lock})
|
12
|
+
at.add_exception(%r{^\./Gemfile.lock})
|
13
|
+
at.add_exception(%r{^\./spec/.*?\.txt})
|
14
|
+
at.add_exception(%r{^\./spec/.*?\.html})
|
15
|
+
|
16
|
+
at.add_mapping(%r%^spec/(.*?)/.*rb$%) { |filename, _|
|
17
|
+
filename
|
18
|
+
}
|
19
|
+
at.add_mapping(%r%^lib/(.*?)\/([^\/]*?)\.rb$%) { |_, m|
|
20
|
+
["spec/#{m[1]}/#{m[2]}_spec.rb"]
|
21
|
+
}
|
22
|
+
end
|
data/Gemfile
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
group :development do
|
3
|
+
group :development, :test do
|
4
4
|
if RUBY_VERSION.match(/^1\.8/)
|
5
5
|
gem 'ruby-debug'
|
6
6
|
elsif RUBY_VERSION.match(/^1\.9/)
|
7
7
|
gem 'ruby-debug19'
|
8
8
|
end
|
9
|
+
gem 'timecop'
|
10
|
+
gem 'autotest'
|
11
|
+
gem 'autotest-growl'
|
9
12
|
gem "rspec", ">= 2.0.0.beta.19"
|
10
13
|
gem "bundler", "~> 1.0.0"
|
11
14
|
gem "jeweler", "~> 1.5.0.pre3"
|
data/Gemfile.lock
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
ZenTest (4.4.1)
|
5
|
+
autotest (4.4.6)
|
6
|
+
ZenTest (>= 4.4.1)
|
7
|
+
autotest-growl (0.2.8)
|
4
8
|
columnize (0.3.1)
|
5
9
|
diff-lcs (1.1.2)
|
6
10
|
git (1.2.5)
|
@@ -26,13 +30,17 @@ GEM
|
|
26
30
|
ruby-debug-base (~> 0.10.3.0)
|
27
31
|
ruby-debug-base (0.10.3)
|
28
32
|
linecache (>= 0.3)
|
33
|
+
timecop (0.3.5)
|
29
34
|
|
30
35
|
PLATFORMS
|
31
36
|
ruby
|
32
37
|
|
33
38
|
DEPENDENCIES
|
39
|
+
autotest
|
40
|
+
autotest-growl
|
34
41
|
bundler (~> 1.0.0)
|
35
42
|
jeweler (~> 1.5.0.pre3)
|
36
43
|
rcov
|
37
44
|
rspec (>= 2.0.0.beta.19)
|
38
45
|
ruby-debug
|
46
|
+
timecop
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
@@ -0,0 +1 @@
|
|
1
|
+
Autotest.add_discovery { "rspec2" }
|
data/averager.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{averager}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tobias Schwab"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-12-15}
|
13
13
|
s.description = %q{RubyGem to track long running processes.}
|
14
14
|
s.email = %q{tobias.schwab@dynport.de}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
|
+
".autotest",
|
20
21
|
".bundle/config",
|
21
22
|
".rspec",
|
22
23
|
"Gemfile",
|
@@ -25,11 +26,11 @@ Gem::Specification.new do |s|
|
|
25
26
|
"README.rdoc",
|
26
27
|
"Rakefile",
|
27
28
|
"VERSION",
|
29
|
+
"autotest/discover.rb",
|
28
30
|
"averager.gemspec",
|
29
31
|
"lib/averager.rb",
|
30
32
|
"spec/averager_spec.rb",
|
31
|
-
"spec/spec_helper.rb"
|
32
|
-
"spec/time_travel.rb"
|
33
|
+
"spec/spec_helper.rb"
|
33
34
|
]
|
34
35
|
s.homepage = %q{http://github.com/tobstarr/averager}
|
35
36
|
s.require_paths = ["lib"]
|
@@ -37,8 +38,7 @@ Gem::Specification.new do |s|
|
|
37
38
|
s.summary = %q{RubyGem to track long running processes.}
|
38
39
|
s.test_files = [
|
39
40
|
"spec/averager_spec.rb",
|
40
|
-
"spec/spec_helper.rb"
|
41
|
-
"spec/time_travel.rb"
|
41
|
+
"spec/spec_helper.rb"
|
42
42
|
]
|
43
43
|
|
44
44
|
if s.respond_to? :specification_version then
|
@@ -47,6 +47,9 @@ Gem::Specification.new do |s|
|
|
47
47
|
|
48
48
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
49
49
|
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
50
|
+
s.add_development_dependency(%q<timecop>, [">= 0"])
|
51
|
+
s.add_development_dependency(%q<autotest>, [">= 0"])
|
52
|
+
s.add_development_dependency(%q<autotest-growl>, [">= 0"])
|
50
53
|
s.add_development_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
|
51
54
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
52
55
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.0.pre3"])
|
@@ -57,6 +60,9 @@ Gem::Specification.new do |s|
|
|
57
60
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
58
61
|
else
|
59
62
|
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
63
|
+
s.add_dependency(%q<timecop>, [">= 0"])
|
64
|
+
s.add_dependency(%q<autotest>, [">= 0"])
|
65
|
+
s.add_dependency(%q<autotest-growl>, [">= 0"])
|
60
66
|
s.add_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
|
61
67
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
62
68
|
s.add_dependency(%q<jeweler>, ["~> 1.5.0.pre3"])
|
@@ -68,6 +74,9 @@ Gem::Specification.new do |s|
|
|
68
74
|
end
|
69
75
|
else
|
70
76
|
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
77
|
+
s.add_dependency(%q<timecop>, [">= 0"])
|
78
|
+
s.add_dependency(%q<autotest>, [">= 0"])
|
79
|
+
s.add_dependency(%q<autotest-growl>, [">= 0"])
|
71
80
|
s.add_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
|
72
81
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
73
82
|
s.add_dependency(%q<jeweler>, ["~> 1.5.0.pre3"])
|
data/lib/averager.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
$:.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
|
-
|
5
|
+
attr_accessor :every, :expected, :digits, :log_path, :stream, :progress_bar, :counter
|
6
|
+
DEFAULT_EVERY = 1.0
|
7
|
+
DEFAULT_DIGITS = 7
|
8
|
+
|
9
|
+
module ObjectExtensions
|
6
10
|
def each_with_avg(options = {})
|
7
|
-
|
11
|
+
raise NoMethodError if !self.respond_to?(:each)
|
12
|
+
options[:expected] ||= self.count if self.respond_to?(:count)
|
8
13
|
Averager.new(options) do |a|
|
9
14
|
self.each do |element|
|
10
15
|
yield(element)
|
@@ -16,37 +21,41 @@ class Averager
|
|
16
21
|
|
17
22
|
def initialize(options = {})
|
18
23
|
@started = Time.now
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
@log_path = options[:log_path]
|
29
|
-
@stream = options[:stream] || STDOUT
|
24
|
+
self.every = options[:every] || DEFAULT_EVERY
|
25
|
+
self.expected = options[:expected]
|
26
|
+
self.digits = options[:digits] if options[:digits]
|
27
|
+
self.digits ||= DEFAULT_DIGITS
|
28
|
+
self.stream = options[:stream] || $stdout
|
29
|
+
self.log_path = options[:log_path]
|
30
|
+
self.progress_bar = options[:progress_bar] == true
|
31
|
+
self.counter = 0
|
30
32
|
flush_stream_for_progress
|
31
|
-
@progress_bar = options[:progress_bar] == true
|
32
|
-
@i = 0
|
33
33
|
if block_given?
|
34
34
|
yield(self)
|
35
35
|
self.finish
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
40
|
-
if @
|
41
|
-
|
42
|
-
@stream = File.open(@log_path, "w")
|
43
|
-
else
|
44
|
-
@stream.print "\r"
|
39
|
+
def expected=(new_value)
|
40
|
+
if @expected = new_value
|
41
|
+
self.digits = new_value.to_i.to_s.length
|
45
42
|
end
|
46
43
|
end
|
47
44
|
|
45
|
+
def log_path=(new_path)
|
46
|
+
if new_path
|
47
|
+
@log_path = new_path
|
48
|
+
FileUtils.mkdir_p(File.dirname(new_path))
|
49
|
+
self.stream = File.open(new_path, "a")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def flush_stream_for_progress
|
54
|
+
self.stream.print("\r") if self.log_path.nil?
|
55
|
+
end
|
56
|
+
|
48
57
|
def print_current?
|
49
|
-
if @last_printed.nil? || (Time.now - @last_printed) >=
|
58
|
+
if @last_printed.nil? || (Time.now - @last_printed) >= self.every
|
50
59
|
@last_printed = Time.now
|
51
60
|
true
|
52
61
|
else
|
@@ -55,20 +64,20 @@ class Averager
|
|
55
64
|
end
|
56
65
|
|
57
66
|
def print_current(status = nil)
|
58
|
-
return if
|
59
|
-
per_second =
|
67
|
+
return if self.counter == 0
|
68
|
+
per_second = self.counter / (Time.now - @started)
|
60
69
|
out = nil
|
61
70
|
if block_given?
|
62
|
-
out = yield(:digits =>
|
71
|
+
out = yield(:digits => self.digits, :iteration => self.counter, :per_second => per_second, :status => status)
|
63
72
|
else
|
64
|
-
out = "%#{
|
73
|
+
out = "%#{self.digits}d" % self.counter
|
65
74
|
if @expected
|
66
75
|
out << "/#{@expected}"
|
67
|
-
out << " %3.1f%" % (100 * (
|
76
|
+
out << " %3.1f%" % (100 * (self.counter / @expected.to_f)) if self.counter <= @expected
|
68
77
|
end
|
69
78
|
out << " (%.1f/second" % [per_second]
|
70
|
-
if !per_second.infinite? && @expected &&
|
71
|
-
missing = @expected -
|
79
|
+
if !per_second.infinite? && @expected && self.counter < @expected
|
80
|
+
missing = @expected - self.counter
|
72
81
|
seconds = missing / per_second
|
73
82
|
hours = (seconds / 3600.0).floor
|
74
83
|
seconds -= (hours * 3600)
|
@@ -79,7 +88,7 @@ class Averager
|
|
79
88
|
out << ")"
|
80
89
|
out << ": #{status}" if status
|
81
90
|
end
|
82
|
-
if
|
91
|
+
if self.progress_bar
|
83
92
|
flush_stream_for_progress
|
84
93
|
@stream.print out
|
85
94
|
else
|
@@ -95,12 +104,12 @@ class Averager
|
|
95
104
|
status = args.shift
|
96
105
|
end
|
97
106
|
if i_or_status.is_a?(Numeric)
|
98
|
-
|
107
|
+
self.counter = i_or_status
|
99
108
|
else
|
100
109
|
if i_or_status.is_a?(String)
|
101
110
|
status = i_or_status
|
102
111
|
end
|
103
|
-
|
112
|
+
self.counter += 1
|
104
113
|
end
|
105
114
|
if print_current?
|
106
115
|
print_current(status)
|
@@ -115,10 +124,10 @@ class Averager
|
|
115
124
|
if !@printed_last && !print_current?
|
116
125
|
print_current
|
117
126
|
end
|
118
|
-
@stream.puts "\n" if
|
127
|
+
@stream.puts "\n" if self.progress_bar
|
119
128
|
@stream.puts "finished in #{Time.now - @started}"
|
120
129
|
@stream.close if ![$stdout, $stderr].include?(@stream)
|
121
130
|
end
|
122
131
|
end
|
123
132
|
|
124
|
-
|
133
|
+
Object.send(:include, Averager::ObjectExtensions)
|
data/spec/averager_spec.rb
CHANGED
@@ -1,101 +1,261 @@
|
|
1
|
-
require File.
|
1
|
+
require File.expand_path("../spec/spec_helper", File.basename(__FILE__))
|
2
2
|
|
3
3
|
# Time to add your specs!
|
4
4
|
# http://rspec.info/
|
5
5
|
describe "Place your specs here" do
|
6
|
+
let(:log_dir) { project_root.join("tmp/logs/averager") }
|
7
|
+
let(:log_file) { log_dir.join("out.log") }
|
8
|
+
let(:stream) { double("stream").as_null_object }
|
9
|
+
|
6
10
|
before(:each) do
|
7
|
-
|
8
|
-
|
9
|
-
|
11
|
+
FileUtils.rm_rf(log_dir)
|
12
|
+
Timecop.freeze Time.local(2009, 9, 9, 11, 20, 0)
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:each) do
|
16
|
+
Timecop.return
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#initialize" do
|
20
|
+
it "sets every to 1.0 when not set" do
|
21
|
+
Averager.new.every.should == 1.0
|
22
|
+
end
|
23
|
+
|
24
|
+
it "sets every to a value when set" do
|
25
|
+
Averager.new(:every => 10.0).every.should == 10.0
|
26
|
+
end
|
27
|
+
|
28
|
+
it "does not set expected when nothing provided" do
|
29
|
+
Averager.new.expected.should be_nil
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "setting expected" do
|
33
|
+
it "sets expected" do
|
34
|
+
Averager.new(:expected => 10).expected.should == 10
|
35
|
+
end
|
36
|
+
|
37
|
+
it "sets the correct amount of digits" do
|
38
|
+
Averager.new(:expected => 10).digits.should == 2
|
39
|
+
end
|
40
|
+
|
41
|
+
it "overwrites digits from expected" do
|
42
|
+
Averager.new(:expected => 10, :digits => 3).digits.should == 3
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it "sets the digits to default value when not given" do
|
47
|
+
Averager.new.digits.should == 7
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sets log_path to path when provided" do
|
51
|
+
Averager.new(:log_path => "/tmp/out.log").log_path.should == "/tmp/out.log"
|
52
|
+
end
|
53
|
+
|
54
|
+
it "sets the stream when to $stdout when not set" do
|
55
|
+
Averager.new.stream.should == $stdout
|
56
|
+
end
|
57
|
+
|
58
|
+
it "sets the stream to a stream when present" do
|
59
|
+
stream = double("stream").as_null_object
|
60
|
+
Averager.new(:stream => stream).stream.should == stream
|
61
|
+
end
|
62
|
+
|
63
|
+
it "sets progress_bar to true when provided" do
|
64
|
+
Averager.new(:progress_bar => true).progress_bar.should == true
|
65
|
+
end
|
66
|
+
|
67
|
+
it "sets porgress_bar to false when nil" do
|
68
|
+
Averager.new(:progress_bar => nil).progress_bar.should == false
|
69
|
+
end
|
70
|
+
|
71
|
+
it "sets porgress_bar to false when something wird" do
|
72
|
+
Averager.new(:progress_bar => false).progress_bar.should == false
|
73
|
+
end
|
74
|
+
|
75
|
+
it "sets the counter to 0" do
|
76
|
+
Averager.new.counter.should == 0
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "with log_path given" do
|
80
|
+
it "creates the path of log file when not exists" do
|
81
|
+
Averager.new(:log_path => log_file)
|
82
|
+
File.should be_exists(log_dir)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "creates the logfile" do
|
86
|
+
Averager.new(:log_path => log_file)
|
87
|
+
File.should be_exists(log_file)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "opens the file for appending" do
|
91
|
+
stream = double("stream").as_null_object
|
92
|
+
File.should_receive(:open).with(log_file, "a").and_return stream
|
93
|
+
Averager.new(:log_path => log_file)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "with a block" do
|
98
|
+
it "yields the block with itself" do
|
99
|
+
results = []
|
100
|
+
Averager.new(:stream => double("stream").as_null_object) do |a|
|
101
|
+
results << a
|
102
|
+
end
|
103
|
+
results.first.should be_an_instance_of(Averager)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "calls finish on after yielding" do
|
107
|
+
Averager.new do |a|
|
108
|
+
a.should_receive(:finish)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "#each_with_avg" do
|
115
|
+
class OpenIterator
|
116
|
+
def each
|
117
|
+
10.times do |i|
|
118
|
+
yield(i)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
class ClosedIterator
|
124
|
+
def each
|
125
|
+
10.times do |i|
|
126
|
+
yield(i)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def count
|
131
|
+
10
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it "raises a NoMethodError when calling on a object which does not define each" do
|
136
|
+
lambda {
|
137
|
+
Object.new.each_with_avg
|
138
|
+
}.should raise_error(NoMethodError)
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "with objects responding to each only" do
|
142
|
+
it "should respond to each_with_avg" do
|
143
|
+
OpenIterator.new.should respond_to(:each_with_avg)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "initializes a new averager without expected" do
|
147
|
+
Averager.should_receive(:new).with({:stream => stream})
|
148
|
+
OpenIterator.new.each_with_avg(:stream => stream) do |a|
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
it "hands options given to each_with_avg to averager" do
|
153
|
+
Averager.should_receive(:new).with({:every => 10, :stream => stream})
|
154
|
+
OpenIterator.new.each_with_avg(:every => 10, :stream => stream) do |a|
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
it "calls avg 10 times" do
|
159
|
+
stream.should_receive(:puts).exactly(11).times
|
160
|
+
OpenIterator.new.each_with_avg(:stream => stream) do |a|
|
161
|
+
Timecop.freeze Time.now + 1
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it "does not raise NoMethodError" do
|
166
|
+
lambda {
|
167
|
+
OpenIterator.new.each_with_avg(:stream => stream) do
|
168
|
+
end
|
169
|
+
}.should_not raise_error
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
describe "with objects responding to each and count" do
|
174
|
+
it "merges expected into options when initializing averager" do
|
175
|
+
Averager.should_receive(:new).with({:every => 10, :stream => stream, :expected => 10})
|
176
|
+
ClosedIterator.new.each_with_avg(:every => 10, :stream => stream) do |a|
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
10
180
|
end
|
11
181
|
|
12
182
|
it "should print the first every time" do
|
13
|
-
avg = Averager.new(:log_path =>
|
14
|
-
|
183
|
+
avg = Averager.new(:log_path => log_file, :every => 10, :digits => 3)
|
184
|
+
Timecop.freeze Time.now + 1
|
15
185
|
avg.avg(100, "test")
|
16
|
-
File.read(
|
186
|
+
File.read(log_file).should == %(100 (100.0/second): test\n)
|
17
187
|
end
|
18
188
|
|
19
189
|
it "should only print every x seconds" do
|
20
|
-
avg = Averager.new(:log_path =>
|
21
|
-
|
190
|
+
avg = Averager.new(:log_path => log_file, :every => 10, :digits => 3)
|
191
|
+
Timecop.freeze Time.now + 1
|
22
192
|
avg.avg(100, "test")
|
23
|
-
File.read(
|
24
|
-
|
193
|
+
File.read(log_file).should == %(100 (100.0/second): test\n)
|
194
|
+
Timecop.freeze Time.now + 1
|
25
195
|
avg.avg(200, "test")
|
26
|
-
File.read(
|
27
|
-
|
196
|
+
File.read(log_file).should == %(100 (100.0/second): test\n)
|
197
|
+
Timecop.freeze Time.now + 9
|
28
198
|
avg.avg(1100, "test")
|
29
|
-
File.read(
|
199
|
+
File.read(log_file).should == %(100 (100.0/second): test\n1100 (100.0/second): test\n)
|
30
200
|
end
|
31
201
|
|
32
202
|
it "should include a percentage and estimated end time" do
|
33
|
-
avg = Averager.new(:log_path =>
|
34
|
-
|
35
|
-
avg.avg(500, "500")
|
36
|
-
TimeTravel.jump(1)
|
37
|
-
avg.avg(750, "750")
|
38
|
-
File.read(@log_path).should == %( 500/1000 50.0% (500.0/second 00:00:01): 500\n 750/1000 75.0% (375.0/second 00:00:00): 750\n)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should print a progress when asked for" do
|
42
|
-
avg = Averager.new(:log_path => @log_path, :expected => 1000, :every => 1.0, :progress_bar => true)
|
43
|
-
TimeTravel.jump(1)
|
203
|
+
avg = Averager.new(:log_path => log_file, :expected => 1000, :every => 1.0)
|
204
|
+
Timecop.freeze Time.now + 1
|
44
205
|
avg.avg(500, "500")
|
45
|
-
|
46
|
-
TimeTravel.jump(1)
|
206
|
+
Timecop.freeze Time.now + 1
|
47
207
|
avg.avg(750, "750")
|
48
|
-
File.read(
|
208
|
+
File.read(log_file).should == %( 500/1000 50.0% (500.0/second 00:00:01): 500\n 750/1000 75.0% (375.0/second 00:00:00): 750\n)
|
49
209
|
end
|
50
210
|
|
51
211
|
it "should not be mandatory to call with integer" do
|
52
|
-
avg = Averager.new(:log_path =>
|
53
|
-
|
212
|
+
avg = Averager.new(:log_path => log_file, :expected => 2, :every => 1.0)
|
213
|
+
Timecop.freeze Time.now + 1
|
54
214
|
avg.avg
|
55
|
-
|
215
|
+
Timecop.freeze Time.now + 1
|
56
216
|
avg.avg
|
57
|
-
File.read(
|
217
|
+
File.read(log_file).should == %(1/2 50.0% (1.0/second 00:00:01)\n2/2 100.0% (1.0/second)\n)
|
58
218
|
end
|
59
219
|
|
60
220
|
it "should be able to be called with a block" do
|
61
|
-
Averager.new(:log_path =>
|
62
|
-
|
221
|
+
Averager.new(:log_path => log_file, :expected => 2, :every => 1) do |avg|
|
222
|
+
Timecop.freeze Time.now + 1
|
63
223
|
avg.avg
|
64
|
-
|
224
|
+
Timecop.freeze Time.now + 1
|
65
225
|
avg.avg
|
66
226
|
end
|
67
|
-
File.read(
|
227
|
+
File.read(log_file).should == %(1/2 50.0% (1.0/second 00:00:01)\n2/2 100.0% (1.0/second)\nfinished in 2.0\n)
|
68
228
|
end
|
69
229
|
|
70
230
|
it "should not break on printing first and per_second is null" do
|
71
|
-
Averager.new(:log_path =>
|
231
|
+
Averager.new(:log_path => log_file, :expected => 2, :every => 1) do |a|
|
72
232
|
a.avg
|
73
233
|
end
|
74
|
-
File.read(
|
234
|
+
File.read(log_file).should == "1/2 50.0% (inf/second)\nfinished in 0.0\n"
|
75
235
|
end
|
76
236
|
|
77
237
|
it "should not break when per_second is 0.0" do
|
78
|
-
Averager.new(:log_path =>
|
238
|
+
Averager.new(:log_path => log_file, :expected => 2, :every => 1) do |a|
|
79
239
|
a.avg(0.0)
|
80
240
|
end
|
81
241
|
end
|
82
242
|
|
83
243
|
it "should print the last status when finished before" do
|
84
|
-
Averager.new(:log_path =>
|
85
|
-
|
244
|
+
Averager.new(:log_path => log_file, :expected => 3, :every => 4) do |avg|
|
245
|
+
Timecop.freeze Time.now + 1
|
86
246
|
avg.avg
|
87
|
-
|
247
|
+
Timecop.freeze Time.now + 1
|
88
248
|
avg.avg
|
89
|
-
|
249
|
+
Timecop.freeze Time.now + 1
|
90
250
|
avg.avg
|
91
251
|
end
|
92
|
-
File.read(
|
252
|
+
File.read(log_file).should == %(1/3 33.3% (1.0/second 00:00:02)\n3/3 100.0% (1.0/second)\nfinished in 3.0\n)
|
93
253
|
end
|
94
254
|
|
95
255
|
it "should be able to average over an array" do
|
96
|
-
[1, 2, 3, 4].each_with_avg(:log_path =>
|
97
|
-
|
256
|
+
[1, 2, 3, 4].each_with_avg(:log_path => log_file) do |i|
|
257
|
+
Timecop.freeze Time.now + 1
|
98
258
|
end
|
99
|
-
File.read(
|
259
|
+
File.read(log_file).should == %(1/4 25.0% (1.0/second 00:00:03)\n2/4 50.0% (1.0/second 00:00:02)\n3/4 75.0% (1.0/second 00:00:01)\n4/4 100.0% (1.0/second)\nfinished in 4.0\n)
|
100
260
|
end
|
101
261
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,7 +11,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
11
11
|
require 'averager'
|
12
12
|
require 'rspec'
|
13
13
|
require 'rspec/autorun'
|
14
|
-
require
|
14
|
+
require "timecop"
|
15
15
|
|
16
16
|
if defined?(Debugger) && Debugger.respond_to?(:settings)
|
17
17
|
Debugger.settings[:autolist] = 1
|
@@ -22,6 +22,10 @@ end
|
|
22
22
|
# in ./support/ and its subdirectories.
|
23
23
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
24
24
|
|
25
|
+
def project_root
|
26
|
+
Pathname.new(File.expand_path("..", File.basename(__FILE__)))
|
27
|
+
end
|
28
|
+
|
25
29
|
RSpec.configure do |config|
|
26
30
|
|
27
31
|
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: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 1
|
10
|
+
version: 0.2.1
|
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-
|
18
|
+
date: 2010-12-15 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -35,8 +35,50 @@ dependencies:
|
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
prerelease: false
|
37
37
|
type: :development
|
38
|
-
name:
|
38
|
+
name: timecop
|
39
39
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
requirement: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
prerelease: false
|
51
|
+
type: :development
|
52
|
+
name: autotest
|
53
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
requirement: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
prerelease: false
|
65
|
+
type: :development
|
66
|
+
name: autotest-growl
|
67
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
requirement: *id004
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
prerelease: false
|
79
|
+
type: :development
|
80
|
+
name: rspec
|
81
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
40
82
|
none: false
|
41
83
|
requirements:
|
42
84
|
- - ">="
|
@@ -49,12 +91,12 @@ dependencies:
|
|
49
91
|
- beta
|
50
92
|
- 19
|
51
93
|
version: 2.0.0.beta.19
|
52
|
-
requirement: *
|
94
|
+
requirement: *id005
|
53
95
|
- !ruby/object:Gem::Dependency
|
54
96
|
prerelease: false
|
55
97
|
type: :development
|
56
98
|
name: bundler
|
57
|
-
version_requirements: &
|
99
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
58
100
|
none: false
|
59
101
|
requirements:
|
60
102
|
- - ~>
|
@@ -65,12 +107,12 @@ dependencies:
|
|
65
107
|
- 0
|
66
108
|
- 0
|
67
109
|
version: 1.0.0
|
68
|
-
requirement: *
|
110
|
+
requirement: *id006
|
69
111
|
- !ruby/object:Gem::Dependency
|
70
112
|
prerelease: false
|
71
113
|
type: :development
|
72
114
|
name: jeweler
|
73
|
-
version_requirements: &
|
115
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
74
116
|
none: false
|
75
117
|
requirements:
|
76
118
|
- - ~>
|
@@ -82,12 +124,12 @@ dependencies:
|
|
82
124
|
- 0
|
83
125
|
- pre3
|
84
126
|
version: 1.5.0.pre3
|
85
|
-
requirement: *
|
127
|
+
requirement: *id007
|
86
128
|
- !ruby/object:Gem::Dependency
|
87
129
|
prerelease: false
|
88
130
|
type: :development
|
89
131
|
name: rcov
|
90
|
-
version_requirements: &
|
132
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
91
133
|
none: false
|
92
134
|
requirements:
|
93
135
|
- - ">="
|
@@ -96,12 +138,12 @@ dependencies:
|
|
96
138
|
segments:
|
97
139
|
- 0
|
98
140
|
version: "0"
|
99
|
-
requirement: *
|
141
|
+
requirement: *id008
|
100
142
|
- !ruby/object:Gem::Dependency
|
101
143
|
prerelease: false
|
102
144
|
type: :development
|
103
145
|
name: rspec
|
104
|
-
version_requirements: &
|
146
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
105
147
|
none: false
|
106
148
|
requirements:
|
107
149
|
- - ">="
|
@@ -114,12 +156,12 @@ dependencies:
|
|
114
156
|
- beta
|
115
157
|
- 19
|
116
158
|
version: 2.0.0.beta.19
|
117
|
-
requirement: *
|
159
|
+
requirement: *id009
|
118
160
|
- !ruby/object:Gem::Dependency
|
119
161
|
prerelease: false
|
120
162
|
type: :development
|
121
163
|
name: bundler
|
122
|
-
version_requirements: &
|
164
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
123
165
|
none: false
|
124
166
|
requirements:
|
125
167
|
- - ~>
|
@@ -130,12 +172,12 @@ dependencies:
|
|
130
172
|
- 0
|
131
173
|
- 0
|
132
174
|
version: 1.0.0
|
133
|
-
requirement: *
|
175
|
+
requirement: *id010
|
134
176
|
- !ruby/object:Gem::Dependency
|
135
177
|
prerelease: false
|
136
178
|
type: :development
|
137
179
|
name: jeweler
|
138
|
-
version_requirements: &
|
180
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
139
181
|
none: false
|
140
182
|
requirements:
|
141
183
|
- - ~>
|
@@ -147,12 +189,12 @@ dependencies:
|
|
147
189
|
- 0
|
148
190
|
- pre3
|
149
191
|
version: 1.5.0.pre3
|
150
|
-
requirement: *
|
192
|
+
requirement: *id011
|
151
193
|
- !ruby/object:Gem::Dependency
|
152
194
|
prerelease: false
|
153
195
|
type: :development
|
154
196
|
name: rcov
|
155
|
-
version_requirements: &
|
197
|
+
version_requirements: &id012 !ruby/object:Gem::Requirement
|
156
198
|
none: false
|
157
199
|
requirements:
|
158
200
|
- - ">="
|
@@ -161,7 +203,7 @@ dependencies:
|
|
161
203
|
segments:
|
162
204
|
- 0
|
163
205
|
version: "0"
|
164
|
-
requirement: *
|
206
|
+
requirement: *id012
|
165
207
|
description: RubyGem to track long running processes.
|
166
208
|
email: tobias.schwab@dynport.de
|
167
209
|
executables: []
|
@@ -172,6 +214,7 @@ extra_rdoc_files:
|
|
172
214
|
- LICENSE
|
173
215
|
- README.rdoc
|
174
216
|
files:
|
217
|
+
- .autotest
|
175
218
|
- .bundle/config
|
176
219
|
- .rspec
|
177
220
|
- Gemfile
|
@@ -180,11 +223,11 @@ files:
|
|
180
223
|
- README.rdoc
|
181
224
|
- Rakefile
|
182
225
|
- VERSION
|
226
|
+
- autotest/discover.rb
|
183
227
|
- averager.gemspec
|
184
228
|
- lib/averager.rb
|
185
229
|
- spec/averager_spec.rb
|
186
230
|
- spec/spec_helper.rb
|
187
|
-
- spec/time_travel.rb
|
188
231
|
has_rdoc: true
|
189
232
|
homepage: http://github.com/tobstarr/averager
|
190
233
|
licenses: []
|
@@ -222,4 +265,3 @@ summary: RubyGem to track long running processes.
|
|
222
265
|
test_files:
|
223
266
|
- spec/averager_spec.rb
|
224
267
|
- spec/spec_helper.rb
|
225
|
-
- spec/time_travel.rb
|
data/spec/time_travel.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module TimeTravel
|
2
|
-
@@offset = 0
|
3
|
-
@@frozen_time = nil
|
4
|
-
|
5
|
-
def self.now
|
6
|
-
if @@frozen_time
|
7
|
-
@@frozen_time + offset
|
8
|
-
else
|
9
|
-
Time.now_without_time_travel + offset
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.freeze_to(time)
|
14
|
-
@@frozen_time = time
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.jump(seconds)
|
18
|
-
@@offset = offset + seconds
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.offset
|
22
|
-
@@offset
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
class << Time
|
28
|
-
alias_method :now_without_time_travel, :now
|
29
|
-
def now; TimeTravel.now; end
|
30
|
-
end
|