lucid_works 0.6.6 → 0.6.7
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.
@@ -1,6 +1,19 @@
|
|
1
1
|
module LucidWorks
|
2
2
|
class Datasource
|
3
3
|
|
4
|
+
#
|
5
|
+
# Datasource::Schedule supplies numerous convenience methods to make it easy and clean to
|
6
|
+
# display and set schedules in simple formats
|
7
|
+
#
|
8
|
+
# The simple formats supported are:
|
9
|
+
# hourly at 15 minutes past the hour # => {:frequency => 'hourly', :start => {:minutes => 15}}
|
10
|
+
# daily at 3:15 # => {:frequency => 'daily', :start => {:hours => 3, :minutes => 15}}
|
11
|
+
# weekly at 3:15 on Tuesday # => {:frequency => 'weekly', :start => {:days => 1, :hours => 3, :minutes => 15}}
|
12
|
+
#
|
13
|
+
# Notes:
|
14
|
+
# day of week is specified as the # of days from Monday b/c Rails day of week helpers are monday-based
|
15
|
+
# :start hash options keys are pluralized b/c we feed them direcly to Time.advance, e.g. Time.now.advance(:days => 3)
|
16
|
+
#
|
4
17
|
class Schedule < Base
|
5
18
|
self.singleton = true
|
6
19
|
belongs_to :datasource
|
@@ -8,10 +21,14 @@ module LucidWorks
|
|
8
21
|
schema do
|
9
22
|
attribute :period
|
10
23
|
attribute :start_time, :iso8601
|
11
|
-
attribute :active
|
24
|
+
attribute :active, :boolean
|
12
25
|
attribute :type
|
13
26
|
end
|
14
27
|
|
28
|
+
#
|
29
|
+
# returns hourly, daily, weekly based on period
|
30
|
+
# returns custom if it doesn't fit a supported interval
|
31
|
+
#
|
15
32
|
def frequency
|
16
33
|
case period
|
17
34
|
when 1.weeks.seconds then 'weekly'
|
@@ -22,6 +39,9 @@ module LucidWorks
|
|
22
39
|
end
|
23
40
|
end
|
24
41
|
|
42
|
+
#
|
43
|
+
# accepts hourly, daily, weekly, and sets period to respective # of seconds
|
44
|
+
#
|
25
45
|
def frequency=(frequency)
|
26
46
|
self.period = case frequency
|
27
47
|
when 'hourly' then 1.hours.seconds
|
@@ -31,7 +51,9 @@ module LucidWorks
|
|
31
51
|
end
|
32
52
|
end
|
33
53
|
|
54
|
+
#
|
34
55
|
# predict when action will occur next if active at that time
|
56
|
+
#
|
35
57
|
def next_start
|
36
58
|
return start_time if reference_time <= start_time
|
37
59
|
# require 'ruby-debug'; debugger
|
@@ -47,8 +69,10 @@ module LucidWorks
|
|
47
69
|
end
|
48
70
|
start_time + period * next_interval_num
|
49
71
|
end
|
50
|
-
|
72
|
+
|
73
|
+
#
|
51
74
|
# Provide ability to override "now" explicitly for testing purposes
|
75
|
+
#
|
52
76
|
def reference_time=(time); @reference_time = time; end
|
53
77
|
def reference_time; @reference_time || Time.now.localtime; end
|
54
78
|
|
@@ -84,9 +108,7 @@ module LucidWorks
|
|
84
108
|
all_attributes['start'].to_options!
|
85
109
|
all_attributes['start'].each{|k,v| all_attributes['start'][k]=v.to_i}
|
86
110
|
|
87
|
-
if all_attributes.keys.include?('active')
|
88
|
-
self.active = (all_attributes['active'].to_s.downcase == 'true')
|
89
|
-
end
|
111
|
+
self.active = all_attributes['active'] if all_attributes.keys.include?('active')
|
90
112
|
|
91
113
|
self.frequency = all_attributes['frequency']
|
92
114
|
self.start_time =
|
@@ -107,18 +129,44 @@ module LucidWorks
|
|
107
129
|
end
|
108
130
|
end
|
109
131
|
|
132
|
+
#
|
133
|
+
# convenince method for setting the current value in a view selector
|
134
|
+
#
|
110
135
|
def hour
|
111
136
|
self.start_time.localtime.hour rescue nil
|
112
137
|
end
|
113
138
|
|
139
|
+
#
|
140
|
+
# convenince method for setting the current value in a view selector
|
141
|
+
#
|
114
142
|
def min
|
115
143
|
self.start_time.localtime.min rescue nil
|
116
144
|
end
|
117
145
|
|
146
|
+
#
|
147
|
+
# convenince method for setting the current value in a view selector
|
148
|
+
#
|
118
149
|
def day_of_week
|
119
|
-
# subract 1 because '%u' returns 1-7, and this is
|
150
|
+
# subract 1 because '%u' returns 1-7, and this is working with zero-indexed ruby arrays
|
120
151
|
self.start_time.localtime.strftime('%u').to_i - 1 rescue nil
|
121
152
|
end
|
153
|
+
|
154
|
+
def start_is_more_than_one_period_in_the_future?
|
155
|
+
# This works fine with start times that are multiple periods in the past
|
156
|
+
# because that gives a negative difference, and period is always >= 0
|
157
|
+
(self.start_time - self.reference_time) > self.period
|
158
|
+
end
|
159
|
+
|
160
|
+
#
|
161
|
+
# convenience method for detecting whether schedule can be represented in simple format
|
162
|
+
# or should be described as custom (meaning it is beyond the capabilities of the convenience methods)
|
163
|
+
#
|
164
|
+
def custom?
|
165
|
+
return true if self.frequency == 'custom'
|
166
|
+
return false unless self.start_time
|
167
|
+
return true if self.start_is_more_than_one_period_in_the_future?
|
168
|
+
return false
|
169
|
+
end
|
122
170
|
end
|
123
171
|
end
|
124
172
|
end
|
data/lib/lucid_works/version.rb
CHANGED
@@ -258,9 +258,91 @@ describe LucidWorks::Datasource::Schedule do
|
|
258
258
|
end
|
259
259
|
end
|
260
260
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
261
|
+
context 'sub-time convenience accessors' do
|
262
|
+
describe '#hour' do
|
263
|
+
it 'should return the hour component of the time' do
|
264
|
+
@schedule.start_time = Time.new(2011, 4, 15, 13, 11, 56)
|
265
|
+
@schedule.hour.should == 13
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'should return nil if start_time == nil' do
|
269
|
+
@schedule.start_time = nil
|
270
|
+
@schedule.hour.should == nil
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
describe '#min' do
|
275
|
+
it 'should return the minute component of the time' do
|
276
|
+
@schedule.start_time = Time.new(2011, 4, 15, 13, 11, 56)
|
277
|
+
@schedule.min.should == 11
|
278
|
+
end
|
279
|
+
|
280
|
+
it 'should return nil if start_time == nil' do
|
281
|
+
@schedule.start_time = nil
|
282
|
+
@schedule.min.should == nil
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
describe '#day_of_week' do
|
287
|
+
it 'should return the week component of the time' do
|
288
|
+
@schedule.start_time = Time.new(2011, 4, 15, 13, 11, 56)
|
289
|
+
@schedule.day_of_week.should == 4
|
290
|
+
end
|
291
|
+
|
292
|
+
it 'should return nil if start_time == nil' do
|
293
|
+
@schedule.start_time = nil
|
294
|
+
@schedule.day_of_week.should == nil
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
describe '#custom?' do
|
300
|
+
context 'schedule can not be represent as simple weekly/daily/hourly' do
|
301
|
+
it 'should be true if frequency is non-standard' do
|
302
|
+
@schedule.period = 1
|
303
|
+
@schedule.should be_custom
|
304
|
+
end
|
305
|
+
|
306
|
+
it 'should be true if period is standard but start_time is > 1 period from now' do
|
307
|
+
some_random_time = Time.new(2011, 4, 15, 13, 11, 56)
|
308
|
+
more_than_a_day_later = some_random_time.advance(:days => 2)
|
309
|
+
|
310
|
+
@schedule.reference_time = some_random_time
|
311
|
+
@schedule.frequency = 'daily'
|
312
|
+
@schedule.start_time = more_than_a_day_later
|
313
|
+
|
314
|
+
@schedule.should be_custom
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
context 'schedule can be represent as simple weekly/daily/hourly' do
|
319
|
+
it 'should be false if period is standard and start_time is within period from now' do
|
320
|
+
half_past_midnight = Time.iso8601("2011-05-09T00:30:00Z")
|
321
|
+
a_standard_schedule = {"frequency"=>"hourly", "start"=>{"minutes"=>"15"}}
|
322
|
+
a_standard_reference_time = Time.iso8601('2011-05-09T01:15:00Z')
|
323
|
+
|
324
|
+
@schedule.reference_time = a_standard_reference_time
|
325
|
+
@schedule.schedule = a_standard_schedule
|
326
|
+
|
327
|
+
@schedule.should_not be_custom
|
328
|
+
end
|
329
|
+
|
330
|
+
it 'should be false if period is standard and start time is > 1 period in the past' do
|
331
|
+
some_random_time = Time.new(2011, 4, 15, 13, 11, 56)
|
332
|
+
more_than_a_day_ago = some_random_time.advance(:days => -2)
|
333
|
+
@schedule.reference_time = some_random_time
|
334
|
+
@schedule.frequency = 'daily'
|
335
|
+
@schedule.start_time = more_than_a_day_ago
|
336
|
+
|
337
|
+
@schedule.should_not be_custom
|
338
|
+
end
|
339
|
+
|
340
|
+
end
|
341
|
+
|
342
|
+
it 'should be false if the start_time is nil and frequency is standard' do
|
343
|
+
@schedule.start_time = nil
|
344
|
+
@schedule.frequency = 'weekly'
|
345
|
+
@schedule.should_not be_custom
|
346
|
+
end
|
347
|
+
end
|
266
348
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: lucid_works
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.6.
|
5
|
+
version: 0.6.7
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Sam Pierson
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-05-
|
13
|
+
date: 2011-05-18 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|