ri_cal 0.8.5 → 0.8.6

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.
Files changed (38) hide show
  1. data/History.txt +7 -0
  2. data/Rakefile +59 -46
  3. data/VERSION +1 -0
  4. data/component_attributes/component_property_defs.yml +3 -3
  5. data/lib/ri_cal/component/t_z_info_timezone.rb +17 -3
  6. data/lib/ri_cal/core_extensions/date/conversions.rb +0 -14
  7. data/lib/ri_cal/core_extensions/date_time/conversions.rb +0 -6
  8. data/lib/ri_cal/fast_date_time.rb +8 -0
  9. data/lib/ri_cal/properties/alarm.rb +8 -8
  10. data/lib/ri_cal/properties/calendar.rb +3 -3
  11. data/lib/ri_cal/properties/event.rb +62 -65
  12. data/lib/ri_cal/properties/freebusy.rb +19 -20
  13. data/lib/ri_cal/properties/journal.rb +50 -53
  14. data/lib/ri_cal/properties/timezone.rb +10 -11
  15. data/lib/ri_cal/properties/timezone_period.rb +10 -10
  16. data/lib/ri_cal/properties/todo.rb +68 -71
  17. data/lib/ri_cal/property_value.rb +1 -0
  18. data/lib/ri_cal/property_value/date.rb +4 -0
  19. data/lib/ri_cal/property_value/date_time.rb +8 -0
  20. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer.rb +4 -3
  21. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_day_incrementer.rb +5 -1
  22. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_monthday_incrementer.rb +1 -1
  23. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_numbered_day_incrementer.rb +5 -1
  24. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_weekno_incrementer.rb +5 -1
  25. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/frequency_incrementer.rb +9 -0
  26. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/list_incrementer.rb +11 -1
  27. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/null_sub_cycle_incrementer.rb +4 -0
  28. data/lib/ri_cal/property_value/recurrence_rule/recurring_month_day.rb +5 -1
  29. data/lib/ri_cal/property_value/recurrence_rule/recurring_year_day.rb +5 -1
  30. data/lib/ri_cal/property_value/zulu_date_time.rb +34 -0
  31. data/parked_specs/ri_cal/claudio_a_bug_spec.rb +100 -0
  32. data/ri_cal.gemspec +218 -21
  33. data/spec/ri_cal/component/event_spec.rb +17 -0
  34. data/spec/ri_cal/component/t_z_info_timezone_spec.rb +5 -4
  35. data/spec/ri_cal/fast_date_time_spec.rb +10 -0
  36. data/spec/ri_cal/inf_loop_spec.rb +78 -0
  37. data/spec/ri_cal/parser_spec.rb +3 -3
  38. metadata +61 -60
@@ -74,7 +74,7 @@ module RiCal
74
74
 
75
75
 
76
76
  # return the the CREATED property
77
- # which will be an instances of RiCal::PropertyValueDateTime
77
+ # which will be an instances of RiCal::PropertyValueZuluDateTime
78
78
  #
79
79
  # [purpose (from RFC 2445)]
80
80
  # This property specifies the date and time that the calendar information was created by teh calendar user agent in the calendar store.
@@ -85,24 +85,24 @@ module RiCal
85
85
  end
86
86
 
87
87
  # set the CREATED property
88
- # property value should be an instance of RiCal::PropertyValueDateTime
88
+ # property value should be an instance of RiCal::PropertyValueZuluDateTime
89
89
  def created_property=(property_value)
90
- @created_property = property_value ? property_value.for_parent(self) : nil
90
+ @created_property = property_value
91
91
  end
92
92
 
93
93
  # set the value of the CREATED property
94
94
  def created=(ruby_value)
95
- self.created_property= RiCal::PropertyValue::DateTime.convert(self, ruby_value)
95
+ self.created_property= RiCal::PropertyValue::ZuluDateTime.convert(self, ruby_value)
96
96
  end
97
97
 
98
98
  # return the value of the CREATED property
99
- # which will be an instance of DateTime
99
+ # which will be an instance of ZuluDateTime
100
100
  def created
101
101
  created_property ? created_property.ruby_value : nil
102
102
  end
103
103
 
104
104
  def created_property_from_string(line) # :nodoc:
