icalendar 0.97 → 0.98

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 (72) hide show
  1. data/Rakefile +2 -2
  2. data/docs/api/classes/Icalendar/Component.src/M000029.html +1 -1
  3. data/docs/api/classes/Icalendar/Component.src/M000030.html +1 -1
  4. data/docs/api/classes/Icalendar/Component.src/M000035.html +1 -1
  5. data/docs/api/classes/Icalendar/Component.src/M000040.html +1 -1
  6. data/docs/api/classes/Icalendar/Component.src/M000041.html +1 -1
  7. data/docs/api/classes/Icalendar/Component.src/M000042.html +1 -1
  8. data/docs/api/classes/Icalendar/Component.src/M000043.html +9 -4
  9. data/docs/api/classes/Icalendar/Component.src/M000044.html +1 -1
  10. data/docs/api/classes/Icalendar/Component.src/M000045.html +1 -1
  11. data/docs/api/classes/Icalendar/Component.src/M000046.html +1 -1
  12. data/docs/api/classes/Icalendar/Component.src/M000047.html +1 -1
  13. data/docs/api/classes/Icalendar/Component.src/M000048.html +1 -1
  14. data/docs/api/classes/Icalendar/Component.src/M000049.html +1 -1
  15. data/docs/api/classes/Icalendar/Component.src/M000050.html +1 -1
  16. data/docs/api/classes/Icalendar/Geo.html +2 -2
  17. data/docs/api/classes/Icalendar/Geo.src/M000024.html +1 -1
  18. data/docs/api/classes/Icalendar/Geo.src/M000025.html +1 -1
  19. data/docs/api/classes/String.src/M000012.html +1 -1
  20. data/docs/api/created.rid +1 -1
  21. data/docs/api/files/lib/icalendar/component_rb.html +1 -1
  22. data/docs/api/files/lib/icalendar/conversions_rb.html +1 -1
  23. data/docs/api/files/lib/icalendar/parser_rb.html +1 -1
  24. data/lib/icalendar/component.rb +10 -3
  25. data/lib/icalendar/conversions.rb +1 -1
  26. data/lib/icalendar/parser.rb +1 -1
  27. data/test/conversions_test.rb +35 -4
  28. data/test/fixtures/folding.ics +23 -0
  29. data/test/{life.ics → fixtures/life.ics} +0 -0
  30. data/test/{simplecal.ics → fixtures/simplecal.ics} +0 -0
  31. data/test/{single_event.ics → fixtures/single_event.ics} +1 -1
  32. data/test/parser_test.rb +2 -2
  33. metadata +7 -44
  34. data/test/coverage/-home-rosejn-projects-icalendar-lib-hash_attrs_rb.html +0 -574
  35. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-base_rb.html +0 -575
  36. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-calendar_rb.html +0 -629
  37. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-component-alarm_rb.html +0 -581
  38. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-component-event_rb.html +0 -658
  39. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-component-freebusy_rb.html +0 -574
  40. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-component-journal_rb.html +0 -597
  41. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-component-timezone_rb.html +0 -625
  42. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-component-todo_rb.html +0 -600
  43. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-component_rb.html +0 -924
  44. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-conversions_rb.html +0 -667
  45. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar-parser_rb.html +0 -938
  46. data/test/coverage/-home-rosejn-projects-icalendar-lib-icalendar_rb.html +0 -576
  47. data/test/coverage/-home-rosejn-projects-icalendar-lib-meta_rb.html +0 -572
  48. data/test/coverage/calendar_test_rb.html +0 -590
  49. data/test/coverage/component_test_rb.html +0 -602
  50. data/test/coverage/index.html +0 -1009
  51. data/test/coverage/lib-hash_attrs_rb.html +0 -574
  52. data/test/coverage/lib-icalendar-base_rb.html +0 -583
  53. data/test/coverage/lib-icalendar-calendar_rb.html +0 -631
  54. data/test/coverage/lib-icalendar-component-alarm_rb.html +0 -581
  55. data/test/coverage/lib-icalendar-component-event_rb.html +0 -661
  56. data/test/coverage/lib-icalendar-component-freebusy_rb.html +0 -576
  57. data/test/coverage/lib-icalendar-component-journal_rb.html +0 -599
  58. data/test/coverage/lib-icalendar-component-timezone_rb.html +0 -625
  59. data/test/coverage/lib-icalendar-component-todo_rb.html +0 -602
  60. data/test/coverage/lib-icalendar-component_rb.html +0 -941
  61. data/test/coverage/lib-icalendar-conversions_rb.html +0 -673
  62. data/test/coverage/lib-icalendar-parser_rb.html +0 -916
  63. data/test/coverage/lib-icalendar_rb.html +0 -576
  64. data/test/coverage/lib-meta_rb.html +0 -572
  65. data/test/coverage/parameter_test_rb.html +0 -569
  66. data/test/coverage/parser_test_rb.html +0 -623
  67. data/test/coverage/test-calendar_test_rb.html +0 -590
  68. data/test/coverage/test-component-event_test_rb.html +0 -584
  69. data/test/coverage/test-component_test_rb.html +0 -606
  70. data/test/coverage/test-conversions_test_rb.html +0 -603
  71. data/test/coverage/test-parameter_test_rb.html +0 -569
  72. data/test/coverage/test-parser_test_rb.html +0 -624
