googlecalendar 0.0.6 → 1.0.0

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.
@@ -1,9 +1,21 @@
1
1
  = Versions
2
+ === 1.0.0 (Nov 18th, 2008)
3
+ * New svn repository layout (with trunk, branches and tags)
4
+ * Using newgen for project maintenance and website generation
5
+ * Old website http://benjamin.francisoud.googlepages.com/googlecalendar is DEPRECATED
6
+ * New website http://googlecalendar.rubyforge.org
7
+ * Changed from Apache License to MIT License - no big deal, googlecalendar for ruby is still free to use,modify, extend and will ever be ;)s
8
+ * Fixed a bug when parsing a calendar summary with ':' in it
9
+ Thanks to Gregor Schmidt for his contribution :)
10
+ * dsl methods html and text create output dir if missing
11
+
12
+
2
13
  === 0.0.6 (Dec 03rd, 2007)
3
14
  * Added add_reminder and reset_reminders to GData (see examples/ruby_standalone/gdata_new_event_reminder.rb)
4
15
  Contribution: Nicolas Fouché
5
16
  * Added "Quick Add" (see examples/ruby_standalone/gdata_quick_add.rb)
6
17
  Contribution: Levi Kennedy
18
+ * Fixed white space in '@ location.to_s'
7
19
 
8
20
  === 0.0.5 (Sept 24th, 2007)
9
21
  * You can now set a different google url in GData class (default value is www.google.com)