105
- @created_property = RiCal::PropertyValue::DateTime.new(self, line)
105
+ @created_property = RiCal::PropertyValue::ZuluDateTime.new(self, line)
106
106
  end
107
107
 
108
108
 
@@ -140,7 +140,7 @@ module RiCal
140
140
 
141
141
 
142
142
  # return the the DTSTAMP property
143
- # which will be an instances of RiCal::PropertyValueDateTime
143
+ # which will be an instances of RiCal::PropertyValueZuluDateTime
144
144
  #
145
145
  # [purpose (from RFC 2445)]
146
146
  # This property indicates the date/time that the instance of the iCalendar object was created.
@@ -151,24 +151,24 @@ module RiCal
151
151
  end
152
152
 
153
153
  # set the DTSTAMP property
154
- # property value should be an instance of RiCal::PropertyValueDateTime
154
+ # property value should be an instance of RiCal::PropertyValueZuluDateTime
155
155
  def dtstamp_property=(property_value)
156
- @dtstamp_property = property_value ? property_value.for_parent(self) : nil
156
+ @dtstamp_property = property_value
157
157
  end
158
158
 
159
159
  # set the value of the DTSTAMP property
160
160
  def dtstamp=(ruby_value)
161
- self.dtstamp_property= RiCal::PropertyValue::DateTime.convert(self, ruby_value)
161
+ self.dtstamp_property= RiCal::PropertyValue::ZuluDateTime.convert(self, ruby_value)
162
162
  end
163
163
 
164
164
  # return the value of the DTSTAMP property
165
- # which will be an instance of DateTime
165
+ # which will be an instance of ZuluDateTime
166
166
  def dtstamp
167
167
  dtstamp_property ? dtstamp_property.ruby_value : nil
168
168
  end
169
169
 
170
170
  def dtstamp_property_from_string(line) # :nodoc:
171
- @dtstamp_property = RiCal::PropertyValue::DateTime.new(self, line)
171
+ @dtstamp_property = RiCal::PropertyValue::ZuluDateTime.new(self, line)
172
172
  end
173
173
 
174
174
 
@@ -239,7 +239,7 @@ module RiCal
239
239
 
240
240
 
241
241
  # return the the LAST-MODIFIED property
242
- # which will be an instances of RiCal::PropertyValueDateTime
242
+ # which will be an instances of RiCal::PropertyValueZuluDateTime
243
243
  #
244
244
  # [purpose (from RFC 2445)]
245
245
  # This property specifies the date and time that the information associated with the calendar component was last revised in teh calendar store.
@@ -250,24 +250,24 @@ module RiCal
250
250
  end
251
251
 
252
252
  # set the LAST-MODIFIED property
253
- # property value should be an instance of RiCal::PropertyValueDateTime
253
+ # property value should be an instance of RiCal::PropertyValueZuluDateTime
254
254
  def last_modified_property=(property_value)
255
- @last_modified_property = property_value ? property_value.for_parent(self) : nil
255
+ @last_modified_property = property_value
256
256
  end
257
257
 
258
258
  # set the value of the LAST-MODIFIED property
259
259
  def last_modified=(ruby_value)
260
- self.last_modified_property= RiCal::PropertyValue::DateTime.convert(self, ruby_value)
260
+ self.last_modified_property= RiCal::PropertyValue::ZuluDateTime.convert(self, ruby_value)
261
261
  end
262
262
 
263
263
  # return the value of the LAST-MODIFIED property
264
- # which will be an instance of DateTime
264
+ # which will be an instance of ZuluDateTime
265
265
  def last_modified
266
266
  last_modified_property ? last_modified_property.ruby_value : nil
267
267
  end
268
268
 
269
269
  def last_modified_property_from_string(line) # :nodoc:
270
- @last_modified_property = RiCal::PropertyValue::DateTime.new(self, line)
270
+ @last_modified_property = RiCal::PropertyValue::ZuluDateTime.new(self, line)
271
271
  end
272
272
 
273
273
 
@@ -1423,74 +1423,74 @@ module RiCal
1423
1423
  end
1424
1424
 
1425
1425
  def export_properties_to(export_stream) #:nodoc:
