google_calendar 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ module Google
2
+ class HTTPRequestFailed < StandardError; end
3
+ class HTTPAuthorizationFailed < StandardError; end
4
+ class HTTPNotFound < StandardError; end
5
+ class HTTPTooManyRedirections < StandardError; end
6
+ end
@@ -0,0 +1,150 @@
1
+ require 'nokogiri'
2
+ require 'time'
3
+
4
+ module Google
5
+
6
+ # Represents a google Event.
7
+ #
8
+ # === Attributes
9
+ #
10
+ # * +id+ - The google assigned id of the event (nil until saved), read only.
11
+ # * +title+ - The title of the event, read/write.
12
+ # * +content+ - The content of the event, read/write.
13
+ # * +start_time+ - The start time of the event (Time object, defaults to now), read/write.
14
+ # * +end_time+ - The end time of the event (Time object, defaults to one hour from now), read/write.
15
+ # * +calendar+ - What calendar the event belongs to, read/write.
16
+ # * +raw_xml+ - The full google xml representation of the event.
17
+ #
18
+ class Event
19
+ attr_reader :id, :raw_xml
20
+ attr_accessor :title, :content, :where, :calendar
21
+
22
+ # Create a new event, and optionally set it's attributes.
23
+ #
24
+ # ==== Example
25
+ # Event.new(:title => 'Swimming',
26
+ # :content => 'Do not forget a towel this time',
27
+ # :where => 'The Ocean',
28
+ # :start_time => Time.now,
29
+ # :end_time => Time.now + (60 * 60),
30
+ # :calendar => calendar_object)
31
+ #
32
+ def initialize(params = {})
33
+ @id = params[:id]
34
+ @title = params[:title]
35
+ @content = params[:content]
36
+ @where = params[:where]
37
+ @start_time = params[:start_time]
38
+ @end_time = params[:end_time]
39
+ @calendar = params[:calendar]
40
+ @raw_xml = params[:raw_xml]
41
+ end
42
+
43
+ # Sets the start time of the Event. Must be a Time object or a parsable string representation of a time.
44
+ #
45
+ def start_time=(time)
46
+ raise ArgumentError, "Start Time must be either Time or String" unless (time.is_a?(String) || time.is_a?(Time))
47
+ @start_time = (time.is_a? String) ? Time.parse(time) : time
48
+ end
49
+
50
+ # Get the start_time of the event.
51
+ #
52
+ # If no time is set (i.e. new event) it defaults to the current time.
53
+ #
54
+ def start_time
55
+ @start_time ||= Time.now
56
+ (@start_time.is_a? String) ? @start_time : @start_time.utc.xmlschema
57
+ end
58
+
59
+ # Get the end_time of the event.
60
+ #
61
+ # If no time is set (i.e. new event) it defaults to one hour in the future.
62
+ #
63
+ def end_time
64
+ @end_time ||= Time.now + (60 * 60) # seconds * min
65
+ (@end_time.is_a? String) ? @end_time : @end_time.utc.xmlschema
66
+ end
67
+
68
+ # Sets the end time of the Event. Must be a Time object or a parsable string representation of a time.
69
+ #
70
+ def end_time=(time)
71
+ raise ArgumentError, "End Time must be either Time or String" unless (time.is_a?(String) || time.is_a?(Time))
72
+ @end_time = ((time.is_a? String) ? Time.parse(time) : time)
73
+ end
74
+
75
+ #
76
+ def self.build_from_google_feed(xml, calendar)
77
+ Nokogiri::XML(xml).xpath("//xmlns:entry").collect {|e| new_from_xml(e, calendar)}
78
+ end
79
+
80
+ # Google XMl representation of an evetn object.
81
+ #
82
+ def to_xml
83
+ "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'>
84
+ <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category>
85
+ <title type='text'>#{title}</title>
86
+ <content type='text'>#{content}</content>
87
+ <gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency>
88
+ <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus>
89
+ <gd:where valueString=\"#{where}\"></gd:where>
90
+ <gd:when startTime=\"#{start_time}\" endTime=\"#{end_time}\"></gd:when>
91
+ </entry>"
92
+ end
93
+
94
+ # String representation of an event object.
95
+ #
96
+ def to_s
97
+ "#{title} (#{self.id})\n\t#{start_time}\n\t#{end_time}\n\t#{where}\n\t#{content}"
98
+ end
99
+
100
+ # Saves an event.
101
+ # Note: If using this on an event you created without using a calendar object,
102
+ # make sure to set the calendar before calling this method.
103
+ #
104
+ def save
105
+ update_after_save(@calendar.save_event(self))
106
+ end
107
+
108
+ # Deletes an event.
109
+ # Note: If using this on an event you created without using a calendar object,
110
+ # make sure to set the calendar before calling this method.
111
+ #
112
+ def delete
113
+ @calendar.delete_event(self)
114
+ @id = nil
115
+ end
116
+
117
+ protected
118
+
119
+ # Create a new event from a google 'entry' xml block.
120
+ #
121
+ def self.new_from_xml(xml, calendar) #:nodoc:
122
+ id = xml.at_xpath("gCal:uid")['value'].split('@').first
123
+ title = xml.at_xpath("xmlns:title").content
124
+ content = xml.at_xpath("xmlns:content").content
125
+ where = xml.at_xpath("gd:where")['valueString']
126
+ start_time = xml.at_xpath("gd:when")['startTime']
127
+ end_time = xml.at_xpath("gd:when")['endTime']
128
+
129
+ Event.new(:id => id,
130
+ :title => title,
131
+ :content => content,
132
+ :where => where,
133
+ :start_time => start_time,
134
+ :end_time => end_time,
135
+ :calendar => calendar,
136
+ :raw_xml => xml)
137
+ end
138
+
139
+ # Set the ID after google assigns it (only necessary when we are creating a new event)
140
+ #
141
+ def update_after_save(respose) #:nodoc:
142
+ return if @id && @id != ''
143
+
144
+ xml = Nokogiri::XML(respose.body).at_xpath("//xmlns:entry")
145
+ @id = xml.at_xpath("gCal:uid")['value'].split('@').first
146
+ @raw_xml = xml
147
+ end
148
+
149
+ end
150
+ end
@@ -0,0 +1,19 @@
1
+ require "net/http"
2
+ require "net/https"
3
+
4
+ module Net
5
+
6
+ # Helper Method for using SSL
7
+ #
8
+ class HTTPS < HTTP
9
+
10
+ # Setup a secure connection with defaults
11
+ #
12
+ def initialize(address, port = nil)
13
+ super(address, port)
14
+ self.use_ssl = true
15
+ self.verify_mode = OpenSSL::SSL::VERIFY_NONE
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,6 @@
1
+ module Google
2
+ require 'google/errors'
3
+ autoload :Calendar, 'google/calendar'
4
+ autoload :Connection, 'google/connection'
5
+ autoload :Event, 'google/event'
6
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+ require 'mocha'
13
+
14
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
16
+ require 'google_calendar'
17
+ require 'google/net/https'
18
+
19
+ class Test::Unit::TestCase
20
+ @@mock_path = File.expand_path(File.join(File.dirname(__FILE__), 'mocks'))
21
+ end
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <entry xmlns="http://www.w3.org/2005/Atom" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005">
3
+ <id>http://www.google.com/calendar/feeds/default/private/full/b1vq6rj4r4mg85kcickc7iomb0</id>
4
+ <published>2010-12-13T07:34:25.000Z</published>
5
+ <updated>2010-12-13T07:34:25.000Z</updated>
6
+ <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
7
+ <title type="text">New Event</title>
8
+ <content type="text">A new event</content>
9
+ <link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=YjF2cTZyajRyNG1nODVrY2lja2M3aW9tYjAgc3RldmUuemljaEBt" title="alternate"/>
10
+ <link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/b1vq6rj4r4mg85kcickc7iomb0"/>
11
+ <link rel="edit" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/b1vq6rj4r4mg85kcickc7iomb0/63427908865"/>
12
+ <author>
13
+ <name>Some Guy</name>
14
+ <email>some.guy@gmail.com</email>
15
+ </author>
16
+ <gd:comments>
17
+ <gd:feedLink href="https://www.google.com/calendar/feeds/default/private/full/b1vq6rj4r4mg85kcickc7iomb0/comments"/>
18
+ </gd:comments>
19
+ <gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
20
+ <gd:where valueString="Joe's House"/>
21
+ <gd:who email="some.guy@gmail.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="some.guy@gmail.com"/>
22
+ <gd:when endTime="2010-12-13T01:34:20.000-08:00" startTime="2010-12-13T00:34:20.000-08:00"/>
23
+ <gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
24
+ <gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
25
+ <gCal:anyoneCanAddSelf value="false"/>
26
+ <gCal:guestsCanInviteOthers value="true"/>
27
+ <gCal:guestsCanModify value="false"/>
28
+ <gCal:guestsCanSeeGuests value="true"/>
29
+ <gCal:sequence value="0"/>
30
+ <gCal:uid value="b1vq6rj4r4mg85kcickc7iomb0@google.com"/>
31
+ </entry>
@@ -0,0 +1,119 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005">
3
+ <id>http://www.google.com/calendar/feeds/default/private/full</id>
4
+ <updated>2010-12-10T07:09:25.000Z</updated>
5
+ <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
6
+ <title type="text">Some Guy</title>
7
+ <subtitle type="text">Some Guy</subtitle>
8
+ <link rel="alternate" type="text/html" href="https://www.google.com/calendar/embed?src=some.guy@gmail.com"/>
9
+ <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full"/>
10
+ <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full"/>
11
+ <link rel="http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/batch"/>
12
+ <link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full?q=Test&amp;max-results=25"/>
13
+ <author>
14
+ <name>Some Guy</name>
15
+ <email>some.guy@gmail.com</email>
16
+ </author>
17
+ <generator version="1.0" uri="http://www.google.com/calendar">Google Calendar</generator>
18
+ <openSearch:totalResults>1</openSearch:totalResults>
19
+ <openSearch:startIndex>1</openSearch:startIndex>
20
+ <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
21
+ <gCal:timezone value="America/Los_Angeles"/>
22
+ <gCal:timesCleaned value="0"/>
23
+ <entry>
24
+ <id>http://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio</id>
25
+ <published>2010-04-22T16:05:29.000Z</published>
26
+ <updated>2010-05-01T05:14:18.000Z</updated>
27
+ <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
28
+ <title type="text">Test</title>
29
+ <content type="text"/>
30
+ <link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=b2o2Zm1wYXVsYnZrOW91b2owbGo0djZoaW8gc3RldmUuemljaEBt" title="alternate"/>
31
+ <link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio"/>
32
+ <link rel="edit" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/63408374058"/>
33
+ <author>
34
+ <name>Some Guy</name>
35
+ <email>some.guy@gmail.com</email>
36
+ </author>
37
+ <gd:comments>
38
+ <gd:feedLink href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/comments"/>
39
+ </gd:comments>
40
+ <gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
41
+ <gd:where valueString=""/>
42
+ <gd:who email="some.guy@gmail.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="some.guy@gmail.com"/>
43
+ <gd:when endTime="2010-04-09" startTime="2010-04-08">
44
+ <gd:reminder method="alert" minutes="10"/>
45
+ </gd:when>
46
+ <gd:transparency value="http://schemas.google.com/g/2005#event.transparent"/>
47
+ <gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
48
+ <gCal:anyoneCanAddSelf value="false"/>
49
+ <gCal:guestsCanInviteOthers value="true"/>
50
+ <gCal:guestsCanModify value="false"/>
51
+ <gCal:guestsCanSeeGuests value="true"/>
52
+ <gCal:sequence value="0"/>
53
+ <gCal:uid value="oj6fmpaulbvk9ouoj0lj4v6hio@google.com"/>
54
+ </entry>
55
+ <entry>
56
+ <id>http://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio</id>
57
+ <published>2010-04-22T16:05:29.000Z</published>
58
+ <updated>2010-05-01T05:14:18.000Z</updated>
59
+ <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
60
+ <title type="text">Test</title>
61
+ <content type="text"/>
62
+ <link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=b2o2Zm1wYXVsYnZrOW91b2owbGo0djZoaW8gc3RldmUuemljaEBt" title="alternate"/>
63
+ <link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio"/>
64
+ <link rel="edit" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/63408374058"/>
65
+ <author>
66
+ <name>Some Guy</name>
67
+ <email>some.guy@gmail.com</email>
68
+ </author>
69
+ <gd:comments>
70
+ <gd:feedLink href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/comments"/>
71
+ </gd:comments>
72
+ <gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
73
+ <gd:where valueString=""/>
74
+ <gd:who email="some.guy@gmail.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="some.guy@gmail.com"/>
75
+ <gd:when endTime="2010-04-09" startTime="2010-04-08">
76
+ <gd:reminder method="alert" minutes="10"/>
77
+ </gd:when>
78
+ <gd:transparency value="http://schemas.google.com/g/2005#event.transparent"/>
79
+ <gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
80
+ <gCal:anyoneCanAddSelf value="false"/>
81
+ <gCal:guestsCanInviteOthers value="true"/>
82
+ <gCal:guestsCanModify value="false"/>
83
+ <gCal:guestsCanSeeGuests value="true"/>
84
+ <gCal:sequence value="0"/>
85
+ <gCal:uid value="oj6fmpaulbvk9ouoj0lj4v6hio@google.com"/>
86
+ </entry>
87
+ <entry>
88
+ <id>http://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio</id>
89
+ <published>2010-04-22T16:05:29.000Z</published>
90
+ <updated>2010-05-01T05:14:18.000Z</updated>
91
+ <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
92
+ <title type="text">Test</title>
93
+ <content type="text"/>
94
+ <link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=b2o2Zm1wYXVsYnZrOW91b2owbGo0djZoaW8gc3RldmUuemljaEBt" title="alternate"/>
95
+ <link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio"/>
96
+ <link rel="edit" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/63408374058"/>
97
+ <author>
98
+ <name>Some Guy</name>
99
+ <email>some.guy@gmail.com</email>
100
+ </author>
101
+ <gd:comments>
102
+ <gd:feedLink href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/comments"/>
103
+ </gd:comments>
104
+ <gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
105
+ <gd:where valueString=""/>
106
+ <gd:who email="some.guy@gmail.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="some.guy@gmail.com"/>
107
+ <gd:when endTime="2010-04-09" startTime="2010-04-08">
108
+ <gd:reminder method="alert" minutes="10"/>
109
+ </gd:when>
110
+ <gd:transparency value="http://schemas.google.com/g/2005#event.transparent"/>
111
+ <gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
112
+ <gCal:anyoneCanAddSelf value="false"/>
113
+ <gCal:guestsCanInviteOthers value="true"/>
114
+ <gCal:guestsCanModify value="false"/>
115
+ <gCal:guestsCanSeeGuests value="true"/>
116
+ <gCal:sequence value="0"/>
117
+ <gCal:uid value="oj6fmpaulbvk9ouoj0lj4v6hio@google.com"/>
118
+ </entry>
119
+ </feed>
@@ -0,0 +1,33 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <entry xmlns="http://www.w3.org/2005/Atom" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005">
3
+ <id>http://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio</id>
4
+ <published>2010-04-22T16:05:29.000Z</published>
5
+ <updated>2010-05-01T05:14:18.000Z</updated>
6
+ <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
7
+ <title type="text">Test</title>
8
+ <content type="text"/>
9
+ <link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=b2o2Zm1wYXVsYnZrOW91b2owbGo0djZoaW8gc3RldmUuemljaEBt" title="alternate"/>
10
+ <link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio"/>
11
+ <link rel="edit" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/63408374058"/>
12
+ <author>
13
+ <name>Some Guy</name>
14
+ <email>some.guy@gmail.com</email>
15
+ </author>
16
+ <gd:comments>
17
+ <gd:feedLink href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/comments"/>
18
+ </gd:comments>
19
+ <gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
20
+ <gd:where valueString=""/>
21
+ <gd:who email="some.guy@gmail.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="some.guy@gmail.com"/>
22
+ <gd:when endTime="2010-04-09" startTime="2010-04-08">
23
+ <gd:reminder method="alert" minutes="10"/>
24
+ </gd:when>
25
+ <gd:transparency value="http://schemas.google.com/g/2005#event.transparent"/>
26
+ <gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
27
+ <gCal:anyoneCanAddSelf value="false"/>
28
+ <gCal:guestsCanInviteOthers value="true"/>
29
+ <gCal:guestsCanModify value="false"/>
30
+ <gCal:guestsCanSeeGuests value="true"/>
31
+ <gCal:sequence value="0"/>
32
+ <gCal:uid value="oj6fmpaulbvk9ouoj0lj4v6hio@google.com"/>
33
+ </entry>
@@ -0,0 +1,55 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005">
3
+ <id>http://www.google.com/calendar/feeds/default/private/full</id>
4
+ <updated>2010-12-10T07:09:25.000Z</updated>
5
+ <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
6
+ <title type="text">Some Guy</title>
7
+ <subtitle type="text">Some Guy</subtitle>
8
+ <link rel="alternate" type="text/html" href="https://www.google.com/calendar/embed?src=some.guy@gmail.com"/>
9
+ <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full"/>
10
+ <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full"/>
11
+ <link rel="http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/batch"/>
12
+ <link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full?q=Test&amp;max-results=25"/>
13
+ <author>
14
+ <name>Some Guy</name>
15
+ <email>some.guy@gmail.com</email>
16
+ </author>
17
+ <generator version="1.0" uri="http://www.google.com/calendar">Google Calendar</generator>
18
+ <openSearch:totalResults>1</openSearch:totalResults>
19
+ <openSearch:startIndex>1</openSearch:startIndex>
20
+ <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
21
+ <gCal:timezone value="America/Los_Angeles"/>
22
+ <gCal:timesCleaned value="0"/>
23
+ <entry>
24
+ <id>http://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio</id>
25
+ <published>2010-04-22T16:05:29.000Z</published>
26
+ <updated>2010-05-01T05:14:18.000Z</updated>
27
+ <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
28
+ <title type="text">Test</title>
29
+ <content type="text"/>
30
+ <link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=b2o2Zm1wYXVsYnZrOW91b2owbGo0djZoaW8gc3RldmUuemljaEBt" title="alternate"/>
31
+ <link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio"/>
32
+ <link rel="edit" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/63408374058"/>
33
+ <author>
34
+ <name>Some Guy</name>
35
+ <email>some.guy@gmail.com</email>
36
+ </author>
37
+ <gd:comments>
38
+ <gd:feedLink href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/comments"/>
39
+ </gd:comments>
40
+ <gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
41
+ <gd:where valueString="At School"/>
42
+ <gd:who email="some.guy@gmail.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="some.guy@gmail.com"/>
43
+ <gd:when endTime="2010-04-09" startTime="2010-04-08">
44
+ <gd:reminder method="alert" minutes="10"/>
45
+ </gd:when>
46
+ <gd:transparency value="http://schemas.google.com/g/2005#event.transparent"/>
47
+ <gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
48
+ <gCal:anyoneCanAddSelf value="false"/>
49
+ <gCal:guestsCanInviteOthers value="true"/>
50
+ <gCal:guestsCanModify value="false"/>
51
+ <gCal:guestsCanSeeGuests value="true"/>
52
+ <gCal:sequence value="0"/>
53
+ <gCal:uid value="oj6fmpaulbvk9ouoj0lj4v6hio@google.com"/>
54
+ </entry>
55
+ </feed>