rubyredrick-ri_cal 0.0.11 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -23,7 +23,38 @@ module RiCal
23
23
  def self.entity_name #:nodoc:
24
24
  "VEVENT"
25
25
  end
26
+
27
+ # Return a date_time representing the time at which the event starts
28
+ def start_time
29
+ dtstart_property ? dtstart.to_datetime : nil
30
+ end
31
+
32
+ # Return a date_time representing the time at which the event starts
33
+ def finish_property
34
+ if dtend_property
35
+ dtend_property
36
+ elsif duration_property
37
+ (dtstart_property + duration_property)
38
+ else
39
+ dtstart_property
40
+ end
41
+ end
26
42
 
43
+ # Return a date_time representing the time at which the event starts
44
+ def finish_time
45
+ prop = finish_property
46
+ prop ? prop.to_finish_time : nil
47
+ end
48
+
49
+ def zulu_occurrence_range_start_time
50
+ dtstart_property ? dtstart_property.to_zulu_occurrence_range_start_time : nil
51
+ end
52
+
53
+ def zulu_occurrence_range_finish_time
54
+ prop = finish_property
55
+ prop ? prop.to_zulu_occurrence_range_finish_time : nil
56
+ end
57
+
27
58
  end
28
59
  end
29
60
  end
@@ -16,6 +16,15 @@ module RiCal
16
16
  def self.entity_name #:nodoc:
17
17
  "VJOURNAL"
18
18
  end
19
+
20
+ # Return a date_time representing the time at which the event starts
21
+ def start_time
22
+ dtstart.to_datetime
23
+ end
24
+
25
+ # Journals take up no calendar time, so the finish time is always the same as the start_time
26
+ alias_method :finish_time, :start_time
27
+
19
28
  end
20
29
  end
21
30
  end
@@ -21,6 +21,23 @@ module RiCal
21
21
  def subcomponent_class #:nodoc:
22
22
  {:alarm => Alarm }
23
23
  end
24
+
25
+ # Return a date_time representing the time at which the todo should start
26
+ def start_time
27
+ dtstart_property ? dtstart.to_datetime : nil
28
+ end
29
+
30
+ # Return a date_time representing the time at which the todo is due
31
+ def finish_time
32
+ if due
33
+ due_property.to_finish_time
34
+ elsif duration_property && dtstart_property
35
+ (dtstart_property + duration_property).to_finish_time
36
+ else
37
+ nil
38
+ end
39
+ end
40
+
24
41
  end
25
42
  end
26
43
  end
@@ -163,7 +163,26 @@ module RiCal
163
163
  def bounded?
164
164
  EnumerationInstance.new(self).bounded?
165
165
  end
166
+
167
+ # Return a array whose first element is a UTC DateTime representing the start of the first
168
+ # occurrence, and whose second element is a UTC DateTime representing the end of the last
169
+ # occurrence.
170
+ # If the receiver is not bounded then the second element will be nil.
166
171
  #
172
+ # The purpose of this method is to provide values which may be used as database attributes so
173
+ # that a query can find all occurence enumerating components which may have occurrences within
174
+ # a range of times.
175
+ def zulu_occurrence_range
176
+ if bounded?
177
+ all = occurrences
178
+ first, last = all.first, all.last
179
+ else
180
+ first = occurrences(:count => 1).first
181
+ last = nil
182
+ end
183
+ [first.zulu_occurrence_range_start_time, last ? last.zulu_occurrence_range_finish_time : nil]
184
+ end
185
+
167
186
  def set_occurrence_properties!(occurrence) # :nodoc:
168
187
  occurrence_end = occurrence.dtend
169
188
  occurrence_start = occurrence.dtstart
@@ -54,7 +54,7 @@ module RiCal
54
54
  # set the CREATED property
55
55
  # property value should be an instance of RiCal::PropertyValueDateTime
56
56
  def created_property=(property_value)
57
- @created_property = property_value.for_parent(self)
57
+ @created_property = property_value ? property_value.for_parent(self) : nil
58
58
  end
59
59
 
60
60
  # set the value of the CREATED property