1426
- export_prop_to(export_stream, "REQUEST-STATUS", @request_status_property)
1426
+ export_prop_to(export_stream, "RDATE", @rdate_property)
1427
+ export_prop_to(export_stream, "CONTACT", @contact_property)
1428
+ export_prop_to(export_stream, "COMPLETED", @completed_property)
1427
1429
  export_prop_to(export_stream, "EXDATE", @exdate_property)
1428
- export_prop_to(export_stream, "DTSTAMP", @dtstamp_property)
1429
1430
  export_prop_to(export_stream, "CREATED", @created_property)
1430
- export_prop_to(export_stream, "CONTACT", @contact_property)
1431
- export_prop_to(export_stream, "CATEGORIES", @categories_property)
1431
+ export_prop_to(export_stream, "DURATION", @duration_property)
1432
1432
  export_prop_to(export_stream, "STATUS", @status_property)
1433
- export_prop_to(export_stream, "LAST-MODIFIED", @last_modified_property)
1434
1433
  export_prop_to(export_stream, "DTSTART", @dtstart_property)
1435
- export_prop_to(export_stream, "COMPLETED", @completed_property)
1436
1434
  export_prop_to(export_stream, "RECURRENCE-ID", @recurrence_id_property)
1435
+ export_prop_to(export_stream, "DTSTAMP", @dtstamp_property)
1437
1436
  export_prop_to(export_stream, "RESOURCES", @resources_property)
1438
- export_prop_to(export_stream, "ATTENDEE", @attendee_property)
1439
- export_prop_to(export_stream, "DURATION", @duration_property)
1437
+ export_prop_to(export_stream, "CATEGORIES", @categories_property)
1440
1438
  export_prop_to(export_stream, "DUE", @due_property)
1441
- export_prop_to(export_stream, "UID", @uid_property)
1442
- export_prop_to(export_stream, "URL", @url_property)
1439
+ export_prop_to(export_stream, "LAST-MODIFIED", @last_modified_property)
1443
1440
  export_prop_to(export_stream, "PRIORITY", @priority_property)
1444
1441
  export_prop_to(export_stream, "PERCENT-COMPLETE", @percent_complete_property)
1445
- export_prop_to(export_stream, "ORGANIZER", @organizer_property)
1446
- export_prop_to(export_stream, "RRULE", @rrule_property)
1442
+ export_prop_to(export_stream, "GEO", @geo_property)
1443
+ export_prop_to(export_stream, "ATTENDEE", @attendee_property)
1444
+ export_prop_to(export_stream, "UID", @uid_property)
1447
1445
  export_prop_to(export_stream, "DESCRIPTION", @description_property)
1448
- export_prop_to(export_stream, "CLASS", @class_property)
1446
+ export_prop_to(export_stream, "URL", @url_property)
1449
1447
  export_prop_to(export_stream, "SUMMARY", @summary_property)
1450
- export_prop_to(export_stream, "GEO", @geo_property)
1448
+ export_prop_to(export_stream, "ORGANIZER", @organizer_property)
1449
+ export_prop_to(export_stream, "RRULE", @rrule_property)
1451
1450
  export_prop_to(export_stream, "ATTACH", @attach_property)
1452
- export_prop_to(export_stream, "SEQUENCE", @sequence_property)
1453
- export_prop_to(export_stream, "RDATE", @rdate_property)
1451
+ export_prop_to(export_stream, "CLASS", @class_property)
1454
1452
  export_prop_to(export_stream, "RELATED-TO", @related_to_property)
1453
+ export_prop_to(export_stream, "REQUEST-STATUS", @request_status_property)
1455
1454
  export_prop_to(export_stream, "EXRULE", @exrule_property)
1456
1455
  export_prop_to(export_stream, "LOCATION", @location_property)
1457
1456
  export_prop_to(export_stream, "COMMENT", @comment_property)
1457
+ export_prop_to(export_stream, "SEQUENCE", @sequence_property)
1458
1458
  end
1459
1459
 
1460
1460
  def ==(o) #:nodoc:
1461
1461
  if o.class == self.class
1462
- (request_status_property == o.request_status_property) &&
1462
+ (rdate_property == o.rdate_property) &&
1463
+ (contact_property == o.contact_property) &&
1464
+ (completed_property == o.completed_property) &&
1463
1465
  (exdate_property == o.exdate_property) &&
