tilia-vobject 4.0.0.pre.alpha5 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.sabre.md +59 -2
  3. data/Gemfile +1 -8
  4. data/Gemfile.lock +18 -12
  5. data/LICENSE +1 -1
  6. data/LICENSE.sabre +1 -1
  7. data/lib/tilia/v_object.rb +1 -0
  8. data/lib/tilia/v_object/birthday_calendar_generator.rb +11 -11
  9. data/lib/tilia/v_object/cli.rb +39 -38
  10. data/lib/tilia/v_object/component.rb +47 -50
  11. data/lib/tilia/v_object/component/available.rb +4 -37
  12. data/lib/tilia/v_object/component/v_alarm.rb +6 -18
  13. data/lib/tilia/v_object/component/v_availability.rb +6 -39
  14. data/lib/tilia/v_object/component/v_calendar.rb +66 -98
  15. data/lib/tilia/v_object/component/v_card.rb +42 -69
  16. data/lib/tilia/v_object/component/v_event.rb +5 -17
  17. data/lib/tilia/v_object/component/v_free_busy.rb +4 -16
  18. data/lib/tilia/v_object/component/v_journal.rb +16 -16
  19. data/lib/tilia/v_object/component/v_time_zone.rb +2 -14
  20. data/lib/tilia/v_object/component/v_todo.rb +17 -36
  21. data/lib/tilia/v_object/date_time_parser.rb +24 -24
  22. data/lib/tilia/v_object/document.rb +25 -25
  23. data/lib/tilia/v_object/free_busy_data.rb +7 -7
  24. data/lib/tilia/v_object/free_busy_generator.rb +73 -75
  25. data/lib/tilia/v_object/i_tip.rb +1 -0
  26. data/lib/tilia/v_object/i_tip/broker.rb +134 -116
  27. data/lib/tilia/v_object/i_tip/i_tip_exception.rb +1 -1
  28. data/lib/tilia/v_object/i_tip/message.rb +13 -13
  29. data/lib/tilia/v_object/invalid_data_exception.rb +8 -0
  30. data/lib/tilia/v_object/node.rb +22 -27
  31. data/lib/tilia/v_object/parameter.rb +22 -22
  32. data/lib/tilia/v_object/parse_exception.rb +1 -1
  33. data/lib/tilia/v_object/parser.rb +1 -0
  34. data/lib/tilia/v_object/parser/json.rb +9 -19
  35. data/lib/tilia/v_object/parser/mime_dir.rb +73 -39
  36. data/lib/tilia/v_object/parser/parser.rb +9 -14
  37. data/lib/tilia/v_object/parser/xml.rb +33 -50
  38. data/lib/tilia/v_object/parser/xml/element.rb +1 -0
  39. data/lib/tilia/v_object/parser/xml/element/key_value.rb +2 -2
  40. data/lib/tilia/v_object/property.rb +52 -52
  41. data/lib/tilia/v_object/property/binary.rb +10 -10
  42. data/lib/tilia/v_object/property/boolean.rb +6 -6
  43. data/lib/tilia/v_object/property/flat_text.rb +3 -3
  44. data/lib/tilia/v_object/property/float_value.rb +10 -10
  45. data/lib/tilia/v_object/property/i_calendar.rb +1 -0
  46. data/lib/tilia/v_object/property/i_calendar/cal_address.rb +3 -3
  47. data/lib/tilia/v_object/property/i_calendar/date_time.rb +29 -57
  48. data/lib/tilia/v_object/property/i_calendar/duration.rb +6 -6
  49. data/lib/tilia/v_object/property/i_calendar/period.rb +10 -10
  50. data/lib/tilia/v_object/property/i_calendar/recur.rb +16 -24
  51. data/lib/tilia/v_object/property/integer_value.rb +8 -8
  52. data/lib/tilia/v_object/property/text.rb +21 -36
  53. data/lib/tilia/v_object/property/time.rb +29 -6
  54. data/lib/tilia/v_object/property/unknown.rb +2 -2
  55. data/lib/tilia/v_object/property/uri.rb +24 -5
  56. data/lib/tilia/v_object/property/utc_offset.rb +5 -5
  57. data/lib/tilia/v_object/property/v_card.rb +1 -0
  58. data/lib/tilia/v_object/property/v_card/date.rb +3 -3
  59. data/lib/tilia/v_object/property/v_card/date_and_or_time.rb +30 -42
  60. data/lib/tilia/v_object/property/v_card/date_time.rb +1 -1
  61. data/lib/tilia/v_object/property/v_card/language_tag.rb +4 -4
  62. data/lib/tilia/v_object/property/v_card/time_stamp.rb +5 -5
  63. data/lib/tilia/v_object/reader.rb +12 -11
  64. data/lib/tilia/v_object/recur.rb +2 -0
  65. data/lib/tilia/v_object/recur/event_iterator.rb +30 -27
  66. data/lib/tilia/v_object/recur/max_instances_exceeded_exception.rb +10 -0
  67. data/lib/tilia/v_object/recur/no_instances_exception.rb +1 -1
  68. data/lib/tilia/v_object/recur/r_date_iterator.rb +15 -41
  69. data/lib/tilia/v_object/recur/r_rule_iterator.rb +23 -156
  70. data/lib/tilia/v_object/settings.rb +16 -0
  71. data/lib/tilia/v_object/splitter.rb +1 -0
  72. data/lib/tilia/v_object/splitter/i_calendar.rb +5 -5
  73. data/lib/tilia/v_object/splitter/splitter_interface.rb +2 -2
  74. data/lib/tilia/v_object/splitter/v_card.rb +5 -5
  75. data/lib/tilia/v_object/string_util.rb +25 -9
  76. data/lib/tilia/v_object/time_zone_data.rb +1 -0
  77. data/lib/tilia/v_object/time_zone_util.rb +6 -6
  78. data/lib/tilia/v_object/uuid_util.rb +3 -3
  79. data/lib/tilia/v_object/v_card_converter.rb +24 -21
  80. data/lib/tilia/v_object/version.rb +1 -1
  81. data/lib/tilia/v_object/writer.rb +7 -7
  82. data/test/test_helper.rb +3 -3
  83. data/test/v_object/birthday_calendar_generator_test.rb +22 -0
  84. data/test/v_object/component/v_alarm_test.rb +3 -1
  85. data/test/v_object/component/v_calendar_test.rb +40 -4
  86. data/test/v_object/component/v_card_test.rb +1 -1
  87. data/test/v_object/component_test.rb +5 -3
  88. data/test/v_object/date_time_parser_test.rb +15 -5
  89. data/test/v_object/free_busy_generator_test.rb +5 -5
  90. data/test/v_object/i_tip/broker_attendee_reply_test.rb +19 -0
  91. data/test/v_object/i_tip/broker_delete_event_test.rb +146 -2
  92. data/test/v_object/i_tip/broker_new_event_test.rb +21 -0
  93. data/test/v_object/i_tip/broker_process_reply_test.rb +10 -0
  94. data/test/v_object/i_tip/broker_tester.rb +1 -1
  95. data/test/v_object/i_tip/broker_update_event_test.rb +36 -0
  96. data/test/v_object/issue259_test.rb +24 -0
  97. data/test/v_object/issue40_test.rb +3 -1
  98. data/test/v_object/j_cal_test.rb +15 -12
  99. data/test/v_object/parser/json_test.rb +5 -5
  100. data/test/v_object/parser/mime_dir_test.rb +109 -0
  101. data/test/v_object/property/binary_test.rb +4 -2
  102. data/test/v_object/property/i_calendar/date_time_test.rb +3 -1
  103. data/test/v_object/property/uri_test.rb +23 -0
  104. data/test/v_object/recur/event_iterator/by_month_in_daily_test.rb +1 -1
  105. data/test/v_object/recur/event_iterator/by_set_pos_hang_test.rb +1 -1
  106. data/test/v_object/recur/event_iterator/expand_floating_times_test.rb +9 -9
  107. data/test/v_object/recur/event_iterator/handle_r_date_expand_test.rb +51 -0
  108. data/test/v_object/recur/event_iterator/incorrect_expand_test.rb +3 -5
  109. data/test/v_object/recur/event_iterator/infinite_loop_problem_test.rb +3 -1
  110. data/test/v_object/{issue26_test.rb → recur/event_iterator/issue26_test.rb} +3 -1
  111. data/test/v_object/recur/event_iterator/main_test.rb +9 -3
  112. data/test/v_object/recur/event_iterator/max_instances_test.rb +38 -0
  113. data/test/v_object/recur/event_iterator/missing_overridden_test.rb +3 -5
  114. data/test/v_object/recur/event_iterator/no_instances_test.rb +5 -3
  115. data/test/v_object/recur/event_iterator/override_first_event_test.rb +9 -9
  116. data/test/v_object/recur/r_date_iterator_test.rb +18 -0
  117. data/test/v_object/recur/r_rule_iterator_test.rb +4 -4
  118. data/test/v_object/splitter/i_calendar_test.rb +27 -7
  119. data/test/v_object/splitter/v_card_test.rb +5 -3
  120. data/test/v_object/test_case.rb +14 -4
  121. data/tilia-vobject.gemspec +2 -2
  122. metadata +17 -11