@@ -120,7 +120,7 @@ module RiCal
120
120
  # set the DTSTART property
121
121
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
122
122
  def dtstart_property=(property_value)
123
- @dtstart_property = property_value.for_parent(self)
123
+ @dtstart_property = property_value ? property_value.for_parent(self) : nil
124
124
  end
125
125
 
126
126
  # set the value of the DTSTART property
@@ -186,7 +186,7 @@ module RiCal
186
186
  # set the LAST-MODIFIED property
187
187
  # property value should be an instance of RiCal::PropertyValueDateTime
188
188
  def last_modified_property=(property_value)
189
- @last_modified_property = property_value.for_parent(self)
189
+ @last_modified_property = property_value ? property_value.for_parent(self) : nil
190
190
  end
191
191
 
192
192
  # set the value of the LAST-MODIFIED property
@@ -318,7 +318,7 @@ module RiCal
318
318
  # set the DTSTAMP property
319
319
  # property value should be an instance of RiCal::PropertyValueDateTime
320
320
  def dtstamp_property=(property_value)
321
- @dtstamp_property = property_value.for_parent(self)
321
+ @dtstamp_property = property_value ? property_value.for_parent(self) : nil
322
322
  end
323
323
 
324
324
  # set the value of the DTSTAMP property
@@ -549,7 +549,7 @@ module RiCal
549
549
  # set the RECURRENCE-ID property
550
550
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
551
551
  def recurrence_id_property=(property_value)
552
- @recurrence_id_property = property_value.for_parent(self)
552
+ @recurrence_id_property = property_value ? property_value.for_parent(self) : nil
553
553
  end
554
554
 
555
555
  # set the value of the RECURRENCE-ID property
@@ -582,7 +582,7 @@ module RiCal
582
582
  # set the DTEND property
583
583
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
584
584
  def dtend_property=(property_value)
585
- @dtend_property = property_value.for_parent(self)
585
+ @dtend_property = property_value ? property_value.for_parent(self) : nil
586
586
  @duration_property = nil
587
587
  end
588
588
 
@@ -1039,8 +1039,8 @@ module RiCal
1039
1039
 
1040
1040
  # set the value of the RDATE property to a single value
1041
1041
  # one instance of OccurrenceList may be passed to this method
1042
- def rdate=(ruby_value)
1043
- @rdate_property = [RiCal::PropertyValue::OccurrenceList.convert(self, ruby_value)]
1042
+ def rdate=(*ruby_value)
1043
+ @rdate_property = [RiCal::PropertyValue::OccurrenceList.convert(self, *ruby_value)]
1044
1044
  end
1045
1045
 
1046
1046
  # add one or more values to the RDATE property
@@ -54,7 +54,7 @@ module RiCal
54
54
  # set the DTSTART property
55
55
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
56
56
  def dtstart_property=(property_value)
57
- @dtstart_property = property_value.for_parent(self)
57
+ @dtstart_property = property_value ? property_value.for_parent(self) : nil
58
58
  end
59
59
 
60
60
  # set the value of the DTSTART property
@@ -87,7 +87,7 @@ module RiCal
87
87
  # set the DTEND property
88
88
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
89
89
  def dtend_property=(property_value)
90
- @dtend_property = property_value.for_parent(self)
90
+ @dtend_property = property_value ? property_value.for_parent(self) : nil
91
91
  end
92
92
 
93
93
  # set the value of the DTEND property
@@ -153,7 +153,7 @@ module RiCal
153
153
  # set the DTSTAMP property
154
154
  # property value should be an instance of RiCal::PropertyValueDateTime
155
155
  def dtstamp_property=(property_value)
156
- @dtstamp_property = property_value.for_parent(self)
156
+ @dtstamp_property = property_value ? property_value.for_parent(self) : nil
157
157
  end
158
158
 
159
159
  # set the value of the DTSTAMP property
@@ -54,7 +54,7 @@ module RiCal
54
54
  # set the CREATED property
55
55
  # property value should be an instance of RiCal::PropertyValueDateTime
56
56
  def created_property=(property_value)