1464
- (dtstamp_property == o.dtstamp_property) &&
1465
1466
  (created_property == o.created_property) &&
1466
- (contact_property == o.contact_property) &&
1467
- (categories_property == o.categories_property) &&
1467
+ (duration_property == o.duration_property) &&
1468
1468
  (status_property == o.status_property) &&
1469
- (last_modified_property == o.last_modified_property) &&
1470
1469
  (dtstart_property == o.dtstart_property) &&
1471
- (completed_property == o.completed_property) &&
1472
1470
  (recurrence_id_property == o.recurrence_id_property) &&
1471
+ (dtstamp_property == o.dtstamp_property) &&
1473
1472
  (resources_property == o.resources_property) &&
1474
- (attendee_property == o.attendee_property) &&
1475
- (duration_property == o.duration_property) &&
1473
+ (categories_property == o.categories_property) &&
1476
1474
  (due_property == o.due_property) &&
1477
- (uid_property == o.uid_property) &&
1478
- (url_property == o.url_property) &&
1475
+ (last_modified_property == o.last_modified_property) &&
1479
1476
  (priority_property == o.priority_property) &&
1480
1477
  (percent_complete_property == o.percent_complete_property) &&
1481
- (organizer_property == o.organizer_property) &&
1482
- (rrule_property == o.rrule_property) &&
1478
+ (geo_property == o.geo_property) &&
1479
+ (attendee_property == o.attendee_property) &&
1480
+ (uid_property == o.uid_property) &&
1483
1481
  (description_property == o.description_property) &&
1484
- (class_property == o.class_property) &&
1482
+ (url_property == o.url_property) &&
1485
1483
  (summary_property == o.summary_property) &&
1486
- (geo_property == o.geo_property) &&
1484
+ (organizer_property == o.organizer_property) &&
1485
+ (rrule_property == o.rrule_property) &&
1487
1486
  (attach_property == o.attach_property) &&
1488
- (sequence_property == o.sequence_property) &&
1489
- (rdate_property == o.rdate_property) &&
1487
+ (class_property == o.class_property) &&
1490
1488
  (related_to_property == o.related_to_property) &&
1489
+ (request_status_property == o.request_status_property) &&
1491
1490
  (exrule_property == o.exrule_property) &&
1492
1491
  (location_property == o.location_property) &&
1493
- (comment_property == o.comment_property)
1492
+ (comment_property == o.comment_property) &&
1493
+ (sequence_property == o.sequence_property)
1494
1494
  else
1495
1495
  super
1496
1496
  end
@@ -1498,45 +1498,42 @@ module RiCal
1498
1498
 
1499
1499
  def initialize_copy(o) #:nodoc:
1500
1500
  super
1501
- request_status_property = request_status_property && request_status_property.dup
1501
+ rdate_property = rdate_property && rdate_property.dup
1502
+ contact_property = contact_property && contact_property.dup
1503
+ completed_property = completed_property && completed_property.dup
1502
1504
  exdate_property = exdate_property && exdate_property.dup
1503
- dtstamp_property = dtstamp_property && dtstamp_property.dup
1504
1505
  created_property = created_property && created_property.dup
1505
- contact_property = contact_property && contact_property.dup
1506
- categories_property = categories_property && categories_property.dup
1506
+ duration_property = duration_property && duration_property.dup
1507
1507
  status_property = status_property && status_property.dup
1508
- last_modified_property = last_modified_property && last_modified_property.dup
1509
1508
  dtstart_property = dtstart_property && dtstart_property.dup
1510
- completed_property = completed_property && completed_property.dup
1511
1509
  recurrence_id_property = recurrence_id_property && recurrence_id_property.dup
1510
+ dtstamp_property = dtstamp_property && dtstamp_property.dup
1512
1511
  resources_property = resources_property && resources_property.dup
1513
- attendee_property = attendee_property && attendee_property.dup
1514
- duration_property = duration_property && duration_property.dup
1512
+ categories_property = categories_property && categories_property.dup
1515
1513
  due_property = due_property && due_property.dup
