averager 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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"
@@ -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.0
1
+ 0.2.1
@@ -0,0 +1 @@
1
+ Autotest.add_discovery { "rspec2" }
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{averager}
8
- s.version = "0.2.0"
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-11-03}
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"])
@@ -1,10 +1,15 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
- $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
4
  class Averager
5
- module ArrayExtensions
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
- options[:expected] ||= self.length
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
- @every = options[:every] || 1.0
20
- if @expected = options[:expected]
21
- @digits = @expected.to_i.to_s.length
22
- end
23
- if options[:digits]
24
- @digits = options[:digits]
25
- else
26
- @digits ||= 7
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 flush_stream_for_progress
40
- if @log_path
41
- FileUtils.mkdir_p(File.dirname(@log_path))
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) >= @every
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 @i == 0
59
- per_second = @i / (Time.now - @started)
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 => @digits, :iteration => @i, :per_second => per_second, :status => status)
71
+ out = yield(:digits => self.digits, :iteration => self.counter, :per_second => per_second, :status => status)
63
72
  else
64
- out = "%#{@digits}d" % @i
73
+ out = "%#{self.digits}d" % self.counter
65
74
  if @expected
66
75
  out << "/#{@expected}"
67
- out << " %3.1f%" % (100 * (@i / @expected.to_f)) if @i <= @expected
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 && @i < @expected
71
- missing = @expected - @i
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 @progress_bar
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
- @i = i_or_status
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
- @i += 1
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 @progress_bar
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
- Array.send(:include, Averager::ArrayExtensions)
133
+ Object.send(:include, Averager::ObjectExtensions)
@@ -1,101 +1,261 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
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
- @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)
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 => @log_path, :every => 10, :digits => 3)
14
- TimeTravel.jump(1)
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(@log_path).should == %(100 (100.0/second): test\n)
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 => @log_path, :every => 10, :digits => 3)
21
- TimeTravel.jump(1)
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(@log_path).should == %(100 (100.0/second): test\n)
24
- TimeTravel.jump(1)
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(@log_path).should == %(100 (100.0/second): test\n)
27
- TimeTravel.jump(9)
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(@log_path).should == %(100 (100.0/second): test\n1100 (100.0/second): test\n)
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 => @log_path, :expected => 1000, :every => 1.0)
34
- TimeTravel.jump(1)
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
- File.read(@log_path).should == %( 500/1000 50.0% (500.0/second 00:00:01): 500)
46
- TimeTravel.jump(1)
206
+ Timecop.freeze Time.now + 1
47
207
  avg.avg(750, "750")
48
- File.read(@log_path).should == %( 750/1000 75.0% (375.0/second 00:00:00): 750)
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 => @log_path, :expected => 2, :every => 1.0)
53
- TimeTravel.jump(1)
212
+ avg = Averager.new(:log_path => log_file, :expected => 2, :every => 1.0)
213
+ Timecop.freeze Time.now + 1
54
214
  avg.avg
55
- TimeTravel.jump(1)
215
+ Timecop.freeze Time.now + 1
56
216
  avg.avg
57
- File.read(@log_path).should == %(1/2 50.0% (1.0/second 00:00:01)\n2/2 100.0% (1.0/second)\n)
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 => @log_path, :expected => 2, :every => 1) do |avg|
62
- TimeTravel.jump(1)
221
+ Averager.new(:log_path => log_file, :expected => 2, :every => 1) do |avg|
222
+ Timecop.freeze Time.now + 1
63
223
  avg.avg
64
- TimeTravel.jump(1)
224
+ Timecop.freeze Time.now + 1
65
225
  avg.avg
66
226
  end
67
- File.read(@log_path).should == %(1/2 50.0% (1.0/second 00:00:01)\n2/2 100.0% (1.0/second)\nfinished in 2.0\n)
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 => @log_path, :expected => 2, :every => 1) do |a|
231
+ Averager.new(:log_path => log_file, :expected => 2, :every => 1) do |a|
72
232
  a.avg
73
233
  end
74
- File.read(@log_path).should == "1/2 50.0% (inf/second)\nfinished in 0.0\n"
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 => @log_path, :expected => 2, :every => 1) do |a|
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 => @log_path, :expected => 3, :every => 4) do |avg|
85
- TimeTravel.jump(1)
244
+ Averager.new(:log_path => log_file, :expected => 3, :every => 4) do |avg|
245
+ Timecop.freeze Time.now + 1
86
246
  avg.avg
87
- TimeTravel.jump(1)
247
+ Timecop.freeze Time.now + 1
88
248
  avg.avg
89
- TimeTravel.jump(1)
249
+ Timecop.freeze Time.now + 1
90
250
  avg.avg
91
251
  end
92
- File.read(@log_path).should == %(1/3 33.3% (1.0/second 00:00:02)\n3/3 100.0% (1.0/second)\nfinished in 3.0\n)
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 => @log_path) do |i|
97
- TimeTravel.jump(1)
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(@log_path).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)
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
@@ -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 'time_travel'
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: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 0
10
- version: 0.2.0
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-11-03 00:00:00 +01:00
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: rspec
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: *id002
94
+ requirement: *id005
53
95
  - !ruby/object:Gem::Dependency
54
96
  prerelease: false
55
97
  type: :development
56
98
  name: bundler
57
- version_requirements: &id003 !ruby/object:Gem::Requirement
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: *id003
110
+ requirement: *id006
69
111
  - !ruby/object:Gem::Dependency
70
112
  prerelease: false
71
113
  type: :development
72
114
  name: jeweler
73
- version_requirements: &id004 !ruby/object:Gem::Requirement
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: *id004
127
+ requirement: *id007
86
128
  - !ruby/object:Gem::Dependency
87
129
  prerelease: false
88
130
  type: :development
89
131
  name: rcov
90
- version_requirements: &id005 !ruby/object:Gem::Requirement
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: *id005
141
+ requirement: *id008
100
142
  - !ruby/object:Gem::Dependency
101
143
  prerelease: false
102
144
  type: :development
103
145
  name: rspec
104
- version_requirements: &id006 !ruby/object:Gem::Requirement
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: *id006
159
+ requirement: *id009
118
160
  - !ruby/object:Gem::Dependency
119
161
  prerelease: false
120
162
  type: :development
121
163
  name: bundler
122
- version_requirements: &id007 !ruby/object:Gem::Requirement
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: *id007
175
+ requirement: *id010
134
176
  - !ruby/object:Gem::Dependency
135
177
  prerelease: false
136
178
  type: :development
137
179
  name: jeweler
138
- version_requirements: &id008 !ruby/object:Gem::Requirement
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: *id008
192
+ requirement: *id011
151
193
  - !ruby/object:Gem::Dependency
152
194
  prerelease: false
153
195
  type: :development
154
196
  name: rcov
155
- version_requirements: &id009 !ruby/object:Gem::Requirement
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: *id009
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
@@ -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