paulsm-icalendar 1.1.0.4

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 (48) hide show
  1. data/COPYING +56 -0
  2. data/GPL +340 -0
  3. data/README +266 -0
  4. data/Rakefile +109 -0
  5. data/docs/rfcs/itip_notes.txt +69 -0
  6. data/docs/rfcs/rfc2425.pdf +0 -0
  7. data/docs/rfcs/rfc2426.pdf +0 -0
  8. data/docs/rfcs/rfc2445.pdf +0 -0
  9. data/docs/rfcs/rfc2446.pdf +0 -0
  10. data/docs/rfcs/rfc2447.pdf +0 -0
  11. data/docs/rfcs/rfc3283.txt +738 -0
  12. data/examples/create_cal.rb +45 -0
  13. data/examples/parse_cal.rb +20 -0
  14. data/examples/single_event.ics +18 -0
  15. data/lib/hash_attrs.rb +34 -0
  16. data/lib/icalendar.rb +39 -0
  17. data/lib/icalendar/base.rb +43 -0
  18. data/lib/icalendar/calendar.rb +113 -0
  19. data/lib/icalendar/component.rb +442 -0
  20. data/lib/icalendar/component/alarm.rb +44 -0
  21. data/lib/icalendar/component/event.rb +129 -0
  22. data/lib/icalendar/component/freebusy.rb +38 -0
  23. data/lib/icalendar/component/journal.rb +61 -0
  24. data/lib/icalendar/component/timezone.rb +105 -0
  25. data/lib/icalendar/component/todo.rb +64 -0
  26. data/lib/icalendar/conversions.rb +150 -0
  27. data/lib/icalendar/helpers.rb +109 -0
  28. data/lib/icalendar/parameter.rb +33 -0
  29. data/lib/icalendar/parser.rb +396 -0
  30. data/lib/icalendar/rrule.rb +126 -0
  31. data/lib/icalendar/tzinfo.rb +121 -0
  32. data/lib/meta.rb +32 -0
  33. data/test/calendar_test.rb +71 -0
  34. data/test/component/event_test.rb +256 -0
  35. data/test/component/timezone_test.rb +67 -0
  36. data/test/component/todo_test.rb +13 -0
  37. data/test/component_test.rb +76 -0
  38. data/test/conversions_test.rb +97 -0
  39. data/test/coverage/STUB +0 -0
  40. data/test/fixtures/folding.ics +23 -0
  41. data/test/fixtures/life.ics +46 -0
  42. data/test/fixtures/simplecal.ics +119 -0
  43. data/test/fixtures/single_event.ics +23 -0
  44. data/test/interactive.rb +17 -0
  45. data/test/parameter_test.rb +29 -0
  46. data/test/parser_test.rb +84 -0
  47. data/test/read_write.rb +23 -0
  48. metadata +108 -0
