watchme 0.0.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/.gitignore +12 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +64 -0
- data/Rakefile +13 -0
- data/autotest/discover.rb +1 -0
- data/lib/watchme.rb +8 -0
- data/lib/watchme/ci.rake +56 -0
- data/lib/watchme/timer.rb +114 -0
- data/lib/watchme/version.rb +3 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/timer_spec.rb +318 -0
- data/watchme.gemspec +28 -0
- metadata +147 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
watchme (0.0.1)
|
5
|
+
activesupport (>= 3.0.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
ZenTest (4.7.0)
|
11
|
+
activesupport (3.2.3)
|
12
|
+
i18n (~> 0.6)
|
13
|
+
multi_json (~> 1.0)
|
14
|
+
autotest-fsevent (0.2.8)
|
15
|
+
sys-uname
|
16
|
+
builder (3.0.0)
|
17
|
+
diff-lcs (1.1.3)
|
18
|
+
ffi (1.0.11)
|
19
|
+
geminabox (0.6.1)
|
20
|
+
builder
|
21
|
+
httpclient
|
22
|
+
sinatra
|
23
|
+
guard (1.0.1)
|
24
|
+
ffi (>= 0.5.0)
|
25
|
+
thor (~> 0.14.6)
|
26
|
+
guard-rspec (0.7.0)
|
27
|
+
guard (>= 0.10.0)
|
28
|
+
httpclient (2.2.4)
|
29
|
+
i18n (0.6.0)
|
30
|
+
multi_json (1.3.2)
|
31
|
+
rack (1.4.1)
|
32
|
+
rack-protection (1.2.0)
|
33
|
+
rack
|
34
|
+
rake (0.9.2.2)
|
35
|
+
rb-fsevent (0.9.1)
|
36
|
+
rspec (2.9.0)
|
37
|
+
rspec-core (~> 2.9.0)
|
38
|
+
rspec-expectations (~> 2.9.0)
|
39
|
+
rspec-mocks (~> 2.9.0)
|
40
|
+
rspec-core (2.9.0)
|
41
|
+
rspec-expectations (2.9.1)
|
42
|
+
diff-lcs (~> 1.1.3)
|
43
|
+
rspec-mocks (2.9.0)
|
44
|
+
sinatra (1.3.2)
|
45
|
+
rack (~> 1.3, >= 1.3.6)
|
46
|
+
rack-protection (~> 1.2)
|
47
|
+
tilt (~> 1.3, >= 1.3.3)
|
48
|
+
sys-uname (0.9.0)
|
49
|
+
ffi (>= 1.0.0)
|
50
|
+
thor (0.14.6)
|
51
|
+
tilt (1.3.3)
|
52
|
+
|
53
|
+
PLATFORMS
|
54
|
+
ruby
|
55
|
+
|
56
|
+
DEPENDENCIES
|
57
|
+
ZenTest
|
58
|
+
autotest-fsevent
|
59
|
+
geminabox
|
60
|
+
guard-rspec
|
61
|
+
rake
|
62
|
+
rb-fsevent
|
63
|
+
rspec
|
64
|
+
watchme!
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
if ENV['RAILS_BUNDLE_FIRST']
|
5
|
+
unless system('bundle check')
|
6
|
+
# system('ruby -r rubygems -e "p Gem.path"')
|
7
|
+
puts "RAILS_BUNDLE_FIRST is set, running `bundle install`..."
|
8
|
+
system("bundle install") || raise("'bundle install' failed.")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
import 'lib/watchme/ci.rake'
|
13
|
+
RSpec::Core::RakeTask.new
|
@@ -0,0 +1 @@
|
|
1
|
+
Autotest.add_discovery { "rspec2" }
|
data/lib/watchme.rb
ADDED
data/lib/watchme/ci.rake
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
|
2
|
+
namespace :ci do
|
3
|
+
desc "Perform a build on the CI server"
|
4
|
+
task :build do
|
5
|
+
begin
|
6
|
+
Rake::Task['ci:qa'].invoke
|
7
|
+
Rake::Task['ci:success'].invoke
|
8
|
+
rescue Exception => e
|
9
|
+
Rake::Task['ci:failure'].invoke
|
10
|
+
raise e
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Update your code base (will erase local changes!!!)"
|
15
|
+
task :rebase do
|
16
|
+
system('git checkout .')
|
17
|
+
system('git pull --rebase')
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Run QA"
|
21
|
+
task :qa do
|
22
|
+
Rake::Task['ci:rspec'].invoke
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Run Rspec"
|
26
|
+
task :rspec do
|
27
|
+
system "mkdir -p ../public" unless File.exists?("../public")
|
28
|
+
Rake::Task['ci:rspec_run'].invoke
|
29
|
+
end
|
30
|
+
|
31
|
+
RSpec::Core::RakeTask.new(:rspec_run) do |t|
|
32
|
+
t.pattern = "./spec/**/*spec.rb"
|
33
|
+
t.rspec_opts = ["--format", "html", "--out", "../public/rspec.html"]
|
34
|
+
t.fail_on_error = true
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "The Build Succeeded, so tell our monitoring service"
|
38
|
+
task :success do
|
39
|
+
if File.exists?("/home/deployer/monitor/log")
|
40
|
+
system 'echo "WatchMe succeeded, http://cc.cenx.localnet" > /home/deployer/monitor/log/WatchMe.cc'
|
41
|
+
else
|
42
|
+
print "BUILD SUCCEEDED, but log directory (/home/deployer/monitor/log) does not exist"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "The Build failed, so tell our monitoring service"
|
47
|
+
task :failure do
|
48
|
+
if File.exists?("/home/deployer/monitor/log")
|
49
|
+
system "curl http://cc.cenx.localnet/watchme > /home/deployer/monitor/log/WatchMe.cc"
|
50
|
+
else
|
51
|
+
raise "BUILD FAILED, but log directory (/home/deployer/monitor/log) does not exist"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
|
2
|
+
module WatchMe
|
3
|
+
class Timer
|
4
|
+
|
5
|
+
attr_accessor :duration, :start_time, :stop_time
|
6
|
+
|
7
|
+
def initialize(data = {})
|
8
|
+
@duration = data[:duration]
|
9
|
+
start
|
10
|
+
end
|
11
|
+
|
12
|
+
def start
|
13
|
+
@start_time = Time.now
|
14
|
+
@start_time
|
15
|
+
end
|
16
|
+
|
17
|
+
def stop
|
18
|
+
@stop_time = Time.now
|
19
|
+
update_duration_as_required
|
20
|
+
@stop_time
|
21
|
+
end
|
22
|
+
|
23
|
+
def duration_to_s
|
24
|
+
Timer.calculate_duration_to_s(duration)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.num_increments(inc_duration,total_duration)
|
28
|
+
inc_secs = to_seconds(inc_duration)
|
29
|
+
total_secs = to_seconds(total_duration)*1.0
|
30
|
+
return 0 if inc_secs == 0
|
31
|
+
return (total_secs / inc_secs).ceil
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.to_minutes(input,data = {})
|
35
|
+
result, has_scale = to_seconds_or_as_is(input,data)
|
36
|
+
result /= 60 if has_scale
|
37
|
+
result
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.to_seconds(input,data = {})
|
41
|
+
result, has_scale = to_seconds_or_as_is(input,data)
|
42
|
+
result
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.calculate_duration_to_s(duration_in_seconds)
|
46
|
+
return "N/A" if duration_in_seconds.nil?
|
47
|
+
|
48
|
+
#TODO use sortable hash if ruby 1.9.2
|
49
|
+
times = [ 60*60*24*365.0, 60*60*24.0, 60*60.0, 60.0, 1.0, 0.001]
|
50
|
+
names = [ 'year','day','hour','minute','second', 'millisecond']
|
51
|
+
|
52
|
+
times.each_with_index do |factor,index|
|
53
|
+
adjusted_time = duration_in_seconds / factor
|
54
|
+
next if (adjusted_time < 1 && factor != 0.001)
|
55
|
+
adjusted_time = (adjusted_time * 100).round / 100.0
|
56
|
+
adjusted_time = adjusted_time.round if adjusted_time == adjusted_time.round
|
57
|
+
name = adjusted_time == 1 ? names[index] : names[index].pluralize
|
58
|
+
return "#{adjusted_time} #{name}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def self.to_seconds_or_as_is(input,data = {})
|
65
|
+
return [0,false] if input.nil?
|
66
|
+
return [input.to_i,false] if input.to_s == input.to_i.to_s
|
67
|
+
|
68
|
+
days_in_month = data[:days_in_month] || 31
|
69
|
+
days_in_year = data[:days_in_year] || 366
|
70
|
+
|
71
|
+
now = data[:now]
|
72
|
+
now = Time.at(data[:now_epoch]) if now.nil? && !data[:now_epoch].nil?
|
73
|
+
unless now.nil?
|
74
|
+
days_in_month = now.end_of_month.day
|
75
|
+
days_in_year = now.end_of_year.yday
|
76
|
+
end
|
77
|
+
|
78
|
+
input = "#{input}"
|
79
|
+
input.gsub!(/\s/,"")
|
80
|
+
m = input.match(/^(\d*)$/)
|
81
|
+
return [ m[1].to_i, false ] unless m.nil?
|
82
|
+
m = input.match(/^(\d*)(.*)s$/)
|
83
|
+
m = input.match(/^(\d*)(.*)$/) if m.nil?
|
84
|
+
return [0, false] if m.nil?
|
85
|
+
d = (m[1] == "") ? 1 : m[1].to_i
|
86
|
+
scale = m[2]
|
87
|
+
answer = case scale
|
88
|
+
when "second"
|
89
|
+
d
|
90
|
+
when "minute"
|
91
|
+
d * 60
|
92
|
+
when "hour"
|
93
|
+
d * 60 * 60
|
94
|
+
when "day"
|
95
|
+
d * 60 * 60 * 24
|
96
|
+
when "week"
|
97
|
+
d * 60 * 60 * 24 * 7
|
98
|
+
when "month"
|
99
|
+
d * 60 * 60 * 24 * days_in_month
|
100
|
+
when "year"
|
101
|
+
d * 60 * 60 * 24 * days_in_year
|
102
|
+
else
|
103
|
+
0
|
104
|
+
end
|
105
|
+
[answer,true]
|
106
|
+
end
|
107
|
+
|
108
|
+
def update_duration_as_required
|
109
|
+
return if @start_time.nil? || @stop_time.nil?
|
110
|
+
@duration = @stop_time - @start_time
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rspec'
|
4
|
+
require File.dirname(__FILE__) + '/../lib/watchme'
|
5
|
+
|
6
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
7
|
+
# in spec/support/ and its subdirectories.
|
8
|
+
# Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.mock_with :rspec
|
12
|
+
end
|
data/spec/timer_spec.rb
ADDED
@@ -0,0 +1,318 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module WatchMe
|
4
|
+
describe Timer do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@before_now = Time.parse("2010-09-21 10:11:10")
|
8
|
+
@now = Time.parse("2010-09-21 10:11:12")
|
9
|
+
Time.stub!(:now).and_return(@now)
|
10
|
+
@obj = Timer.new
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#initialize" do
|
14
|
+
|
15
|
+
it "should set duration to nil" do
|
16
|
+
@obj.duration.should == nil
|
17
|
+
@obj.start_time.should == @now
|
18
|
+
@obj.stop_time.should == nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should support constructor values" do
|
22
|
+
obj = Timer.new(:duration => 12.34)
|
23
|
+
obj.duration.should == 12.34
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#start" do
|
29
|
+
|
30
|
+
it "should set start_time to now" do
|
31
|
+
@obj.start.should == @now
|
32
|
+
@obj.start_time.should == @now
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#stop" do
|
38
|
+
|
39
|
+
it "should set stop_time to now" do
|
40
|
+
@obj.stop.should == @now
|
41
|
+
@obj.stop_time.should == @now
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should leave duration alone if start time nil" do
|
45
|
+
@obj.start_time = nil
|
46
|
+
@obj.stop
|
47
|
+
@obj.duration.should == nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should update the duration if start time set" do
|
51
|
+
Time.stub!(:now).and_return(@before_now)
|
52
|
+
@obj.start
|
53
|
+
Time.stub!(:now).and_return(@now)
|
54
|
+
@obj.stop
|
55
|
+
@obj.duration.should == 2
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#calculate_duration_to_s" do
|
61
|
+
|
62
|
+
it "should support nil" do
|
63
|
+
Timer.calculate_duration_to_s(nil).should == "N/A"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "only two decimal places" do
|
67
|
+
Timer.calculate_duration_to_s(19.342).should == '19.34 seconds'
|
68
|
+
end
|
69
|
+
|
70
|
+
it "milliseconds" do
|
71
|
+
Timer.calculate_duration_to_s(0.34).should == '340 milliseconds'
|
72
|
+
end
|
73
|
+
|
74
|
+
it "seconds" do
|
75
|
+
Timer.calculate_duration_to_s(9.34).should == '9.34 seconds'
|
76
|
+
end
|
77
|
+
|
78
|
+
it "minutes" do
|
79
|
+
Timer.calculate_duration_to_s(1.12*60).should == '1.12 minutes'
|
80
|
+
end
|
81
|
+
|
82
|
+
it "hours" do
|
83
|
+
Timer.calculate_duration_to_s(1.5*60*60).should == '1.5 hours'
|
84
|
+
end
|
85
|
+
|
86
|
+
it "days" do
|
87
|
+
Timer.calculate_duration_to_s(2.8*60*60*24).should == '2.8 days'
|
88
|
+
end
|
89
|
+
|
90
|
+
it "years" do
|
91
|
+
Timer.calculate_duration_to_s(9.8*60*60*24*365).should == '9.8 years'
|
92
|
+
end
|
93
|
+
|
94
|
+
it "second" do
|
95
|
+
Timer.calculate_duration_to_s(1).should == '1 second'
|
96
|
+
end
|
97
|
+
|
98
|
+
it "minute" do
|
99
|
+
Timer.calculate_duration_to_s(60).should == '1 minute'
|
100
|
+
end
|
101
|
+
|
102
|
+
it "hour" do
|
103
|
+
Timer.calculate_duration_to_s(1*60*60).should == '1 hour'
|
104
|
+
end
|
105
|
+
|
106
|
+
it "day" do
|
107
|
+
Timer.calculate_duration_to_s(1*60*60*24).should == '1 day'
|
108
|
+
end
|
109
|
+
|
110
|
+
it "year" do
|
111
|
+
Timer.calculate_duration_to_s(1*60*60*24*365).should == '1 year'
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
describe "#num_increments" do
|
117
|
+
|
118
|
+
it "should internally convert the units" do
|
119
|
+
Timer.num_increments("30seconds","3minutes").should == 6
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should round up" do
|
123
|
+
Timer.num_increments("45seconds","1minutes").should == 2
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should handle months to months perfectly" do
|
127
|
+
Timer.num_increments("2month","10months").should == 5
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should handle nil" do
|
131
|
+
Timer.num_increments("",nil).should == 0
|
132
|
+
Timer.num_increments(nil,"").should == 0
|
133
|
+
Timer.num_increments("garble","garble").should == 0
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "#to_minutes" do
|
140
|
+
|
141
|
+
it "Should just grab the seconds and convert" do
|
142
|
+
Timer.to_minutes("30second").should == 0
|
143
|
+
Timer.to_minutes("10minutes").should == 10
|
144
|
+
Timer.to_minutes("hour").should == 60
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should keep as-is in the units as expected" do
|
148
|
+
Timer.to_minutes(30).should == 30
|
149
|
+
Timer.to_minutes("30").should == 30
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should accept how many days in a month, and year" do
|
153
|
+
Timer.to_minutes("month", :days_in_month => 28).should == 60 * 24 * 28
|
154
|
+
Timer.to_minutes("month", :days_in_month => 31).should == 60 * 24 * 31
|
155
|
+
|
156
|
+
Timer.to_minutes("year", :days_in_year => 365).should == 60 * 24 * 365
|
157
|
+
Timer.to_minutes("year", :days_in_year => 366).should == 60 * 24 * 366
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should accept how many now for month conversion" do
|
161
|
+
Timer.to_minutes("month", :now => Time.parse("2011-09-21")).should == 60 * 24 * 30
|
162
|
+
Timer.to_minutes("month", :now_epoch => Time.parse("2011-10-21").to_i).should == 60 * 24 * 31
|
163
|
+
|
164
|
+
Timer.to_minutes("year", :now => Time.parse("2011-09-21")).should == 60 * 24 * 365
|
165
|
+
Timer.to_minutes("year", :now_epoch => Time.parse("2012-09-21").to_i).should == 60 * 24 * 366
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
describe "#to_seconds" do
|
172
|
+
|
173
|
+
it "should support nil" do
|
174
|
+
Timer.to_seconds(nil).should == 0
|
175
|
+
Timer.to_seconds("").should == 0
|
176
|
+
Timer.to_seconds("garble").should == 0
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should keep as-is in the units as expected" do
|
180
|
+
Timer.to_minutes(30).should == 30
|
181
|
+
Timer.to_minutes("30").should == 30
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should support no number" do
|
185
|
+
Timer.to_seconds("second").should == 1
|
186
|
+
Timer.to_seconds("minute").should == 1 * 60
|
187
|
+
Timer.to_seconds("hour").should == 1 * 60 * 60
|
188
|
+
Timer.to_seconds("day").should == 1 * 60 * 60 * 24
|
189
|
+
Timer.to_seconds("week").should == 1 * 60 * 60 * 24 * 7
|
190
|
+
Timer.to_seconds("month").should == 1 * 60 * 60 * 24 * 31
|
191
|
+
Timer.to_seconds("year").should == 1 * 60 * 60 * 24 * 366
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should support seconds" do
|
195
|
+
Timer.to_seconds("10 seconds").should == 10
|
196
|
+
Timer.to_seconds("10 second").should == 10
|
197
|
+
Timer.to_seconds("10second").should == 10
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should support minutes" do
|
201
|
+
Timer.to_seconds("10 minutes").should == 10*60
|
202
|
+
Timer.to_seconds("10 minute").should == 10*60
|
203
|
+
Timer.to_seconds("10minute").should == 10*60
|
204
|
+
end
|
205
|
+
|
206
|
+
it "should support hours" do
|
207
|
+
Timer.to_seconds("10 hours").should == 10*60*60
|
208
|
+
Timer.to_seconds("10 hour").should == 10*60*60
|
209
|
+
Timer.to_seconds("10hour").should == 10*60*60
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should support days" do
|
213
|
+
Timer.to_seconds("10 days").should == 10*60*60*24
|
214
|
+
Timer.to_seconds("10 day").should == 10*60*60*24
|
215
|
+
Timer.to_seconds("10day").should == 10*60*60*24
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should support weeks" do
|
219
|
+
Timer.to_seconds("10 weeks").should == 10*60*60*24*7
|
220
|
+
Timer.to_seconds("10 week").should == 10*60*60*24*7
|
221
|
+
Timer.to_seconds("10week").should == 10*60*60*24*7
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should support the a 31 day month" do
|
225
|
+
Timer.to_seconds("10 months").should == 10*60*60*24*31
|
226
|
+
Timer.to_seconds("10 months").should == 10*60*60*24*31
|
227
|
+
Timer.to_seconds("10month").should == 10*60*60*24*31
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should support a 366 day year" do
|
231
|
+
Timer.to_seconds("10 years").should == 10*60*60*24*366
|
232
|
+
Timer.to_seconds("10 years").should == 10*60*60*24*366
|
233
|
+
Timer.to_seconds("10years").should == 10*60*60*24*366
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should ignore other times" do
|
237
|
+
Timer.to_seconds("10 garbles").should == 0
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should accept how many days in a month, and year" do
|
241
|
+
Timer.to_seconds("month", :days_in_month => 28).should == 60 * 60 * 24 * 28
|
242
|
+
Timer.to_seconds("month", :days_in_month => 31).should == 60 * 60 * 24 * 31
|
243
|
+
|
244
|
+
Timer.to_seconds("year", :days_in_year => 365).should == 60 * 60 * 24 * 365
|
245
|
+
Timer.to_seconds("year", :days_in_year => 366).should == 60 * 60 * 24 * 366
|
246
|
+
end
|
247
|
+
|
248
|
+
it "should accept how many now for month conversion" do
|
249
|
+
Timer.to_seconds("month", :now => Time.parse("2011-09-21")).should == 60 * 60 * 24 * 30
|
250
|
+
Timer.to_seconds("month", :now_epoch => Time.parse("2011-10-21").to_i).should == 60 * 60 * 24 * 31
|
251
|
+
|
252
|
+
Timer.to_seconds("year", :now => Time.parse("2011-09-21")).should == 60 * 60 * 24 * 365
|
253
|
+
Timer.to_seconds("year", :now_epoch => Time.parse("2012-09-21").to_i).should == 60 * 60 * 24 * 366
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|
257
|
+
|
258
|
+
|
259
|
+
describe "#duration_to_s" do
|
260
|
+
|
261
|
+
it "should support nil" do
|
262
|
+
obj = Timer.new
|
263
|
+
obj.duration_to_s.should == "N/A"
|
264
|
+
end
|
265
|
+
|
266
|
+
it "only two decimal places" do
|
267
|
+
Timer.new(:duration => 19.342).duration_to_s.should == '19.34 seconds'
|
268
|
+
end
|
269
|
+
|
270
|
+
it "milliseconds" do
|
271
|
+
Timer.new(:duration => 0.34).duration_to_s.should == '340 milliseconds'
|
272
|
+
end
|
273
|
+
|
274
|
+
it "seconds" do
|
275
|
+
Timer.new(:duration => 9.34).duration_to_s.should == '9.34 seconds'
|
276
|
+
end
|
277
|
+
|
278
|
+
it "minutes" do
|
279
|
+
Timer.new(:duration => 1.12*60).duration_to_s.should == '1.12 minutes'
|
280
|
+
end
|
281
|
+
|
282
|
+
it "hours" do
|
283
|
+
Timer.new(:duration => 1.5*60*60).duration_to_s.should == '1.5 hours'
|
284
|
+
end
|
285
|
+
|
286
|
+
it "days" do
|
287
|
+
Timer.new(:duration => 2.8*60*60*24).duration_to_s.should == '2.8 days'
|
288
|
+
end
|
289
|
+
|
290
|
+
it "years" do
|
291
|
+
Timer.new(:duration => 9.8*60*60*24*365).duration_to_s.should == '9.8 years'
|
292
|
+
end
|
293
|
+
|
294
|
+
it "second" do
|
295
|
+
Timer.new(:duration => 1).duration_to_s.should == '1 second'
|
296
|
+
end
|
297
|
+
|
298
|
+
it "minute" do
|
299
|
+
Timer.new(:duration => 60).duration_to_s.should == '1 minute'
|
300
|
+
end
|
301
|
+
|
302
|
+
it "hour" do
|
303
|
+
Timer.new(:duration => 1*60*60).duration_to_s.should == '1 hour'
|
304
|
+
end
|
305
|
+
|
306
|
+
it "day" do
|
307
|
+
Timer.new(:duration => 1*60*60*24).duration_to_s.should == '1 day'
|
308
|
+
end
|
309
|
+
|
310
|
+
it "year" do
|
311
|
+
Timer.new(:duration => 1*60*60*24*365).duration_to_s.should == '1 year'
|
312
|
+
end
|
313
|
+
|
314
|
+
|
315
|
+
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
data/watchme.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "watchme/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "watchme"
|
7
|
+
s.version = WatchMe::VERSION
|
8
|
+
s.authors = ["Andrew Forward"]
|
9
|
+
s.email = ["aforward@gmail.com"]
|
10
|
+
s.homepage = "http://github.com/aforward/watchme"
|
11
|
+
s.summary = %q{Simple API for tracking time within a ruby project}
|
12
|
+
s.description = %q{Simple API for tracking time within a ruby project}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_dependency('activesupport','>=3.0.0')
|
20
|
+
|
21
|
+
s.add_development_dependency('rake')
|
22
|
+
s.add_development_dependency('rspec')
|
23
|
+
s.add_development_dependency('ZenTest')
|
24
|
+
s.add_development_dependency('guard-rspec')
|
25
|
+
s.add_development_dependency('autotest-fsevent') if RUBY_PLATFORM =~ /darwin/i
|
26
|
+
s.add_development_dependency('rb-fsevent') if RUBY_PLATFORM =~ /darwin/i
|
27
|
+
s.add_development_dependency('geminabox')
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: watchme
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew Forward
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-25 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: &70195297442860 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70195297442860
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70195297442440 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70195297442440
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70195297441980 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70195297441980
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ZenTest
|
49
|
+
requirement: &70195297441560 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70195297441560
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: guard-rspec
|
60
|
+
requirement: &70195297441140 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70195297441140
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: autotest-fsevent
|
71
|
+
requirement: &70195297440620 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70195297440620
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rb-fsevent
|
82
|
+
requirement: &70195297440140 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70195297440140
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: geminabox
|
93
|
+
requirement: &70195297439600 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *70195297439600
|
102
|
+
description: Simple API for tracking time within a ruby project
|
103
|
+
email:
|
104
|
+
- aforward@gmail.com
|
105
|
+
executables: []
|
106
|
+
extensions: []
|
107
|
+
extra_rdoc_files: []
|
108
|
+
files:
|
109
|
+
- .gitignore
|
110
|
+
- Gemfile
|
111
|
+
- Gemfile.lock
|
112
|
+
- Rakefile
|
113
|
+
- autotest/discover.rb
|
114
|
+
- lib/watchme.rb
|
115
|
+
- lib/watchme/ci.rake
|
116
|
+
- lib/watchme/timer.rb
|
117
|
+
- lib/watchme/version.rb
|
118
|
+
- spec/spec_helper.rb
|
119
|
+
- spec/timer_spec.rb
|
120
|
+
- watchme.gemspec
|
121
|
+
homepage: http://github.com/aforward/watchme
|
122
|
+
licenses: []
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
+
none: false
|
135
|
+
requirements:
|
136
|
+
- - ! '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
requirements: []
|
140
|
+
rubyforge_project:
|
141
|
+
rubygems_version: 1.8.10
|
142
|
+
signing_key:
|
143
|
+
specification_version: 3
|
144
|
+
summary: Simple API for tracking time within a ruby project
|
145
|
+
test_files:
|
146
|
+
- spec/spec_helper.rb
|
147
|
+
- spec/timer_spec.rb
|