icalendar 1.5.4 → 2.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -1
  3. data/.rspec +2 -0
  4. data/.travis.yml +1 -2
  5. data/History.txt +2 -7
  6. data/README.md +82 -107
  7. data/Rakefile +6 -7
  8. data/icalendar.gemspec +10 -9
  9. data/lib/icalendar.rb +17 -33
  10. data/lib/icalendar/alarm.rb +35 -0
  11. data/lib/icalendar/calendar.rb +17 -100
  12. data/lib/icalendar/component.rb +41 -403
  13. data/lib/icalendar/event.rb +51 -0
  14. data/lib/icalendar/freebusy.rb +27 -0
  15. data/lib/icalendar/has_components.rb +83 -0
  16. data/lib/icalendar/has_properties.rb +156 -0
  17. data/lib/icalendar/journal.rb +39 -0
  18. data/lib/icalendar/parser.rb +75 -403
  19. data/lib/icalendar/timezone.rb +53 -0
  20. data/lib/icalendar/todo.rb +52 -0
  21. data/lib/icalendar/tzinfo.rb +30 -30
  22. data/lib/icalendar/value.rb +80 -0
  23. data/lib/icalendar/values/array.rb +43 -0
  24. data/lib/icalendar/values/binary.rb +31 -0
  25. data/lib/icalendar/values/boolean.rb +17 -0
  26. data/lib/icalendar/values/cal_address.rb +8 -0
  27. data/lib/icalendar/values/date.rb +26 -0
  28. data/lib/icalendar/values/date_time.rb +34 -0
  29. data/lib/icalendar/values/duration.rb +48 -0
  30. data/lib/icalendar/values/float.rb +17 -0
  31. data/lib/icalendar/values/integer.rb +17 -0
  32. data/lib/icalendar/values/period.rb +46 -0
  33. data/lib/icalendar/values/recur.rb +63 -0
  34. data/lib/icalendar/values/text.rb +26 -0
  35. data/lib/icalendar/values/time.rb +34 -0
  36. data/lib/icalendar/values/time_with_zone.rb +31 -0
  37. data/lib/icalendar/values/uri.rb +19 -0
  38. data/lib/icalendar/values/utc_offset.rb +39 -0
  39. data/lib/icalendar/version.rb +5 -0
  40. data/spec/alarm_spec.rb +108 -0
  41. data/spec/calendar_spec.rb +167 -0
  42. data/spec/event_spec.rb +108 -0
  43. data/{test/fixtures/folding.ics → spec/fixtures/nondefault_values.ics} +2 -2
  44. data/{test → spec}/fixtures/single_event.ics +11 -14
  45. data/spec/fixtures/timezone.ics +35 -0
  46. data/spec/freebusy_spec.rb +7 -0
  47. data/spec/journal_spec.rb +7 -0
  48. data/spec/parser_spec.rb +26 -0
  49. data/spec/roundtrip_spec.rb +40 -0
  50. data/spec/spec_helper.rb +25 -0
  51. data/spec/timezone_spec.rb +31 -0
  52. data/spec/todo_spec.rb +24 -0
  53. data/spec/tzinfo_spec.rb +85 -0
  54. data/spec/values/date_time_spec.rb +80 -0
  55. data/spec/values/duration_spec.rb +67 -0
  56. data/spec/values/period_spec.rb +47 -0
  57. data/spec/values/recur_spec.rb +47 -0
  58. data/spec/values/text_spec.rb +72 -0
  59. data/spec/values/utc_offset_spec.rb +41 -0
  60. metadata +129 -88
  61. data/GPL +0 -340
  62. data/examples/create_cal.rb +0 -45
  63. data/examples/parse_cal.rb +0 -20
  64. data/examples/single_event.ics +0 -18
  65. data/lib/hash_attrs.rb +0 -34
  66. data/lib/icalendar/base.rb +0 -47
  67. data/lib/icalendar/component/alarm.rb +0 -47
  68. data/lib/icalendar/component/event.rb +0 -131
  69. data/lib/icalendar/component/freebusy.rb +0 -38
  70. data/lib/icalendar/component/journal.rb +0 -60
  71. data/lib/icalendar/component/timezone.rb +0 -91
  72. data/lib/icalendar/component/todo.rb +0 -64
  73. data/lib/icalendar/conversions.rb +0 -107
  74. data/lib/icalendar/helpers.rb +0 -109
  75. data/lib/icalendar/parameter.rb +0 -33
  76. data/lib/icalendar/rrule.rb +0 -133
  77. data/lib/meta.rb +0 -32
  78. data/script/console +0 -10
  79. data/script/recur1.ics +0 -38
  80. data/script/tryit.rb +0 -13
  81. data/test/component/test_event.rb +0 -253
  82. data/test/component/test_timezone.rb +0 -74
  83. data/test/component/test_todo.rb +0 -31
  84. data/test/fixtures/life.ics +0 -46
  85. data/test/fixtures/nonstandard.ics +0 -25
  86. data/test/fixtures/simplecal.ics +0 -119
  87. data/test/interactive.rb +0 -17
  88. data/test/read_write.rb +0 -23
  89. data/test/test_calendar.rb +0 -167
  90. data/test/test_component.rb +0 -102
  91. data/test/test_conversions.rb +0 -104
  92. data/test/test_helper.rb +0 -7
  93. data/test/test_parameter.rb +0 -91
  94. data/test/test_parser.rb +0 -100
  95. data/test/test_tzinfo.rb +0 -83
  96. data/website/index.html +0 -70
  97. data/website/index.txt +0 -38
  98. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  99. data/website/stylesheets/screen.css +0 -159
  100. data/website/template.html.erb +0 -50
