icalendar 0.95

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 (81) hide show
  1. data/COPYING +56 -0
  2. data/GPL +340 -0
  3. data/README +121 -0
  4. data/Rakefile +101 -0
  5. data/docs/api/classes/Array.html +146 -0
  6. data/docs/api/classes/Date.html +157 -0
  7. data/docs/api/classes/DateTime.html +178 -0
  8. data/docs/api/classes/Fixnum.html +146 -0
  9. data/docs/api/classes/Float.html +146 -0
  10. data/docs/api/classes/Icalendar/Alarm.html +184 -0
  11. data/docs/api/classes/Icalendar/Base.html +118 -0
  12. data/docs/api/classes/Icalendar/Calendar.html +411 -0
  13. data/docs/api/classes/Icalendar/Component.html +306 -0
  14. data/docs/api/classes/Icalendar/DateProp.html +187 -0
  15. data/docs/api/classes/Icalendar/DateProp/ClassMethods.html +195 -0
  16. data/docs/api/classes/Icalendar/Event.html +202 -0
  17. data/docs/api/classes/Icalendar/Freebusy.html +157 -0
  18. data/docs/api/classes/Icalendar/InvalidComponentClass.html +117 -0
  19. data/docs/api/classes/Icalendar/InvalidPropertyValue.html +117 -0
  20. data/docs/api/classes/Icalendar/Journal.html +190 -0
  21. data/docs/api/classes/Icalendar/Parameter.html +166 -0
  22. data/docs/api/classes/Icalendar/Parser.html +447 -0
  23. data/docs/api/classes/Icalendar/Timezone.html +197 -0
  24. data/docs/api/classes/Icalendar/Todo.html +199 -0
  25. data/docs/api/classes/String.html +160 -0
  26. data/docs/api/classes/Time.html +161 -0
  27. data/docs/api/created.rid +1 -0
  28. data/docs/api/files/COPYING.html +163 -0
  29. data/docs/api/files/GPL.html +531 -0
  30. data/docs/api/files/README.html +241 -0
  31. data/docs/api/files/lib/icalendar/base_rb.html +108 -0
  32. data/docs/api/files/lib/icalendar/calendar_rb.html +101 -0
  33. data/docs/api/files/lib/icalendar/component/alarm_rb.html +101 -0
  34. data/docs/api/files/lib/icalendar/component/event_rb.html +101 -0
  35. data/docs/api/files/lib/icalendar/component/freebusy_rb.html +101 -0
  36. data/docs/api/files/lib/icalendar/component/journal_rb.html +101 -0
  37. data/docs/api/files/lib/icalendar/component/timezone_rb.html +101 -0
  38. data/docs/api/files/lib/icalendar/component/todo_rb.html +101 -0
  39. data/docs/api/files/lib/icalendar/component_rb.html +101 -0
  40. data/docs/api/files/lib/icalendar/conversions_rb.html +108 -0
  41. data/docs/api/files/lib/icalendar/helpers_rb.html +101 -0
  42. data/docs/api/files/lib/icalendar/parameter_rb.html +101 -0
  43. data/docs/api/files/lib/icalendar/parser_rb.html +109 -0
  44. data/docs/api/files/lib/icalendar_rb.html +118 -0
  45. data/docs/api/fr_class_index.html +48 -0
  46. data/docs/api/fr_file_index.html +43 -0
  47. data/docs/api/fr_method_index.html +63 -0
  48. data/docs/api/index.html +24 -0
  49. data/docs/api/rdoc-style.css +208 -0
  50. data/docs/examples/create_cal.rb +40 -0
  51. data/docs/examples/parse_cal.rb +19 -0
  52. data/docs/examples/single_event.ics +18 -0
  53. data/docs/rfcs/rfc2425.pdf +0 -0
  54. data/docs/rfcs/rfc2426.pdf +0 -0
  55. data/docs/rfcs/rfc2445.pdf +0 -0
  56. data/docs/rfcs/rfc2446.pdf +0 -0
  57. data/docs/rfcs/rfc2447.pdf +0 -0
  58. data/docs/rfcs/rfc3283.txt +738 -0
  59. data/lib/icalendar.rb +27 -0
  60. data/lib/icalendar/#helpers.rb# +92 -0
  61. data/lib/icalendar/base.rb +31 -0
  62. data/lib/icalendar/calendar.rb +112 -0
  63. data/lib/icalendar/component.rb +253 -0
  64. data/lib/icalendar/component/alarm.rb +35 -0
  65. data/lib/icalendar/component/event.rb +68 -0
  66. data/lib/icalendar/component/freebusy.rb +35 -0
  67. data/lib/icalendar/component/journal.rb +61 -0
  68. data/lib/icalendar/component/timezone.rb +43 -0
  69. data/lib/icalendar/component/todo.rb +65 -0
  70. data/lib/icalendar/conversions.rb +115 -0
  71. data/lib/icalendar/helpers.rb +109 -0
  72. data/lib/icalendar/parameter.rb +33 -0
  73. data/lib/icalendar/parser.rb +395 -0
  74. data/test/calendar_test.rb +46 -0
  75. data/test/component/event_test.rb +47 -0
  76. data/test/component_test.rb +74 -0
  77. data/test/parser_test.rb +83 -0
  78. data/test/property_helpers.rb +35 -0
  79. data/test/simplecal.ics +119 -0
  80. data/test/single_event.ics +23 -0
  81. metadata +135 -0