@@ -0,0 +1,67 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
2
+
3
+ require 'test/unit'
4
+ require 'icalendar'
5
+
6
+ class TestTimezone < Test::Unit::TestCase
7
+
8
+ # Create a calendar with an event for each test.
9
+ def setup
10
+ @cal = Icalendar::Calendar.new
11
+ # Define a test timezone
12
+ @testTimezone = %Q(BEGIN:VTIMEZONE\r\nTZID:America/Chicago\r\nBEGIN:STANDARD\r\nTZOFFSETTO:-0600\r\nRRULE:FREQ=YEARLY\\;BYMONTH=11\\;BYDAY=1SU\r\nDTSTART:19701101T020000\r\nTZOFFSETFROM:-0500\r\nTZNAME:CST\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:-0500\r\nRRULE:FREQ=YEARLY\\;BYMONTH=3\\;BYDAY=2SU\r\nDTSTART:19700308TO20000\r\nTZOFFSETFROM:-0600\r\nTZNAME:CDT\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\n)
13
+ end
14
+
15
+ def test_new
16
+ @tz = Icalendar::Timezone.new
17
+ assert(@tz)
18
+ end
19
+
20
+ def test_raw_generation
21
+ timezone = Icalendar::Timezone.new
22
+ daylight = Icalendar::Daylight.new
23
+ standard = Icalendar::Standard.new
24
+
25
+ timezone.timezone_id = "America/Chicago"
26
+
27
+ daylight.timezone_offset_from = "-0600"
28
+ daylight.timezone_offset_to = "-0500"
29
+ daylight.timezone_name = "CDT"
30
+ daylight.dtstart = "19700308TO20000"
31
+ daylight.recurrence_rules = ["FREQ=YEARLY;BYMONTH=3;BYDAY=2SU"]
32
+
33
+ standard.timezone_offset_from = "-0500"
34
+ standard.timezone_offset_to = "-0600"
35
+ standard.timezone_name = "CST"
36
+ standard.dtstart = "19701101T020000"
37
+ standard.recurrence_rules = ["FREQ=YEARLY;BYMONTH=11;BYDAY=1SU"]
38
+
39
+ timezone.add(standard)
40
+ timezone.add(daylight)
41
+ @cal.add(timezone)
42
+ assert_equal(@testTimezone, @cal.timezones.first.to_ical)
43
+ end
44
+
45
+ def test_block_creation
46
+ @cal.timezone do
47
+ timezone_id "America/Chicago"
48
+
49
+ daylight do
50
+ timezone_offset_from "-0600"
51
+ timezone_offset_to "-0500"
52
+ timezone_name "CDT"
53
+ dtstart "19700308TO20000"
54
+ add_recurrence_rule "FREQ=YEARLY;BYMONTH=3;BYDAY=2SU"
55
+ end
56
+
57
+ standard do
58
+ timezone_offset_from "-0500"
59
+ timezone_offset_to "-0600"
60
+ timezone_name "CST"
61
+ dtstart "19701101T020000"
62
+ add_recurrence_rule "FREQ=YEARLY;BYMONTH=11;BYDAY=1SU"
63
+ end
64
+ end
65
+ assert_equal(@testTimezone, @cal.timezones.first.to_ical)
66
+ end
67
+ end
@@ -0,0 +1,13 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ class TestTodo < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @cal = Icalendar::Calendar.new
7
+ @todo = Icalendar::Todo.new
8
+ end
9
+
10
+ def test_new
11
+ assert(@todo)
12
+ end
13
+ end
@@ -0,0 +1,76 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'date'
4
+ require 'test/unit'
5
+ require 'icalendar'
6
+
7
+ class TestComponent < Test::Unit::TestCase
8
+
9
+ # Create a calendar with an event for each test.
10
+ def setup
11
+ @cal = Icalendar::Calendar.new
12
+ @event = Icalendar::Event.new
13
+ end
14
+
15
+ def test_add_remove_component
16
+ @cal.add_component(@event)
17
+ assert_equal(1, @cal.events.size)
18
+ @cal.remove_component(@event)
19
+ assert_equal(0, @cal.events.size)
20
+ end
21
+
22
+ def test_ical_property
23
+ # No alias but it does have a prop_name
24
+ assert_equal(false, @event.ip_class?)
25
+ @event.ip_class = "PRIVATE"
26
+ assert_equal(true, @event.ip_class?)
27
+ assert_equal("PRIVATE", @event.ip_class)
28
+
29
+ # Check that both dtend and its alias start work correctly
30
+ date = DateTime.new(2005, 02, 05, 23, 24, 25)
31
+ @event.dtend = date
32
+ assert_equal(date.year, @event.dtend.year)
33
+
34
+ date2 = DateTime.new(2005, 02, 05, 23, 24, 26)
35
+ @event.end = date2
36
+ assert_equal(date2.year, @event.end.year)
37
+ end
38
+
39
+ def test_ical_multi_property
40
+ # Query
41
+ assert_equal(false, @event.comments?)
42
+ @event.comments = []
43
+ assert_equal(true, @event.comments?)
44
+
45
+ # Should return an empty array, rather than nil
46
+ assert_equal(0, @event.comments.size)
47
+
48
+ # Add and remove
49
+ @event.add_comment "c1"
50
+ @event.add_comment "c2"
51
+ assert_equal(2, @event.comments.size)
52
+ assert_equal(["c1","c2"], @event.comments)
53
+ @event.remove_comment "c1"
54
+ assert_equal(["c2"], @event.comments)
55
+
56
+ # Set & get whole array
57
+ foo = ["as", "df"]
58
+ @event.comments = foo
59
+ assert_equal(foo, @event.comments)
60
+ end
61
+
62
+ def test_x_property
63
+ @event.x_foobar = "my-custom-property"
64
+ assert_equal("my-custom-property", @event.x_foobar)
65
+ end
66
+
67
+ def test_respond_to_missing
68
+ component = Icalendar::Component.new('name')
69
+ assert !component.respond_to?(:there_is_no_such_method)
70
+ end
71
+
72
+ def test_respond_to_x_property
73
+ component = Icalendar::Component.new('name')
74
+ assert component.respond_to?(:x_foobar)
75
+ end
76
+ end
@@ -0,0 +1,97 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+
3
+ require 'test/unit'
4
+ require 'icalendar'
5
+
6
+ require 'date'
7
+
8
+ class TestConversions < Test::Unit::TestCase
9
+ include Icalendar
10
+
11
+ RESULT = <<EOS
12
+ BEGIN:VCALENDAR
13
+ VERSION:2.0
14
+ CALSCALE:GREGORIAN
15
+ PRODID:iCalendar-Ruby
16
+ BEGIN:VEVENT
17
+ SEQUENCE:2
18
+ ORGANIZER:mailto:joe@example.com?subject=Ruby
19
+ DTSTART:20060720
20
+ UID:foobar
21
+ X-TIME-OF-DAY:101736
22
+ GEO:46.01\\;8.57
23
+ DTSTAMP:20060720T174052
24
+ CATEGORIES:foo\\,bar\\,baz
25
+ DESCRIPTION:desc
26
+ LAST-MODIFIED:19960817T133000
27
+ END:VEVENT
28
+ END:VCALENDAR
29
+ EOS
30
+
31
+ def setup
32
+ @cal = Calendar.new
33
+ end
34
+
35
+ def test_to_ical_conversions
36
+ @cal.event do
37
+ # String
38
+ description "desc"
39
+
40
+ # Fixnum
41
+ sequence 2
42
+
43
+ # Float by way of Geo class
44
+ geo(Geo.new(46.01, 8.57))
45
+
46
+ # Array
47
+ categories ["foo", "bar"]
48
+ add_category "baz"
49
+
50
+ # Last Modified
51
+ last_modified DateTime.parse("1996-08-17T13:30:00")
52
+
53
+ # URI
54
+ organizer(URI::MailTo.build(['joe@example.com', 'subject=Ruby']))
55
+
56
+ # Date
57
+ start Date.parse("2006-07-20")
58
+
59
+ # DateTime
60
+ timestamp DateTime.parse("2006-07-20T17:40:52+0200")
61
+
62
+ # Time
63
+ x_time_of_day Time.at(123456).utc
64
+
65
+ uid "foobar"
66
+ end
67
+
68
+ assert_equal(RESULT.gsub("\n", "\r\n"), @cal.to_ical)
69
+ end
70
+
71
+ def test_to_ical_folding
72
+ @cal.x_wr_calname = 'Test Long Description'
73
+
74
+ @cal.event do
75
+ url 'http://test.com/events/644'
76
+ dtend DateTime.parse('20061215T180000')
77
+ dtstart DateTime.parse('20061215T160000')
78
+ timestamp DateTime.parse('20061215T114034')
79
+ seq 1001
80
+ uid 'foobar'
81
+ summary 'DigiWorld 2006'
82
+
83
+ description "FULL DETAILS:\nhttp://test.com/events/570\n\n" +
84
+ "Cary Brothers walks the same musical ground as Pete Yorn, Nick Drake, " +
85
+ "Jeff Buckley and others; crafting emotional melodies, with strong vocals " +
86
+ "and thoughtful lyrics. Brett Dennen has &quot;that thing.&quot; " +
87
+ "Inspired fans describe it: &quot;lush shimmering vocals, an intricately " +
88
+ "groovin&#39; guitar style, a lyrical beauty rare in a young songwriter," +
89
+ "&quot; and &quot;this soulful blend of everything that feels good.&quot; " +
90
+ "Rising up around him is music; transcending genres, genders and generations."
91
+ end
92
+
93
+ folded = File.read(File.join(File.dirname(__FILE__), 'fixtures/folding.ics')).gsub("\n", "\r\n")
94
+ assert_equal(folded, @cal.to_ical)
95
+ end
96
+
97
+ end
File without changes
@@ -0,0 +1,23 @@
1
+ BEGIN:VCALENDAR
2
+ VERSION:2.0
3
+ CALSCALE:GREGORIAN
4
+ PRODID:iCalendar-Ruby
5
+ X-WR-CALNAME:Test Long Description
6
+ BEGIN:VEVENT
7
+ SEQUENCE:1001
8
+ DTEND:20061215T180000
9
+ URL:http://test.com/events/644
10
+ DTSTART:20061215T160000
11
+ UID:foobar
12
+ DTSTAMP:20061215T114034
13
+ DESCRIPTION:FULL DETAILS:\nhttp://test.com/events/570\n\nCary Brothers walk
14
+ s the same musical ground as Pete Yorn\, Nick Drake\, Jeff Buckley and othe
15
+ rs\; crafting emotional melodies\, with strong vocals and thoughtful lyrics
16
+ . Brett Dennen has &quot\;that thing.&quot\; Inspired fans describe it: &qu
17
+ ot\;lush shimmering vocals\, an intricately groovin&#39\; guitar style\, a
18
+ lyrical beauty rare in a young songwriter\,&quot\; and &quot\;this soulful
19
+ blend of everything that feels good.&quot\; Rising up around him is music\;
20
+ transcending genres\, genders and generations.
21
+ SUMMARY:DigiWorld 2006
22
+ END:VEVENT
23
+ END:VCALENDAR
@@ -0,0 +1,46 @@
1
+ BEGIN:VCALENDAR
2
+ VERSION:2.0
3
+ X-WR-CALNAME:Life
4
+ PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
5
+ X-WR-RELCALID:69FB0467-7E07-4DE7-901D-B70242B3DB25
6
+ X-WR-TIMEZONE:America/Chicago
7
+ CALSCALE:GREGORIAN
8
+ METHOD:PUBLISH
9
+ BEGIN:VTIMEZONE
10
+ TZID:America/Chicago
11
+ LAST-MODIFIED:20050825T194346Z
12
+ BEGIN:DAYLIGHT
13
+ DTSTART:20050403T080000
14
+ TZOFFSETTO:-0500
15
+ TZOFFSETFROM:+0000
16
+ TZNAME:CDT
17
+ END:DAYLIGHT
18
+ BEGIN:STANDARD
19
+ DTSTART:20051030T020000
20
+ TZOFFSETTO:-0600
21
+ TZOFFSETFROM:-0500
22
+ TZNAME:CST
23
+ END:STANDARD
24
+ END:VTIMEZONE
25
+ BEGIN:VEVENT
26
+ UID:bsuidfortestabc123
27
+ ORGANIZER:mailto:joebob@random.net
28
+ ATTACH:http://bush.sucks.org/impeach/him.rhtml
29
+ ATTACH:http://corporations-dominate.existence.net/why.rhtml
30
+ LAST-MODIFIED:20050825T194346Z
31
+ SUMMARY:This is a really long summary
32
+ to test the method of unfolding lines
33
+ so I'm just going to ma
34
+ ke it
35
+ a whol
36
+ e
37
+ bunch of lines.
38
+ CLASS:PRIVATE
39
+ PRIORITY:2
40
+ GEO:37.386013;-122.0829322
41
+ DTSTART;TZID=US-Mountain:20050120T170000
42
+ DTEND:20050120T184500
43
+ DTSTAMP:20050118T211523Z
44
+ END:VEVENT
45
+ END:VCALENDAR
46
+
@@ -0,0 +1,119 @@
1
+ BEGIN:VCALENDAR
2
+ VERSION
3
+ :2.0
4
+ PRODID
5
+ :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
6
+ BEGIN:VEVENT
7
+ UID
8
+ :a08863de-1dd1-11b2-9445-d6248402dd19
9
+ SUMMARY
10
+ :Hybrid Embedded Systems. This is a really long summary
11
+ to test the method of unfolding lines
12
+ so I'm just going to ma
13
+ ke it
14
+ a whole
15
+ bunch of lines.
16
+ CATEGORIES
17
+ :Personal
18
+ STATUS
19
+ :CONFIRMED
20
+ CLASS
21
+ :PRIVATE
22
+ RRULE
23
+ :FREQ=WEEKLY;INTERVAL=1;BYDAY=TH
24
+ DTSTART
25
+ :20050120T170000
26
+ DTEND
27
+ :20050120T184500
28
+ DTSTAMP
29
+ :20050118T211523Z
30
+ END:VEVENT
31
+ BEGIN:VEVENT
32
+ UID
33
+ :6226e2f6-1dd2-11b2-9ad7-9b8d2d642229
34
+ SUMMARY
35
+ :Databases
36
+ LOCATION
37
+ :ECCS 1b12
38
+ CATEGORIES
39
+ :Personal
40
+ STATUS
41
+ :CONFIRMED
42
+ CLASS
43
+ :PRIVATE
44
+ X-MOZILLA-ALARM-DEFAULT-LENGTH
45
+ :30
46
+ X-MOZILLA-LASTALARMACK
47
+ :20050118T141054
48
+ RRULE
49
+ :FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE
50
+ DTSTART
51
+ :20050117T173000
52
+ DTEND
53
+ :20050117T184500
54
+ DTSTAMP
55
+ :20050118T210648Z
56
+ LAST-MODIFIED
57
+ :20050118T211954Z
58
+ BEGIN:VALARM
59
+ TRIGGER
60
+ ;VALUE=DURATION
61
+ :-PT30M
62
+ END:VALARM
63
+ END:VEVENT
64
+ BEGIN:VEVENT
65
+ UID
66
+ :d8f4468a-1dd1-11b2-9e0a-bbe95143dbed
67
+ SUMMARY
68
+ :Software Radios
69
+ LOCATION
70
+ :ECCR 1b06
71
+ CATEGORIES
72
+ :Personal
73
+ STATUS
74
+ :CONFIRMED
75
+ CLASS
76
+ :PRIVATE
77
+ X-MOZILLA-ALARM-DEFAULT-LENGTH
78
+ :30
79
+ X-MOZILLA-LASTALARMACK
80
+ :20050118T141351
81
+ RRULE
82
+ :FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE
83
+ DTSTART
84
+ :20050117T100000
85
+ DTEND
86
+ :20050117T111500
87
+ DTSTAMP
88
+ :20050118T211304Z
89
+ LAST-MODIFIED
90
+ :20050118T212016Z
91
+ BEGIN:VALARM
92
+ TRIGGER
93
+ ;VALUE=DURATION
94
+ :-PT30M
95
+ END:VALARM
96
+ END:VEVENT
97
+ BEGIN:VEVENT
98
+ UID
99
+ :9acd4cc8-1dd1-11b2-a65e-b276ad1df3b9
100
+ SUMMARY
101
+ :Israel & Palestine peace accord talk...
102
+ LOCATION
103
+ :Chem. 140
104
+ CATEGORIES
105
+ :Personal
106
+ STATUS
107
+ :CONFIRMED
108
+ CLASS
109
+ :PRIVATE
110
+ DTSTART
111
+ :20050118T193000
112
+ DTEND
113
+ :20050118T203000
114
+ DTSTAMP
115
+ :20050118T212943Z
116
+ LAST-MODIFIED
117
+ :20050118T213355Z
118
+ END:VEVENT
119
+ END:VCALENDAR