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,941 +0,0 @@
1
- <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>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 Thu Jul 20 18:17:28 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='lib-icalendar-component_rb.html'>lib/icalendar/component.rb</a>
499
- </td>
500
- <td class='value'>
501
- <tt>401</tt>
502
- </td>
503
- <td class='value'>
504
- <tt>401</tt>
505
- </td>
506
- <td>
507
- <table cellspacing='0' cellpadding='0' align='right'>
508
- <tr>
509
- <td>
510
- <tt>78.3%</tt>&nbsp;</td>
511
- <td>
512
- <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
513
- <tr>
514
- <td class='covered' width='78' />
515
- <td class='uncovered' width='22' />
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>71.7%</tt>&nbsp;</td>
527
- <td>
528
- <table cellspacing='0' class='percent_graph' cellpadding='0' width='100'>
529
- <tr>
530
- <td class='covered' width='72' />
531
- <td class='uncovered' width='28' />
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 class Geo &lt; Icalendar::Base
550
- 11 attr_accessor :latitude, :longitude
551
- 12 alias :lat :latitude
552
- 13 alias :long :longitude
553
- 14
554
- 15 def initialize(lat, long)
555
- 16 @lat = lat
556
- 17 @long = long
557
- 18 end
558
- 19
559
- 20 def to_ical
560
- 21 &quot;#{@lat.to_ical};#{@long.to_ical}&quot;
561
- 22 end
562
- 23 end
563
- 24
564
- 25 # The body of the iCalendar object consists of a sequence of calendar
565
- 26 # properties and one or more calendar components. The calendar
566
- 27 # properties are attributes that apply to the calendar as a whole. The
567
- 28 # calendar components are collections of properties that express a
568
- 29 # particular calendar semantic. For example, the calendar component can
569
- 30 # specify an Event, a Todo, a Journal entry, Timezone information, or
570
- 31 # Freebusy time information, or an Alarm.
571
- 32 class Component &lt; Icalendar::Base
572
- 33
573
- 34 meta_include HashAttrs
574
- 35
575
- 36 attr_reader :name
576
- 37 attr_accessor :properties
577
- 38
578
- 39 @@multi_properties = {}
579
- 40
580
- 41 def initialize(name)
581
- 42 @name = name
582
- 43 @components = Hash.new([])
583
- 44 @properties = {}
584
- 45
585
- 46 @@logger.info(&quot;New #{@name[1,@name.size].capitalize}...&quot;)
586
- 47 end
587
- 48
588
- 49 # Add a sub-component to the current component object.
589
- 50 def add_component(component)
590
- 51 key = (component.class.to_s.downcase + 's').gsub('icalendar::', '').to_sym
591
- 52
592
- 53 unless @components.has_key? key
593
- 54 @components[key] = []
594
- 55 end
595
- 56
596
- 57 @components[key] &lt;&lt; component
597
- 58 end
598
- 59
599
- 60 # Add a component to the calendar.
600
- 61 alias add add_component
601
- 62
602
- 63 # Add an event to the calendar.
603
- 64 alias add_event add_component
604
- 65
605
- 66 # Add a todo item to the calendar.
606
- 67 alias add_todo add_component
607
- 68
608
- 69 # Add a journal item to the calendar.
609
- 70 alias add_journal add_component
610
- 71
611
- 72 def remove_component(component)
612
- 73 key = (component.class.to_s.downcase + 's').gsub('icalendar::', '').to_sym
613
- 74
614
- 75 if @components.has_key? key
615
- 76 @components[key].delete(component)
616
- 77 end
617
- 78 end
618
- 79
619
- 80 # Remove a component from the calendar.
620
- 81 alias remove remove_component
621
- 82
622
- 83 # Remove an event from the calendar.
623
- 84 alias remove_event remove_component
624
- 85
625
- 86 # Remove a todo item from the calendar.
626
- 87 alias remove_todo remove_component
627
- 88
628
- 89 # Remove a journal item from the calendar.
629
- 90 alias remove_journal remove_component
630
- 91
631
- 92 def to_ical
632
- 93 print_component do
633
- 94 s = &quot;&quot;
634
- 95 @components.each_value do |comps|
635
- 96 comps.each { |component| s &lt;&lt; component.to_ical }
636
- 97 end
637
- 98 s
638
- 99 end
639
- 100 end
640
- 101
641
- 102 # Print this icalendar component
642
- 103 def print_component
643
- 104 # Begin a new component
644
- 105 &quot;BEGIN:#{@name.upcase}\r\n&quot; +
645
- 106
646
- 107 # Then the properties
647
- 108 print_properties +
648
- 109
649
- 110 # sub components
650
- 111 yield +
651
- 112
652
- 113 # End of this component
653
- 114 &quot;END:#{@name.upcase}\r\n&quot;
654
- 115 end
655
- 116
656
- 117 # Print this components properties
657
- 118 def print_properties
658
- 119 s = &quot;&quot;
659
- 120
660
- 121 @properties.each do |key,val|
661
- 122 # Take out underscore for property names that conflicted
662
- 123 # with built-in words.
663
- 124 if key =~ /ip_.*/
664
- 125 key = key[3..-1]
665
- 126 end
666
- 127
667
- 128 # Property name
668
- 129 s &lt;&lt; &quot;#{key.upcase}&quot; +
669
- 130
670
- 131 # Possible parameters
671
- 132 print_parameters(val) +
672
- 133
673
- 134 # Property value
674
- 135 &quot;:#{val.to_ical}\r\n&quot;
675
- 136 end
676
- 137
677
- 138 s
678
- 139 end
679
- 140
680
- 141 # Print the parameters for a specific property
681
- 142 def print_parameters(val)
682
- 143 s = &quot;&quot;
683
- 144 return s unless val.respond_to?(:ical_params) and not val.ical_params.nil?
684
- 145
685
- 146 val.ical_params.each do |key,val|
686
- 147 s &lt;&lt; &quot;;#{key}&quot;
687
- 148 val = [ val ] unless val.is_a?(Array)
688
- 149
689
- 150 # Possible parameter values
690
- 151 unless val.empty?
691
- 152 s &lt;&lt; &quot;=&quot;
692
- 153 sep = &quot;&quot; # First entry comes after = sign, but then we need commas
693
- 154 val.each do |pval|
694
- 155 if pval.respond_to? :to_ical
695
- 156 s &lt;&lt; sep &lt;&lt; pval.to_ical
696
- 157 sep = &quot;,&quot;
697
- 158 end
698
- 159 end
699
- 160 end
700
- 161 end
701
- 162 s
702
- 163 end
703
- 164
704
- 165 # TODO: Look into the x-property, x-param stuff...
705
- 166 # This would really only be needed for subclassing to add additional
706
- 167 # properties to an application using the API.
707
- 168 def custom_property(name, value)
708
- </span><span class="false">169 @properties[name] = value
709
- 170 end
710
- </span><span class="marked">171
711
- 172 def multi_property?(name)
712
- 173 @@multi_properties.has_key?(name.downcase)
713
- 174 end
714
- 175
715
- 176 # Make it protected so we can monitor usage...
716
- 177 protected
717
- 178
718
- 179 def Component.ical_component(*syms)
719
- 180 hash_accessor :@components, *syms
720
- 181 end
721
- 182
722
- 183 # Define a set of methods supporting a new property
723
- 184 def Component.ical_property(property, alias_name = nil, prop_name = nil)
724
- 185 property = &quot;#{property}&quot;.strip.downcase
725
- 186 alias_name = &quot;#{alias_name}&quot;.strip.downcase unless alias_name.nil?
726
- 187
727
- 188 # If a prop_name was given then we use that for the actual storage
728
- 189 property = &quot;#{prop_name}&quot;.strip.downcase unless prop_name.nil?
729
- 190
730
- 191 generate_getter(property, alias_name)
731
- 192 generate_setter(property, alias_name)
732
- 193 generate_query(property, alias_name)
733
- 194 end
734
- 195
735
- 196 # Define a set of methods defining a new property, which
736
- 197 # supports multiple values for the same property name.
737
- 198 def Component.ical_multi_property(property, singular, plural)
738
- 199 property = &quot;#{property}&quot;.strip.downcase.gsub(/-/, '_')
739
- 200 plural = &quot;#{plural}&quot;.strip.downcase
740
- 201
741
- 202 # Set this key so the parser knows to use an array for
742
- 203 # storing this property type.
743
- 204 @@multi_properties[&quot;#{property}&quot;] = true
744
- 205
745
- 206 generate_multi_getter(property, plural)
746
- 207 generate_multi_setter(property, plural)
747
- 208 generate_multi_query(property, plural)
748
- 209 generate_multi_adder(property, singular)
749
- 210 generate_multi_remover(property, singular)
750
- 211 end
751
- 212
752
- 213 private
753
- 214
754
- 215 def Component.generate_getter(property, alias_name)
755
- 216 unless instance_methods.include? property
756
- 217 code = &lt;&lt;-code
757
- </span><span class="false">218 def #{property}(val = nil, params = nil)
758
- 219 return @properties[&quot;#{property}&quot;] if val.nil?
759
- 220
760
- 221 unless val.respond_to?(:to_ical)
761
- 222 raise(NotImplementedError, &quot;Value of type (&quot; + val.class.to_s + &quot;) does not support to_ical method!&quot;)
762
- 223 end
763
- 224
764
- 225 unless params.nil?
765
- 226 # Extend with the parameter methods only if we have to...
766
- 227 unless val.respond_to?(:ical_params)
767
- 228 val.class.class_eval { attr_accessor :ical_params }
768
- 229 end
769
- 230 val.ical_params = params
770
- 231 end
771
- 232
772
- 233 @properties[&quot;#{property}&quot;] = val
773
- 234 end
774
- 235 code
775
- </span><span class="marked">236
776
- 237 class_eval code, &quot;component.rb&quot;, 219
777
- 238 alias_method(&quot;#{alias_name}&quot;, &quot;#{property}&quot;) unless alias_name.nil?
778
- 239 end
779
- 240 end
780
- 241
781
- 242 def Component.generate_setter(property, alias_name)
782
- 243 setter = property + '='
783
- 244 unless instance_methods.include? setter
784
- 245 code = &lt;&lt;-code
785
- </span><span class="false">246 def #{setter}(val)
786
- 247 #{property}(val)
787
- 248 end
788
- 249 code
789
- </span><span class="marked">250
790
- 251 class_eval code, &quot;component.rb&quot;, 233
791
- 252 alias_method(&quot;#{alias_name}=&quot;, &quot;#{property+'='}&quot;) unless alias_name.nil?
792
- 253 end
793
- 254 end
794
- 255
795
- 256 def Component.generate_query(property, alias_name)
796
- 257 query = &quot;#{property}?&quot;
797
- 258 unless instance_methods.include? query
798
- 259 code = &lt;&lt;-code
799
- </span><span class="false">260 def #{query}
800
- 261 @properties.has_key?(&quot;#{property.downcase}&quot;)
801
- 262 end
802
- 263 code
803
- </span><span class="marked">264
804
- 265 class_eval code, &quot;component.rb&quot;, 226
805
- 266
806
- 267 alias_method(&quot;#{alias_name}\?&quot;, &quot;#{query}&quot;) unless alias_name.nil?
807
- 268 end
808
- 269 end
809
- 270
810
- 271 def Component.generate_multi_getter(property, plural)
811
- 272 # Getter for whole array
812
- 273 unless instance_methods.include? plural
813
- 274 code = &lt;&lt;-code
814
- </span><span class="false">275 def #{plural}(a = nil)
815
- 276 if a.nil?
816
- 277 @properties[&quot;#{property}&quot;] || []
817
- 278 else
818
- 279 self.#{plural}=(a)
819
- 280 end
820
- 281 end
821
- 282 code
822
- </span><span class="marked">283
823
- 284 class_eval code, &quot;component.rb&quot;, 186
824
- 285 end
825
- 286 end
826
- 287
827
- 288 def Component.generate_multi_setter(property, plural)
828
- 289 # Setter for whole array
829
- 290 unless instance_methods.include? plural+'+'
830
- 291 code = &lt;&lt;-code
831
- </span><span class="false">292 def #{plural}=(a)
832
- 293 if a.respond_to?(:to_ary)
833
- 294 a.to_ary.each do |val|
834
- 295 unless val.respond_to?(:to_ical)
835
- 296 raise(NotImplementedError, &quot;Property values do not support to_ical method!&quot;)
836
- 297 end
837
- 298 end
838
- 299
839
- 300 @properties[&quot;#{property}&quot;] = a.to_ary
840
- 301 else
841
- 302 raise ArgumentError, &quot;#{plural} is a multi-property that must be an array! Use the add_[property] method to add single entries.&quot;
842
- 303 end
843
- 304 end
844
- 305 code
845
- </span><span class="marked">306
846
- 307 class_eval code, &quot;component.rb&quot;, 198
847
- 308 end
848
- 309 end
849
- 310
850
- 311 def Component.generate_multi_query(property, plural)
851
- 312 # Query for any of these properties
852
- 313 unless instance_methods.include? plural+'?'
853
- 314 code = &lt;&lt;-code
854
- </span><span class="false">315 def #{plural}?
855
- 316 @properties.has_key?(&quot;#{property}&quot;)
856
- 317 end
857
- 318 code
858
- </span><span class="marked">319
859
- 320 class_eval code, &quot;component.rb&quot;, 210
860
- 321 end
861
- 322 end
862
- 323
863
- 324 def Component.generate_multi_adder(property, singular)
864
- 325 adder = &quot;add_&quot;+singular.to_s
865
- 326 # Add another item to this properties array
866
- 327 unless instance_methods.include? adder
867
- 328 code = &lt;&lt;-code
868
- </span><span class="false">329 def #{adder}(val, params = {})
869
- 330 unless val.respond_to?(:to_ical)
870
- 331 raise(NotImplementedError, &quot;Property value object does not support to_ical method!&quot;)
871
- 332 end
872
- 333
873
- 334 unless params.nil?
874
- 335 # Extend with the parameter methods only if we have to...
875
- 336 unless val.respond_to?(:ical_params)
876
- 337 val.class.class_eval { attr_accessor :ical_params }
877
- 338 end
878
- 339 val.ical_params = params
879
- 340 end
880
- 341
881
- 342 if @properties.has_key?(&quot;#{property}&quot;)
882
- 343 @properties[&quot;#{property}&quot;] &lt;&lt; val
883
- 344 else
884
- 345 @properties[&quot;#{property}&quot;] = [val]
885
- 346 end
886
- 347 end
887
- 348 code
888
- </span><span class="marked">349
889
- 350 class_eval code, &quot;component.rb&quot;, 289
890
- 351 alias_method(&quot;add_#{property.downcase}&quot;, &quot;#{adder}&quot;)
891
- 352 end
892
- 353 end
893
- 354
894
- 355 def Component.generate_multi_remover(property, singular)
895
- 356 # Remove an item from this properties array
896
- 357 unless instance_methods.include? &quot;remove_#{singular}&quot;
897
- 358 code = &lt;&lt;-code
898
- </span><span class="false">359 def remove_#{singular}(a)
899
- 360 if @properties.has_key?(&quot;#{property}&quot;)
900
- 361 @properties[&quot;#{property}&quot;].delete(a)
901
- 362 end
902
- 363 end
903
- 364 code
904
- </span><span class="marked">365
905
- 366 class_eval code, &quot;component.rb&quot;, 303
906
- 367 alias_method(&quot;remove_#{property.downcase}&quot;, &quot;remove_#{singular}&quot;)
907
- 368 end
908
- 369 end
909
- 370
910
- 371 def method_missing(method_name, *args)
911
- 372 @@logger.debug(&quot;Inside method_missing...&quot;)
912
- 373 method_name = method_name.to_s.downcase
913
- 374
914
- 375 unless method_name =~ /x_.*/
915
- 376 raise NoMethodError, &quot;Method Name: #{method_name}&quot;
916
- 377 end
917
- 378
918
- 379 # x-properties are accessed with underscore but stored with a dash so
919
- 380 # they output correctly and we don't have to special case the
920
- 381 # output code, which would require checking every property.
921
- 382 if args.size &gt; 0 # Its a setter
922
- 383 # Pull off the possible equals
923
- 384 @properties[method_name[/x_[^=]*/].gsub('x_', 'x-')] = args.first
924
- 385 else # Or its a getter
925
- 386 return @properties[method_name.gsub('x_', 'x-')]
926
- 387 end
927
- 388 end
928
- 389
929
- 390 public
930
- 391
931
- 392 def respond_to?(method_name)
932
- 393 unless method_name.to_s.downcase =~ /x_.*/
933
- 394 super
934
- 395 end
935
- 396
936
- 397 true
937
- 398 end
938
- 399
939
- 400 end # class Component
940
- 401 end
941
- </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><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">