@@ -13,11 +13,11 @@ module Tilia
13
13
  # It only generates the freebusy report for the following time-range:
14
14
  # 2011-01-01 11:00:00 until 2011-01-03 11:11:11
15
15
  #
16
- # @param string expected
17
- # @param array input
18
- # @param string|null time_zone
19
- # @param string vavailability
20
- # @return void
16
+ # @param [String] expected
17
+ # @param [array] input
18
+ # @param [String, nil] time_zone
19
+ # @param [String] vavailability
20
+ # @return [void]
21
21
  def assert_free_busy_report(expected, input, time_zone = nil, vavailability = nil)
22
22
  utc = ActiveSupport::TimeZone.new('UTC')
23
23
  gen = Tilia::VObject::FreeBusyGenerator.new(
@@ -52,6 +52,7 @@ CALSCALE:GREGORIAN
52
52
  METHOD:REPLY
53
53
  BEGIN:VEVENT
54
54
  UID:foobar
55
+ DTSTAMP:**ANY**
55
56
  SEQUENCE:1
56
57
  DTSTART:20140716T120000Z
57
58
  SUMMARY:B-day party
@@ -156,6 +157,7 @@ CALSCALE:GREGORIAN
156
157
  METHOD:REPLY
157
158
  BEGIN:VEVENT
158
159
  UID:foobar
160
+ DTSTAMP:**ANY**
159
161
  SEQUENCE:1
160
162
  DTSTART:20140726T120000Z
161
163
  SUMMARY:Daily sprint
@@ -165,6 +167,7 @@ ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
165
167
  END:VEVENT
166
168
  BEGIN:VEVENT
167
169
  UID:foobar
170
+ DTSTAMP:**ANY**
168
171
  SEQUENCE:1
169
172
  DTSTART:20140724T120000Z
170
173
  SUMMARY:Daily sprint
@@ -174,6 +177,7 @@ ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
174
177
  END:VEVENT
175
178
  BEGIN:VEVENT
176
179
  UID:foobar
180
+ DTSTAMP:**ANY**
177
181
  SEQUENCE:1
178
182
  DTSTART:20140728T120000Z
179
183
  SUMMARY:Daily sprint
@@ -183,6 +187,7 @@ ATTENDEE;PARTSTAT=TENTATIVE;CN=One:mailto:one@example.org
183
187
  END:VEVENT
184
188
  BEGIN:VEVENT
185
189
  UID:foobar
190
+ DTSTAMP:**ANY**
186
191
  SEQUENCE:1
187
192
  DTSTART:20140729T120000Z
188
193
  SUMMARY:Daily sprint
@@ -192,6 +197,7 @@ ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
192
197
  END:VEVENT
193
198
  BEGIN:VEVENT
194
199
  UID:foobar
200
+ DTSTAMP:**ANY**
195
201
  SEQUENCE:1
196
202
  DTSTART:20140725T120000Z
197
203
  SUMMARY:Daily sprint
@@ -295,6 +301,7 @@ CALSCALE:GREGORIAN
295
301
  METHOD:REPLY
296
302
  BEGIN:VEVENT
297
303
  UID:foobar
304
+ DTSTAMP:**ANY**
298
305
  SEQUENCE:1
299
306
  DTSTART;VALUE=DATE:20140726
300
307
  RECURRENCE-ID;VALUE=DATE:20140726
@@ -303,6 +310,7 @@ ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
303
310
  END:VEVENT
304
311
  BEGIN:VEVENT
305
312
  UID:foobar
313
+ DTSTAMP:**ANY**
306
314
  SEQUENCE:1
307
315
  DTSTART;VALUE=DATE:20140724
308
316
  RECURRENCE-ID;VALUE=DATE:20140724
@@ -311,6 +319,7 @@ ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
311
319
  END:VEVENT
312
320
  BEGIN:VEVENT
313
321
  UID:foobar
322
+ DTSTAMP:**ANY**
314
323
  SEQUENCE:1
315
324
  DTSTART;VALUE=DATE:20140728
316
325
  RECURRENCE-ID;VALUE=DATE:20140728
@@ -319,6 +328,7 @@ ATTENDEE;PARTSTAT=TENTATIVE;CN=One:mailto:one@example.org
319
328
  END:VEVENT
320
329
  BEGIN:VEVENT
321
330
  UID:foobar
331
+ DTSTAMP:**ANY**
322
332
  SEQUENCE:1
323
333
  DTSTART;VALUE=DATE:20140729
324
334
  RECURRENCE-ID;VALUE=DATE:20140729
@@ -327,6 +337,7 @@ ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
327
337
  END:VEVENT
328
338
  BEGIN:VEVENT
329
339
  UID:foobar
340
+ DTSTAMP:**ANY**
330
341
  SEQUENCE:1
331
342
  DTSTART;VALUE=DATE:20140725
332
343
  RECURRENCE-ID;VALUE=DATE:20140725
@@ -417,6 +428,7 @@ CALSCALE:GREGORIAN
417
428
  METHOD:REPLY
418
429
  BEGIN:VEVENT
419
430
  UID:foobar
431
+ DTSTAMP:**ANY**
420
432
  SEQUENCE:1
421
433
  DTSTART:20140716T120000Z
422
434
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
@@ -514,6 +526,7 @@ CALSCALE:GREGORIAN
514
526
  METHOD:REPLY
515
527
  BEGIN:VEVENT
516
528
  UID:foobar
529
+ DTSTAMP:**ANY**
517
530
  SEQUENCE:1
518
531
  DTSTART:20140818T200000Z
519
532
  RECURRENCE-ID:20140818T200000Z
@@ -577,6 +590,7 @@ CALSCALE:GREGORIAN
577
590
  METHOD:REPLY
578
591
  BEGIN:VEVENT
579
592
  UID:foobar
593
+ DTSTAMP:**ANY**
580
594
  SEQUENCE:1
581
595
  DTSTART;TZID=America/Toronto:20140818T200000
582
596
  RECURRENCE-ID;TZID=America/Toronto:20140818T200000
@@ -641,6 +655,7 @@ CALSCALE:GREGORIAN
641
655
  METHOD:REPLY
642
656
  BEGIN:VEVENT
643
657
  UID:foobar
658
+ DTSTAMP:**ANY**
644
659
  SEQUENCE:1
645
660
  DTSTART;VALUE=DATE:20140818
646
661
  SUMMARY:Weekly meeting
@@ -702,6 +717,7 @@ CALSCALE:GREGORIAN
702
717
  METHOD:REPLY
703
718
  BEGIN:VEVENT
704
719
  UID:foobar
720
+ DTSTAMP:**ANY**
705
721
  SEQUENCE:1
706
722
  DTSTART:20140716T120000Z
707
723
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
@@ -877,6 +893,7 @@ CALSCALE:GREGORIAN
877
893
  METHOD:REPLY
878
894
  BEGIN:VEVENT
879
895
  UID:foobar
896
+ DTSTAMP:**ANY**
880
897
  SEQUENCE:1
881
898
  DTSTART;VALUE=DATE:20140716
882
899
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
@@ -942,6 +959,7 @@ CALSCALE:GREGORIAN
942
959
  METHOD:REPLY
943
960
  BEGIN:VEVENT
944
961
  UID:foobar
962
+ DTSTAMP:**ANY**
945
963
  SEQUENCE:1
946
964
  DTSTART:20140724T120000Z
947
965
  SUMMARY:Daily sprint
@@ -1023,6 +1041,7 @@ CALSCALE:GREGORIAN
1023
1041
  METHOD:REPLY
1024
1042
  BEGIN:VEVENT
1025
1043
  UID:foobar
1044
+ DTSTAMP:**ANY**
1026
1045
  SEQUENCE:1
1027
1046
  DTSTART:20140717T120000Z
1028
1047
  SUMMARY:B-day party
@@ -4,7 +4,7 @@ require 'v_object/i_tip/broker_tester'
4
4
  module Tilia
5
5
  module VObject
6
6
  class BrokerDeleteEventTest < ITip::BrokerTester
7
- def test_organizer_delete
7
+ def test_organizer_delete_with_dtend
8
8
  old_message = <<ICS
9
9
  BEGIN:VCALENDAR
10
10
  VERSION:2.0
@@ -16,6 +16,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
16
16
  ATTENDEE;CN=One:mailto:one@example.org
17
17
  ATTENDEE;CN=Two:mailto:two@example.org
18
18
  DTSTART:20140716T120000Z
19
+ DTEND:20140716T130000Z
19
20
  END:VEVENT
20
21
  END:VCALENDAR
21
22
  ICS
@@ -41,9 +42,11 @@ CALSCALE:GREGORIAN
41
42
  METHOD:CANCEL
42
43
  BEGIN:VEVENT
43
44
  UID:foobar
45
+ DTSTAMP:**ANY**
44
46
  SEQUENCE:2
45
47
  SUMMARY:foo
46
48
  DTSTART:20140716T120000Z
49
+ DTEND:20140716T130000Z
47
50
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
48
51
  ATTENDEE;CN=One:mailto:one@example.org
49
52
  END:VEVENT
@@ -66,9 +69,11 @@ CALSCALE:GREGORIAN
66
69
  METHOD:CANCEL
67
70
  BEGIN:VEVENT
68
71
  UID:foobar
72
+ DTSTAMP:**ANY**
69
73
  SEQUENCE:2
70
74
  SUMMARY:foo
71
75
  DTSTART:20140716T120000Z
76
+ DTEND:20140716T130000Z
72
77
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
73
78
  ATTENDEE;CN=Two:mailto:two@example.org
74
79
  END:VEVENT
@@ -80,7 +85,7 @@ ICS
80
85
  parse(old_message, new_message, expected, 'mailto:strunk@example.org')
81
86
  end
82
87
 
83
- def test_attendee_delete
88
+ def test_attendee_delete_with_duration
84
89
  old_message = <<ICS
85
90
  BEGIN:VCALENDAR
86
91
  VERSION:2.0
@@ -92,6 +97,142 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
92
97
  ATTENDEE;CN=One:mailto:one@example.org
93
98
  ATTENDEE;CN=Two:mailto:two@example.org
94
99
  DTSTART:20140716T120000Z
100
+ DURATION:PT1H
101
+ END:VEVENT
102
+ END:VCALENDAR
103
+ ICS
104
+
105
+ new_message = nil
106
+
107
+ version = Version::VERSION
108
+
109
+ expected = [
110
+ {
111
+ 'uid' => 'foobar',
112
+ 'method' => 'CANCEL',
113
+ 'component' => 'VEVENT',
114
+ 'sender' => 'mailto:strunk@example.org',
115
+ 'senderName' => 'Strunk',
116
+ 'recipient' => 'mailto:one@example.org',
117
+ 'recipientName' => 'One',
118
+ 'message' => <<ICS
119
+ BEGIN:VCALENDAR
120
+ VERSION:2.0
121
+ PRODID:-//Tilia//Tilia VObject #{version}//EN
122
+ CALSCALE:GREGORIAN
123
+ METHOD:CANCEL
124
+ BEGIN:VEVENT
125
+ UID:foobar
126
+ DTSTAMP:**ANY**
127
+ SEQUENCE:2
128
+ SUMMARY:foo
129
+ DTSTART:20140716T120000Z
130
+ DURATION:PT1H
131
+ ORGANIZER;CN=Strunk:mailto:strunk@example.org
132
+ ATTENDEE;CN=One:mailto:one@example.org
133
+ END:VEVENT
134
+ END:VCALENDAR
135
+ ICS
136
+ },
137
+ {
138
+ 'uid' => 'foobar',
139
+ 'method' => 'CANCEL',
140
+ 'component' => 'VEVENT',
141
+ 'sender' => 'mailto:strunk@example.org',
142
+ 'senderName' => 'Strunk',
143
+ 'recipient' => 'mailto:two@example.org',
144
+ 'recipientName' => 'Two',
145
+ 'message' => <<ICS
146
+ BEGIN:VCALENDAR
147
+ VERSION:2.0
148
+ PRODID:-//Tilia//Tilia VObject #{version}//EN
149
+ CALSCALE:GREGORIAN
150
+ METHOD:CANCEL
151
+ BEGIN:VEVENT
152
+ UID:foobar
153
+ DTSTAMP:**ANY**
154
+ SEQUENCE:2
155
+ SUMMARY:foo
156
+ DTSTART:20140716T120000Z
157
+ DURATION:PT1H
158
+ ORGANIZER;CN=Strunk:mailto:strunk@example.org
159
+ ATTENDEE;CN=Two:mailto:two@example.org
160
+ END:VEVENT
161
+ END:VCALENDAR
162
+ ICS
163
+ }
164
+ ]
165
+
166
+ parse(old_message, new_message, expected, 'mailto:strunk@example.org')
167
+ end
168
+
169
+ def test_attendee_delete_with_dtend
170
+ old_message = <<ICS
171
+ BEGIN:VCALENDAR
172
+ VERSION:2.0
173
+ BEGIN:VEVENT
174
+ UID:foobar
175
+ SEQUENCE:1
176
+ SUMMARY:foo
177
+ ORGANIZER;CN=Strunk:mailto:strunk@example.org
178
+ ATTENDEE;CN=One:mailto:one@example.org
179
+ ATTENDEE;CN=Two:mailto:two@example.org
180
+ DTSTART:20140716T120000Z
181
+ DTEND:20140716T130000Z
182
+ END:VEVENT
183
+ END:VCALENDAR
184
+ ICS
185
+
186
+ new_message = nil
187
+
188
+ version = Version::VERSION
189
+
190
+ expected = [
191
+ {
192
+ 'uid' => 'foobar',
193
+ 'method' => 'REPLY',
194
+ 'component' => 'VEVENT',
195
+ 'sender' => 'mailto:one@example.org',
196
+ 'senderName' => 'One',
197
+ 'recipient' => 'mailto:strunk@example.org',
198
+ 'recipientName' => 'Strunk',
199
+ 'message' => <<ICS
200
+ BEGIN:VCALENDAR
201
+ VERSION:2.0
202
+ PRODID:-//Tilia//Tilia VObject #{version}//EN
203
+ CALSCALE:GREGORIAN
204
+ METHOD:REPLY
205
+ BEGIN:VEVENT
206
+ UID:foobar
207
+ DTSTAMP:**ANY**
208
+ SEQUENCE:1
209
+ DTSTART:20140716T120000Z
210
+ DTEND:20140716T130000Z
211
+ SUMMARY:foo
212
+ ORGANIZER;CN=Strunk:mailto:strunk@example.org
213
+ ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
214
+ END:VEVENT
215
+ END:VCALENDAR
216
+ ICS
217
+ }
218
+ ]
219
+
220
+ parse(old_message, new_message, expected, 'mailto:one@example.org')
221
+ end
222
+
223
+ def test_attendee_reply_with_duration
224
+ old_message = <<ICS
225
+ BEGIN:VCALENDAR
226
+ VERSION:2.0
227
+ BEGIN:VEVENT
228
+ UID:foobar
229
+ SEQUENCE:1
230
+ SUMMARY:foo
231
+ ORGANIZER;CN=Strunk:mailto:strunk@example.org
232
+ ATTENDEE;CN=One:mailto:one@example.org
233
+ ATTENDEE;CN=Two:mailto:two@example.org
234
+ DTSTART:20140716T120000Z
235
+ DURATION:PT1H
95
236
  END:VEVENT
96
237
  END:VCALENDAR
97
238
  ICS
@@ -117,8 +258,10 @@ CALSCALE:GREGORIAN
117
258
  METHOD:REPLY
118
259
  BEGIN:VEVENT
119
260
  UID:foobar
261
+ DTSTAMP:**ANY**
120
262
  SEQUENCE:1
121
263
  DTSTART:20140716T120000Z
264
+ DURATION:PT1H
122
265
  SUMMARY:foo
123
266
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
124
267
  ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
@@ -143,6 +286,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
143
286
  ATTENDEE;CN=One:mailto:one@example.org
144
287
  ATTENDEE;CN=Two:mailto:two@example.org
145
288
  DTSTART:20140716T120000Z
289
+ DTEND:20140716T130000Z
146
290
  END:VEVENT
147
291
  END:VCALENDAR
148
292
  ICS
@@ -15,6 +15,7 @@ BEGIN:VCALENDAR
15
15
  BEGIN:VEVENT
16
16
  UID:foobar
17
17
  DTSTART:20140811T220000Z
18
+ DTEND:20140811T230000Z
18
19
  END:VEVENT
19
20
  END:VCALENDAR
20
21
  ICS
@@ -41,6 +42,7 @@ VERSION:2.0
41
42
  BEGIN:VEVENT
42
43
  UID:foobar
43
44
  DTSTART:20140811T220000Z
45
+ DTEND:20140811T230000Z
44
46
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
45
47
  ATTENDEE;CN=White:mailto:white@example.org
46
48
  END:VEVENT
@@ -57,6 +59,7 @@ METHOD:REQUEST
57
59
  BEGIN:VEVENT
58
60
  UID:foobar
59
61
  DTSTART:20140811T220000Z
62
+ DTEND:20140811T230000Z
60
63
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
61
64
  ATTENDEE;CN=White;PARTSTAT=NEEDS-ACTION:mailto:white@example.org
62
65
  END:VEVENT
@@ -129,6 +132,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
129
132
  ATTENDEE;CN=One:mailto:one@example.org
130
133
  ATTENDEE;CN=Two:mailto:two@example.org
131
134
  DTSTART:20140716T120000Z
135
+ DURATION:PT1H
132
136
  RRULE:FREQ=DAILY
133
137
  EXDATE:20140717T120000Z
134
138
  END:VEVENT
@@ -139,6 +143,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
139
143
  ATTENDEE;CN=Two:mailto:two@example.org
140
144
  ATTENDEE;CN=Three:mailto:three@example.org
141
145
  DTSTART:20140718T120000Z
146
+ DURATION:PT1H
142
147
  END:VEVENT
143
148
  END:VCALENDAR
144
149
  ICS
@@ -166,6 +171,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
166
171
  ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
167
172
  ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
168
173
  DTSTART:20140716T120000Z
174
+ DURATION:PT1H
169
175
  RRULE:FREQ=DAILY
170
176
  EXDATE:20140717T120000Z,20140718T120000Z
171
177
  END:VEVENT
@@ -192,6 +198,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
192
198
  ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
193
199
  ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
194
200
  DTSTART:20140716T120000Z
201
+ DURATION:PT1H
195
202
  RRULE:FREQ=DAILY
196
203
  EXDATE:20140717T120000Z
197
204
  END:VEVENT
@@ -202,6 +209,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
202
209
  ATTENDEE;CN=Two:mailto:two@example.org
203
210
  ATTENDEE;CN=Three:mailto:three@example.org
204
211
  DTSTART:20140718T120000Z
212
+ DURATION:PT1H
205
213
  END:VEVENT
206
214
  END:VCALENDAR
207
215
  ICS
@@ -227,6 +235,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
227
235
  ATTENDEE;CN=Two:mailto:two@example.org
228
236
  ATTENDEE;CN=Three:mailto:three@example.org
229
237
  DTSTART:20140718T120000Z
238
+ DURATION:PT1H
230
239
  END:VEVENT
231
240
  END:VCALENDAR
232
241
  ICS
@@ -248,6 +257,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
248
257
  ATTENDEE;CN=One:mailto:one@example.org
249
258
  ATTENDEE;CN=Two:mailto:two@example.org
250
259
  DTSTART:20140716T120000Z
260
+ DTEND:20140716T130000Z
251
261
  RRULE:FREQ=DAILY
252
262
  END:VEVENT
253
263
  BEGIN:VEVENT
@@ -257,6 +267,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
257
267
  ATTENDEE;CN=Two:mailto:two@example.org
258
268
  ATTENDEE;CN=Three:mailto:three@example.org
259
269
  DTSTART:20140718T120000Z
270
+ DTEND:20140718T130000Z
260
271
  END:VEVENT
261
272
  END:VCALENDAR
262
273
  ICS
@@ -284,6 +295,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
284
295
  ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
285
296
  ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
286
297
  DTSTART:20140716T120000Z
298
+ DTEND:20140716T130000Z
287
299
  RRULE:FREQ=DAILY
288
300
  EXDATE:20140718T120000Z
289
301
  END:VEVENT
@@ -310,6 +322,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
310
322
  ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
311
323
  ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
312
324
  DTSTART:20140716T120000Z
325
+ DTEND:20140716T130000Z
313
326
  RRULE:FREQ=DAILY
314
327
  END:VEVENT
315
328
  BEGIN:VEVENT
@@ -319,6 +332,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
319
332
  ATTENDEE;CN=Two:mailto:two@example.org
320
333
  ATTENDEE;CN=Three:mailto:three@example.org
321
334
  DTSTART:20140718T120000Z
335
+ DTEND:20140718T130000Z
322
336
  END:VEVENT
323
337
  END:VCALENDAR
324
338
  ICS
@@ -344,6 +358,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
344
358
  ATTENDEE;CN=Two:mailto:two@example.org
345
359
  ATTENDEE;CN=Three:mailto:three@example.org
346
360
  DTSTART:20140718T120000Z
361
+ DTEND:20140718T130000Z
347
362
  END:VEVENT
348
363
  END:VCALENDAR
349
364
  ICS
@@ -360,6 +375,7 @@ VERSION:2.0
360
375
  BEGIN:VEVENT
361
376
  UID:foobar
362
377
  DTSTART:20140811T220000Z
378
+ DTEND:20140811T230000Z
363
379
  ORGANIZER;CN=Strunk:mailto:strunk@example.org
364
380
  ATTENDEE;CN=White;SCHEDULE-AGENT=CLIENT:mailto:white@example.org
365
381
  END:VEVENT
@@ -380,6 +396,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
380
396
  ATTENDEE;CN=One:mailto:one@example.org
381
397
  ATTENDEE;CN=Two:mailto:two@example.org
382
398
  DTSTART:20140716T120000Z
399
+ DTEND:20140716T130000Z
383
400
  RRULE:FREQ=DAILY
384
401
  END:VEVENT
385
402
  BEGIN:VEVENT
@@ -389,6 +406,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
389
406
  ATTENDEE;CN=Two:mailto:two@example.org
390
407
  ATTENDEE;CN=Three:mailto:three@example.org
391
408
  DTSTART:20140718T120000Z
409
+ DTEND:20140718T130000Z
392
410
  END:VEVENT
393
411
  END:VCALENDAR
394
412
  ICS
@@ -406,6 +424,7 @@ ORGANIZER;CN=Strunk:mailto:strunk@example.org
406
424
  ATTENDEE;CN=One:mailto:one@example.org
407
425
  ATTENDEE;CN=Two:mailto:two@example.org
408
426
  DTSTART:20140716T120000Z
427
+ DTEND:20140716T130000Z
409
428
  RRULE:FREQ=DAILY
410
429
  END:VEVENT
411
430
  BEGIN:VEVENT
@@ -415,6 +434,7 @@ ORGANIZER;CN=Strunk:mailto:ew@example.org
415
434
  ATTENDEE;CN=Two:mailto:two@example.org
416
435
  ATTENDEE;CN=Three:mailto:three@example.org
417
436
  DTSTART:20140718T120000Z
437
+ DTEND:20140718T130000Z
418
438
  END:VEVENT
419
439
  END:VCALENDAR
420
440
  ICS
@@ -428,6 +448,7 @@ BEGIN:VCALENDAR
428
448
  BEGIN:VEVENT
429
449
  UID:foobar
430
450
  DTSTART:20140811T220000Z
451
+ DTEND:20140811T230000Z
431
452
  ATTENDEE;CN=Two:mailto:two@example.org
432
453
  END:VEVENT
433
454
  END:VCALENDAR