@@ -1,924 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>/home/rosejn/projects/icalendar/lib/icalendar/component.rb - C0 code coverage information</title><style type='text/css'>body { background-color: rgb(240, 240, 245); }</style><style type='text/css'>span.marked {
2
- background-color: rgb(185, 200, 200);
3
- display: block;
4
- }
5
- span.inferred {
6
- background-color: rgb(170, 185, 185);
7
- display: block;
8
- }
9
- span.overview {
10
- border-bottom: 8px solid black;
11
- }
12
- div.overview {
13
- border-bottom: 8px solid black;
14
- }
15
- body {
16
- font-family: verdana, arial, helvetica;
17
- }
18
- div.footer {
19
- font-size: 68%;
20
- margin-top: 1.5em;
21
- }
22
- h1, h2, h3, h4, h5, h6 {
23
- margin-bottom: 0.5em;
24
- }
25
- h5 {
26
- margin-top: 0.5em;
27
- }
28
- .hidden {
29
- display: none;
30
- }
31
- div.separator {
32
- height: 10px;
33
- }
34
- table tr td, table tr th {
35
- font-size: 68%;
36
- }
37
- td.value table tr td {
38
- font-size: 11px;
39
- }
40
- table.percent_graph {
41
- height: 12px;
42
- border: #808080 1px solid;
43
- empty-cells: show;
44
- }
45
- table.percent_graph td.covered {
46
- height: 10px;
47
- background: #00f000;
48
- }
49
- table.percent_graph td.uncovered {
50
- height: 10px;
51
- background: #e00000;
52
- }
53
- table.percent_graph td.NA {
54
- height: 10px;
55
- background: #eaeaea;
56
- }
57
- table.report {
58
- border-collapse: collapse;
59
- width: 100%;
60
- }
61
- table.report td.heading {
62
- background: #dcecff;
63
- border: #d0d0d0 1px solid;
64
- font-weight: bold;
65
- text-align: center;
66
- }
67
- table.report td.heading:hover {
68
- background: #c0ffc0;
69
- }
70
- table.report td.text {
71
- border: #d0d0d0 1px solid;
72
- }
73
- table.report td.value {
74
- text-align: right;
75
- border: #d0d0d0 1px solid;
76
- }
77
- </style><style type='text/css'>span.run0 {
78
- background-color: rgb(178, 204, 255);
79
- display: block;
80
- }
81
- span.run1 {
82
- background-color: rgb(178, 206, 255);
83
- display: block;
84
- }
85
- span.run2 {
86
- background-color: rgb(178, 209, 255);
87
- display: block;
88
- }
89
- span.run3 {
90
- background-color: rgb(178, 211, 255);
91
- display: block;
92
- }
93
- span.run4 {
94
- background-color: rgb(178, 214, 255);
95
- display: block;
96
- }
97
- span.run5 {
98
- background-color: rgb(178, 218, 255);
99
- display: block;
100
- }
101
- span.run6 {
102
- background-color: rgb(178, 220, 255);
103
- display: block;
104
- }
105
- span.run7 {
106
- background-color: rgb(178, 223, 255);
107
- display: block;
108
- }
109
- span.run8 {
110
- background-color: rgb(178, 225, 255);
111
- display: block;
112
- }
113
- span.run9 {
114
- background-color: rgb(178, 228, 255);
115
- display: block;
116
- }
117
- span.run10 {
118
- background-color: rgb(178, 232, 255);
119
- display: block;
120
- }
121
- span.run11 {
122
- background-color: rgb(178, 234, 255);
123
- display: block;
124
- }
125
- span.run12 {
126
- background-color: rgb(178, 237, 255);
127
- display: block;
128
- }
129
- span.run13 {
130
- background-color: rgb(178, 239, 255);
131
- display: block;
132
- }
133
- span.run14 {
134
- background-color: rgb(178, 242, 255);
135
- display: block;
136
- }
137
- span.run15 {
138
- background-color: rgb(178, 246, 255);
139
- display: block;
140
- }
141
- span.run16 {
142
- background-color: rgb(178, 248, 255);
143
- display: block;
144
- }
145
- span.run17 {
146
- background-color: rgb(178, 251, 255);
147
- display: block;
148
- }
149
- span.run18 {
150
- background-color: rgb(178, 253, 255);
151
- display: block;
152
- }
153
- span.run19 {
154
- background-color: rgb(178, 255, 253);
155
- display: block;
156
- }
157
- span.run20 {
158
- background-color: rgb(178, 255, 249);
159
- display: block;
160
- }
161
- span.run21 {
162
- background-color: rgb(178, 255, 247);
163
- display: block;
164
- }
165
- span.run22 {
166
- background-color: rgb(178, 255, 244);
167
- display: block;
168
- }
169
- span.run23 {
170
- background-color: rgb(178, 255, 242);
171
- display: block;
172
- }
173
- span.run24 {
174
- background-color: rgb(178, 255, 239);
175
- display: block;
176
- }
177
- span.run25 {
178
- background-color: rgb(178, 255, 235);
179
- display: block;
180
- }
181
- span.run26 {
182
- background-color: rgb(178, 255, 233);
183
- display: block;
184
- }
185
- span.run27 {
186
- background-color: rgb(178, 255, 230);
187
- display: block;
188
- }
189
- span.run28 {
190
- background-color: rgb(178, 255, 228);
191
- display: block;
192
- }
193
- span.run29 {
194
- background-color: rgb(178, 255, 225);
195
- display: block;
196
- }
197
- span.run30 {
198
- background-color: rgb(178, 255, 221);
199
- display: block;
200
- }
201
- span.run31 {
202
- background-color: rgb(178, 255, 219);
203
- display: block;
204
- }
205
- span.run32 {
206
- background-color: rgb(178, 255, 216);
207
- display: block;
208
- }
209
- span.run33 {
210
- background-color: rgb(178, 255, 214);
211
- display: block;
212
- }
213
- span.run34 {
214
- background-color: rgb(178, 255, 211);
215
- display: block;
216
- }
217
- span.run35 {
218
- background-color: rgb(178, 255, 207);
219
- display: block;
220
- }
221
- span.run36 {
222
- background-color: rgb(178, 255, 205);
223
- display: block;
224
- }
225
- span.run37 {
226
- background-color: rgb(178, 255, 202);
227
- display: block;
228
- }
229
- span.run38 {
230
- background-color: rgb(178, 255, 200);
231
- display: block;
232
- }
233
- span.run39 {
234
- background-color: rgb(178, 255, 197);
235
- display: block;
236
- }
237
- span.run40 {
238
- background-color: rgb(178, 255, 193);
239
- display: block;
240
- }
241
- span.run41 {
242
- background-color: rgb(178, 255, 191);
243
- display: block;
244
- }
245
- span.run42 {
246
- background-color: rgb(178, 255, 188);
247
- display: block;
248
- }
249
- span.run43 {
250
- background-color: rgb(178, 255, 186);
251
- display: block;
252
- }
253
- span.run44 {
254
- background-color: rgb(178, 255, 183);
255
- display: block;
256
- }
257
- span.run45 {
258
- background-color: rgb(178, 255, 179);
259
- display: block;
260
- }
261
- span.run46 {
262
- background-color: rgb(179, 255, 178);
263
- display: block;
264
- }
265
- span.run47 {
266
- background-color: rgb(182, 255, 178);
267
- display: block;
268
- }
269
- span.run48 {
270
- background-color: rgb(184, 255, 178);
271
- display: block;
272
- }
273
- span.run49 {
274
- background-color: rgb(187, 255, 178);
275
- display: block;
276
- }
277
- span.run50 {
278
- background-color: rgb(191, 255, 178);
279
- display: block;
280
- }
281
- span.run51 {
282
- background-color: rgb(193, 255, 178);
283
- display: block;
284
- }
285
- span.run52 {
286
- background-color: rgb(196, 255, 178);
287
- display: block;
288
- }
289
- span.run53 {
290
- background-color: rgb(198, 255, 178);
291
- display: block;
292
- }
293
- span.run54 {
294
- background-color: rgb(201, 255, 178);
295
- display: block;
296
- }
297
- span.run55 {
298
- background-color: rgb(205, 255, 178);
299
- display: block;
300
- }
301
- span.run56 {
302
- background-color: rgb(207, 255, 178);
303
- display: block;
304
- }
305
- span.run57 {
306
- background-color: rgb(210, 255, 178);
307
- display: block;
308
- }
309
- span.run58 {
310
- background-color: rgb(212, 255, 178);
311
- display: block;
312
- }
313
- span.run59 {
314
- background-color: rgb(215, 255, 178);
315
- display: block;
316
- }
317
- span.run60 {
318
- background-color: rgb(219, 255, 178);
319
- display: block;
320
- }
321
- span.run61 {
322
- background-color: rgb(221, 255, 178);
323
- display: block;
324
- }
325
- span.run62 {
326
- background-color: rgb(224, 255, 178);
327
- display: block;
328
- }
329
- span.run63 {
330
- background-color: rgb(226, 255, 178);
331
- display: block;
332
- }
333
- span.run64 {
334
- background-color: rgb(229, 255, 178);
335
- display: block;
336
- }
337
- span.run65 {
338
- background-color: rgb(233, 255, 178);
339
- display: block;
340
- }
341
- span.run66 {
342
- background-color: rgb(235, 255, 178);
343
- display: block;
344
- }
345
- span.run67 {
346
- background-color: rgb(238, 255, 178);
347
- display: block;
348
- }
349
- span.run68 {
350
- background-color: rgb(240, 255, 178);
351
- display: block;
352
- }
353
- span.run69 {
354
- background-color: rgb(243, 255, 178);
355
- display: block;
356
- }
357
- span.run70 {
358
- background-color: rgb(247, 255, 178);
359
- display: block;
360
- }
361
- span.run71 {
362
- background-color: rgb(249, 255, 178);
363
- display: block;
364
- }
365
- span.run72 {
366
- background-color: rgb(252, 255, 178);
367
- display: block;
368
- }
369
- span.run73 {
370
- background-color: rgb(255, 255, 178);
371
- display: block;
372
- }
373
- span.run74 {
374
- background-color: rgb(255, 252, 178);
375
- display: block;
376
- }
377
- span.run75 {
378
- background-color: rgb(255, 248, 178);
379
- display: block;
380
- }
381
- span.run76 {
382
- background-color: rgb(255, 246, 178);
383
- display: block;
384
- }
385
- span.run77 {
386
- background-color: rgb(255, 243, 178);
387
- display: block;
388
- }
389
- span.run78 {
390
- background-color: rgb(255, 240, 178);
391
- display: block;
392
- }
393
- span.run79 {
394
- background-color: rgb(255, 238, 178);
395
- display: block;
396
- }
397
- span.run80 {
398
- background-color: rgb(255, 234, 178);
399
- display: block;
400
- }
401
- span.run81 {
402
- background-color: rgb(255, 232, 178);
403
- display: block;
404
- }
405
- span.run82 {
406
- background-color: rgb(255, 229, 178);
407
- display: block;
408
- }
409
- span.run83 {
410
- background-color: rgb(255, 226, 178);
411
- display: block;
412
- }
413
- span.run84 {
414
- background-color: rgb(255, 224, 178);
415
- display: block;
416
- }
417
- span.run85 {
418
- background-color: rgb(255, 220, 178);
419
- display: block;
420
- }
421
- span.run86 {
422
- background-color: rgb(255, 218, 178);
423
- display: block;
424
- }
425
- span.run87 {
426
- background-color: rgb(255, 215, 178);
427
- display: block;
428
- }
429
- span.run88 {
430
- background-color: rgb(255, 212, 178);
431
- display: block;
432
- }
433
- span.run89 {
434
- background-color: rgb(255, 210, 178);
435
- display: block;
436
- }
437
- span.run90 {
438
- background-color: rgb(255, 206, 178);
439
- display: block;
440
- }
441
- span.run91 {
442
- background-color: rgb(255, 204, 178);
443
- display: block;
444
- }
445
- span.run92 {
446
- background-color: rgb(255, 201, 178);
447
- display: block;
448
- }
449
- span.run93 {
450
- background-color: rgb(255, 198, 178);
451
- display: block;
452
- }
453
- span.run94 {
454
- background-color: rgb(255, 196, 178);
455
- display: block;
456
- }
457
- span.run95 {
458
- background-color: rgb(255, 192, 178);
459
- display: block;
460
- }
461
- span.run96 {
462
- background-color: rgb(255, 189, 178);
463
- display: block;
464
- }
465
- span.run97 {
466
- background-color: rgb(255, 187, 178);
467
- display: block;
468
- }
469
- span.run98 {
470
- background-color: rgb(255, 184, 178);
471
- display: block;
472
- }
473
- span.run99 {
474
- background-color: rgb(255, 182, 178);
475
- display: block;
476
- }
477
- span.run100 {
478
- background-color: rgb(255, 178, 178);
479
- display: block;
480
- }
481
- </style></head><body><h3>C0 code coverage information generated on Sun May 21 00:51:54 CEST 2006</h3><hr /><pre><span class='marked'>Marked code looks like this.
482
- This line is also marked as covered.
483
- </span><span class='inferred'>Lines considered as run by rcov, but not reported by Ruby, look like this.
484
- </span><span class='false'>Finally, here&apos;s a line marked as not executed.
485
- </span></pre> <table class='report'>
486
- <thead>
487
- <tr>
488
- <td class='heading'>Name</td>
489
- <td class='heading'>Total lines</td>
490
- <td class='heading'>Lines of code</td>
491
- <td class='heading'>Total coverage</td>
492
- <td class='heading'>Code coverage</td>
493
- </tr>
494
- </thead>
495
- <tbody>
496
- <tr>
497
- <td>
498
- <a href='-home-rosejn-projects-icalendar-lib-icalendar-component_rb.html'>/home/rosejn/projects/icalendar/lib/icalendar/component.rb</a>
499
- </td>
500
- <td class='value'>
501
- <tt>384</tt>
502
- </td>
503
- <td class='value'>
504
- <tt>384</tt>
505
- </td>
506
- <td>
507
- <table cellspacing='0' cellpadding='0' align='right'>
508
- <tr>
509
- <td>
510
- <tt>73.2%</tt>&nbsp;</td>
511
- <td>
512
- <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
513
- <tr>
514
- <td class='covered' width='73' />
515
- <td class='uncovered' width='27' />
516
- </tr>
517
- </table>
518
- </td>
519
- </tr>
520
- </table>
521
- </td>
522
- <td>
523
- <table cellspacing='0' cellpadding='0' align='right'>
524
- <tr>
525
- <td>
526
- <tt>65.6%</tt>&nbsp;</td>
527
- <td>
528
- <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
529
- <tr>
530
- <td class='covered' width='66' />
531
- <td class='uncovered' width='34' />
532
- </tr>
533
- </table>
534
- </td>
535
- </tr>
536
- </table>
537
- </td>
538
- </tr>
539
- </tbody>
540
- </table><pre><span class="false"> 1 =begin
541
- 2 Copyright (C) 2005 Jeff Rose
542
- 3
543
- 4 This library is free software; you can redistribute it and/or modify it
544
- 5 under the same terms as the ruby language itself, see the file COPYING for
545
- 6 details.
546
- 7 =end
547
- </span><span class="marked"> 8
548
- 9 module Icalendar
549
- 10 # The body of the iCalendar object consists of a sequence of calendar
550
- 11 # properties and one or more calendar components. The calendar
551
- 12 # properties are attributes that apply to the calendar as a whole. The
552
- 13 # calendar components are collections of properties that express a
553
- 14 # particular calendar semantic. For example, the calendar component can
554
- 15 # specify an Event, a Todo, a Journal entry, Timezone information, or
555
- 16 # Freebusy time information, or an Alarm.
556
- 17 class Component &lt; Icalendar::Base
557
- 18
558
- 19 meta_include HashAttrs
559
- 20
560
- 21 attr_reader :name
561
- 22 attr_accessor :properties
562
- 23
563
- 24 @@multi_properties = {}
564
- 25
565
- 26 def initialize(name)
566
- 27 @name = name
567
- 28 @components = Hash.new([])
568
- 29 @properties = {}
569
- 30
570
- 31 @@logger.info(&quot;New #{@name[1,@name.size].capitalize}...&quot;)
571
- 32 end
572
- 33
573
- 34 # Add a sub-component to the current component object.
574
- 35 def add_component(component)
575
- 36 key = (component.class.to_s.downcase + 's').gsub('icalendar::', '').to_sym
576
- 37
577
- 38 unless @components.has_key? key
578
- 39 @components[key] = []
579
- 40 end
580
- 41
581
- 42 @components[key] &lt;&lt; component
582
- 43 end
583
- 44
584
- 45 # Add a component to the calendar.
585
- 46 alias add add_component
586
- 47
587
- 48 # Add an event to the calendar.
588
- 49 alias add_event add_component
589
- 50
590
- 51 # Add a todo item to the calendar.
591
- 52 alias add_todo add_component
592
- 53
593
- 54 # Add a journal item to the calendar.
594
- 55 alias add_journal add_component
595
- 56
596
- 57 def remove_component(component)
597
- 58 key = (component.class.to_s.downcase + 's').gsub('icalendar::', '').to_sym
598
- 59
599
- 60 if @components.has_key? key
600
- 61 @components[key].delete(component)
601
- 62 end
602
- 63 end
603
- 64
604
- 65 # Remove a component from the calendar.
605
- 66 alias remove remove_component
606
- 67
607
- 68 # Remove an event from the calendar.
608
- 69 alias remove_event remove_component
609
- 70
610
- 71 # Remove a todo item from the calendar.
611
- 72 alias remove_todo remove_component
612
- 73
613
- 74 # Remove a journal item from the calendar.
614
- 75 alias remove_journal remove_component
615
- 76
616
- 77 def to_ical
617
- 78 print_component do
618
- 79 s = &quot;&quot;
619
- 80 @components.each_value do |comps|
620
- 81 comps.each { |component| s &lt;&lt; component.to_ical }
621
- 82 end
622
- 83 s
623
- 84 end
624
- 85 end
625
- 86
626
- 87 # Print this icalendar component
627
- 88 def print_component
628
- 89 # Begin a new component
629
- 90 &quot;BEGIN:#{@name.upcase}\r\n&quot; +
630
- 91
631
- 92 # Then the properties
632
- 93 print_properties +
633
- 94
634
- 95 # Any custom body of the derived component
635
- 96 yield +
636
- 97
637
- 98 # End of this component
638
- 99 &quot;END:#{@name.upcase}\r\n&quot;
639
- 100 end
640
- 101
641
- 102 # Print this components properties
642
- 103 def print_properties
643
- 104 s = &quot;&quot;
644
- 105
645
- 106 @properties.each do |key,val|
646
- 107
647
- 108 # Take out underscore for property names that conflicted
648
- 109 # with built-in words.
649
- 110 if key =~ /ip_.*/
650
- 111 key = key[3..-1]
651
- 112 end
652
- 113
653
- 114 # Property name
654
- 115 s &lt;&lt; &quot;#{key.upcase}&quot; +
655
- 116
656
- 117 # Possible parameters
657
- 118 print_parameters(val) +
658
- 119
659
- 120 # Property value
660
- 121 &quot;:#{val.to_ical}\r\n&quot;
661
- 122 end
662
- 123
663
- 124 s
664
- 125 end
665
- 126
666
- 127 # Print the parameters for a specific property
667
- 128 def print_parameters(val)
668
- 129 s = &quot;&quot;
669
- 130 return s unless val.respond_to?(:ical_params) and not val.ical_params.nil?
670
- 131
671
- 132 val.ical_params.each do |key,val|
672
- 133 s &lt;&lt; &quot;;#{key}&quot;
673
- 134 val = [ val ] unless val.is_a?(Array)
674
- 135
675
- 136 # Possible parameter values
676
- 137 unless val.empty?
677
- 138 s &lt;&lt; &quot;=&quot;
678
- 139 sep = &quot;&quot; # First entry comes after = sign, but then we need commas
679
- 140 val.each do |pval|
680
- 141 if pval.respond_to? :to_ical
681
- 142 s &lt;&lt; sep &lt;&lt; pval.to_ical
682
- 143 sep = &quot;,&quot;
683
- 144 end
684
- 145 end
685
- 146 end
686
- 147 end
687
- 148 s
688
- 149 end
689
- 150
690
- 151 # TODO: Look into the x-property, x-param stuff...
691
- 152 def custom_property(name, value)
692
- </span><span class="false">153 @properties[name] = value
693
- 154 end
694
- </span><span class="marked">155
695
- 156 def multi_property?(name)
696
- 157 @@multi_properties.has_key?(name.downcase)
697
- 158 end
698
- 159
699
- 160 # Make it protected so we can monitor usage...
700
- 161 protected
701
- 162
702
- 163 def Component.ical_component(*syms)
703
- 164 hash_accessor :@components, *syms
704
- 165 end
705
- 166
706
- 167 # Define a set of methods supporting a new property
707
- 168 def Component.ical_property(property, alias_name = nil, prop_name = nil)
708
- 169 property = &quot;#{property}&quot;.strip.downcase
709
- 170 alias_name = &quot;#{alias_name}&quot;.strip.downcase unless alias_name.nil?
710
- 171
711
- 172 # If a prop_name was given then we use that for the actual storage
712
- 173 property = &quot;#{prop_name}&quot;.strip.downcase unless prop_name.nil?
713
- 174
714
- 175 generate_getter(property, alias_name)
715
- 176 generate_setter(property, alias_name)
716
- 177 generate_query(property, alias_name)
717
- 178 end
718
- 179
719
- 180 # Define a set of methods defining a new property, which
720
- 181 # supports multiple values for the same property name.
721
- 182 def Component.ical_multi_property(property, singular, plural)
722
- 183 property = &quot;#{property}&quot;.strip.downcase.gsub(/-/, '_')
723
- 184 plural = &quot;#{plural}&quot;.strip.downcase
724
- 185
725
- 186 # Set this key so the parser knows to use an array for
726
- 187 # storing this property type.
727
- 188 @@multi_properties[&quot;#{property}&quot;] = true
728
- 189
729
- 190 generate_multi_getter(property, plural)
730
- 191 generate_multi_setter(property, plural)
731
- 192 generate_multi_query(property, plural)
732
- 193 generate_multi_adder(property, singular)
733
- 194 generate_multi_remover(property, singular)
734
- 195 end
735
- 196
736
- 197 private
737
- 198
738
- 199 def Component.generate_getter(property, alias_name)
739
- 200 unless instance_methods.include? property
740
- 201 code = &lt;&lt;-code
741
- </span><span class="false">202 def #{property}(val = nil, params = nil)
742
- 203 return @properties[&quot;#{property}&quot;] if val.nil?
743
- 204
744
- 205 unless val.respond_to?(:to_ical)
745
- 206 raise(NotImplementedError, &quot;Value of type (&quot; + val.class.to_s + &quot;) does not support to_ical method!&quot;)
746
- 207 end
747
- 208
748
- 209 unless params.nil?
749
- 210 # Extend with the parameter methods only if we have to...
750
- 211 unless val.respond_to?(:ical_params)
751
- 212 val.class.class_eval { attr_accessor :ical_params }
752
- 213 end
753
- 214 val.ical_params = params
754
- 215 end
755
- 216
756
- 217 @properties[&quot;#{property}&quot;] = val
757
- 218 end
758
- 219 code
759
- </span><span class="marked">220
760
- 221 class_eval code, &quot;component.rb&quot;, 219
761
- 222 alias_method(&quot;#{alias_name}&quot;, &quot;#{property}&quot;) unless alias_name.nil?
762
- 223 end
763
- 224 end
764
- 225
765
- 226 def Component.generate_setter(property, alias_name)
766
- 227 setter = property + '='
767
- 228 unless instance_methods.include? setter
768
- 229 code = &lt;&lt;-code
769
- </span><span class="false">230 def #{setter}(val)
770
- 231 #{property}(val)
771
- 232 end
772
- 233 code
773
- </span><span class="marked">234
774
- 235 class_eval code, &quot;component.rb&quot;, 233
775
- 236 alias_method(&quot;#{alias_name}=&quot;, &quot;#{property+'='}&quot;) unless alias_name.nil?
776
- 237 end
777
- 238 end
778
- 239
779
- 240 def Component.generate_query(property, alias_name)
780
- 241 query = &quot;#{property}?&quot;
781
- 242 unless instance_methods.include? query
782
- 243 code = &lt;&lt;-code
783
- </span><span class="false">244 def #{query}
784
- 245 @properties.has_key?(&quot;#{property.downcase}&quot;)
785
- 246 end
786
- 247 code
787
- </span><span class="marked">248
788
- 249 class_eval code, &quot;component.rb&quot;, 226
789
- 250
790
- 251 alias_method(&quot;#{alias_name}\?&quot;, &quot;#{query}&quot;) unless alias_name.nil?
791
- 252 end
792
- 253 end
793
- 254
794
- 255 def Component.generate_multi_getter(property, plural)
795
- 256 # Getter for whole array
796
- 257 unless instance_methods.include? plural
797
- 258 code = &lt;&lt;-code
798
- </span><span class="false">259 def #{plural}(a = nil)
799
- 260 if a.nil?
800
- 261 @properties[&quot;#{property}&quot;] || []
801
- 262 else
802
- 263 self.#{plural}=(a)
803
- 264 end
804
- 265 end
805
- 266 code
806
- </span><span class="marked">267
807
- 268 class_eval code, &quot;component.rb&quot;, 186
808
- 269 end
809
- 270 end
810
- 271
811
- 272 def Component.generate_multi_setter(property, plural)
812
- 273 # Setter for whole array
813
- 274 unless instance_methods.include? plural+'+'
814
- 275 code = &lt;&lt;-code
815
- </span><span class="false">276 def #{plural}=(a)
816
- 277 if a.respond_to?(:to_ary)
817
- 278 a.to_ary.each do |val|
818
- 279 unless val.respond_to?(:to_ical)
819
- 280 raise(NotImplementedError, &quot;Property values do not support to_ical method!&quot;)
820
- 281 end
821
- 282 end
822
- 283
823
- 284 @properties[&quot;#{property}&quot;] = a.to_ary
824
- 285 else
825
- 286 raise ArgumentError, &quot;#{plural} is a multi-property that must be an array! Use the add_[property] method to add single entries.&quot;
826
- 287 end
827
- 288 end
828
- 289 code
829
- </span><span class="marked">290
830
- 291 class_eval code, &quot;component.rb&quot;, 198
831
- 292 end
832
- 293 end
833
- 294
834
- 295 def Component.generate_multi_query(property, plural)
835
- 296 # Query for any of these properties
836
- 297 unless instance_methods.include? plural+'?'
837
- 298 code = &lt;&lt;-code
838
- </span><span class="false">299 def #{plural}?
839
- 300 @properties.has_key?(&quot;#{property}&quot;)
840
- 301 end
841
- 302 code
842
- </span><span class="marked">303
843
- 304 class_eval code, &quot;component.rb&quot;, 210
844
- 305 end
845
- 306 end
846
- 307
847
- 308 def Component.generate_multi_adder(property, singular)
848
- 309 adder = &quot;add_&quot;+singular.to_s
849
- 310 # Add another item to this properties array
850
- 311 unless instance_methods.include? adder
851
- 312 code = &lt;&lt;-code
852
- </span><span class="false">313 def #{adder}(val, params = {})
853
- 314 unless val.respond_to?(:to_ical)
854
- 315 raise(NotImplementedError, &quot;Property value object does not support to_ical method!&quot;)
855
- 316 end
856
- 317
857
- 318 unless params.nil?
858
- 319 # Extend with the parameter methods only if we have to...
859
- 320 unless val.respond_to?(:ical_params)
860
- 321 val.class.class_eval { attr_accessor :ical_params }
861
- 322 end
862
- 323 val.ical_params = params
863
- 324 end
864
- 325
865
- 326 if @properties.has_key?(&quot;#{property}&quot;)
866
- 327 @properties[&quot;#{property}&quot;] &lt;&lt; val
867
- 328 else
868
- 329 @properties[&quot;#{property}&quot;] = [val]
869
- 330 end
870
- 331 end
871
- 332 code
872
- </span><span class="marked">333
873
- 334 class_eval code, &quot;component.rb&quot;, 289
874
- 335 alias_method(&quot;add_#{property.downcase}&quot;, &quot;#{adder}&quot;)
875
- 336 end
876
- 337 end
877
- 338
878
- 339 def Component.generate_multi_remover(property, singular)
879
- 340 # Remove an item from this properties array
880
- 341 unless instance_methods.include? &quot;remove_#{singular}&quot;
881
- 342 code = &lt;&lt;-code
882
- </span><span class="false">343 def remove_#{singular}(a)
883
- 344 if @properties.has_key?(&quot;#{property}&quot;)
884
- 345 @properties[&quot;#{property}&quot;].delete(a)
885
- 346 end
886
- 347 end
887
- 348 code
888
- </span><span class="marked">349
889
- 350 class_eval code, &quot;component.rb&quot;, 303
890
- 351 alias_method(&quot;remove_#{property.downcase}&quot;, &quot;remove_#{singular}&quot;)
891
- 352 end
892
- 353 end
893
- 354
894
- 355 def method_missing(method_name, *args)
895
- </span><span class="false">356 method_name = method_name.to_s.downcase
896
- 357
897
- 358 unless method_name =~ /x_.*/
898
- 359 raise NoMethodError, &quot;Method Name: #{method_name}&quot;
899
- 360 end
900
- 361
901
- 362 val = args.first
902
- 363
903
- 364 if method_name =~ /(.*)(=)/ # Its a setter
904
- 365 @properties[$1] = val
905
- 366 @@logger.debug(&quot;Setting #{$1} =&gt; #{val}&quot;)
906
- 367 else # Or its a getter
907
- 368 @@logger.debug(&quot;Getting #{method_name} =&gt; #{@properties[method_name]}&quot;)
908
- 369 return @properties[method_name]
909
- 370 end
910
- 371 end
911
- </span><span class="marked">372
912
- 373 public
913
- 374
914
- 375 def respond_to?(method_name)
915
- 376 unless method_name.to_s.downcase =~ /x-.*/
916
- 377 super
917
- 378 end
918
- 379
919
- 380 true
920
- 381 end
921
- 382
922
- 383 end # class Component
923
- 384 end
924
- </span></pre><hr /><p><a href='http://validator.w3.org/check/referer'><img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88' /></a><a href='http://jigsaw.w3.org/css-validator/check/referer'><img src='http://jigsaw.w3.org/css-validator/images/vcss' alt='Valid CSS!' style='border:0;width:88px;height:31px' /></a></p></body></html>