@@ -0,0 +1,35 @@
1
+ =begin
2
+ Copyright (C) 2005 Jeff Rose
3
+
4
+ This library is free software; you can redistribute it and/or modify it
5
+ under the same terms as the ruby language itself, see the file COPYING for
6
+ details.
7
+ =end
8
+ module Icalendar
9
+ # An Alarm calendar component is a grouping of component
10
+ # properties that is a reminder or alarm for an event or a
11
+ # to-do. For example, it may be used to define a reminder for a
12
+ # pending Event or an overdue Todo.
13
+ class Alarm < Component
14
+
15
+ # Single properties
16
+ ical_property :action
17
+ ical_property :trigger
18
+
19
+ # Single but must appear together
20
+ ical_property :duration
21
+ ical_property :repeat
22
+
23
+ # Single and only occurring once
24
+ ical_property :attach, :attachment
25
+
26
+ def initialize()
27
+ super("VALARM")
28
+
29
+ end
30
+
31
+ def to_ical
32
+ print_string {}
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,68 @@
1
+ =begin
2
+ Copyright (C) 2005 Jeff Rose
3
+
4
+ This library is free software; you can redistribute it and/or modify it
5
+ under the same terms as the ruby language itself, see the file COPYING for
6
+ details.
7
+ =end
8
+
9
+ module Icalendar
10
+ # A Event calendar component is a grouping of component
11
+ # properties, and possibly including Alarm calendar components, that
12
+ # represents a scheduled amount of time on a calendar. For example, it
13
+ # can be an activity; such as a one-hour long, department meeting from
14
+ # 8:00 AM to 9:00 AM, tomorrow. Generally, an event will take up time
15
+ # on an individual calendar.
16
+ class Event < Component
17
+ attr_accessor :alarms
18
+
19
+ # Single properties
20
+ ical_property :klass, nil, :class
21
+ ical_property :created
22
+ ical_property :description
23
+ ical_property :dtstart, :start
24
+ ical_property :geo
25
+ ical_property :last_mod, :last_modification
26
+ ical_property :location
27
+ ical_property :organizer
28
+ ical_property :priority
29
+ ical_property :dtstamp, :timestamp
30
+ ical_property :seq, :sequence
31
+ ical_property :status
32
+ ical_property :summary
33
+ ical_property :transp, :transparency
34
+ ical_property :uid, :user_id
35
+ ical_property :url
36
+ ical_property :recurid, :recurrence_id
37
+
38
+ # Single but mutually exclusive TODO: not testing anything yet
39
+ ical_property :dtend, :end
40
+ ical_property :duration
41
+
42
+ # Multi-properties
43
+ ical_multi_property :attach, :attachment, :attachments
44
+ ical_multi_property :attendee, :attendee, :attendees
45
+ ical_multi_property :categories, :category, :categories
46
+ ical_multi_property :comment, :comment, :comments
47
+ ical_multi_property :contact, :contact, :contacts
48
+ ical_multi_property :exdate, :exception_date, :exception_dates
49
+ ical_multi_property :exrule, :exception_rule, :exception_rules
50
+ ical_multi_property :rstatus, :request_status, :request_statuses
51
+ ical_multi_property :related_to, :related_to, :related_tos
52
+ ical_multi_property :resources, :resource, :resources
53
+ ical_multi_property :rdate, :recurrence_date, :recurrence_dates
54
+ ical_multi_property :rrule, :recurrence_rule, :recurrence_rules
55
+
56
+ def initialize()
57
+ super("VEVENT")
58
+
59
+ @alarms = []
60
+ end
61
+
62
+ def to_ical
63
+ print_string do |s|
64
+ @alarms.each { |alarm| s << alarm.to_ical }
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,35 @@
1
+ =begin
2
+ Copyright (C) 2005 Jeff Rose
3
+
4
+ This library is free software; you can redistribute it and/or modify it
5
+ under the same terms as the ruby language itself, see the file COPYING for
6
+ details.
7
+ =end
8
+ module Icalendar
9
+ # A Freebusy calendar component is a grouping of
10
+ # component properties that represents either a request for, a reply to
11
+ # a request for free or busy time information or a published set of
12
+ # busy time information.
13
+ class Freebusy < Component
14
+
15
+ # Single properties
16
+ ical_property :contact
17
+ ical_property :dtstart, :start
18
+ ical_property :dtend, :end
19
+ ical_property :dtstamp, :timestamp
20
+ ical_property :duration
21
+ ical_property :organizer
22
+ ical_property :uid, :user_id
23
+ ical_property :url
24
+
25
+ # Multi-properties
26
+ ical_multi_property :attendee, :attendee, :attendees
27
+ ical_multi_property :comment, :comment, :comments
28
+ ical_multi_property :freebusy, :freebusy, :freebusys
29
+ ical_multi_property :rstatus, :request_status, :request_statuses
30
+
31
+ def initialize()
32
+ super("VFREEBUSY")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,61 @@
1
+ =begin
2
+ Copyright (C) 2005 Jeff Rose
3
+
4
+ This library is free software; you can redistribute it and/or modify it
5
+ under the same terms as the ruby language itself, see the file COPYING for
6
+ details.
7
+ =end
8
+ module Icalendar
9
+ # A Journal calendar component is a grouping of
10
+ # component properties that represent one or more descriptive text
11
+ # notes associated with a particular calendar date. The "DTSTART"
12
+ # property is used to specify the calendar date that the journal entry
13
+ # is associated with. Generally, it will have a DATE value data type,
14
+ # but it can also be used to specify a DATE-TIME value data type.
15
+ # Examples of a journal entry include a daily record of a legislative
16
+ # body or a journal entry of individual telephone contacts for the day
17
+ # or an ordered list of accomplishments for the day. The Journal
18
+ # calendar component can also be used to associate a document with a
19
+ # calendar date.
20
+ class Journal < Component
21
+
22
+ # Single properties
23
+ ical_property :klass, nil, :class
24
+ ical_property :created
25
+ ical_property :description
26
+ ical_property :dtstart, :start
27
+ ical_property :last_mod, :last_modification
28
+ ical_property :organizer
29
+ ical_property :dtstamp, :timestamp
30
+ ical_property :seq, :sequence
31
+ ical_property :status
32
+ ical_property :summary
33
+ ical_property :uid, :user_id
34
+ ical_property :url
35
+ ical_property :recurid, :recurrence_id
36
+
37
+ # Multi-properties
38
+ ical_multi_property :attach, :attachment, :attachments
39
+ ical_multi_property :attendee, :attendee, :attendees
40
+ ical_multi_property :categories, :category, :categories
41
+ ical_multi_property :comment, :comment, :comments
42
+ ical_multi_property :contact, :contact, :contacts
43
+ ical_multi_property :exdate, :exception_date, :exception_dates
44
+ ical_multi_property :exrule, :exception_rule, :exception_rules
45
+ ical_multi_property :rstatus, :request_status, :request_statuses
46
+ ical_multi_property :related_to, :related_to, :related_tos
47
+ ical_multi_property :resources, :resource, :resources
48
+ ical_multi_property :rdate, :recurrence_date, :recurrence_dates
49
+ ical_multi_property :rrule, :recurrence_rule, :recurrence_rules
50
+
51
+ def initialize()
52
+ super("VJOURNAL")
53
+ end
54
+
55
+ def to_ical
56
+ print_string { }
57
+ end
58
+
59
+ end
60
+ end
61
+
@@ -0,0 +1,43 @@
1
+ =begin
2
+ Copyright (C) 2005 Jeff Rose
3
+
4
+ This library is free software; you can redistribute it and/or modify it
5
+ under the same terms as the ruby language itself, see the file COPYING for
6
+ details.
7
+ =end
8
+ module Icalendar
9
+ # A Timezone is unambiguously defined by the set of time
10
+ # measurement rules determined by the governing body for a given
11
+ # geographic area. These rules describe at a minimum the base offset
12
+ # from UTC for the time zone, often referred to as the Standard Time
13
+ # offset. Many locations adjust their Standard Time forward or backward
14
+ # by one hour, in order to accommodate seasonal changes in number of
15
+ # daylight hours, often referred to as Daylight Saving Time. Some
16
+ # locations adjust their time by a fraction of an hour. Standard Time
17
+ # is also known as Winter Time. Daylight Saving Time is also known as
18
+ # Advanced Time, Summer Time, or Legal Time in certain countries. The
19
+ # following table shows the changes in time zone rules in effect for
20
+ # New York City starting from 1967. Each line represents a description
21
+ # or rule for a particular observance.
22
+ class Timezone < Component
23
+
24
+ # Single properties
25
+ ical_property :dtstart, :start
26
+ ical_property :tzoffsetto, :timezone_offset_to
27
+ ical_property :tzoffsetfrom, :timezone_offset_from
28
+
29
+ # Multi-properties
30
+ ical_multi_property :comment, :comment, :comments
31
+ ical_multi_property :rdate, :recurrence_date, :recurrence_dates
32
+ ical_multi_property :rrule, :recurrence_rule, :recurrence_rules
33
+
34
+ def initialize()
35
+ super("VTIMEZONE")
36
+ @components = components
37
+ end
38
+
39
+ def to_ical
40
+ super.to_s { |s| s << @components.each { |component| component.to_s } }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,65 @@
1
+ =begin
2
+ Copyright (C) 2005 Jeff Rose
3
+
4
+ This library is free software; you can redistribute it and/or modify it
5
+ under the same terms as the ruby language itself, see the file COPYING for
6
+ details.
7
+ =end
8
+ module Icalendar
9
+ # A Todo calendar component is a grouping of component
10
+ # properties and possibly Alarm calendar components that represent
11
+ # an action-item or assignment. For example, it can be used to
12
+ # represent an item of work assigned to an individual; such as "turn in
13
+ # travel expense today".
14
+ class Todo < Component
15
+ attr_reader :alarms
16
+
17
+ # Single properties
18
+ ical_property :klass, nil, :class
19
+ ical_property :completed
20
+ ical_property :created
21
+ ical_property :description
22
+ ical_property :dtstamp, :timestamp
23
+ ical_property :dtstart, :start
24
+ ical_property :geo
25
+ ical_property :last_mod, :last_modification
26
+ ical_property :location
27
+ ical_property :organizer
28
+ ical_property :percent
29
+ ical_property :priority
30
+ ical_property :recurid, :recurrence_id
31
+ ical_property :seq, :sequence
32
+ ical_property :status
33
+ ical_property :summary
34
+ ical_property :uid, :user_id
35
+ ical_property :url
36
+
37
+ # Single but mutually exclusive TODO: not testing anything yet
38
+ ical_property :due
39
+ ical_property :duration
40
+
41
+ # Multi-properties
42
+ ical_multi_property :attach, :attachment, :attachments
43
+ ical_multi_property :attendee, :attendee, :attendees
44
+ ical_multi_property :categories, :category, :categories
45
+ ical_multi_property :comment, :comment, :comments
46
+ ical_multi_property :contact, :contact, :contacts
47
+ ical_multi_property :exdate, :exception_date, :exception_dates
48
+ ical_multi_property :exrule, :exception_rule, :exception_rules
49
+ ical_multi_property :rstatus, :request_status, :request_statuses
50
+ ical_multi_property :related_to, :related_to, :related_tos
51
+ ical_multi_property :resources, :resource, :resources
52
+ ical_multi_property :rdate, :recurrence_date, :recurrence_dates
53
+ ical_multi_property :rrule, :recurrence_rule, :recurrence_rules
54
+
55
+ def initialize()
56
+ super("VTODO")
57
+
58
+ @alarms = alarms
59
+ end
60
+
61
+ def to_ical
62
+ print_string { |s| @alarms.each { |alarm| alarm.to_s } }
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,115 @@
1
+ =begin
2
+ Copyright (C) 2005 Jeff Rose
3
+
4
+ This library is free software; you can redistribute it and/or modify it
5
+ under the same terms as the ruby language itself, see the file COPYING for
6
+ details.
7
+ =end
8
+
9
+ require 'date'
10
+
11
+ ### Add some to_ical methods to classes
12
+
13
+ # class Object
14
+ # def to_ical
15
+ # raise(NotImplementedError, "This object does not implement the to_ical method!")
16
+ # end
17
+ # end
18
+
19
+ class String
20
+ def to_ical
21
+ "#{self}"
22
+ end
23
+ end
24
+
25
+ class Fixnum
26
+ def to_ical
27
+ "#{self}"
28
+ end
29
+ end
30
+
31
+ class Float
32
+ def to_ical
33
+ "#{self}"
34
+ end
35
+ end
36
+
37
+ class Array
38
+ def to_ical
39
+ map{|elem| elem.to_ical}.join ','
40
+ end
41
+ end
42
+
43
+ class DateTime < Date
44
+ def to_ical(utc = false)
45
+ s = ""
46
+
47
+ # 4 digit year
48
+ s << self.year.to_s
49
+
50
+ # Double digit month
51
+ s << "0" unless self.month > 9
52
+ s << self.month.to_s
53
+
54
+ # Double digit day
55
+ s << "0" unless self.day > 9
56
+ s << self.day.to_s
57
+
58
+ s << "T"
59
+
60
+ # Double digit hour
61
+ s << "0" unless self.hour > 9
62
+ s << self.hour.to_s
63
+
64
+ # Double digit minute
65
+ s << "0" unless self.min > 9
66
+ s << self.min.to_s
67
+
68
+ # Double digit second
69
+ s << "0" unless self.sec > 9
70
+ s << self.sec.to_s
71
+
72
+ # UTC time gets a Z suffix
73
+ if utc
74
+ s << "Z"
75
+ end
76
+ end
77
+ end
78
+
79
+ class Date
80
+ def to_ical(utc = false)
81
+ s = ""
82
+
83
+ # 4 digit year
84
+ s << self.year.to_s
85
+
86
+ # Double digit month
87
+ s << "0" unless self.month > 9
88
+ s << self.month.to_s
89
+
90
+ # Double digit day
91
+ s << "0" unless self.day > 9
92
+ s << self.day.to_s
93
+ end
94
+ end
95
+
96
+ class Time
97
+ def to_ical(utc = false)
98
+ # Double digit hour
99
+ s << "0" unless self.hour > 9
100
+ s << self.hour.to_s
101
+
102
+ # Double digit minute
103
+ s << "0" unless self.min > 9
104
+ s << self.min.to_s
105
+
106
+ # Double digit second
107
+ s << "0" unless self.sec > 9
108
+ s << self.sec.to_s
109
+
110
+ # UTC time gets a Z suffix
111
+ if utc
112
+ s << "Z"
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,109 @@
1
+ =begin
2
+ Copyright (C) 2005 Jeff Rose
3
+ Copyright (C) 2005 Sam Roberts
4
+
5
+ This library is free software; you can redistribute it and/or modify it
6
+ under the same terms as the ruby language itself, see the file COPYING for
7
+ details.
8
+ =end
9
+
10
+ module Icalendar
11
+ module DateProp
12
+ # date = date-fullyear date-month date-mday
13
+ # date-fullyear = 4 DIGIT
14
+ # date-month = 2 DIGIT
15
+ # date-mday = 2 DIGIT
16
+ DATE = '(\d\d\d\d)(\d\d)(\d\d)'
17
+
18
+ # time = time-hour [":"] time-minute [":"] time-second [time-secfrac] [time-zone]
19
+ # time-hour = 2 DIGIT
20
+ # time-minute = 2 DIGIT
21
+ # time-second = 2 DIGIT
22
+ # time-secfrac = "," 1*DIGIT
23
+ # time-zone = "Z" / time-numzone
24
+ # time-numzome = sign time-hour [":"] time-minute
25
+ # TIME = '(\d\d)(\d\d)(\d\d)(Z)?'
26
+ TIME = '(\d\d)(\d\d)(\d\d)'
27
+
28
+ # This method is called automatically when the module is mixed in.
29
+ # I guess you have to do this to mixin class methods rather than instance methods.
30
+ def self.append_features(base)
31
+ super
32
+ klass.extend(ClassMethods)
33
+ end
34
+
35
+ # This is made a sub-module just so it can be added as class
36
+ # methods rather than instance methods.
37
+ module ClassMethods
38
+ def date_property(dp, alias_name = nil)
39
+ dp = "#{dp}".strip.downcase
40
+ getter = dp
41
+ setter = "#{dp}="
42
+ query = "#{dp}?"
43
+
44
+ unless instance_methods.include? getter
45
+ code = <<-code
46
+ def #{getter}(*a)
47
+ if a.empty?
48
+ @properties[#{dp.upcase}]
49
+ else
50
+ self.#{dp} = a.first
51
+ end
52
+ end
53
+ code
54
+
55
+ module_eval code
56
+ end
57
+
58
+ unless instance_methods.include? setter
59
+ code = <<-code
60
+ def #{setter} a
61
+ @properties[#{dp.upcase}] = a
62
+ end
63
+ code
64
+
65
+ module_eval code
66
+ end
67
+
68
+ unless instance_methods.include? query
69
+ code = <<-code
70
+ def #{query}
71
+ @properties.has_key?(#{dp.upcase})
72
+ end
73
+ code
74
+
75
+ module_eval code
76
+ end
77
+
78
+ # Define the getter
79
+ getter = "get#{property.to_s.capitalize}"
80
+ define_method(getter.to_sym) do
81
+ puts "inside getting..."
82
+ getDateProperty(property.to_s.upcase)
83
+ end
84
+
85
+ # Define the setter
86
+ setter = "set#{property.to_s.capitalize}"
87
+ define_method(setter.to_sym) do |*params|
88
+ date = params[0]
89
+ utc = params[1]
90
+ puts "inside setting..."
91
+ setDateProperty(property.to_s.upcase, date, utc)
92
+ end
93
+
94
+ # Create aliases if a name was specified
95
+ # if not aliasName.nil?
96
+ # gasym = "get#{aliasName.to_s.capitalize}".to_sym
97
+ # gsym = getter.to_sym
98
+ # alias gasym gsym
99
+
100
+ # sasym = "set#{aliasName.to_s.capitalize}".to_sym
101
+ # ssym = setter.to_sym
102
+ # alias sasym ssym
103
+ # end
104
+ end
105
+
106
+ end
107
+
108
+ end
109
+ end