1516
- uid_property = uid_property && uid_property.dup
1517
- url_property = url_property && url_property.dup
1514
+ last_modified_property = last_modified_property && last_modified_property.dup
1518
1515
  priority_property = priority_property && priority_property.dup
1519
1516
  percent_complete_property = percent_complete_property && percent_complete_property.dup
1520
- organizer_property = organizer_property && organizer_property.dup
1521
- rrule_property = rrule_property && rrule_property.dup
1517
+ geo_property = geo_property && geo_property.dup
1518
+ attendee_property = attendee_property && attendee_property.dup
1519
+ uid_property = uid_property && uid_property.dup
1522
1520
  description_property = description_property && description_property.dup
1523
- class_property = class_property && class_property.dup
1521
+ url_property = url_property && url_property.dup
1524
1522
  summary_property = summary_property && summary_property.dup
1525
- geo_property = geo_property && geo_property.dup
1523
+ organizer_property = organizer_property && organizer_property.dup
1524
+ rrule_property = rrule_property && rrule_property.dup
1526
1525
  attach_property = attach_property && attach_property.dup
1527
- sequence_property = sequence_property && sequence_property.dup
1528
- rdate_property = rdate_property && rdate_property.dup
1526
+ class_property = class_property && class_property.dup
1529
1527
  related_to_property = related_to_property && related_to_property.dup
1528
+ request_status_property = request_status_property && request_status_property.dup
1530
1529
  exrule_property = exrule_property && exrule_property.dup
1531
1530
  location_property = location_property && location_property.dup
1532
1531
  comment_property = comment_property && comment_property.dup
1532
+ sequence_property = sequence_property && sequence_property.dup
1533
1533
  end
1534
1534
 
1535
1535
  def add_date_times_to(required_timezones) #:nodoc:
1536
- add_property_date_times_to(required_timezones, created_property)
1537
- add_property_date_times_to(required_timezones, dtstamp_property)
1538
1536
  add_property_date_times_to(required_timezones, dtstart_property)
1539
- add_property_date_times_to(required_timezones, last_modified_property)
1540
1537
  add_property_date_times_to(required_timezones, recurrence_id_property)
1541
1538
  add_property_date_times_to(required_timezones, due_property)
1542
1539
  add_property_date_times_to(required_timezones, exdate_property)
@@ -1545,7 +1542,7 @@ module RiCal
1545
1542
 
1546
1543
  module ClassMethods #:nodoc:
1547
1544
  def property_parser #:nodoc:
1548
- {"RDATE"=>:rdate_property_from_string, "RELATED-TO"=>:related_to_property_from_string, "DTSTART"=>:dtstart_property_from_string, "DTSTAMP"=>:dtstamp_property_from_string, "LOCATION"=>:location_property_from_string, "EXRULE"=>:exrule_property_from_string, "CONTACT"=>:contact_property_from_string, "URL"=>:url_property_from_string, "LAST-MODIFIED"=>:last_modified_property_from_string, "COMPLETED"=>:completed_property_from_string, "RESOURCES"=>:resources_property_from_string, "EXDATE"=>:exdate_property_from_string, "ATTACH"=>:attach_property_from_string, "UID"=>:uid_property_from_string, "SEQUENCE"=>:sequence_property_from_string, "PERCENT-COMPLETE"=>:percent_complete_property_from_string, "CATEGORIES"=>:categories_property_from_string, "SUMMARY"=>:summary_property_from_string, "RECURRENCE-ID"=>:recurrence_id_property_from_string, "GEO"=>:geo_property_from_string, "CLASS"=>:class_property_from_string, "RRULE"=>:rrule_property_from_string, "STATUS"=>:status_property_from_string, "ATTENDEE"=>:attendee_property_from_string, "PRIORITY"=>:priority_property_from_string, "ORGANIZER"=>:organizer_property_from_string, "CREATED"=>:created_property_from_string, "REQUEST-STATUS"=>:request_status_property_from_string, "COMMENT"=>:comment_property_from_string, "DURATION"=>:duration_property_from_string, "DUE"=>:due_property_from_string, "DESCRIPTION"=>:description_property_from_string}
1545
+ {"RDATE"=>:rdate_property_from_string, "COMMENT"=>:comment_property_from_string, "LOCATION"=>:location_property_from_string, "CONTACT"=>:contact_property_from_string, "URL"=>:url_property_from_string, "RECURRENCE-ID"=>:recurrence_id_property_from_string, "LAST-MODIFIED"=>:last_modified_property_from_string, "COMPLETED"=>:completed_property_from_string, "CLASS"=>:class_property_from_string, "EXDATE"=>:exdate_property_from_string, "UID"=>:uid_property_from_string, "SEQUENCE"=>:sequence_property_from_string, "PERCENT-COMPLETE"=>:percent_complete_property_from_string, "EXRULE"=>:exrule_property_from_string, "ATTENDEE"=>:attendee_property_from_string, "ORGANIZER"=>:organizer_property_from_string, "GEO"=>:geo_property_from_string, "RRULE"=>:rrule_property_from_string, "RESOURCES"=>:resources_property_from_string, "ATTACH"=>:attach_property_from_string, "CATEGORIES"=>:categories_property_from_string, "SUMMARY"=>:summary_property_from_string, "PRIORITY"=>:priority_property_from_string, "DESCRIPTION"=>:description_property_from_string, "RELATED-TO"=>:related_to_property_from_string, "REQUEST-STATUS"=>:request_status_property_from_string, "DURATION"=>:duration_property_from_string, "DUE"=>:due_property_from_string, "STATUS"=>:status_property_from_string, "DTSTART"=>:dtstart_property_from_string, "DTSTAMP"=>:dtstamp_property_from_string, "CREATED"=>:created_property_from_string}
1549
1546
  end