data/Manifest.txt ADDED
@@ -0,0 +1,20 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ README.txt
6
+ Rakefile
7
+ bin/googlecalendar4ruby
8
+ html/scripts.js
9
+ html/styles.css
10
+ lib/builders.rb
11
+ lib/googlecalendar.rb
12
+ lib/googlecalendar/calendar.rb
13
+ lib/googlecalendar/dsl.rb
14
+ lib/googlecalendar/event.rb
15
+ lib/googlecalendar/gcalendar.rb
16
+ lib/googlecalendar/gdata.rb
17
+ lib/googlecalendar/ical.rb
18
+ lib/googlecalendar/net.rb
19
+ lib/googlecalendar/version.rb
20
+ lib/googlecalendar_builders.rb
data/PostInstall.txt ADDED
@@ -0,0 +1,14 @@
1
+ Thanks a lot for installing googlecalendar for ruby ;)
2
+
3
+ If you are migrating from version 0.0.x to 1.0.0, you will need to add:
4
+
5
+ require 'googlecalendar'
6
+ ** include Googlecalendar **
7
+
8
+ If you where using the 'builders' with:
9
+ require 'builders' # DEPRECATED
10
+ is replaced by
11
+ require 'googlecalendar_builders'
12
+
13
+ For more information on googlecalendar, see http://googlecalendar.rubyforge.org
14
+
data/README.rdoc ADDED
@@ -0,0 +1,55 @@
1
+ = Google Calendar
2
+
3
+ * Website (http://googlecalendar.rubyforge.org/)
4
+
5
+ == DESCRIPTION:
6
+
7
+ The Google Calendar project provides
8
+ * Ruby api's to connect to google calendars (standalone, without rails)
9
+ * A plugin for Ruby On Rails
10
+ * Export features (text file or simple html page)
11
+
12
+ == FEATURES:
13
+
14
+ * api to connect ot google calendars
15
+ * log into your calendar account
16
+ * list calendars
17
+ * compatible with google apps accounts
18
+ * add events, reminders
19
+ * browse events
20
+ * export to text file
21
+ * export to html
22
+ * and many more...
23
+
24
+ == INSTALL:
25
+
26
+ * sudo gem install googlecalendar
27
+
28
+ == Author
29
+
30
+ Benjamin Francisoud - http://rubyscube.blogspot.com
31
+
32
+ == LICENSE:
33
+
34
+ (The MIT License)
35
+
36
+ Copyright (c) 2008 Benjamin Francisoud
37
+
38
+ Permission is hereby granted, free of charge, to any person obtaining
39
+ a copy of this software and associated documentation files (the
40
+ 'Software'), to deal in the Software without restriction, including
41
+ without limitation the rights to use, copy, modify, merge, publish,
42
+ distribute, sublicense, and/or sell copies of the Software, and to
43
+ permit persons to whom the Software is furnished to do so, subject to
44
+ the following conditions:
45
+
46
+ The above copyright notice and this permission notice shall be
47
+ included in all copies or substantial portions of the Software.
48
+
49
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
50
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
51
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
52
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
53
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
54
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
55
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.txt ADDED
@@ -0,0 +1,55 @@
1
+ = Google Calendar
2
+
3
+ * Website (http://googlecalendar.rubyforge.org/)
4
+
5
+ == DESCRIPTION:
6
+
7
+ The Google Calendar project provides
8
+ * Ruby api's to connect to google calendars (standalone, without rails)
9
+ * A plugin for Ruby On Rails
10
+ * Export features (text file or simple html page)
11
+
12
+ == FEATURES:
13
+
14
+ * api to connect ot google calendars
15
+ * log into your calendar account
16
+ * list calendars
17
+ * compatible with google apps accounts
18
+ * add events, reminders
19
+ * browse events
20
+ * export to text file
21
+ * export to html
22
+ * and many more...
23
+
24
+ == INSTALL:
25
+
26
+ * sudo gem install googlecalendar
27
+
28
+ == Author
29
+
30
+ Benjamin Francisoud - http://rubyscube.blogspot.com
31
+
32
+ == LICENSE:
33
+
34
+ (The MIT License)
35
+
36
+ Copyright (c) 2008 Benjamin Francisoud
37
+
38
+ Permission is hereby granted, free of charge, to any person obtaining
39
+ a copy of this software and associated documentation files (the
40
+ 'Software'), to deal in the Software without restriction, including
41
+ without limitation the rights to use, copy, modify, merge, publish,
42
+ distribute, sublicense, and/or sell copies of the Software, and to
43
+ permit persons to whom the Software is furnished to do so, subject to
44
+ the following conditions:
45
+
46
+ The above copyright notice and this permission notice shall be
47
+ included in all copies or substantial portions of the Software.
48
+
49
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
50
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
51
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
52
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
53
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
54
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
55
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'config/requirements'
2
+ require 'config/hoe' # setup Hoe + all gem configuration
3
+
4
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Benjamin Francisoud on 2008-10-18.
4
+ # Copyright (c) 2008. All rights reserved.
5
+
6
+ begin
7
+ require 'rubygems'
8
+ rescue LoadError
9
+ # no rubygems to load, so we fail silently
10
+ end
11
+
12
+ require 'optparse'
13
+
14
+ # NOTE: the option -p/--path= is given as an example, and should probably be replaced in your application.
15
+
16
+ OPTIONS = {
17
+ :path => '~'
18
+ }
19
+ MANDATORY_OPTIONS = %w( )
20
+
21
+ parser = OptionParser.new do |opts|
22
+ opts.banner = <<BANNER
23
+ This application is wonderful because...
24
+
25
+ Usage: #{File.basename($0)} [options]
26
+
27
+ Options are:
28
+ BANNER
29
+ opts.separator ""
30
+ opts.on("-p", "--path=PATH", String,
31
+ "The root path for selecting files",
32
+ "Default: ~") { |OPTIONS[:path]| }
33
+ opts.on("-h", "--help",
34
+ "Show this help message.") { puts opts; exit }
35
+ opts.parse!(ARGV)
36
+
37
+ if MANDATORY_OPTIONS && MANDATORY_OPTIONS.find { |option| OPTIONS[option.to_sym].nil? }
38
+ puts opts; exit
39
+ end
40
+ end
41
+
42
+ path = OPTIONS[:path]
43
+
44
+ # do stuff
data/html/scripts.js ADDED
@@ -0,0 +1,9 @@
1
+ <script language="javascript">
2
+ function displayHideSection(labelSection) {
3
+ if ((document.getElementById(labelSection).style.display == "") || (document.getElementById(labelSection).style.display == "none")) {
4
+ document.getElementById(labelSection).style.display = "block";
5
+ } else if (document.getElementById(labelSection).style.display == "block") {
6
+ document.getElementById(labelSection).style.display = "none";
7
+ }
8
+ }
9
+ </script>
data/html/styles.css ADDED
@@ -0,0 +1,11 @@
1
+ <style type="text/css">
2
+ body{background:#ffffff;color:#000000;font:0.9em "Trebuchet MS",Trebuchet,Verdana,Sans-Serif;}
3
+ a:hover{color: #ff6835;}
4
+ a:visited {color: #c63200;}
5
+ h1,h2,h3,h4,h5,h6{padding:0px;margin:0px;}
6
+ h1 a:link{text-decoration:none;color:#FFFAFA;}
7
+ h1 a:visited{text-decoration:none;color:#FFFAFA;}
8
+ h1{padding:18px 0px 10px 5%;margin:0px 0px 8px 0px;border-top:solid 9px #FF7F50;border-bottom:solid 1px #DEB887;color:#FFFAFA;background:#8e2400;font:bold 266% Verdana,Sans-Serif;}
9
+ h2{margin:0px 0px 10px 0px;padding:2px 0px 2px 5px;border-right:solid 1px #f5f5f5;border-bottom:solid 1px #dddddd;border-top:solid 1px #f5f5f5;border-left:solid 1px #f5f5f5;color:#555555;background:#eeeeee;font:bold 110% Verdana,Sans-Serif;}
10
+ .details{margin:10px 10px 10px 10px;padding:2px 2px 2px 2px;display:none}
11
+ </style>
data/lib/builders.rb CHANGED
@@ -1,96 +1,3 @@
1
- require File.dirname(__FILE__) + '/googlecalendar'
1
+ require File.dirname(__FILE__) + '/googlecalendar_builders'
2
2
 
3
- class TextBuilder
4
- attr_accessor :calendar, :filename
5
-
6
- def export
7
- begin
8
- File.delete(@filename)
9
- rescue
10
- # if doesn't exist
11
- end
12
- File.open(@filename, File::CREAT|File::RDWR) do |file|
13
- file << calendar.to_s
14
- end
15
- end
16
- end
17
-
18
- def text(calendar, filename)
19
- text_builder = TextBuilder.new
20
- text_builder.calendar = calendar
21
- text_builder.filename = filename
22
- text_builder.export
23
- end
24
-
25
- class HtmlBuilder
26
- attr_accessor :calendar, :filename, :date_format
27
-
28
- def export
29
- begin
30
- File.delete(@filename)
31
- rescue
32
- # if doesn't exist
33
- end
34
- File.open(@filename, File::CREAT|File::RDWR) do |file|
35
- file << "<html><head>\n"
36
- file << "<title>Calendar</tilte>\n"
37
- IO.foreach("html/styles.css") { |line| file << line }
38
- file << "\n"
39
- IO.foreach("html/scripts.js") { |line| file << line }
40
- file << "\n</head>\n<body>"
41
- file << summary
42
- event_number = 0
43
- @calendar.events.each do |event|
44
- file << "<p class=\"event\">"
45
- file << "<h2>Event [" + event.start_date.to_s + "]</h2>"
46
- file << "<div><b>From: </b>" + event.start_date.to_s + "<b> -&gt; To:</b> " + event.end_date.to_s + "</div>"
47
- file << div(event, 'summary')
48
- file << details(event, event_number)
49
- file << "</p>\n"
50
- event_number += 1
51
- end
52
- file << "</body></html>"
53
- end
54
- end
55
-
56
- def format(date)
57
- Date.strptime(date, @date_format)
58
- end
59
-
60
- def summary
61
- data = "<p class=\"calendar\">"
62
- data << "<h1>Calendar</h1>"
63
- data << div(@calendar, 'version')
64
- data << div(@calendar, 'scale')
65
- data << div(@calendar, 'method')
66
- data << "<div><b>number of events: </b>" + @calendar.events.size.to_s + "</div>"
67
- data << "</p>\n"
68
- return data
69
- end
70
-
71
- def details(event, number)
72
- details = "<a href=\"javascript:displayHideSection('details" + number.to_s + "');\">Display details</a>"
73
- details << "<div id=\"details" + number.to_s + "\" class=\"details\">"
74
- details << div(event, 'start_date')
75
- details << div(event, 'end_date')
76
- details << div(event, 'time_stamp')
77
- details << div(event, 'created')
78
- details << div(event, 'last_modified')
79
- details << div(event, 'status')
80
- details << div(event, 'rrule')
81
- details << div(event, 'class_name')
82
- details << "</div>"
83
- end
84
-
85
- def div(object, field)
86
- "<div><b>" + field.capitalize + ": </b>" + object.send(field).to_s + "</div>\n"
87
- end
88
- end
89
-
90
- def html(calendar, filename)
91
- html_builder = HtmlBuilder.new
92
- html_builder.calendar = calendar
93
- html_builder.filename = filename
94
- html_builder.date_format = "%d-%m-%y" #"%F"#"%A %B %d %Y" #"%d-%m-%Y"
95
- html_builder.export
96
- end
3
+ puts "Warning: [googlecalendar] require 'builders' is DEPRECATED use require 'googlecalendar_builders' instead ! Will be remove in next versions..."
@@ -1,384 +1,10 @@
1
- require 'net/http'
2
- require 'net/https'
3
- require 'uri'
4
- require "rexml/document"
5
-
6
- class Calendar
7
- attr_accessor :product_id, :version, :scale, :method, :events
8
-
9
- def add(event)
10
- # create events if it doesn't exist
11
- @events ||= []
12
- @events.push event
13
- end
14
-
15
- def to_s
16
- data = "########## calendar ##########\n"
17
- data << 'version: ' + @version.to_s + "\n"
18
- data << 'scale: ' + @scale.to_s + "\n"
19
- data << 'method: ' + @method.to_s + "\n"
20
- data << 'number of events: ' + @events.size.to_s + "\n"
21
- @events.each do |event|
22
- data << event.to_s
23
- end
24
- return data
25
- end
26
- end
27
-
28
- class GCalendar
29
- attr_reader :title, :url
30
-
31
- def initialize(title, url)
32
- @title = title
33
- @url = url
34
- end
35
- end
36
-
37
- class Event
38
- attr_accessor :start_date, :end_date, :time_stamp, :class_name, :created, :last_modified, :status, :summary, :description, :location, :rrule
39
-
40
- def to_s
41
- data = "---------- event ----------\n"
42
- data << 'start_date: ' + @start_date.to_s + "\n"
43
- data << 'end_date: ' + @end_date.to_s + "\n"
44
- data << 'time_stamp: ' + @time_stamp.to_s + "\n"
45
- data << 'class_name: ' + @class_name.to_s + "\n"
46
- data << 'created: ' + @created.to_s + "\n"
47
- data << 'last_modified: ' + @last_modified.to_s + "\n"
48
- data << 'status: ' + @status.to_s + "\n"
49
- data << 'rrule: ' + @rrule.to_s + "\n"
50
- data << 'summary: ' + @summary.to_s + "\n"
51
- data << 'desription: ' + @desription.to_s + "\n"
52
- data << 'location: ' + @location.to_s + "\n"
53
- return data
54
- end
55
-
56
- # 'FREQ=WEEKLY;BYDAY=MO;WKST=MO'
57
- def rrule_as_hash
58
- array = @rrule.split(';')
59
- hash = Hash.new
60
- array.each do |item|
61
- pair = item.split('=')
62
- hash[pair[0]] = pair[1]
63
- end
64
- return hash
65
- end
66
- end
67
-
68
- #
69
- # Make it east to use some of the convenience methods using https
70
- #
71
- module Net
72
- class HTTPS < HTTP
73
- def initialize(address, port = nil)
74
- super(address, port)
75
- self.use_ssl = true
76
- end
77
- end
78
- end
79
-
80
- # A ruby class to wrap calls to the Google Data API
81
- #
82
- # More informations
83
- #
84
- # Google calendar API: http://code.google.com/apis/calendar/developers_guide_protocol.html
85
- class GData
86
- attr_accessor :google_url
87
-
88
- def initialize(google='www.google.com')
89
- @calendars = []
90
- @google_url = google
91
- end
92
-
93
- #Log into google data, this method needs to be call once before using other methods of the class
94
- #* Email The user's email address.
95
- #* Passwd The user's password.
96
- #* source Identifies your client application. Should take the form companyName-applicationName-versionID
97
- #*Warning* Replace the default value with something like:
98
- #+companyName-applicationName-versionID+
99
- def login(email, pwd, source='googlecalendar.rubyforge.org-googlecalendar-default')
100
- # service The string cl, which is the service name for Google Calendar.
101
- @user_id = email
102
- response = Net::HTTPS.post_form(URI.parse("https://#{@google_url}/accounts/ClientLogin"),
103
- { 'Email' => email,
104
- 'Passwd' => pwd,
105
- 'source' => source,
106
- 'accountType' => 'HOSTED_OR_GOOGLE',
107
- 'service' => 'cl'})
108
- response.error! unless response.kind_of? Net::HTTPSuccess
109
- @token = response.body.split(/=/).last
110
- @headers = {
111
- 'Authorization' => "GoogleLogin auth=#{@token}",
112
- 'Content-Type' => 'application/atom+xml'
113
- }
114
- return @token
115
- end
116
-
117
- # Reset reminders
118
- def reset_reminders(event)
119
- event[:reminders] = ""
120
- end
121
-
122
- # Add a reminder to the event hash
123
- #* reminderMinutes
124
- #* reminderMethod [email, alert, sms, none]
125
- def add_reminder(event, reminderMinutes, reminderMethod)
126
- event[:reminders] = event[:reminders].to_s +
127
- "<gd:reminder minutes='#{reminderMinutes}' method='#{reminderMethod}' />\n"
128
- end
129
-
130
- # Create a quick add event
131
- #
132
- # <tt>text = 'Tennis with John April 11 3pm-3:30pm'</tt>
133
- #
134
- # http://code.google.com/apis/calendar/developers_guide_protocol.html#CreatingQuickAdd
135
- def quick_add(text)
136
- content = <<EOF
137
- <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gCal='http://schemas.google.com/gCal/2005'>
138
- <content type="html">#{text}</content>
139
- <gCal:quickadd value="true"/>
140
- </entry>
141
- EOF
142
- post_event(content)
143
- end
144
-
145
- #'event' param is a hash containing
146
- #* :title
147
- #* :content
148
- #* :author
149
- #* :email
150
- #* :where
151
- #* :startTime '2007-06-06T15:00:00.000Z'
152
- #* :endTime '2007-06-06T17:00:00.000Z'
153
- #
154
- # Use add_reminder(event, reminderMinutes, reminderMethod) method to add reminders
155
- def new_event(event={},calendar = nil)
156
- new_event = template(event)
157
- post_event(new_event, calendar)
158
- end
159
-
160
- def post_event(xml, calendar = nil)
161
- #Get calendar url
162
- calendar_url = if calendar
163
- get_calendars
164
- find_calendar(calendar).url
165
- else
166
- # We will use user'default calendar in this case
167
- '/calendar/feeds/default/private/full'
168
- end
169
-
170
- http = Net::HTTP.new(@google_url, 80)
171
- response, data = http.post(calendar_url, xml, @headers)
172
- case response
173
- when Net::HTTPSuccess, Net::HTTPRedirection
174
- redirect_response, redirect_data = http.post(response['location'], xml, @headers)
175
- case response
176
- when Net::HTTPSuccess, Net::HTTPRedirection
177
- return redirect_response
178
- else
179
- response.error!
180
- end
181
- else
182
- response.error!
183
- end
184
- end
185
-
186
- # Retreive user's calendar urls.
187
- def get_calendars
188
- http = Net::HTTP.new(@google_url, 80)
189
- response, data = http.get("http://#{@google_url}/calendar/feeds/" + @user_id, @headers)
190
- case response
191
- when Net::HTTPSuccess, Net::HTTPRedirection
192
- redirect_response, redirect_data = http.get(response['location'], @headers)
193
- case response
194
- when Net::HTTPSuccess, Net::HTTPRedirection
195
- doc = REXML::Document.new redirect_data
196
- doc.elements.each('//entry')do |e|
197
- title = e.elements['title'].text
198
- url = e.elements['link'].attributes['href']
199
- @calendars << GCalendar.new(title, url.sub!("http://#{@google_url}",''))
200
- end
201
- return redirect_response
202
- else
203
- response.error!
204
- end
205
- else
206
- response.error!
207
- end
208
- end
209
-
210
- def find_calendar(x)
211
- @calendars.find {|c| c.title.match x}
212
- end
213
-
214
- # The atom event template to submit a new event
215
- def template(event={})
216
- content = <<EOF
217
- <?xml version="1.0"?>
218
- <entry xmlns='http://www.w3.org/2005/Atom'
219
- xmlns:gd='http://schemas.google.com/g/2005'>
220
- <category scheme='http://schemas.google.com/g/2005#kind'
221
- term='http://schemas.google.com/g/2005#event'></category>
222
- <title type='text'>#{event[:title]}</title>
223
- <content type='text'>#{event[:content]}</content>
224
- <author>
225
- <name>#{event[:author]}</name>
226
- <email>#{event[:email]}</email>
227
- </author>
228
- <gd:transparency
229
- value='http://schemas.google.com/g/2005#event.opaque'>
230
- </gd:transparency>
231
- <gd:eventStatus
232
- value='http://schemas.google.com/g/2005#event.confirmed'>
233
- </gd:eventStatus>
234
- <gd:where valueString='#{event[:where]}'></gd:where>
235
- <gd:when startTime='#{event[:startTime]}' endTime='#{event[:endTime]}'>
236
- #{event[:reminders]}
237
- </gd:when>
238
- </entry>
239
- EOF
240
- end
241
- end # GData class
242
-
243
- class ICALParser
244
- attr_reader :calendar
245
-
246
- def parse(data)
247
- lines = data.split("\n")
248
-
249
- reset_prefix
250
- lines.each do |line|
251
- handle_element(line)
252
- end
253
-
254
- return @calendar
255
- end
256
-
257
- def handle_element(line)
258
- pair = line.split(':')
259
- name = pair[0]
260
- value = pair[1]
261
- handler_method = @method_prefix + name.split(';')[0].tr('-', '_').downcase
262
- if self.respond_to? handler_method
263
- self.send(handler_method, value.chomp)
264
- end
265
- end
266
-
267
- def reset_prefix
268
- @method_prefix = "handle_"
269
- end
270
-
271
- def handle_begin(value)
272
- if value == "VCALENDAR"
273
- handle_vcalendar_begin(value)
274
- elsif value == "VEVENT"
275
- handle_vevent_begin(value)
276
- end
277
- end
278
-
279
- def handle_vcalendar_end(value)
280
- reset_prefix
281
- end
282
-
283
- def handle_vcalendar_begin(value)
284
- @calendar = Calendar.new
285
- @method_prefix = @method_prefix + value.downcase + "_"
286
- end
287
-
288
- def handle_vcalendar_version(value)
289
- @calendar.version = value
290
- end
291
-
292
- def handle_vcalendar_calscale(value)
293
- @calendar.scale = value
294
- end
295
-
296
- def handle_vcalendar_method(value)
297
- @calendar.method = value
298
- # FIXME don't like to do this!
299
- reset_prefix
300
- end
301
-
302
- def handle_vevent_begin(value)
303
- event = Event.new
304
- @calendar.add event
305
- @method_prefix = @method_prefix + value.downcase + "_"
306
- end
307
-
308
- def handle_vevent_end(value)
309
- reset_prefix
310
- end
311
-
312
- def handle_vevent_dtstart(value)
313
- @calendar.events.last.start_date = Date.parse(value)
314
- end
315
-
316
- def handle_vevent_dtend(value)
317
- @calendar.events.last.end_date = Date.parse(value)
318
- end
319
-
320
- def handle_vevent_dtstamp(value)
321
- @calendar.events.last.time_stamp = DateTime.parse(value)
322
- end
323
-
324
- def handle_vevent_class(value)
325
- @calendar.events.last.class_name = value
326
- end
327
-
328
- def handle_vevent_created(value)
329
- @calendar.events.last.created = DateTime.parse(value)
330
- end
331
-
332
- def handle_vevent_last_modified(value)
333
- @calendar.events.last.last_modified = DateTime.parse(value)
334
- end
335
-
336
- def handle_vevent_status(value)
337
- @calendar.events.last.status = value
338
- end
339
-
340
- def handle_vevent_summary(value)
341
- @calendar.events.last.summary = value
342
- end
343
-
344
- def handle_vevent_rrule(value)
345
- @calendar.events.last.rrule = value
346
- end
347
-
348
- def handle_vevent_description(value)
349
- @calendar.events.last.description = value
350
- end
351
-
352
- def handle_vevent_location(value)
353
- @calendar.events.last.location = value
354
- end
355
- end
356
-
357
- def parse(data)
358
- parser = ICALParser.new
359
- parser.parse(data)
360
- end
361
-
362
- def scan(ical_url, base_url='www.google.com')
363
- Net::HTTP.start(base_url, 80) do |http|
364
- response, data = http.get(ical_url)
365
- case response
366
- when Net::HTTPSuccess, Net::HTTPRedirection
367
- return data
368
- else
369
- response.error!
370
- end
371
- end
372
- end
373
-
374
- def scan_proxy(proxy_addr, proxy_port, ical_url, base_url='www.google.com')
375
- Net::HTTP::Proxy(proxy_addr, proxy_port).start(base_url, 80) do |http|
376
- response, data = http.get(ical_url)
377
- case response
378
- when Net::HTTPSuccess, Net::HTTPRedirection
379
- return data
380
- else
381
- response.error!
382
- end
383
- end
384
- end
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module Googlecalendar
5
+ # List of lib files to include
6
+ FILES = %w{calendar.rb dsl.rb event.rb gcalendar.rb gdata.rb ical.rb net.rb version.rb}
7
+ end
8
+
9
+ # Add all FILES as require
10
+ Googlecalendar::FILES.each { |f| require "googlecalendar/#{f}"}