57
- @created_property = property_value.for_parent(self)
57
+ @created_property = property_value ? property_value.for_parent(self) : nil
58
58
  end
59
59
 
60
60
  # set the value of the CREATED property
@@ -120,7 +120,7 @@ module RiCal
120
120
  # set the DTSTART property
121
121
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
122
122
  def dtstart_property=(property_value)
123
- @dtstart_property = property_value.for_parent(self)
123
+ @dtstart_property = property_value ? property_value.for_parent(self) : nil
124
124
  end
125
125
 
126
126
  # set the value of the DTSTART property
@@ -153,7 +153,7 @@ module RiCal
153
153
  # set the DTSTAMP property
154
154
  # property value should be an instance of RiCal::PropertyValueDateTime
155
155
  def dtstamp_property=(property_value)
156
- @dtstamp_property = property_value.for_parent(self)
156
+ @dtstamp_property = property_value ? property_value.for_parent(self) : nil
157
157
  end
158
158
 
159
159
  # set the value of the DTSTAMP property
@@ -186,7 +186,7 @@ module RiCal
186
186
  # set the LAST-MODIFIED property
187
187
  # property value should be an instance of RiCal::PropertyValueDateTime
188
188
  def last_modified_property=(property_value)
189
- @last_modified_property = property_value.for_parent(self)
189
+ @last_modified_property = property_value ? property_value.for_parent(self) : nil
190
190
  end
191
191
 
192
192
  # set the value of the LAST-MODIFIED property
@@ -252,7 +252,7 @@ module RiCal
252
252
  # set the RECURRENCE-ID property
253
253
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
254
254
  def recurrence_id_property=(property_value)
255
- @recurrence_id_property = property_value.for_parent(self)
255
+ @recurrence_id_property = property_value ? property_value.for_parent(self) : nil
256
256
  end
257
257
 
258
258
  # set the value of the RECURRENCE-ID property
@@ -54,7 +54,7 @@ module RiCal
54
54
  # set the LAST-MODIFIED property
55
55
  # property value should be an instance of RiCal::PropertyValueDateTime
56
56
  def last_modified_property=(property_value)
57
- @last_modified_property = property_value.for_parent(self)
57
+ @last_modified_property = property_value ? property_value.for_parent(self) : nil
58
58
  end
59
59
 
60
60
  # set the value of the LAST-MODIFIED property
@@ -21,7 +21,7 @@ module RiCal
21
21
  # set the DTSTART property
22
22
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
23
23
  def dtstart_property=(property_value)
24
- @dtstart_property = property_value.for_parent(self)
24
+ @dtstart_property = property_value ? property_value.for_parent(self) : nil
25
25
  end
26
26
 
27
27
  # set the value of the DTSTART property
@@ -1,6 +1,7 @@
1
1
  module RiCal
2
2
  module Properties #:nodoc:
3
- #- ©2009 Rick DeNatale, All rights reserved. Refer to the file README.txt for the license
3
+ #- ©2009 Rick DeNatale
4
+ #- All rights reserved. Refer to the file README.txt for the license
4
5
  #
5
6
  # Properties::Todo provides property accessing methods for the Todo class
6
7
  # This source file is generated by the rical:gen_propmodules rake tasks, DO NOT EDIT
@@ -53,7 +54,7 @@ module RiCal
53
54
  # set the COMPLETED property
54
55
  # property value should be an instance of RiCal::PropertyValueDateTime
55
56
  def completed_property=(property_value)
56
- @completed_property = property_value.for_parent(self)
57
+ @completed_property = property_value ? property_value.for_parent(self) : nil
57
58
  end
58
59
 
59
60
  # set the value of the COMPLETED property
@@ -86,7 +87,7 @@ module RiCal
86
87
  # set the CREATED property
87
88
  # property value should be an instance of RiCal::PropertyValueDateTime
88
89
  def created_property=(property_value)
89
- @created_property = property_value.for_parent(self)
90
+ @created_property = property_value ? property_value.for_parent(self) : nil
90
91
  end
91
92
 
92
93
  # set the value of the CREATED property
@@ -152,7 +153,7 @@ module RiCal
152
153
  # set the DTSTAMP property