1550
1547
  end
1551
1548
 
@@ -17,6 +17,7 @@ module RiCal
17
17
  autoload :Text, "ri_cal/property_value/text.rb"
18
18
  autoload :Uri, "ri_cal/property_value/uri.rb"
19
19
  autoload :UtcOffset, "ri_cal/property_value/utc_offset.rb"
20
+ autoload :ZuluDateTime, "ri_cal/property_value/zulu_date_time.rb"
20
21
 
21
22
  attr_writer :params, :value #:nodoc:
22
23
  attr_reader :timezone_finder #:nodoc:
@@ -20,6 +20,10 @@ module RiCal
20
20
  nil
21
21
  end
22
22
  end
23
+
24
+ def to_ri_cal_zulu_date_time
25
+ self.to_ri_cal_date_time_value.to_ri_cal_zulu_date_time
26
+ end
23
27
 
24
28
  # Set the value of the property to val
25
29
  #
@@ -71,6 +71,14 @@ module RiCal
71
71
  nil
72
72
  end
73
73
  end
74
+
75
+ def to_ri_cal_zulu_date_time
76
+ ZuluDateTime.new(nil, :value => self.utc.fast_date_tme)
77
+ end
78
+
79
+ def fast_date_tme # :nodoc:
80
+ @date_time_value
81
+ end
74
82
 
75
83
  # Set the value of the property to val
76
84
  #
@@ -76,12 +76,13 @@ module RiCal
76
76
 
77
77
  # Return the next time after previous_occurrence generated by this incrementer
78
78
  # But the occurrence is outside the current cycle of any outer incrementer(s) return
79
- # nil which will cause the outer incrementer to step to its next cycle.
79
+ # nil which will cause the outer incrementer to step to its next cycle
80
80
  def next_time(previous_occurrence)
81
+ @previous_occurrence = previous_occurrence
81
82
  if current_occurrence
82
- sub_occurrence = sub_cycle_incrementer.next_time(previous_occurrence)
83
+ sub_occurrence = @sub_cycle_incrementer.next_time(previous_occurrence)
83
84
  else #first time
84
- sub_occurrence = sub_cycle_incrementer.first_sub_occurrence(previous_occurrence, update_cycle_range(previous_occurrence))
85
+ sub_occurrence = @sub_cycle_incrementer.first_sub_occurrence(previous_occurrence, update_cycle_range(previous_occurrence))
85
86
  end
86
87
  if sub_occurrence
87
88
  candidate = sub_occurrence
@@ -39,6 +39,10 @@ module RiCal
39
39
  OccurrenceIncrementer::ByYeardayIncrementer.for_rrule(rrule)
40
40
  end
41
41
  end
