ice_cube 0.3.9 → 0.4
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/lib/ice_cube.rb +4 -1
- data/lib/ice_cube/rule_occurrence.rb +7 -5
- data/lib/ice_cube/rules/daily_rule.rb +2 -0
- data/lib/ice_cube/rules/weekly_rule.rb +1 -0
- data/lib/ice_cube/schedule.rb +20 -6
- data/lib/ice_cube/version.rb +1 -1
- metadata +3 -4
data/lib/ice_cube.rb
CHANGED
@@ -30,6 +30,9 @@ module IceCube
|
|
30
30
|
autoload :MonthOfYearValidation, 'ice_cube/validations/month_of_year'
|
31
31
|
autoload :SecondOfMinuteValidation, 'ice_cube/validations/second_of_minute'
|
32
32
|
|
33
|
+
# if you're reading this code, you've just been iced
|
34
|
+
# http://brosicingbros.com/
|
35
|
+
|
33
36
|
VERSION = '0.2.3'
|
34
37
|
|
35
38
|
IceCube::ONE_DAY = 24 * 60 * 60
|
@@ -44,4 +47,4 @@ module IceCube
|
|
44
47
|
|
45
48
|
include TimeUtil
|
46
49
|
|
47
|
-
end
|
50
|
+
end
|
@@ -14,7 +14,7 @@ module IceCube
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def all_occurrences
|
17
|
-
raise ArgumentError.new("Rule must specify either an until date or a count to use 'all_occurrences'") unless @rule.occurrence_count || @rule.until_date
|
17
|
+
raise ArgumentError.new("Rule must specify either an until date or a count to use 'all_occurrences'") unless @rule.occurrence_count || @rule.until_date || @end_time
|
18
18
|
find_occurrences { |roc| false }
|
19
19
|
end
|
20
20
|
|
@@ -47,15 +47,16 @@ module IceCube
|
|
47
47
|
end
|
48
48
|
#walk through all of the successive dates, looking for the next occurrence (interval-valid), then return it.
|
49
49
|
begin
|
50
|
+
return nil if @end_time && date > @end_time
|
50
51
|
return nil if @rule.until_date && date > @rule.until_date # until check
|
51
|
-
return RuleOccurrence.new(@rule, @start_date, date, @index + 1) if @rule.in_interval?(date, @start_date)
|
52
|
+
return RuleOccurrence.new(@rule, @start_date, @end_time, date, @index + 1) if @rule.in_interval?(date, @start_date)
|
52
53
|
end while date = @rule.next_suggestion(date)
|
53
54
|
end
|
54
55
|
|
55
56
|
attr_reader :rule
|
56
57
|
|
57
58
|
private
|
58
|
-
|
59
|
+
|
59
60
|
def find_occurrences
|
60
61
|
include_dates = []
|
61
62
|
roc = self
|
@@ -68,11 +69,12 @@ module IceCube
|
|
68
69
|
include_dates
|
69
70
|
end
|
70
71
|
|
71
|
-
def initialize(rule, start_date, date = nil, index = 0)
|
72
|
+
def initialize(rule, start_date, end_time, date = nil, index = 0)
|
72
73
|
#set some variables
|
73
74
|
@rule = rule
|
74
|
-
@date = date
|
75
75
|
@start_date = start_date
|
76
|
+
@end_time = end_time
|
77
|
+
@date = date
|
76
78
|
@index = index
|
77
79
|
end
|
78
80
|
|
@@ -2,11 +2,13 @@ module IceCube
|
|
2
2
|
|
3
3
|
class DailyRule < Rule
|
4
4
|
|
5
|
+
# TODO repair
|
5
6
|
# Determine whether this rule occurs on a give date.
|
6
7
|
def in_interval?(date, start_date)
|
7
8
|
#make sure we're in a proper interval
|
8
9
|
day_count = ((date - start_date) / IceCube::ONE_DAY).to_i
|
9
10
|
day_count % @interval == 0
|
11
|
+
true
|
10
12
|
end
|
11
13
|
|
12
14
|
def to_ical
|
@@ -7,6 +7,7 @@ module IceCube
|
|
7
7
|
# and we're in a valid day of the week.
|
8
8
|
def in_interval?(date, start_date)
|
9
9
|
#make sure we're in the right interval
|
10
|
+
date = adjust(date, start_date)
|
10
11
|
week_of_year = Date.civil(date.year, date.month, date.day).cweek
|
11
12
|
week_of_year % @interval == 0
|
12
13
|
end
|
data/lib/ice_cube/schedule.rb
CHANGED
@@ -2,7 +2,8 @@ module IceCube
|
|
2
2
|
|
3
3
|
class Schedule
|
4
4
|
|
5
|
-
attr_reader :rdates, :exdates, :start_date, :duration
|
5
|
+
attr_reader :rdates, :exdates, :start_date, :duration, :end_time
|
6
|
+
alias :start_time :start_date
|
6
7
|
|
7
8
|
def initialize(start_date, options = {})
|
8
9
|
@rrule_occurrence_heads = []
|
@@ -12,6 +13,8 @@ module IceCube
|
|
12
13
|
@start_date = start_date
|
13
14
|
raise ArgumentError.new('Duration cannot be negative') if options[:duration] && options[:duration] < 0
|
14
15
|
@duration = options[:duration]
|
16
|
+
raise ArgumentError.new('Start time must be before end time') if options[:end_time] && options[:end_time] < @start_date
|
17
|
+
@end_time = options[:end_time]
|
15
18
|
end
|
16
19
|
|
17
20
|
# Convert the schedule to a hash, reverse of Schedule.from_hash
|
@@ -23,6 +26,7 @@ module IceCube
|
|
23
26
|
hash[:rdates] = @rdates
|
24
27
|
hash[:exdates] = @exdates
|
25
28
|
hash[:duration] = @duration
|
29
|
+
hash[:end_time] = @end_time
|
26
30
|
hash
|
27
31
|
end
|
28
32
|
|
@@ -32,6 +36,7 @@ module IceCube
|
|
32
36
|
hash[:start_date] = TimeUtil.serializable_time(hash[:start_date])
|
33
37
|
hash[:rdates] = hash[:rdates].map { |t| TimeUtil.serializable_time(t) }
|
34
38
|
hash[:exdates] = hash[:exdates].map { |t| TimeUtil.serializable_time(t) }
|
39
|
+
hash[:end_time] = TimeUtil.serializable_time(hash[:end_time])
|
35
40
|
hash.to_yaml
|
36
41
|
end
|
37
42
|
|
@@ -39,7 +44,7 @@ module IceCube
|
|
39
44
|
def self.from_hash(hash)
|
40
45
|
options = {}
|
41
46
|
options[:duration] = hash[:duration] if hash.has_key?(:duration)
|
42
|
-
|
47
|
+
options[:end_time] = hash[:end_time] if hash.has_key?(:end_time)
|
43
48
|
schedule = Schedule.new(hash[:start_date], options)
|
44
49
|
hash[:rrules].each { |rr| schedule.add_recurrence_rule Rule.from_hash(rr) }
|
45
50
|
hash[:exrules].each { |ex| schedule.add_exception_rule Rule.from_hash(ex) }
|
@@ -77,6 +82,9 @@ module IceCube
|
|
77
82
|
representation << SEPARATOR unless representation.empty?
|
78
83
|
representation << @exdates.uniq.sort.map { |d| 'not on ' << d.strftime(TIME_FORMAT) }.join(SEPARATOR)
|
79
84
|
end
|
85
|
+
if @end_time
|
86
|
+
representation << "until #{end_time.strftime(TIME_FORMAT)}"
|
87
|
+
end
|
80
88
|
representation
|
81
89
|
end
|
82
90
|
|
@@ -89,14 +97,16 @@ module IceCube
|
|
89
97
|
|
90
98
|
# Determine whether a given time adheres to the ruleset of this schedule.
|
91
99
|
def occurs_at?(date)
|
100
|
+
return false if @end_time && date > @end_time
|
92
101
|
dates = occurrences(date)
|
93
102
|
dates.last == date
|
94
103
|
end
|
95
104
|
|
96
105
|
# Determine whether a given date appears in the times returned by the schedule
|
97
106
|
# Required activeSupport
|
98
|
-
def occurs_on?(date)
|
107
|
+
def occurs_on?(date)
|
99
108
|
time = date.to_time
|
109
|
+
return false if @end_time && time > @end_time
|
100
110
|
occurrences_between(time.beginning_of_day, time.end_of_day).any?
|
101
111
|
end
|
102
112
|
|
@@ -109,6 +119,7 @@ module IceCube
|
|
109
119
|
|
110
120
|
# Find all occurrences until a certain date
|
111
121
|
def occurrences(end_date)
|
122
|
+
end_date = @end_time if @end_time && @end_time < end_date
|
112
123
|
find_occurrences { |head| head.upto(end_date) }
|
113
124
|
end
|
114
125
|
|
@@ -122,7 +133,7 @@ module IceCube
|
|
122
133
|
# Add a rule of any type as an recurrence in this schedule
|
123
134
|
def add_recurrence_rule(rule)
|
124
135
|
raise ArgumentError.new('Argument must be a valid rule') unless rule.class < Rule
|
125
|
-
@rrule_occurrence_heads << RuleOccurrence.new(rule, @start_date)
|
136
|
+
@rrule_occurrence_heads << RuleOccurrence.new(rule, @start_date, @end_time)
|
126
137
|
end
|
127
138
|
|
128
139
|
def rrules
|
@@ -132,7 +143,7 @@ module IceCube
|
|
132
143
|
# Add a rule of any type as an exception to this schedule
|
133
144
|
def add_exception_rule(rule)
|
134
145
|
raise ArgumentError.new('Argument must be a valid rule') unless rule.class < Rule
|
135
|
-
@exrule_occurrence_heads << RuleOccurrence.new(rule, @start_date)
|
146
|
+
@exrule_occurrence_heads << RuleOccurrence.new(rule, @start_date, @end_time)
|
136
147
|
end
|
137
148
|
|
138
149
|
def exrules
|
@@ -150,6 +161,9 @@ module IceCube
|
|
150
161
|
end
|
151
162
|
|
152
163
|
def occurrences_between(begin_time, end_time)
|
164
|
+
# adjust to the propert end date
|
165
|
+
end_time = @end_time if @end_time && @end_time < end_time
|
166
|
+
# collect the occurrences
|
153
167
|
exclude_dates, include_dates = Set.new(@exdates), SortedSet.new(@rdates)
|
154
168
|
@rrule_occurrence_heads.each do |rrule_occurrence_head|
|
155
169
|
include_dates.merge(rrule_occurrence_head.between(begin_time, end_time))
|
@@ -166,7 +180,7 @@ module IceCube
|
|
166
180
|
|
167
181
|
# tell if, from a list of rule_occurrence heads, a certain time is occurring
|
168
182
|
def any_occurring_at?(what, time)
|
169
|
-
return false if @start_time &&
|
183
|
+
return false if @start_time && time < @start_time
|
170
184
|
what.any? do |occurrence_head|
|
171
185
|
# time is less than now and duration is less than that distance
|
172
186
|
possibilities = occurrence_head.between(@start_date, time)
|
data/lib/ice_cube/version.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,8 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
|
9
|
-
version: 0.3.9
|
7
|
+
- 4
|
8
|
+
version: "0.4"
|
10
9
|
platform: ruby
|
11
10
|
authors:
|
12
11
|
- John Crepezzi
|
@@ -14,7 +13,7 @@ autorequire:
|
|
14
13
|
bindir: bin
|
15
14
|
cert_chain: []
|
16
15
|
|
17
|
-
date: 2010-06-
|
16
|
+
date: 2010-06-25 00:00:00 -04:00
|
18
17
|
default_executable:
|
19
18
|
dependencies:
|
20
19
|
- !ruby/object:Gem::Dependency
|