@@ -1,46 +0,0 @@
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
-
@@ -1,25 +0,0 @@
1
- BEGIN:VCALENDAR
2
- VERSION:2.0
3
- PRODID:bsprodidfortestabc123
4
- BEGIN:VEVENT
5
- UID:bsuidfortestabc123
6
- ORGANIZER:mailto:joebob@random.net
7
- ATTACH:http://bush.sucks.org/impeach/him.rhtml
8
- ATTACH:http://corporations-dominate.existence.net/why.rhtml
9
- SUMMARY:This is a really long summary
10
- to test the method of unfolding lines\,
11
- so I'm just going to ma
12
- ke it
13
- a whol
14
- e
15
- bunch of lines.
16
- CLASS:PRIVATE
17
- PRIORITY:2
18
- CUSTOMFIELD:Not properly noted as custom with X- prefix.
19
- GEO:37.386013;-122.0829322
20
- DTSTART;TZID=US-Mountain:20050120T170000
21
- DTEND:20050120T184500
22
- DTSTAMP:20050118T211523Z
23
- NAME:SomeName
24
- END:VEVENT
25
- END:VCALENDAR
@@ -1,119 +0,0 @@
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
data/test/interactive.rb DELETED
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # NOTE: you must have installed ruby-breakpoint in order to use this script.
4
- # Grab it using gem with "gem install ruby-breakpoint --remote" or download
5
- # from the website (http://ruby-breakpoint.rubyforge.org/) then run setup.rb
6
-
7
- $:.unshift(File.dirname(__FILE__) + '/../lib')
8
-
9
- require 'rubygems'
10
- require 'breakpoint'
11
-
12
- require 'icalendar'
13
-
14
- cal = Icalendar::Parser.new(File.new("life.ics")).parse
15
- #cal = Icalendar::Calendar.new
16
-
17
- breakpoint
data/test/read_write.rb DELETED
@@ -1,23 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- # NOTE: you must have installed ruby-breakpoint in order to use this script.
4
- # Grab it using gem with "gem install ruby-breakpoint --remote" or download
5
- # from the website (http://ruby-breakpoint.rubyforge.org/) then run setup.rb
6
-
7
- $:.unshift(File.dirname(__FILE__) + '/../lib')
8
-
9
- require 'breakpoint'
10
- require 'icalendar'
11
-
12
- cals = Icalendar::Parser.new(File.new(ARGV[0])).parse
13
- puts "Parsed #{cals.size} calendars"
14
-
15
- cal = cals.first
16
- puts "First calendar has:"
17
- puts "#{cal.events.size} events"
18
- puts "#{cal.todos.size} todos"
19
- puts "#{cal.journals.size} journals"
20
-
21
- test = File.new("rw.ics", "w")
22
- test.write(cal.to_ical)
23
- test.close
@@ -1,167 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- require 'date'
4
-
5
- class TestCalendar < Test::Unit::TestCase
6
- include Icalendar
7
- # Generate a calendar using the raw api, and then spit it out
8
- # as a string. Parse the string and make sure everything matches up.
9
- def test_raw_generation
10
- # Create a fresh calendar
11
- cal = Calendar.new
12
-
13
- cal.calscale = "GREGORIAN"
14
- cal.version = "3.2"
15
- cal.prodid = "test-prodid"
16
-
17
- # Now generate the string and then parse it so we can verify
18
- # that everything was set, generated and parsed correctly.
19
- calString = cal.to_ical
20
-
21
- cals = Parser.new(calString).parse
22
-
23
- cal2 = cals.first
24
- assert_equal("GREGORIAN", cal2.calscale)
25
- assert_equal("3.2", cal2.version)
26
- assert_equal("test-prodid", cal2.prodid)
27
- end
28
-
29
- def test_block_creation
30
- cal = Calendar.new
31
- cal.event do
32
- self.dtend = "19970903T190000Z"
33
- self.summary = "This is my summary"
34
- end
35
-
36
- event = cal.event
37
- event.dtend "19970903T190000Z", {:TZID => "Europe/Copenhagen"}
38
- event.summary "This is my summary"
39
-
40
- cal.events.each do |ev|
41
- assert_equal("19970903T190000Z", ev.dtend)
42
- assert_equal("This is my summary", ev.summary)
43
- end
44
- end
45
-
46
- def test_block_creation_with_timezone
47
- cal = Calendar.new
48
-
49
- event_start = DateTime.new 1997, 9, 3, 19, 0, 0
50
- tz = TZInfo::Timezone.get "Europe/Copenhagen"
51
- timezone = tz.ical_timezone event_start
52
- cal.add timezone
53
-
54
- cal.event do
55
- dtstart event_start
56
- dtend "19970903T190000Z"
57
- summary "This is my summary"
58
- end
59
-
60
- cal.events.each do |ev|
61
- assert_equal(event_start, ev.dtstart)
62
- assert_equal("19970903T190000Z", ev.dtend)
63
- end
64
- end
65
-
66
- def test_create_multiple_event_calendar
67
- # Create a fresh calendar
68
- Timecop.freeze DateTime.new(2013, 12, 26, 5, 0, 0, '+0000')
69
- cal = Calendar.new
70
- [1,2,3].each do |t|
71
- cal.event do
72
- self.dtend = "1997090#{t}T190000Z"
73
- self.summary = "This is summary #{t}"
74
- end
75
- end
76
- [1,2,3].each do |t|
77
- cal.todo do
78
- self.summary = "test #{t} todo"
79
- end
80
- end
81
- expected_no_uid = <<-EXPECTED.gsub("\n", "\r\n")
82
- BEGIN:VCALENDAR
83
- VERSION:2.0
84
- CALSCALE:GREGORIAN
85
- PRODID:iCalendar-Ruby
86
- BEGIN:VEVENT
87
- DTEND:19970901T190000Z
88
- DTSTAMP:20131226T050000Z
89
- SEQUENCE:0
90
- SUMMARY:This is summary 1
91
- END:VEVENT
92
- BEGIN:VEVENT
93
- DTEND:19970902T190000Z
94
- DTSTAMP:20131226T050000Z
95
- SEQUENCE:0
96
- SUMMARY:This is summary 2
97
- END:VEVENT
98
- BEGIN:VEVENT
99
- DTEND:19970903T190000Z
100
- DTSTAMP:20131226T050000Z
101
- SEQUENCE:0
102
- SUMMARY:This is summary 3
103
- END:VEVENT
104
- BEGIN:VTODO
105
- DTSTAMP:20131226T050000Z
106
- SEQUENCE:0
107
- SUMMARY:test 1 todo
108
- END:VTODO
109
- BEGIN:VTODO
110
- DTSTAMP:20131226T050000Z
111
- SEQUENCE:0
112
- SUMMARY:test 2 todo
113
- END:VTODO
114
- BEGIN:VTODO
115
- DTSTAMP:20131226T050000Z
116
- SEQUENCE:0
117
- SUMMARY:test 3 todo
118
- END:VTODO
119
- END:VCALENDAR
120
- EXPECTED
121
- actual_no_uid = cal.to_ical.gsub /^UID:.*\r\n(?: .*\r\n)*/, ''
122
- Timecop.return
123
- assert_equal expected_no_uid, actual_no_uid
124
- end
125
-
126
- def test_find
127
- cal = Calendar.new
128
-
129
- # add some events so we actually have to search
130
- 10.times do
131
- cal.event
132
- cal.todo
133
- cal.journal
134
- cal.freebusy
135
- end
136
- event = cal.events[5]
137
- assert_equal(event, cal.find_event(event.uid))
138
-
139
- todo = cal.todos[5]
140
- assert_equal(todo, cal.find_todo(todo.uid))
141
-
142
- journal = cal.journals[5]
143
- assert_equal(journal, cal.find_journal(journal.uid))
144
-
145
- freebusy = cal.freebusys[5]
146
- assert_equal(freebusy, cal.find_freebusy(freebusy.uid))
147
- end
148
-
149
- def test_set_and_get_proprietary_attributes
150
- cal = Calendar.new
151
-
152
- cal.x_wr_name = 'Icalendar Calendar'
153
-
154
- calString = cal.to_ical
155
-
156
- cals = Parser.new(calString).parse
157
-
158
- cal2 = cals.first
159
- assert_equal(["Icalendar Calendar"], cal2.x_wr_name)
160
- end
161
-
162
- def test_respond_to_proprietary_attributes
163
- cal = Calendar.new
164
-
165
- assert_respond_to(cal, 'x_wr_name=')
166
- end
167
- end
@@ -1,102 +0,0 @@
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
- # Create a calendar with an event for each test.
9
- def setup
10
- @cal = Icalendar::Calendar.new
11
- @event = Icalendar::Event.new
12
- end
13
-
14
- def test_add_remove_component
15
- @cal.add_component(@event)
16
- assert_equal(1, @cal.events.size)
17
- @cal.remove_component(@event)
18
- assert_equal(0, @cal.events.size)
19
- end
20
-
21
- def test_ical_property
22
- # No alias but it does have a prop_name
23
- assert_equal(false, @event.ip_class?)
24
- @event.ip_class = "PRIVATE"
25
- assert_equal(true, @event.ip_class?)
26
- assert_equal("PRIVATE", @event.ip_class)
27
-
28
- # Check that both dtend and its alias start work correctly
29
- date = DateTime.new(2005, 02, 05, 23, 24, 25)
30
- @event.dtend = date
31
- assert_equal(date.year, @event.dtend.year)
32
-
33
- date2 = DateTime.new(2005, 02, 05, 23, 24, 26)
34
- @event.end = date2
35
- assert_equal(date2.year, @event.end.year)
36
- end
37
-
38
- def test_ical_multi_property
39
- # Query
40
- assert_equal(false, @event.comments?)
41
- @event.comments = []
42
- assert_equal(true, @event.comments?)
43
-
44
- # Should return an empty array, rather than nil
45
- assert_equal(0, @event.comments.size)
46
-
47
- # Add and remove
48
- @event.add_comment "c1"
49
- @event.add_comment "c2"
50
- assert_equal(2, @event.comments.size)
51
- assert_equal(["c1","c2"], @event.comments)
52
- @event.remove_comment "c1"
53
- assert_equal(["c2"], @event.comments)
54
-
55
- # Add using multi setter
56
- @event.comments "c3"
57
- assert_equal(["c2","c3"], @event.comments)
58
-
59
- # Set & get whole array
60
- foo = ["as", "df"]
61
- @event.comments = foo
62
- assert_equal(foo, @event.comments)
63
- end
64
-
65
- def test_x_property
66
- @event.x_foobar = "my-custom-property"
67
- assert_equal(["my-custom-property"], @event.x_foobar)
68
- end
69
-
70
- def test_method_missing_no_x
71
- assert_raise NoMethodError do
72
- @event.there_is_no_such_method
73
- end
74
- end
75
-
76
- def test_respond_to_missing
77
- component = Icalendar::Component.new('name')
78
- assert !component.respond_to?(:there_is_no_such_method)
79
- end
80
-
81
- def test_respond_to_x_property
82
- component = Icalendar::Component.new('name')
83
- assert component.respond_to?(:x_foobar)
84
- end
85
-
86
- def test_geo_constructor
87
- geo = Icalendar::Geo.new(1, 2)
88
- assert_equal(1, geo.latitude)
89
- assert_equal(1, geo.lat)
90
- assert_equal(2, geo.longitude)
91
- assert_equal(2, geo.long)
92
- assert_equal('1;2', geo.to_ical)
93
- end
94
-
95
- def test_geo_lat_and_long_setter
96
- geo = Icalendar::Geo.new(1, 2)
97
- geo.lat = 3
98
- geo.long = 4
99
- assert_equal(3, geo.lat)
100
- assert_equal(4, geo.long)
101
- end
102
- end