42
+
43
+ def unneeded?(candidate)
44
+ false
45
+ end
42
46
 
43
47
  def daily_incrementer?
44
48
  true
@@ -60,7 +64,7 @@ module RiCal
60
64
  result
61
65
  end
62
66
 
63
- def candidate_acceptible?(candidate)
67
+ def candidate_acceptable?(candidate)
64
68
  list.any? {|recurring_day| recurring_day.include?(candidate)}
65
69
  end
66
70
 
@@ -8,7 +8,7 @@ module RiCal
8
8
  def self.for_rrule(rrule)
9
9
  conditional_incrementer(rrule, :bymonthday, DailyIncrementer)
10
10
  end
11
-
11
+
12
12
  def scope_of(date_time)
13
13
  date_time.month
14
14
  end
@@ -9,6 +9,10 @@ module RiCal
9
9
  def daily_incrementer?
10
10
  true
11
11
  end
12
+
13
+ def unneeded?(candidate)
14
+ list.length == 1 && list.first.fixed_day?
15
+ end
12
16
 
13
17
  def occurrences_for(date_time)
14
18
  if occurrences && @scoping_value == scope_of(date_time)
@@ -24,7 +28,7 @@ module RiCal
24
28
  date_time.end_of_day
25
29
  end
26
30
 
27
- def candidate_acceptible?(candidate)
31
+ def candidate_acceptable?(candidate)
28
32
  list.any? {|by_part| by_part.include?(candidate)}
29
33
  end
30
34
  end
@@ -20,6 +20,10 @@ module RiCal
20
20
  def weeknum_incrementer?
21
21
  true
22
22
  end
23
+
24
+ def unneeded?(candidate)
25
+ false
26
+ end
23
27
 
24
28
  def first_within_outer_cycle(previous_occurrence, outer_range)
25
29
  new_range_start = outer_range.first
@@ -47,7 +51,7 @@ module RiCal
47
51
  weeks.map {|wk_num| week_one_occurrence.advance(:days => (wk_num - 1) * 7)}
48
52
  end
49
53
 
50
- def candidate_acceptible?(candidate)
54
+ def candidate_acceptable?(candidate)
51
55
  list.include?(candidate.iso_week_num(wkst))
52
56
  end
53
57
 
@@ -33,6 +33,14 @@ module RiCal
33
33
  def step(occurrence)
34
34
  occurrence.advance(advance_what => (interval * multiplier))
35
35
  end
36
+
37
+ def sub_cycle_incrementer
38
+ if @sub_cycle_incrementer.unneeded?(current_occurrence || @previous_occurrence)
39
+ NullSubCycleIncrementer
40
+ else
41
+ super
42
+ end
43
+ end
36
44
 
37
45
  def first_within_outer_cycle(previous_occurrence, outer_cycle_range)
38
46
  if outer_range
@@ -46,6 +54,7 @@ module RiCal
46
54
 
47
55
  # Advance to the next occurrence, if the result is within the current cycles of all outer incrementers
48
56
  def next_cycle(previous_occurrence)
57
+ @sub_cycle_dtstart = previous_occurrence
49
58
  if current_occurrence
50
59
  candidate = sub_cycle_incrementer.cycle_adjust(step(current_occurrence))
51
60
  else
@@ -40,6 +40,16 @@ module RiCal
40
40
  nil
41
41
  end
42
42
  end
43
+
44
+ def unneeded?(candidate)
45
+ sub_cycle_incrementer.unneeded?(candidate) &&
46
+ list.length == 1 &&
47
+ candidate_acceptable?(candidate)
48
+ end
49
+
50
+ def candidate_acceptable?(candidate)
51
+ list.any? {|value| candidate.send(varying_time_attribute) == value}
52
+ end
43
53
 
44
54
  def first_within_outer_cycle(previous_occurrence, outer_range)
45
55
  self.outer_range = outer_range
@@ -47,7 +57,7 @@ module RiCal
47
57
  occurrences.each { |occurrence|
48
58
  sub = sub_cycle_incrementer.first_within_outer_cycle(previous_occurrence, update_cycle_range(occurrence))
49
59
  return sub if sub && sub > previous_occurrence
50
- }
60
+ }
51
61
  nil
52
62
  end
53
63