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,276 @@
1
+ #- ©2009 Rick DeNatale, All rights reserved. Refer to the file README.txt for the license
2
+
3
+ require File.join(File.dirname(__FILE__), %w[.. spec_helper])
4
+
5
+ describe "http://rick_denatale.lighthouseapp.com/projects/30941/tickets/17" do
6
+ it "should parse this" do
7
+ RiCal.parse_string(<<-ENDCAL)
8
+ BEGIN:VCALENDAR
9
+ PRODID:-//Google Inc//Google Calendar 70.9054//EN
10
+ VERSION:2.0
11
+ CALSCALE:GREGORIAN
12
+ METHOD:PUBLISH
13
+ X-WR-CALNAME:Australian Tech Events
14
+ X-WR-TIMEZONE:Australia/Sydney
15
+ X-WR-CALDESC:TO ADD EVENTS INVITE THIS ADDRESS\;\npf44opfb12hherild7h2pl11b
16
+ 4@group.calendar.google.com\n\nThis is a public calendar to know what's com
17
+ ing up all around the country in the technology industry.\n\nIncludes digit
18
+ al\, internet\, web\, enterprise\, software\, hardware\, and it's various f
19
+ lavours. \n\nFeel free to add real events. Keep it real.
20
+ BEGIN:VTIMEZONE
21
+ TZID:Australia/Perth
22
+ X-LIC-LOCATION:Australia/Perth
23
+ BEGIN:STANDARD
24
+ TZOFFSETFROM:+0800
25
+ TZOFFSETTO:+0800
26
+ TZNAME:WST
27
+ DTSTART:19700101T000000
28
+ END:STANDARD
29
+ END:VTIMEZONE
30
+ BEGIN:VTIMEZONE
31
+ TZID:Australia/Sydney
32
+ X-LIC-LOCATION:Australia/Sydney
33
+ BEGIN:STANDARD
34
+ TZOFFSETFROM:+1100
35
+ TZOFFSETTO:+1000
36
+ TZNAME:EST
37
+ DTSTART:19700405T030000
38
+ RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
39
+ END:STANDARD
40
+ BEGIN:DAYLIGHT
41
+ TZOFFSETFROM:+1000
42
+ TZOFFSETTO:+1100
43
+ TZNAME:EST
44
+ DTSTART:19701004T020000
45
+ RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
46
+ END:DAYLIGHT
47
+ END:VTIMEZONE
48
+ BEGIN:VTIMEZONE
49
+ TZID:Australia/Brisbane
50
+ X-LIC-LOCATION:Australia/Brisbane
51
+ BEGIN:STANDARD
52
+ TZOFFSETFROM:+1000
53
+ TZOFFSETTO:+1000
54
+ TZNAME:EST
55
+ DTSTART:19700101T000000
56
+ END:STANDARD
57
+ END:VTIMEZONE
58
+ BEGIN:VEVENT
59
+ DTSTART:20091110T080000Z
60
+ DTEND:20091110T100000Z
61
+ DTSTAMP:20090720T133540Z
62
+ UID:9357CC6B-C4BF-4797-AC5F-83E47C3FDA9E
63
+ URL:thehive.org.au
64
+ CLASS:PUBLIC
65
+ CREATED:20090713T123838Z
66
+ DESCRIPTION:check the website for details
67
+ LAST-MODIFIED:20090713T123838Z
68
+ LOCATION:Melbourne
69
+ SEQUENCE:1
70
+ STATUS:CONFIRMED
71
+ SUMMARY:The Hive MELBOURNE
72
+ TRANSP:OPAQUE
73
+ BEGIN:VALARM
74
+ ACTION:AUDIO
75
+ TRIGGER:-PT5M
76
+ X-WR-ALARMUID:F92A055A-2CD9-4FB2-A22A-BD4834ACEE96
77
+ ATTACH;VALUE=URI:Basso
78
+ END:VALARM
79
+ END:VEVENT
80
+ END:VCALENDAR
81
+ ENDCAL
82
+ end
83
+ end
84
+
85
+ describe "http://rick_denatale.lighthouseapp.com/projects/30941/tickets/18" do
86
+ it "should handle a subcomponent" do
87
+ event = RiCal.Event do |evt|
88
+ evt.alarm do |alarm|
89
+ alarm.trigger = "-PT5M"
90
+ alarm.action = 'AUDIO'
91
+ end
92
+ end
93
+
94
+ lambda {event.export}.should_not raise_error
95
+ end
96
+ end
97
+
98
+ describe "http://rick_denatale.lighthouseapp.com/projects/30941/tickets/19" do
99
+ before(:each) do
100
+ cals = RiCal.parse_string(<<-ENDCAL)
101
+ BEGIN:VCALENDAR
102
+ METHOD:REQUEST
103
+ PRODID:Microsoft CDO for Microsoft Exchange
104
+ VERSION:2.0
105
+ BEGIN:VTIMEZONE
106
+ TZID:(GMT-05.00) Eastern Time (US & Canada)
107
+ X-MICROSOFT-CDO-TZID:10
108
+ BEGIN:STANDARD
109
+ DTSTART:20010101T020000
110
+ TZOFFSETFROM:-0400
111
+ TZOFFSETTO:-0500
112
+ RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=11;BYDAY=1SU
113
+ END:STANDARD
114
+ BEGIN:DAYLIGHT
115
+ DTSTART:20010101T020000
116
+ TZOFFSETFROM:-0500
117
+ TZOFFSETTO:-0400
118
+ RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=2SU
119
+ END:DAYLIGHT
120
+ END:VTIMEZONE
121
+ BEGIN:VEVENT
122
+ DTSTAMP:20090724T143205Z
123
+ DTSTART;TZID="(GMT-05.00) Eastern Time (US & Canada)":20090804T120000
124
+ SUMMARY:FW: ALL HANDS MEETING
125
+ DTEND;TZID="(GMT-05.00) Eastern Time (US & Canada)":20090804T133000
126
+ DESCRIPTION:Some event
127
+ END:VEVENT
128
+ END:VCALENDAR
129
+ ENDCAL
130
+
131
+ @event = cals.first.events.first
132
+ end
133
+
134
+ it "not raise an error accessing DTSTART" do
135
+ lambda {@event.dtstart}.should_not raise_error
136
+ end
137
+ end
138
+
139
+ describe "freebusy problem" do
140
+ before(:each) do
141
+ cal = RiCal.parse_string(<<ENDCAL)
142
+ BEGIN:VCALENDAR
143
+ METHOD:PUBLISH
144
+ VERSION:2.0
145
+ PRODID:Zimbra-Calendar-Provider
146
+ BEGIN:VFREEBUSY
147
+ ORGANIZER:mailto:bj-wagoner@wiu.edu
148
+ DTSTAMP:20090805T200417Z
149
+ DTSTART:20090705T200417Z
150
+ DTEND:20091006T200417Z
151
+ URL:https://zimbra9.wiu.edu/service/home/bjw101/calendar.ifb?null
152
+ FREEBUSY;FBTYPE=BUSY:20090705T200417Z/20090707T050000Z
153
+ FREEBUSY;FBTYPE=BUSY-TENTATIVE:20090711T050000Z/20090712T050000Z
154
+ END:VFREEBUSY
155
+ END:VCALENDAR
156
+ ENDCAL
157
+ @free_busy = cal.first.freebusys.first
158
+ end
159
+
160
+ it "should have two periods" do
161
+ @free_busy.freebusy.map {|fb| fb.to_s}.should == [
162
+ ";FBTYPE=BUSY:20090705T200417Z/20090707T050000Z",
163
+ ";FBTYPE=BUSY-TENTATIVE:20090711T050000Z/20090712T050000Z"
164
+ ]
165
+ end
166
+ end
167
+
168
+ describe "a calendar including vvenue" do
169
+ before(:each) do
170
+ @cal_string = <<ENDCAL
171
+ BEGIN:VCALENDAR
172
+ VERSION:2.0
173
+ X-WR-CALNAME:Upcoming Event: Film in the Park
174
+ PRODID:-//Upcoming.org/Upcoming ICS//EN
175
+ CALSCALE:GREGORIAN
176
+ METHOD:PUBLISH
177
+ BEGIN:VEVENT
178
+ DTSTART:20090807T201500
179
+ DTEND:20090807T220000
180
+ RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20090822T000000
181
+ GEO:-104.997;39.546
182
+ TRANSP:TRANSPARENT
183
+ SUMMARY:Film in the Park
184
+ DESCRIPTION: [Full details at http://upcoming.yahoo.com/event/3082410/ ] Plan to join the HRCA family summer tradition! Bring a blanket and enjoy great FREE family movies! Mark the dates now!
185
+ URL;VALUE=URI:http://upcoming.yahoo.com/event/3082410/
186
+ UID:http://upcoming.yahoo.com/event/3082410/
187
+ DTSTAMP:20090716T103006
188
+ LAST-UPDATED:20090716T103006
189
+ CATEGORIES:Family
190
+ ORGANIZER;CN=mepling95:X-ADDR:http://upcoming.yahoo.com/user/637615/
191
+ LOCATION;VENUE-UID="http://upcoming.yahoo.com/venue/130821/":Civic Green Park @ 9370 Ridgeline Boulevard\, Highlands Ranch\, Colorado 80126 US
192
+ END:VEVENT
193
+ BEGIN:VVENUE
194
+ X-VVENUE-INFO:http://evdb.com/docs/ical-venue/drft-norris-ical-venue.html
195
+ NAME:Civic Green Park
196
+ ADDRESS:9370 Ridgeline Boulevard
197
+ CITY:Highlands Ranch
198
+ REGION;X-ABBREV=co:Colorado
199
+ COUNTRY;X-ABBREV=us:United States
200
+ POSTALCODE:80126
201
+ GEO:39.546;-104.997
202
+ URL;X-LABEL=Venue Info:http://www.hrmafestival.org
203
+ END:VVENUE
204
+ END:VCALENDAR
205
+ ENDCAL
206
+
207
+ @venue_str = <<ENDVENUE
208
+ BEGIN:VVENUE
209
+ X-VVENUE-INFO:http://evdb.com/docs/ical-venue/drft-norris-ical-venue.html
210
+ NAME:Civic Green Park
211
+ ADDRESS:9370 Ridgeline Boulevard
212
+ CITY:Highlands Ranch
213
+ REGION;X-ABBREV=co:Colorado
214
+ COUNTRY;X-ABBREV=us:United States
215
+ POSTALCODE:80126
216
+ GEO:39.546;-104.997
217
+ URL;X-LABEL=Venue Info:http://www.hrmafestival.org
218
+ END:VVENUE
219
+ ENDVENUE
220
+ end
221
+
222
+ it "should parse without error" do
223
+ lambda {RiCal.parse_string(@cal_string)}.should_not raise_error
224
+ end
225
+
226
+ it "should export correctly" do
227
+ export = RiCal.parse_string(@cal_string).first.export
228
+ export.should include(@venue_str)
229
+ end
230
+ end
231
+
232
+ context "ticket #23" do
233
+ describe "RecurrenceRule" do
234
+ it "should convert the rrule string to a hash" do
235
+ rrule = RiCal::PropertyValue::RecurrenceRule.convert(nil, 'INTERVAL=2;FREQ=WEEKLY;BYDAY=TH,TU')
236
+ rrule.to_options_hash.should == {:freq => 'WEEKLY', :byday => %w{TH TU}, :interval => 2}
237
+ end
238
+ end
239
+ end
240
+
241
+ context "ticket #26" do
242
+ context "Date property" do
243
+ it "should handle for_parent" do
244
+ lambda {
245
+ RiCal::PropertyValue::Date.convert(:foo, Date.parse("20090927")).for_parent(:bar)}.should_not raise_error
246
+ end
247
+ end
248
+ end
249
+
250
+ context "ticket 29:supress-x-rical-tzsource-when-not-relevant" do
251
+ it "should parse its own output" do
252
+ cal_string = %Q(BEGIN:VCALENDAR
253
+ PRODID:-//Google Inc//Google Calendar 70.9054//EN
254
+ BEGIN:VEVENT
255
+ DTSTART:20100610T100000
256
+ DTEND:20100610T110000
257
+ END:VEVENT
258
+ END:VCALENDAR)
259
+ lambda {RiCal.parse_string(RiCal.parse_string(cal_string).first.to_s)}.should_not raise_error
260
+ end
261
+ end
262
+
263
+ context "X-properties" do
264
+ it "should round-trip the X-WR-CALNAME property" do
265
+ cal_string = %Q(BEGIN:VCALENDAR
266
+ PRODID:-//Markthisdate.com\,0.7
267
+ VERSION:2.0
268
+ CALSCALE:GREGORIAN
269
+ METHOD:PUBLISH
270
+ X-WR-CALNAME: AFC Ajax Eredivisie wedstrijden 2010 - 2011
271
+ END:VCALENDAR)
272
+ cal = RiCal.parse_string(cal_string).first
273
+ cal.x_wr_calname.first.should == " AFC Ajax Eredivisie wedstrijden 2010 - 2011"
274
+ end
275
+ end
276
+
@@ -0,0 +1,12 @@
1
+ #- ©2009 Rick DeNatale, All rights reserved. Refer to the file README.txt for the license
2
+
3
+ require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
4
+
5
+ describe RiCal::Component::Alarm do
6
+
7
+ describe ".entity_name" do
8
+ it "should be VALARM" do
9
+ RiCal::Component::Alarm.entity_name.should == "VALARM"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,88 @@
1
+ # encoding: utf-8
2
+ #- ©2009 Rick DeNatale, All rights reserved. Refer to the file README.txt for the license
3
+
4
+ require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
5
+
6
+ describe RiCal::Component::Calendar do
7
+
8
+ context ".entity_name" do
9
+ it "should be VCALENDAR" do
10
+ RiCal::Component::Calendar.entity_name.should == "VCALENDAR"
11
+ end
12
+ end
13
+
14
+ context "a new instance" do
15
+ before(:each) do
16
+ @it = RiCal.Calendar
17
+ end
18
+
19
+ it "should have a tz_source of 'TZ_INFO" do
20
+ @it.tz_source.should == "TZINFO"
21
+ end
22
+
23
+ it "should export a product id with an X-RICAL-TZSOURCE parameter of TZINFO" do
24
+ @it.export.should match(%r{\nPRODID;X-RICAL-TZSOURCE=TZINFO:-//com.denhaven2/NONSGML ri_cal gem//EN\n})
25
+ end
26
+ end
27
+
28
+ context "an imported instance with a tzinfo source" do
29
+ before(:each) do
30
+ @it = RiCal.parse_string("BEGIN:VCALENDAR\nPRODID;X-RICAL-TZSOURCE=TZINFO:-\/\/com.denhaven2\/NONSGML ri_cal gem\/\/EN\nCALSCALE:GREGORIAN\nVERSION:2.0\nEND:VCALENDAR\n").first
31
+ end
32
+
33
+ it "should have a tz_source of 'TZ_INFO" do
34
+ @it.tz_source.should == "TZINFO"
35
+ end
36
+
37
+ it "should export a product id with an X-RICAL-TZSOURCE parameter of TZINFO" do
38
+ @it.export.should match(%r{\nPRODID;X-RICAL-TZSOURCE=TZINFO:-//com.denhaven2/NONSGML ri_cal gem//EN\n})
39
+ end
40
+ end
41
+
42
+ context "an imported instance without a tzinfo source" do
43
+ before(:each) do
44
+ @it = RiCal.parse_string("BEGIN:VCALENDAR\nPRODID:-//Apple Inc.//iCal 3.0//EN\nEND:VCALENDAR\n").first
45
+ end
46
+
47
+ it "should have a tz_source of nil" do
48
+ @it.tz_source.should be_nil
49
+ end
50
+
51
+ it "should export not export a product id with an X-RICAL-TZSOURCE parameter of TZINFO" do
52
+ @it.export.should_not match(%r{X-RICAL-TZSOURCE=TZINFO:})
53
+ end
54
+ end
55
+
56
+ describe RiCal::Component::Calendar::FoldingStream do
57
+ before(:each) do
58
+ @it = RiCal::Component::Calendar::FoldingStream.new(nil)
59
+ end
60
+
61
+ describe "#utf_safe_split" do
62
+ it "should properly split an ascii string" do
63
+ @it.utf8_safe_split("abcdef", 3).should == ["abc", "def"]
64
+ end
65
+
66
+ it "should return a nil remainder if the string has less than n characters" do
67
+ @it.utf8_safe_split("a",2).should == ["a", nil]
68
+ end
69
+
70
+ it "should return a nil remainder if the string has exactly n characters" do
71
+ @it.utf8_safe_split("ab",2).should == ["ab", nil]
72
+ end
73
+
74
+ it "should not split a 2-byte utf character" do
75
+ @it.utf8_safe_split("Café", 3).should == ["Caf", "é"]
76
+ @it.utf8_safe_split("Café", 4).should == ["Caf", "é"]
77
+ @it.utf8_safe_split("Café", 5).should == ["Café", nil]
78
+ end
79
+
80
+ it "should not split a 3-byte utf character" do
81
+ @it.utf8_safe_split("Prix €200", 5).should == ["Prix ", "€200"]
82
+ @it.utf8_safe_split("Prix €200", 6).should == ["Prix ", "€200"]
83
+ @it.utf8_safe_split("Prix €200", 7).should == ["Prix ", "€200"]
84
+ @it.utf8_safe_split("Prix €200", 8).should == ["Prix €", "200"]
85
+ end
86
+ end
87
+ end
88
+ end