demingfactor-ri_cal 0.9.0

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 (167) hide show
  1. checksums.yaml +7 -0
  2. data/History.txt +402 -0
  3. data/Manifest.txt +161 -0
  4. data/README.txt +410 -0
  5. data/Rakefile +69 -0
  6. data/VERSION +1 -0
  7. data/bin/ri_cal +8 -0
  8. data/component_attributes/alarm.yml +10 -0
  9. data/component_attributes/calendar.yml +4 -0
  10. data/component_attributes/component_property_defs.yml +180 -0
  11. data/component_attributes/event.yml +45 -0
  12. data/component_attributes/freebusy.yml +16 -0
  13. data/component_attributes/journal.yml +35 -0
  14. data/component_attributes/timezone.yml +3 -0
  15. data/component_attributes/timezone_period.yml +11 -0
  16. data/component_attributes/todo.yml +46 -0
  17. data/copyrights.txt +1 -0
  18. data/docs/draft-ietf-calsify-2446bis-08.txt +7280 -0
  19. data/docs/draft-ietf-calsify-rfc2445bis-09.txt +10416 -0
  20. data/docs/incrementers.txt +7 -0
  21. data/docs/rfc2445.pdf +0 -0
  22. data/lib/ri_cal/component/alarm.rb +19 -0
  23. data/lib/ri_cal/component/calendar.rb +257 -0
  24. data/lib/ri_cal/component/event.rb +58 -0
  25. data/lib/ri_cal/component/freebusy.rb +16 -0
  26. data/lib/ri_cal/component/journal.rb +27 -0
  27. data/lib/ri_cal/component/non_standard.rb +33 -0
  28. data/lib/ri_cal/component/t_z_info_timezone.rb +153 -0
  29. data/lib/ri_cal/component/timezone/daylight_period.rb +25 -0
  30. data/lib/ri_cal/component/timezone/standard_period.rb +23 -0
  31. data/lib/ri_cal/component/timezone/timezone_period.rb +76 -0
  32. data/lib/ri_cal/component/timezone.rb +197 -0
  33. data/lib/ri_cal/component/todo.rb +42 -0
  34. data/lib/ri_cal/component.rb +256 -0
  35. data/lib/ri_cal/core_extensions/array/conversions.rb +15 -0
  36. data/lib/ri_cal/core_extensions/array.rb +7 -0
  37. data/lib/ri_cal/core_extensions/date/conversions.rb +56 -0
  38. data/lib/ri_cal/core_extensions/date.rb +13 -0
  39. data/lib/ri_cal/core_extensions/date_time/conversions.rb +50 -0
  40. data/lib/ri_cal/core_extensions/date_time.rb +15 -0
  41. data/lib/ri_cal/core_extensions/object/conversions.rb +20 -0
  42. data/lib/ri_cal/core_extensions/object.rb +8 -0
  43. data/lib/ri_cal/core_extensions/string/conversions.rb +57 -0
  44. data/lib/ri_cal/core_extensions/string.rb +8 -0
  45. data/lib/ri_cal/core_extensions/time/calculations.rb +153 -0
  46. data/lib/ri_cal/core_extensions/time/conversions.rb +42 -0
  47. data/lib/ri_cal/core_extensions/time/tzid_access.rb +50 -0
  48. data/lib/ri_cal/core_extensions/time/week_day_predicates.rb +55 -0
  49. data/lib/ri_cal/core_extensions/time.rb +14 -0
  50. data/lib/ri_cal/core_extensions.rb +11 -0
  51. data/lib/ri_cal/fast_date_time.rb +234 -0
  52. data/lib/ri_cal/floating_timezone.rb +32 -0
  53. data/lib/ri_cal/invalid_property_value.rb +8 -0
  54. data/lib/ri_cal/invalid_timezone_identifier.rb +20 -0
  55. data/lib/ri_cal/occurrence_enumerator.rb +265 -0
  56. data/lib/ri_cal/occurrence_period.rb +17 -0
  57. data/lib/ri_cal/parser.rb +148 -0
  58. data/lib/ri_cal/properties/alarm.rb +390 -0
  59. data/lib/ri_cal/properties/calendar.rb +164 -0
  60. data/lib/ri_cal/properties/event.rb +1523 -0
  61. data/lib/ri_cal/properties/freebusy.rb +593 -0
  62. data/lib/ri_cal/properties/journal.rb +1237 -0
  63. data/lib/ri_cal/properties/timezone.rb +150 -0
  64. data/lib/ri_cal/properties/timezone_period.rb +416 -0
  65. data/lib/ri_cal/properties/todo.rb +1559 -0
  66. data/lib/ri_cal/properties.rb +12 -0
  67. data/lib/ri_cal/property_value/array.rb +27 -0
  68. data/lib/ri_cal/property_value/cal_address.rb +11 -0
  69. data/lib/ri_cal/property_value/date.rb +184 -0
  70. data/lib/ri_cal/property_value/date_time/additive_methods.rb +44 -0
  71. data/lib/ri_cal/property_value/date_time/time_machine.rb +159 -0
  72. data/lib/ri_cal/property_value/date_time/timezone_support.rb +100 -0
  73. data/lib/ri_cal/property_value/date_time.rb +359 -0
  74. data/lib/ri_cal/property_value/duration.rb +110 -0
  75. data/lib/ri_cal/property_value/geo.rb +11 -0
  76. data/lib/ri_cal/property_value/integer.rb +12 -0
  77. data/lib/ri_cal/property_value/occurrence_list.rb +144 -0
  78. data/lib/ri_cal/property_value/period.rb +86 -0
  79. data/lib/ri_cal/property_value/recurrence_rule/enumeration_support_methods.rb +100 -0
  80. data/lib/ri_cal/property_value/recurrence_rule/enumerator.rb +79 -0
  81. data/lib/ri_cal/property_value/recurrence_rule/initialization_methods.rb +148 -0
  82. data/lib/ri_cal/property_value/recurrence_rule/negative_setpos_enumerator.rb +53 -0
  83. data/lib/ri_cal/property_value/recurrence_rule/numbered_span.rb +31 -0
  84. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_day_incrementer.rb +86 -0
  85. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_hour_incrementer.rb +31 -0
  86. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_minute_incrementer.rb +32 -0
  87. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_month_incrementer.rb +52 -0
  88. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_monthday_incrementer.rb +31 -0
  89. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_numbered_day_incrementer.rb +38 -0
  90. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_second_incrementer.rb +32 -0
  91. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_weekno_incrementer.rb +69 -0
  92. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/by_yearday_incrementer.rb +31 -0
  93. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/daily_incrementer.rb +28 -0
  94. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/frequency_incrementer.rb +80 -0
  95. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/hourly_incrementer.rb +23 -0
  96. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/list_incrementer.rb +106 -0
  97. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/minutely_incrementer.rb +23 -0
  98. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/monthly_incrementer.rb +33 -0
  99. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/null_sub_cycle_incrementer.rb +43 -0
  100. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/secondly_incrementer.rb +28 -0
  101. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/weekly_incrementer.rb +37 -0
  102. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer/yearly_incrementer.rb +57 -0
  103. data/lib/ri_cal/property_value/recurrence_rule/occurrence_incrementer.rb +135 -0
  104. data/lib/ri_cal/property_value/recurrence_rule/recurring_day.rb +131 -0
  105. data/lib/ri_cal/property_value/recurrence_rule/recurring_month_day.rb +64 -0
  106. data/lib/ri_cal/property_value/recurrence_rule/recurring_numbered_week.rb +33 -0
  107. data/lib/ri_cal/property_value/recurrence_rule/recurring_year_day.rb +53 -0
  108. data/lib/ri_cal/property_value/recurrence_rule/time_manipulation.rb +42 -0
  109. data/lib/ri_cal/property_value/recurrence_rule/validations.rb +125 -0
  110. data/lib/ri_cal/property_value/recurrence_rule.rb +154 -0
  111. data/lib/ri_cal/property_value/text.rb +44 -0
  112. data/lib/ri_cal/property_value/uri.rb +11 -0
  113. data/lib/ri_cal/property_value/utc_offset.rb +33 -0
  114. data/lib/ri_cal/property_value/zulu_date_time.rb +34 -0
  115. data/lib/ri_cal/property_value.rb +159 -0
  116. data/lib/ri_cal/required_timezones.rb +55 -0
  117. data/lib/ri_cal.rb +187 -0
  118. data/parked_specs/ri_cal/claudio_a_bug_spec.rb +100 -0
  119. data/performance/empty_propval/subject.rb +43 -0
  120. data/performance/paris_eastern/subject.rb +90 -0
  121. data/performance/penultimate_weekday/subject.rb +15 -0
  122. data/performance/psm_big_enum/ical.ics +3171 -0
  123. data/performance/psm_big_enum/subject.rb +16 -0
  124. data/performance/utah_cycling/subject.rb +55 -0
  125. data/ri_cal.gemspec +244 -0
  126. data/script/benchmark_subject +23 -0
  127. data/script/console +10 -0
  128. data/script/destroy +14 -0
  129. data/script/generate +14 -0
  130. data/script/profile_subject +29 -0
  131. data/script/txt2html +71 -0
  132. data/spec/ri_cal/bugreports_spec.rb +276 -0
  133. data/spec/ri_cal/component/alarm_spec.rb +12 -0
  134. data/spec/ri_cal/component/calendar_spec.rb +88 -0
  135. data/spec/ri_cal/component/event_spec.rb +735 -0
  136. data/spec/ri_cal/component/freebusy_spec.rb +12 -0
  137. data/spec/ri_cal/component/journal_spec.rb +37 -0
  138. data/spec/ri_cal/component/t_z_info_timezone_spec.rb +60 -0
  139. data/spec/ri_cal/component/timezone_spec.rb +236 -0
  140. data/spec/ri_cal/component/todo_spec.rb +112 -0
  141. data/spec/ri_cal/component_spec.rb +224 -0
  142. data/spec/ri_cal/core_extensions/string/conversions_spec.rb +78 -0
  143. data/spec/ri_cal/core_extensions/time/calculations_spec.rb +188 -0
  144. data/spec/ri_cal/core_extensions/time/week_day_predicates_spec.rb +45 -0
  145. data/spec/ri_cal/fast_date_time_spec.rb +77 -0
  146. data/spec/ri_cal/inf_loop_spec.rb +78 -0
  147. data/spec/ri_cal/occurrence_enumerator_spec.rb +611 -0
  148. data/spec/ri_cal/parser_spec.rb +337 -0
  149. data/spec/ri_cal/property_value/date_spec.rb +53 -0
  150. data/spec/ri_cal/property_value/date_time_spec.rb +383 -0
  151. data/spec/ri_cal/property_value/duration_spec.rb +126 -0
  152. data/spec/ri_cal/property_value/occurrence_list_spec.rb +72 -0
  153. data/spec/ri_cal/property_value/period_spec.rb +63 -0
  154. data/spec/ri_cal/property_value/recurrence_rule/recurring_year_day_spec.rb +21 -0
  155. data/spec/ri_cal/property_value/recurrence_rule_spec.rb +1814 -0
  156. data/spec/ri_cal/property_value/text_spec.rb +25 -0
  157. data/spec/ri_cal/property_value/utc_offset_spec.rb +48 -0
  158. data/spec/ri_cal/property_value_spec.rb +125 -0
  159. data/spec/ri_cal/required_timezones_spec.rb +67 -0
  160. data/spec/ri_cal_spec.rb +53 -0
  161. data/spec/spec.opts +4 -0
  162. data/spec/spec_helper.rb +50 -0
  163. data/tasks/gem_loader/load_active_support.rb +3 -0
  164. data/tasks/gem_loader/load_tzinfo_gem.rb +2 -0
  165. data/tasks/ri_cal.rake +412 -0
  166. data/tasks/spec.rake +102 -0
  167. metadata +246 -0