153
154
  # property value should be an instance of RiCal::PropertyValueDateTime
154
155
  def dtstamp_property=(property_value)
155
- @dtstamp_property = property_value.for_parent(self)
156
+ @dtstamp_property = property_value ? property_value.for_parent(self) : nil
156
157
  end
157
158
 
158
159
  # set the value of the DTSTAMP property
@@ -185,7 +186,7 @@ module RiCal
185
186
  # set the DTSTART property
186
187
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
187
188
  def dtstart_property=(property_value)
188
- @dtstart_property = property_value.for_parent(self)
189
+ @dtstart_property = property_value ? property_value.for_parent(self) : nil
189
190
  end
190
191
 
191
192
  # set the value of the DTSTART property
@@ -251,7 +252,7 @@ module RiCal
251
252
  # set the LAST-MODIFIED property
252
253
  # property value should be an instance of RiCal::PropertyValueDateTime
253
254
  def last_modified_property=(property_value)
254
- @last_modified_property = property_value.for_parent(self)
255
+ @last_modified_property = property_value ? property_value.for_parent(self) : nil
255
256
  end
256
257
 
257
258
  # set the value of the LAST-MODIFIED property
@@ -416,7 +417,7 @@ module RiCal
416
417
  # set the RECURRENCE-ID property
417
418
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
418
419
  def recurrence_id_property=(property_value)
419
- @recurrence_id_property = property_value.for_parent(self)
420
+ @recurrence_id_property = property_value ? property_value.for_parent(self) : nil
420
421
  end
421
422
 
422
423
  # set the value of the RECURRENCE-ID property
@@ -614,7 +615,7 @@ module RiCal
614
615
  # set the DUE property
615
616
  # property value should be an instance of either RiCal::PropertyValue::DateTime or RiCal::PropertyValue::Date
616
617
  def due_property=(property_value)
617
- @due_property = property_value.for_parent(self)
618
+ @due_property = property_value ? property_value.for_parent(self) : nil
618
619
  @duration_property = nil
619
620
  end
620
621
 
@@ -151,6 +151,18 @@ module RiCal
151
151
  true
152
152
  end
153
153
 
154
+ def to_zulu_occurrence_range_start_time
155
+ to_ri_cal_date_time_value.to_zulu_occurrence_range_start_time
156
+ end
157
+
158
+ def to_zulu_occurrence_range_finish_time
159
+ to_ri_cal_date_time_value.end_of_day.to_zulu_occurrence_range_finish_time
160
+ end
161
+
162
+ def to_finish_time
163
+ to_ri_cal_date_time_value.end_of_day.to_datetime
164
+ end
165
+
154
166
  def for_occurrence(occurrence)
155
167
  if occurrence.start_of_day?
156
168
  occurrence.to_ri_cal_date_value(timezone_finder)
@@ -67,7 +67,7 @@ module RiCal
67
67
 
68
68
  # Predicate indicating whether or not the instance represents a floating time
69
69
  def floating?
70
- tzid == :floating
70
+ tzid.nil?
71
71
  end
72
72
 
73
73
  def has_valid_tzinfo_tzid? #:nodoc:
@@ -290,7 +290,35 @@ module RiCal
290
290
  end
291
291
 
292
292
  alias_method :to_ri_cal_ruby_value, :to_datetime
293
-
293
+ alias_method :to_finish_time, :to_datetime
294
+
295
+ def to_zulu_time
296
+ utc.to_datetime
297
+ end
298
+
299
+ # If a time is floating, then the utc of it's start time may actually be as early
300
+ # as 12 hours earlier if the occurrence is being viewed in a time zone just west
301
+ # of the International Date Line
302
+ def to_zulu_occurrence_range_start_time
303
+ if floating?
304
+ utc.advance(:hours => -12).to_datetime
305
+ else
306
+ to_zulu_time
307
+ end
308
+ end
309
+
310
+
311
+ # If a time is floating, then the utc of it's start time may actually be as early
312
+ # as 12 hours later if the occurrence is being viewed in a time zone just east
313
+ # of the International Date Line
314
+ def to_zulu_occurrence_range_finish_time
315
+ if floating?
316
+ utc.advance(:hours => 12).to_datetime
317
+ else
318
+ to_zulu_time
319
+ end
320
+ end
321
+
294
322
  def add_date_times_to(required_timezones) #:nodoc:
