clio-gcal4ruby 0.3.4 → 0.3.5
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.
- data/lib/gcal4ruby/event.rb +42 -7
- data/lib/gcal4ruby/recurrence.rb +143 -90
- metadata +3 -3
data/lib/gcal4ruby/event.rb
CHANGED
@@ -68,6 +68,7 @@ module GCal4Ruby
|
|
68
68
|
attr_accessor :clio_id
|
69
69
|
attr_accessor :clio_updated_at
|
70
70
|
|
71
|
+
|
71
72
|
@attendees
|
72
73
|
|
73
74
|
#The event start time
|
@@ -83,7 +84,6 @@ module GCal4Ruby
|
|
83
84
|
#The date the event was last edited
|
84
85
|
attr_reader :edited
|
85
86
|
|
86
|
-
|
87
87
|
#Sets the reminder options for the event. Parameter must be a hash containing one of
|
88
88
|
#:hours, :minutes and :days, which are simply the number of each before the event start date you'd like to
|
89
89
|
#receive the reminder.
|
@@ -119,12 +119,36 @@ module GCal4Ruby
|
|
119
119
|
#Sets the event's recurrence information to a Recurrence object. Returns the recurrence if successful,
|
120
120
|
#false otherwise
|
121
121
|
def recurrence=(r)
|
122
|
-
if r.is_a?(
|
123
|
-
r.event = self unless r.nil?
|
122
|
+
if r.is_a?(RiCal.Event.class)
|
124
123
|
@recurrence = r
|
124
|
+
elsif r.nil?
|
125
|
+
@recurrence = nil
|
125
126
|
else
|
126
127
|
return false
|
127
128
|
end
|
129
|
+
if (@recurrence)
|
130
|
+
@start = @recurrence.dtstart
|
131
|
+
@end = @recurrence.dtend
|
132
|
+
if @recurrence.dtstart.is_a?(Date) && @recurrence.dtend.is_a?(Date)
|
133
|
+
@all_day = true
|
134
|
+
else
|
135
|
+
@all_day = false
|
136
|
+
end
|
137
|
+
end
|
138
|
+
@recurrence
|
139
|
+
end
|
140
|
+
|
141
|
+
def recurrence_to_google
|
142
|
+
@recurrence.to_s.gsub("BEGIN:VEVENT\n","").gsub("END:VEVENT\n","")
|
143
|
+
end
|
144
|
+
|
145
|
+
def recurrence_from_google(rec)
|
146
|
+
rec = "BEGIN:VEVENT\n#{rec}" unless (rec.starts_with? "BEGIN:VEVENT")
|
147
|
+
rec = "#{rec}END:VEVENT\n" unless (rec.ends_with? "END:VEVENT\n")
|
148
|
+
|
149
|
+
rrule = RiCal.parse_string(rec)
|
150
|
+
rrule = [rrule].flatten.first
|
151
|
+
self.recurrence = rrule
|
128
152
|
end
|
129
153
|
|
130
154
|
#Returns a duplicate of the current event as a new Event object
|
@@ -142,6 +166,8 @@ module GCal4Ruby
|
|
142
166
|
@start = Time.parse(str)
|
143
167
|
elsif str.is_a?Time
|
144
168
|
@start = str
|
169
|
+
elsif str.is_a?Date
|
170
|
+
@start = str.to_time
|
145
171
|
else
|
146
172
|
raise "Start Time must be either Time or String"
|
147
173
|
end
|
@@ -154,6 +180,8 @@ module GCal4Ruby
|
|
154
180
|
@end = Time.parse(str)
|
155
181
|
elsif str.is_a?Time
|
156
182
|
@end = str
|
183
|
+
elsif str.is_a?Date
|
184
|
+
@end = str.to_time
|
157
185
|
else
|
158
186
|
raise "End Time must be either Time or String"
|
159
187
|
end
|
@@ -241,7 +269,7 @@ module GCal4Ruby
|
|
241
269
|
else
|
242
270
|
if not @reminder
|
243
271
|
xml.root.delete_element("/entry/gd:when")
|
244
|
-
xml.root.add_element("gd:recurrence").text =
|
272
|
+
xml.root.add_element("gd:recurrence").text = self.recurrence_to_google
|
245
273
|
else
|
246
274
|
ele.delete_attribute('startTime')
|
247
275
|
ele.delete_attribute('endTime')
|
@@ -274,7 +302,7 @@ module GCal4Ruby
|
|
274
302
|
puts 'recurrence element found' if @calendar.service.debug
|
275
303
|
if @recurrence
|
276
304
|
puts 'setting recurrence' if @calendar.service.debug
|
277
|
-
ele.text =
|
305
|
+
ele.text = self.recurrence_to_google
|
278
306
|
else
|
279
307
|
puts 'no recurrence, adding when' if @calendar.service.debug
|
280
308
|
w = xml.root.add_element("gd:when")
|
@@ -293,7 +321,8 @@ module GCal4Ruby
|
|
293
321
|
end
|
294
322
|
if not @attendees.empty?
|
295
323
|
@attendees.each do |a|
|
296
|
-
xml.root.add_element("gd:who", {"email" => a[:email], "valueString" => a[:name], "rel" => "http://schemas.google.com/g/2005#event.attendee"})
|
324
|
+
a = xml.root.add_element("gd:who", {"email" => a[:email], "valueString" => a[:name], "rel" => "http://schemas.google.com/g/2005#event.attendee"})
|
325
|
+
a.add_element("gd:attendeeStatus", {"value" => "http://schemas.google.com/g/2005#event.accepted"})
|
297
326
|
end
|
298
327
|
end
|
299
328
|
unless updated_clio_id
|
@@ -329,6 +358,12 @@ module GCal4Ruby
|
|
329
358
|
ele.elements.each("gd:reminder") do |r|
|
330
359
|
@reminder = {:minutes => r.attributes['minutes'] ? r.attributes['minutes'] : 0, :hours => r.attributes['hours'] ? r.attributes['hours'] : 0, :days => r.attributes['days'] ? r.attributes['days'] : 0, :method => r.attributes['method'] ? r.attributes['method'] : ''}
|
331
360
|
end
|
361
|
+
|
362
|
+
puts "#{@start.strftime("%Y-%m-%d")} == #{ele.attributes['startTime']} && #{@end.strftime("%Y-%m-%d")} == #{ele.attributes['endTime']}" if @calendar.service.debug
|
363
|
+
if @start.strftime("%Y-%m-%d") == ele.attributes['startTime'] && @end.strftime("%Y-%m-%d") == ele.attributes['endTime']
|
364
|
+
puts "ALL DAY" if @calendar.service.debug
|
365
|
+
@all_day = true
|
366
|
+
end
|
332
367
|
when "where"
|
333
368
|
@where = ele.attributes['valueString']
|
334
369
|
when "link"
|
@@ -358,7 +393,7 @@ module GCal4Ruby
|
|
358
393
|
@status = :cancelled
|
359
394
|
end
|
360
395
|
when 'recurrence'
|
361
|
-
|
396
|
+
self.recurrence_from_google(ele.text) #Recurrence.new(ele.text)
|
362
397
|
when "gd:transparency"
|
363
398
|
case ele.attributes["value"]
|
364
399
|
when "http://schemas.google.com/g/2005#event.transparent"
|
data/lib/gcal4ruby/recurrence.rb
CHANGED
@@ -14,6 +14,8 @@ module GCal4Ruby
|
|
14
14
|
#The Recurrence class stores information on an Event's recurrence. The class implements
|
15
15
|
#the RFC 2445 iCalendar recurrence description.
|
16
16
|
class Recurrence
|
17
|
+
include RiCal
|
18
|
+
|
17
19
|
#The event start date/time
|
18
20
|
attr_reader :start
|
19
21
|
#The event end date/time
|
@@ -27,6 +29,8 @@ module GCal4Ruby
|
|
27
29
|
#True if the event is all day (i.e. no start/end time)
|
28
30
|
attr_accessor :all_day
|
29
31
|
|
32
|
+
attr_accessor :rrule
|
33
|
+
|
30
34
|
#Accepts an optional attributes hash or a string containing a properly formatted ISO 8601 recurrence rule. Returns a new Recurrence object
|
31
35
|
def initialize(vars = {})
|
32
36
|
if vars.is_a? Hash
|
@@ -41,101 +45,150 @@ module GCal4Ruby
|
|
41
45
|
|
42
46
|
#Accepts a string containing a properly formatted ISO 8601 recurrence rule and loads it into the recurrence object
|
43
47
|
def load(rec)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
when 'DTSTART;VALUE=DATE'
|
51
|
-
@start = Time.parse(value)
|
52
|
-
@all_day = true
|
53
|
-
when 'DTSTART;VALUE=DATE-TIME'
|
54
|
-
@start = Time.parse_complete(value)
|
55
|
-
when 'DTEND'
|
56
|
-
@end = Time.parse_complete(value)
|
57
|
-
when 'DTEND;VALUE=DATE'
|
58
|
-
@end = Time.parse(value)
|
59
|
-
when 'DTEND;VALUE=DATE-TIME'
|
60
|
-
@end = Time.parse_complete(value)
|
61
|
-
when 'RRULE'
|
62
|
-
vals = value.split(";")
|
63
|
-
key = ''
|
64
|
-
by = ''
|
65
|
-
int = nil
|
66
|
-
vals.each do |rr|
|
67
|
-
a, h = rr.split("=")
|
68
|
-
case a
|
69
|
-
when 'FREQ'
|
70
|
-
key = h.downcase.capitalize
|
71
|
-
when 'INTERVAL'
|
72
|
-
int = h
|
73
|
-
when 'UNTIL'
|
74
|
-
@repeat_until = Time.parse(value)
|
75
|
-
else
|
76
|
-
by = h.split(",")
|
77
|
-
end
|
78
|
-
end
|
79
|
-
@frequency = {key => by}
|
80
|
-
@frequency.merge({'interval' => int}) if int
|
81
|
-
end
|
48
|
+
rec = "BEGIN:VEVENT\n#{rec}" unless (rec.starts_with? "BEGIN:VEVENT")
|
49
|
+
rec = "#{rec}END:VEVENT\n" unless (rec.ends_with? "END:VEVENT\n")
|
50
|
+
|
51
|
+
@rrule = RiCal.parse_string(rec)
|
52
|
+
if @rrule.is_a? Array
|
53
|
+
@rrule = @rrule.first
|
82
54
|
end
|
55
|
+
# attrs = rec.split("\n")
|
56
|
+
# attrs.each do |val|
|
57
|
+
# key, value = val.split(":")
|
58
|
+
# case key
|
59
|
+
# when 'DTSTART'
|
60
|
+
# @start = Time.parse_complete(value)
|
61
|
+
# when 'DTSTART;VALUE=DATE'
|
62
|
+
# @start = Time.parse(value)
|
63
|
+
# @all_day = true
|
64
|
+
# when 'DTSTART;VALUE=DATE-TIME'
|
65
|
+
# @start = Time.parse_complete(value)
|
66
|
+
# when 'DTEND'
|
67
|
+
# @end = Time.parse_complete(value)
|
68
|
+
# when 'DTEND;VALUE=DATE'
|
69
|
+
# @end = Time.parse(value)
|
70
|
+
# when 'DTEND;VALUE=DATE-TIME'
|
71
|
+
# @end = Time.parse_complete(value)
|
72
|
+
# when 'RRULE'
|
73
|
+
# vals = value.split(";")
|
74
|
+
# key = ''
|
75
|
+
# by = ''
|
76
|
+
# int = nil
|
77
|
+
# vals.each do |rr|
|
78
|
+
# a, h = rr.split("=")
|
79
|
+
# case a
|
80
|
+
# when 'FREQ'
|
81
|
+
# key = h.downcase.capitalize
|
82
|
+
# when 'INTERVAL'
|
83
|
+
# int = h
|
84
|
+
# when 'UNTIL'
|
85
|
+
# @repeat_until = Time.parse(value)
|
86
|
+
# else
|
87
|
+
# by = h.split(",")
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
# @frequency = {key => by}
|
91
|
+
# @frequency.merge({'interval' => int}) if int
|
92
|
+
# end
|
93
|
+
# end
|
83
94
|
end
|
84
95
|
|
85
96
|
#Returns a string with the correctly formatted ISO 8601 recurrence rule
|
86
97
|
def to_s
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
98
|
+
return @rrule.to_s.gsub("BEGIN:VEVENT\n","").gsub("END:VEVENT\n","")
|
99
|
+
#
|
100
|
+
# output = ''
|
101
|
+
# if @all_day
|
102
|
+
# output += "DTSTART;VALUE=DATE:#{@start.utc.strftime("%Y%m%d")}\n"
|
103
|
+
# else
|
104
|
+
# output += "DTSTART;VALUE=DATE-TIME:#{@start.complete}\n"
|
105
|
+
# end
|
106
|
+
# if @all_day
|
107
|
+
# output += "DTEND;VALUE=DATE:#{@end.utc.strftime("%Y%m%d")}\n"
|
108
|
+
# else
|
109
|
+
# output += "DTEND;VALUE=DATE-TIME:#{@end.complete}\n"
|
110
|
+
# end
|
111
|
+
# output += "RRULE:"
|
112
|
+
# if @frequency
|
113
|
+
# f = 'FREQ='
|
114
|
+
# i = ''
|
115
|
+
# by = ''
|
116
|
+
# @frequency.each do |key, v|
|
117
|
+
# if v.is_a?(Array)
|
118
|
+
# if v.size > 0
|
119
|
+
# value = v.join(",")
|
120
|
+
# else
|
121
|
+
# value = nil
|
122
|
+
# end
|
123
|
+
# else
|
124
|
+
# value = v
|
125
|
+
# end
|
126
|
+
# f += "#{key.upcase};" if key != 'interval'
|
127
|
+
# case key.downcase
|
128
|
+
# when "secondly"
|
129
|
+
# by += "BYSECOND=#{value};"
|
130
|
+
# when "minutely"
|
131
|
+
# by += "BYMINUTE=#{value};"
|
132
|
+
# when "hourly"
|
133
|
+
# by += "BYHOUR=#{value};"
|
134
|
+
# when "weekly"
|
135
|
+
# by += "BYDAY=#{value};" if value
|
136
|
+
# when "monthly"
|
137
|
+
# by += "BYDAY=#{value};"
|
138
|
+
# when "yearly"
|
139
|
+
# by += "BYYEARDAY=#{value};"
|
140
|
+
# when 'interval'
|
141
|
+
# i += "INTERVAL=#{value};"
|
142
|
+
# end
|
143
|
+
# end
|
144
|
+
# output += f+i+by
|
145
|
+
# end
|
146
|
+
# if @repeat_until
|
147
|
+
# output += "UNTIL=#{@repeat_until.strftime("%Y%m%d")}"
|
148
|
+
# end
|
149
|
+
#
|
150
|
+
# output += "\n"
|
151
|
+
end
|
152
|
+
|
153
|
+
def to_clio_s
|
154
|
+
# output = ""
|
155
|
+
# if @frequency
|
156
|
+
# f = 'FREQ='
|
157
|
+
# i = ''
|
158
|
+
# by = ''
|
159
|
+
# @frequency.each do |key, v|
|
160
|
+
# if v.is_a?(Array)
|
161
|
+
# if v.size > 0
|
162
|
+
# value = v.join(",")
|
163
|
+
# else
|
164
|
+
# value = nil
|
165
|
+
# end
|
166
|
+
# else
|
167
|
+
# value = v
|
168
|
+
# end
|
169
|
+
# f += "#{key.upcase};" if key != 'interval'
|
170
|
+
# case key.downcase
|
171
|
+
# when "secondly"
|
172
|
+
# by += "BYSECOND=#{value};"
|
173
|
+
# when "minutely"
|
174
|
+
# by += "BYMINUTE=#{value};"
|
175
|
+
# when "hourly"
|
176
|
+
# by += "BYHOUR=#{value};"
|
177
|
+
# when "weekly"
|
178
|
+
# by += "BYDAY=#{value};" if value
|
179
|
+
# when "monthly"
|
180
|
+
# by += "BYDAY=#{value};"
|
181
|
+
# when "yearly"
|
182
|
+
# by += "BYYEARDAY=#{value};"
|
183
|
+
# when 'interval'
|
184
|
+
# i += "INTERVAL=#{value};"
|
185
|
+
# end
|
186
|
+
# end
|
187
|
+
# output += f+i+by
|
188
|
+
# end
|
189
|
+
# if @repeat_until
|
190
|
+
# output += "UNTIL=#{@repeat_until.strftime("%Y%m%d")}"
|
191
|
+
# end
|
139
192
|
end
|
140
193
|
|
141
194
|
#Sets the start date/time. Must be a Time object.
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clio-gcal4ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 5
|
10
|
+
version: 0.3.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mike Reich
|