@@ -0,0 +1,100 @@
1
+ #- ©2009 Rick DeNatale, All rights reserved. Refer to the file README.txt for the license
2
+
3
+ require 'rubygems'
4
+ require File.join(File.dirname(__FILE__), %w[.. spec_helper])
5
+
6
+ describe "RiCal TimeZone problem" do
7
+ it "should keep the original calendar timezone intact" do
8
+ original_calendar = RiCal.parse_string(original_calendar_contents).first
9
+ puts "*"*40
10
+ puts original_calendar
11
+ puts "*"*40
12
+ reply_calendar = reply original_calendar
13
+ #reply_calendar = RiCal.parse_string(reply_calendar_contents).first
14
+ puts reply_calendar
15
+ puts "*"*40
16
+
17
+ original_event = original_calendar.events.first
18
+ reply_event = reply_calendar.events.first
19
+ reply_event.start_time.to_s.should == original_event.start_time.to_s
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ # This is the calendar contents generated when we send the message >>#reply to the original calendar.
26
+ def reply_calendar_contents
27
+ "BEGIN:VCALENDAR
28
+ PRODID;X-RICAL-TZSOURCE=TZINFO:-//com.denhaven2/NONSGML ri_cal gem//EN
29
+ CALSCALE:GREGORIAN
30
+ VERSION:2.0
31
+ METHOD:REPLY
32
+ BEGIN:VTIMEZONE
33
+ TZID;X-RICAL-TZSOURCE=TZINFO:America/Argentina/Buenos_Aires
34
+ BEGIN:STANDARD
35
+ DTSTART:20090314T230000
36
+ RDATE:20090314T230000
37
+ TZOFFSETFROM:-0200
38
+ TZOFFSETTO:-0300
39
+ TZNAME:ART
40
+ END:STANDARD
41
+ END:VTIMEZONE
42
+ BEGIN:VEVENT
43
+ CREATED;VALUE=DATE-TIME:20091217T155557Z
44
+ DTEND;TZID=America/Argentina/Buenos_Aires;VALUE=DATE-TIME:20091227T010000
45
+ STATUS:CONFIRMED
46
+ LAST-MODIFIED;TZID=America/Argentina/Buenos_Aires;VALUE=DATE-TIME:2009121
47
+ 7T173400
48
+ DTSTART;TZID=America/Argentina/Buenos_Aires;VALUE=DATE-TIME:20091227T0000
49
+ 00
50
+ ATTENDEE;CN=PoketyPoke;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPANT:barbarazopp
51
+ o@gmail.com
52
+ UID:1693CA3B-C528-4E5A-87FB-CDFAEC0EC662
53
+ ORGANIZER:mailto:nasif.lucas@gmail.com
54
+ DESCRIPTION:
55
+ SUMMARY:testing.. Event
56
+ SEQUENCE:3
57
+ LOCATION:
58
+ END:VEVENT
59
+ END:VCALENDAR".strip
60
+ end
61
+
62
+ def original_calendar_contents
63
+ "BEGIN:VCALENDAR\nPRODID:-//Apple Inc.//iCal 4.0.1//EN\nCALSCALE:GREGORIAN\nVERSION:2.0\nMETHOD:REQUEST\nBEGIN:VEVENT\nTRANSP:TRANSPARENT\nDTSTAMP;VALUE=DATE-TIME:20091217T155800Z\nCREATED;VALUE=DATE-TIME:20091217T155557Z\nDTEND;TZID=America/Argentina/Buenos_Aires;VALUE=DATE-TIME:20091227T010000\nDTSTART;TZID=America/Argentina/Buenos_Aires;VALUE=DATE-TIME:20091227T0000\n 00\nATTENDEE;CN=Lucas Nasif;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:nasif.\n lucas@gmail.com\nATTENDEE;CN=barbarazoppo@gmail.com;CUTYPE=INDIVIDUAL;EMAIL=barbarazoppo@g\n mail.com;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bar\n barazoppo@gmail.com\nUID:1693CA3B-C528-4E5A-87FB-CDFAEC0EC662\nORGANIZER;CN=Lucas Nasif:mailto:nasif.lucas@gmail.com\nSUMMARY:testing.. Event\nSEQUENCE:3\nEND:VEVENT\nBEGIN:VTIMEZONE\nTZID:America/Argentina/Buenos_Aires\nBEGIN:STANDARD\nTZOFFSETTO:-0300\nDTSTART;VALUE=DATE-TIME:20080316T000000\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU\nTZOFFSETFROM:-0200\nTZNAME:GMT-03:00\nEND:STANDARD\nBEGIN:DAYLIGHT\nTZOFFSETTO:-0200\nDTSTART;VALUE=DATE-TIME:20081019T000000\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=3SU\nTZOFFSETFROM:-0300\nTZNAME:GMT-02:00\nEND:DAYLIGHT\nEND:VTIMEZONE\nEND:VCALENDAR\n".strip
64
+ end
65
+
66
+ def reply(original_calendar)
67
+ icalendar = RiCal.Calendar do | calendar |
68
+
69
+ calendar.icalendar_method = "REPLY"
70
+ calendar.default_tzid = original_calendar.default_tzid
71
+
72
+ calendar.event do | event |
73
+
74
+ original_event = original_calendar.events.first
75
+ event.created = original_event.created
76
+ event.dtstart = original_event.start_time
77
+ event.dtend = original_event.finish_time
78
+ event.organizer = original_event.organizer
79
+ event.location = original_event.location.to_s
80
+ event.uid_property = original_event.uid_property
81
+
82
+ options = {'ROLE' => 'REQ-PARTICIPANT',
83
+ 'PARTSTAT' => 'ACCEPTED',
84
+ 'CN' => 'SomeName...'}
85
+
86
+ attendee_property = RiCal::PropertyValue::CalAddress.new(nil,
87
+ :value => @attendant,
88
+ :params => options)
89
+
90
+ event.attendee_property = attendee_property
91
+ event.description = original_event.description.to_s
92
+ event.summary = original_event.summary.to_s
93
+
94
+ event.sequence_property = original_event.sequence_property
95
+ event.status = "CONFIRMED"
96
+ event.last_modified = DateTime.parse(Time.now.to_s)
97
+ end
98
+ end
99
+ icalendar
100
+ end
@@ -0,0 +1,43 @@
1
+ class Subject
2
+ def initialize(out=STDOUT)
3
+ cals = RiCal.parse_string <<-END_OF_DATA
4
+ BEGIN:VCALENDAR
5
+ METHOD:REQUEST
6
+ PRODID:Microsoft CDO for Microsoft Exchange
7
+ VERSION:2.0
8
+ BEGIN:VTIMEZONE
9
+ TZID:(GMT-05.00) Eastern Time (US & Canada)
10
+ X-MICROSOFT-CDO-TZID:10
11
+ BEGIN:STANDARD
12
+ DTSTART:16010101T020000
13
+ TZOFFSETFROM:-0400
14
+ TZOFFSETTO:-0500
15
+ RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=11;BYDAY=1SU
16
+ END:STANDARD
17
+ BEGIN:DAYLIGHT
18
+ DTSTART:16010101T020000
19
+ TZOFFSETFROM:-0500
20
+ TZOFFSETTO:-0400
21
+ RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=2SU
22
+ END:DAYLIGHT
23
+ END:VTIMEZONE
24
+ BEGIN:VEVENT
25
+ DTSTAMP:20090724T143205Z
26
+ DTSTART;TZID="(GMT-05.00) Eastern Time (US & Canada)":20090804T120000
27
+ SUMMARY:FW: ALL HANDS MEETING
28
+ DTEND;TZID="(GMT-05.00) Eastern Time (US & Canada)":20090804T133000
29
+ DESCRIPTION:Some event
30
+ END:VEVENT
31
+ END:VCALENDAR
32
+ END_OF_DATA
33
+
34
+ cal = cals.first
35
+ @event = cal.events.first
36
+ end
37
+
38
+ def run
39
+ puts "start"
40
+ @event.dtstart
41
+ puts "done"
42
+ end
43
+ end
@@ -0,0 +1,90 @@
1
+ class Subject
2
+ def initialize(out=STDOUT)
3
+ cals = RiCal.parse_string <<-END_OF_DATA
4
+ BEGIN:VCALENDAR
5
+ METHOD:PUBLISH
6
+ X-WR-TIMEZONE:America/New_York
7
+ PRODID:-//Apple Inc.//iCal 3.0//EN
8
+ CALSCALE:GREGORIAN
9
+ X-WR-CALNAME:Test
10
+ VERSION:2.0
11
+ X-WR-RELCALID:58DB0663-196B-4B6B-A05A-A53049661280
12
+ X-APPLE-CALENDAR-COLOR:#0252D4
13
+ BEGIN:VTIMEZONE
14
+ TZID:Europe/Paris
15
+ BEGIN:DAYLIGHT
16
+ TZOFFSETFROM:+0100
17
+ TZOFFSETTO:+0200
18
+ DTSTART:19810329T020000
19
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
20
+ TZNAME:CEST
21
+ END:DAYLIGHT
22
+ BEGIN:STANDARD
23
+ TZOFFSETFROM:+0200
24
+ TZOFFSETTO:+0100
25
+ DTSTART:19961027T030000
26
+ RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
27
+ TZNAME:CET
28
+ END:STANDARD
29
+ END:VTIMEZONE
30
+ BEGIN:VTIMEZONE
31
+ TZID:US/Eastern
32
+ BEGIN:DAYLIGHT
33
+ TZOFFSETFROM:-0500
34
+ TZOFFSETTO:-0400
35
+ DTSTART:20070311T020000
36
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
37
+ TZNAME:EDT
38
+ END:DAYLIGHT
39
+ BEGIN:STANDARD
40
+ TZOFFSETFROM:-0400
41
+ TZOFFSETTO:-0500
42
+ DTSTART:20071104T020000
43
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
44
+ TZNAME:EST
45
+ END:STANDARD
46
+ END:VTIMEZONE
47
+ BEGIN:VEVENT
48
+ SEQUENCE:3
49
+ TRANSP:OPAQUE
50
+ UID:AC2EFB19-A8A8-49EF-929F-CA0975374ED6
51
+ DTSTART:20090501T000000Z
52
+ DTSTAMP:20090501T174405Z
53
+ SUMMARY:UTC Event
54
+ CREATED:20090501T174347Z
55
+ DTEND:20090501T010000Z
56
+ END:VEVENT
57
+ BEGIN:VEVENT
58
+ SEQUENCE:2
59
+ TRANSP:OPAQUE
60
+ UID:A5517A09-C53E-4E1F-A642-EA47680BF2B6
61
+ DTSTART;TZID=US/Eastern:20090430T140000
62
+ DTSTAMP:20090501T174428Z
63
+ SUMMARY:Eastern Event
64
+ CREATED:20090501T174415Z
65
+ DTEND;TZID=US/Eastern:20090430T150000
66
+ END:VEVENT
67
+ BEGIN:VEVENT
68
+ SEQUENCE:3
69
+ TRANSP:OPAQUE
70
+ UID:B5024763-9197-4A60-A96E-D8D59D578BB2
71
+ DTSTART;TZID=Europe/Paris:20090430T140000
72
+ DTSTAMP:20090501T174509Z
73
+ SUMMARY:Paris Event
74
+ CREATED:20090501T174439Z
75
+ DTEND;TZID=Europe/Paris:20090430T150000
76
+ END:VEVENT
77
+ END:VCALENDAR
78
+ END_OF_DATA
79
+
80
+ cal = cals.first
81
+ event = cal.events.find {|event| event.summary == "Paris Event"}
82
+ @date_time = event.dtstart_property
83
+ end
84
+
85
+ def run
86
+ puts "start"
87
+ @date_time.in_time_zone("US/Eastern")
88
+ puts "done"
89
+ end
90
+ end
@@ -0,0 +1,15 @@
1
+ require 'tzinfo'
2
+
3
+
4
+ class Subject
5
+ def initialize(out=STDOUT)
6
+ @event = RiCal.Event do |e|
7
+ e.dtstart = "TZID=America/New_York:19970929T090000"
8
+ e.rrule = "FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2"
9
+ end
10
+ end
11
+
12
+ def run
13
+ @event.occurrences(:count => 7)
14
+ end
15
+ end