295
323
  required_timezones.add_datetime(self, tzid) if has_local_timezone?
296
324
  end
data/lib/ri_cal.rb CHANGED
@@ -11,7 +11,7 @@ module RiCal
11
11
  autoload :OccurrenceEnumerator, "#{my_dir}/ri_cal/occurrence_enumerator.rb"
12
12
 
13
13
  # :stopdoc:
14
- VERSION = '0.0.11'
14
+ VERSION = '0.5.0'
15
15
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
16
16
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
17
17
 
data/ri_cal.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{ri_cal}
5
- s.version = "0.0.11"
5
+ s.version = "0.5.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["author=Rick DeNatale"]
9
- s.date = %q{2009-05-23}
9
+ s.date = %q{2009-05-26}
10
10
  s.default_executable = %q{ri_cal}
11
11
  s.description = %q{This is an UNOFFICIAL version. The public official version will be released on RubyForge. Github will be used
12
12
  for interim versions. USE THIS VERSION AT YOUR OWN RISK.
@@ -181,6 +181,149 @@ describe RiCal::Component::Event do
181
181
  end
182
182
  end
183
183
 
184
+ context ".start_time" do
185
+
186
+ it "should be nil if there is no dtstart property" do
187
+ RiCal.Event.start_time.should be_nil
188
+ end
189
+
190
+ it "should be the same as dtstart for a date time" do
191
+ event = RiCal.Event {|e| e.dtstart = "20090525T151900"}
192
+ event.start_time.should == DateTime.civil(2009,05,25,15,19,0,0)
193
+ end
194
+
195
+ it "should be the start of the day of dtstart for a date" do
196
+ event = RiCal.Event {|e| e.dtstart = "20090525"}
197
+ event.start_time.should == DateTime.civil(2009,05,25,0,0,0,0)
198
+ end
199
+ end
200
+
201
+ context ".finish_time" do
202
+ before(:each) do
203
+ @event = RiCal.Event {|e| e.dtstart = "20090525T151900"}
204
+ end
205
+
206
+ context "with a given dtend" do
207
+ it "should be the same as dtend for a date time" do
208
+ @event.dtend = "20090525T161900"
209
+ @event.finish_time.should == DateTime.civil(2009,05,25,16,19,0,0)
210
+ end
211
+
212
+
213
+ end
214
+
215
+ context "with no dtend" do
216
+ context "and a duration" do
217
+ it "should be the dtstart plus the duration" do
218
+ @event.duration = "+P1H"
219
+ @event.finish_time.should == DateTime.civil(2009,5,25,16,19,0,0)
220
+ end
221
+ end
222
+
223
+ context "and no duration" do
224
+ context "when the dtstart is not set" do
225
+ before(:each) do
226
+ @event.dtstart_property = nil
227
+ end
228
+
229
+ it "should be nil" do
230
+ @event.finish_time.should be_nil
231
+ end
232
+ end
233
+ context "when the dstart is a datetime" do
234
+ # For cases where a "VEVENT" calendar component
235
+ # specifies a "DTSTART" property with a DATE-TIME data type but no
236
+ # "DTEND" property, the event ends on the same calendar date and time
237
+ # of day specified by the "DTSTART" property. RFC 2445 p 53
238
+ it "should be the same as start_time" do
239
+ @event.finish_time.should == @event.start_time
240
+ end
241
+ end
242
+ context "when the dtstart is a date" do
243
+ # For cases where a "VEVENT" calendar component specifies a "DTSTART" property with a DATE data type
244
+ # but no "DTEND" property, the events non-inclusive end is the end of the calendar date specified by
245
+ # the "DTSTART" property. RFC 2445 p 53
246
+
247
+ it "should be the end of the same day as start_time" do
248
+ @event.dtstart = "20090525"
249
+ @event.finish_time.should == DateTime.civil(2009,5,25,23,59,59,0)
250
+ end
251
+ end
252
+ end
253
+ end
254
+
255
+ end
256
+
257
+ context ".zulu_occurrence_range_start_time" do
258
+
259
+ it "should be nil if there is no dtstart property" do
260
+ RiCal.Event.zulu_occurrence_range_start_time.should be_nil
261
+ end
262
+
263
+ it "should be the utc equivalent of dtstart for a date time" do
264
+ event = RiCal.Event {|e| e.dtstart = "TZID=America/New_York:20090525T151900"}
265
+ event.zulu_occurrence_range_start_time.should == DateTime.civil(2009,05,25,19,19,0,0)
266
+ end
267
+
268
+ it "should be the utc time of the start of the day of dtstart in the earliest timezone for a date" do
269
+ event = RiCal.Event {|e| e.dtstart = "20090525"}
270
+ event.zulu_occurrence_range_start_time.should == DateTime.civil(2009,05,24,12,0,0,0)
271
+ end
272
+
273
+ it "should be the utc time of the dtstart in the earliest timezone if dtstart is a floating datetime" do
274
+ event = RiCal.Event {|e| e.dtstart = "20090525T151900"}
275
+ event.zulu_occurrence_range_start_time.should == DateTime.civil(2009,05,25,3,19,0,0)
276
+ end
277
+ end
278
+
279
+ context ".zulu_occurrence_range_finish_time" do
280
+ before(:each) do
281
+ @event = RiCal.Event {|e| e.dtstart = "TZID=America/New_York:20090525T151900"}
282
+ end
283
+
284
+ context "with a given dtend" do
285
+ it "should be the utc equivalent of dtend if dtend is a date time" do
286
+ @event.dtend = "TZID=America/New_York:20090525T161900"
287
+ @event.zulu_occurrence_range_finish_time.should == DateTime.civil(2009,05,25, 20,19,0,0)
288
+ end
289
+ end
290
+
291
+ context "with no dtend" do
292
+ context "and a duration" do
293
+ it "should be the dtstart plus the duration" do
294
+ @event.duration = "+P1H"
295
+ @event.zulu_occurrence_range_finish_time.should == DateTime.civil(2009,5,25,20 ,19,0,0)
296
+ end
297
+ end
298
+
299
+ context "and no duration" do
300
+ context "when the dtstart is not set" do
301
+ before(:each) do
302
+ @event.dtstart_property = nil
303
+ end
304
+
305
+ it "should be nil" do
306
+ @event.zulu_occurrence_range_finish_time.should be_nil
307
+ end
308
+ end
309
+
310
+ context "when the dstart is a datetime" do
311
+
312
+ it "should be the same as start_time" do
313
+ @event.zulu_occurrence_range_finish_time.should == @event.zulu_occurrence_range_start_time
314
+ end
315
+ end
316
+
317
+ context "when the dtstart is a date" do
318
+ it "should be the utc of end of the same day as start_time in the westermost time zone" do
319
+ @event.dtstart = "20090525"
320
+ @event.zulu_occurrence_range_finish_time.should == DateTime.civil(2009,5,26,11,59,59,0)
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end
326
+
184
327
  context "description property" do
185
328
  before(:each) do
186
329
  @ical_desc = "posted by Joyce per Zan\\nASheville\\, Rayan's Restauratn\\, Biltm\n ore Square"
@@ -309,7 +452,7 @@ describe RiCal::Component::Event do
309
452
  @it.dtstart = Date.parse("April 22, 2009")
310
453
  unfold(@it.export).should match(/^DTSTART;VALUE=DATE:20090422$/)
311
454
  end
312
-
455
+
313
456
  it "should properly fold on export when the description contains a carriage return" do
314
457
  @it.description = "Weather report looks nice, 80 degrees and partly cloudy, so following Michael's suggestion, let's meet at the food court at Crossroads:\n\rhttp://www.shopcrossroadsplaza.c...\n"
315
458
  export_string = @it.export
@@ -321,7 +464,7 @@ describe RiCal::Component::Event do
321
464
 
322
465
  if RiCal::TimeWithZone
323
466
  context "with ActiveSupport loaded" do
324
-
467
+
325
468
  context "an event with an timezoned exdate" do
326
469
  before(:each) do
327
470
  @old_timezone = Time.zone
@@ -334,15 +477,15 @@ describe RiCal::Component::Event do
334
477
  end
335
478
  @event = cal.events.first
336
479
  end
337
-
480
+
338
481
  after(:each) do
339
482
  Time.zone = @old_timezone
340
483
  end
341
-
484
+
342
485
  it "should pickup the timezone in the exdate property" do
343
486
  @event.exdate.first.first.tzid.should == "America/New_York"
344
487
  end
345
-
488
+
346
489
  it "should have the timezone in the ical representation of the exdate property" do
347
490
  @event.exdate_property.to_s.should match(%r{;TZID=America/New_York[:;]})
348
491
  end
@@ -9,4 +9,29 @@ describe RiCal::Component::Journal do
9
9
  RiCal::Component::Journal.entity_name.should == "VJOURNAL"
10
10
  end
11
11
  end
12
+
13
+ context ".start_time" do
14
+ it "should be the same as dtstart for a date time" do
15
+ event = RiCal.Journal {|e| e.dtstart = "20090525T151900"}
16
+ event.start_time.should == DateTime.civil(2009,05,25,15,19,0,0)
17
+ end
18
+
19
+ it "should be the start of the day of dtstart for a date" do
20
+ event = RiCal.Journal {|e| e.dtstart = "20090525"}
21
+ event.start_time.should == DateTime.civil(2009,05,25,0,0,0,0)
22
+ end
23
+ end
24
+
25
+ context ".finish_time" do
26
+ it "should be the same as dtstart for a date time" do
27
+ event = RiCal.Journal {|e| e.dtstart = "20090525T151900"}
28
+ event.finish_time.should == DateTime.civil(2009,05,25,15,19,0,0)
29
+ end
30
+
31
+ it "should be the start of the day of dtstart for a date" do
32
+ event = RiCal.Journal {|e| e.dtstart = "20090525"}
33
+ event.finish_time.should == DateTime.civil(2009,05,25,0,0,0,0)
34
+ end
35
+ end
36
+
12
37
  end
@@ -3,6 +3,58 @@
3
3
  require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
4
4
 
5
5
  describe RiCal::Component::Todo do
6
+
7
+ context ".start_time" do
8
+ it "should be the same as dtstart for a date time" do
9
+ todo = RiCal.Todo {|e| e.dtstart = "20090525T151900"}
10
+ todo.start_time.should == DateTime.civil(2009,05,25,15,19,0,0)
11
+ end
12
+
13
+ it "should be the start of the day of dtstart for a date" do
14
+ todo = RiCal.Todo {|e| e.dtstart = "20090525"}
15
+ todo.start_time.should == DateTime.civil(2009,05,25,0,0,0,0)
16
+ end
17
+
18
+ it "should be nil if the dtstart property is not set" do
19
+ RiCal.Todo.start_time.should be_nil
20
+ end
21
+ end
22
+
23
+ context ".finish_time" do
24
+ before(:each) do
25
+ @todo = RiCal.Todo {|t| t.dtstart = "20090525T151900"}
26
+ end
27
+
28
+ context "with a given due" do
29
+ it "should be the same as due for a date time" do
30
+ @todo.due = "20090525T161900"
31
+ @todo.finish_time.should == DateTime.civil(2009,05,25,16,19,0,0)
32
+ end
33
+ end
34
+
35
+ context "with no due" do
36
+ context "and a duration" do
37
+ before(:each) do
38
+ @todo.duration = "+P1H"
39
+ end
40
+
41
+ it "should be the dtstart plus the duration" do
42
+ @todo.finish_time.should == DateTime.civil(2009,5,25,16,19,0,0)
43
+ end
44
+
45
+ it "should be nil if the dtstart property is not set" do
46
+ @todo.dtstart_property = nil
47
+ @todo.finish_time.should be_nil
48
+ end
49
+ end
50
+
51
+ context "and no duration" do
52
+ it "should be nil" do
53
+ @todo.finish_time.should be_nil
54
+ end
55
+ end
56
+ end
57
+ end
6
58
 
7
59
  describe "with both due and duration specified" do
8
60
  before(:each) do
@@ -157,6 +157,9 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
157
157
  end
158
158
  end
159
159
  end
160
+
161
+ describe "#zulu_occurrence_range" do
162
+ end
160
163
 
161
164
  describe "#next_occurence" do
162
165
 
@@ -507,5 +510,64 @@ ENDCAL
507
510
  @event.occurrences.length.should == 0
508
511
  end
509
512
  end
513
+
514
+
515
+ describe "#zulu_occurrence_range" do
516
+ context "For an unbounded recurring event" do
517
+ before(:each) do
518
+ @event = RiCal.Event do |e|
519
+ e.dtstart = "TZID=America/New_York:20090525T143500"
520
+ e.dtend = "TZID=America/New_York:20090525T153500"
521
+ e.add_rrule("FREQ=DAILY")
522
+ end
523
+
524
+ it "should return an array with the first dtstart and nil" do
525
+ @event.zulu_occurrence_range.should == [DateTime.civil(2009,5,25,18,35,00, 0), nil]
526
+ end
527
+ end
528
+ end
529
+
530
+ context "For a bounded recurring event" do
531
+ before(:each) do
532
+ @event = RiCal.Event do |e|
533
+ e.dtstart = "TZID=America/New_York:20090525T143500"
534
+ e.dtend = "TZID=America/New_York:20090525T153500"
535
+ e.add_rrule("FREQ=DAILY;COUNT=3")
536
+ end
537
+
538
+ it "should return an array with the first dtstart last dtend converted to utc" do
539
+ @event.zulu_occurrence_range.should == [DateTime.civil(2009,5,25,18,35,00, 0), DateTime.civil(2009,5,27,19,35,00, 0)]
540
+ end
541
+ end
542
+ end
543
+
544
+ context "For an event with no recurrence rules" do
545
+ context "with a non-floating dtstart and dtend" do
546
+ before(:each) do
547
+ @event = RiCal.Event do |e|
548
+ e.dtstart = "TZID=America/New_York:20090525T143500"
549
+ e.dtend = "TZID=America/New_York:20090525T153500"
550
+ end
551
+ end
552
+
553
+ it "should return an array with dtstart and dtend converted to zulu time" do
554
+ @event.zulu_occurrence_range.should == [DateTime.civil(2009,5,25,18,35,00, 0), DateTime.civil(2009,5,25,19,35,00, 0)]
555
+ end
556
+ end
557
+ context "with a floating dtstart and dtend" do
558
+ before(:each) do
559
+ @event = RiCal.Event do |e|
560
+ e.dtstart = "20090525T143500"
561
+ e.dtend = "20090525T153500"
562
+ end
563
+ end
564
+
565
+ it "should return an array with dtstart in the first timezone and dtend in the last time zone converted to zulu time" do
566
+ @event.zulu_occurrence_range.should == [DateTime.civil(2009,5,25,2,35,00, 0), DateTime.civil(2009,5,26,3,35,00, 0)]
567
+ end
568
+ end
569
+ end
570
+ end
571
+
510
572
 
511
573
  end
data/tasks/ri_cal.rake CHANGED
@@ -159,7 +159,7 @@ class VEntityUpdater
159
159
  end
160
160
  @all_props[property] = name.upcase
161
161
  @property_map[name.upcase] = :"#{property}_from_string"
162
- parent_set = needs_tz_access ? ".for_parent(self)" : ""
162
+ parent_set = needs_tz_access ? " ? property_value.for_parent(self) : nil" : ""
163
163
  if type == 'date_time_or_date'
164
164
  line_evaluator = "RiCal::PropertyValue::DateTime.or_date(self, line)"
165
165
  else
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyredrick-ri_cal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - author=Rick DeNatale
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-23 00:00:00 -07:00
12
+ date: 2009-05-26 00:00:00 -07:00
13
13
  default_executable: ri_cal
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency