gcalapi 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,13 @@
1
+ = GoogleCalendar -- Google Calendar API
2
+
3
+ == Installation
4
+
5
+ # gem install gcalapi
6
+
7
+ == License
8
+
9
+ This library is public domain software.
10
+
11
+ == Author
12
+
13
+ zoriorz@gmail.com
@@ -0,0 +1,82 @@
1
+ require 'rake/gempackagetask'
2
+ require "rake/contrib/rubyforgepublisher"
3
+
4
+ require 'rbconfig'
5
+ include Config
6
+
7
+ PKG_NAME = 'gcalapi'
8
+ PKG_VERSION = File.read('VERSION').chomp
9
+ PKG_FILES = FileList["**/*"].exclude(".svn").exclude("pkg").exclude("test/temp_*.rb").exclude("test/parameters.rb")
10
+
11
+ desc "Installing library"
12
+ task :install do
13
+ ruby 'install.rb'
14
+ end
15
+
16
+ desc "Testing library"
17
+ task :test do
18
+ sh '(cd test; sh all.sh)'
19
+ end
20
+
21
+ desc "Removing generated files"
22
+ task :clean do
23
+ rm_rf 'html'
24
+ end
25
+
26
+ # Create RDOC documentation.
27
+ task :rdoc do
28
+ sh "rdoc -S -o html README lib/googlecalendar/*.rb"
29
+ end
30
+
31
+ spec = Gem::Specification.new do |s|
32
+ #### Basic information.
33
+
34
+ s.name = PKG_NAME
35
+ s.version = PKG_VERSION
36
+ s.summary = "Google Calendar API"
37
+ s.description = ""
38
+
39
+ #### Dependencies and requirements.
40
+
41
+ s.files = PKG_FILES
42
+
43
+ #### C code extensions.
44
+
45
+ #s.extensions << "ext/extconf.rb"
46
+
47
+ #### Load-time details: library and application (you will need one or both).
48
+
49
+ s.require_path = 'lib' # Use these for libraries.
50
+ s.autorequire = "googlecalendar/calendar"
51
+
52
+ #### Documentation and testing.
53
+
54
+ s.has_rdoc = true
55
+ #s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
56
+ s.extra_rdoc_files = 'README'
57
+ s.rdoc_options << '--line-numbers' << '--inline-source'
58
+ #s.rdoc_options <<
59
+ # '--title' << 'Rake -- Ruby Make' <<
60
+ # '--main' << 'README' <<
61
+ # '--line-numbers'
62
+ s.test_files = Dir.glob('test/*_test.rb')
63
+
64
+ #### Author and project details.
65
+
66
+ s.author = "zorio"
67
+ s.email = "zoriorz@gmail.com"
68
+ s.homepage = "http://gcalapi.rubyforge.net"
69
+ s.rubyforge_project = "gcalapi"
70
+ end
71
+
72
+ Rake::GemPackageTask.new(spec) do |pkg|
73
+ pkg.need_tar = true
74
+ pkg.package_files += PKG_FILES
75
+ end
76
+
77
+ task :release => [ :clean, :package ]
78
+
79
+ desc "Publish to RubyForge"
80
+ task :rubyforge => [:rdoc, :package] do
81
+ Rake::RubyForgePublisher.new(PKG_NAME, "zorio").upload
82
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.3
@@ -0,0 +1,101 @@
1
+ require "kconv"
2
+ require "yaml"
3
+ require "net/pop"
4
+ require "googlecalendar/calendar"
5
+
6
+ #
7
+ # This example shows how to create an event for Google Calendar from an e-mail.
8
+ #
9
+ # 1. the subject of the email must be 'gcal'.
10
+ #
11
+ # 2. write the mail body in yaml format. here is an example.
12
+ # st: 2006-09-26 09:30:00
13
+ # en: 2006-09-26 11:00:00
14
+ # title: title of an event
15
+ # desc: description of an event
16
+ # where: location of an event
17
+ #
18
+ # 3. send the mail to your mail account.
19
+ #
20
+ # 4. execute this sample script.
21
+ #
22
+
23
+ POP_SERVER = "your pop server"
24
+ POP_PORT = 110
25
+ POP_ACCOUNT = "your account"
26
+ POP_PASSWORD = "your password"
27
+
28
+ GCAL_ACCOUNT = "your gmail account"
29
+ GCAL_PASSWORD = "your gmail password"
30
+ GCAL_FEED = "http://www.google.com/calendar/feeds/XXXXXXXXXXX@group.calendar.google.com/private/full"
31
+
32
+ TARGET_SUBJECT = "gcal"
33
+
34
+ # very simple e-mail parser.
35
+ class Mail
36
+ attr_accessor :subject, :body
37
+ def initialize(cont)
38
+ self.subject = nil
39
+ self.body = nil
40
+ parse(cont)
41
+ end
42
+
43
+ SUBJECT = /^Subject: (.*)$/
44
+
45
+ def parse(cont)
46
+ head = true
47
+ bd = []
48
+ cont.each_line do |line|
49
+ if head
50
+ line.chomp!
51
+ if line =~ SUBJECT
52
+ self.subject = $1
53
+ elsif line == ""
54
+ head = false
55
+ end
56
+ else
57
+ bd << line
58
+ end
59
+ end
60
+ self.body = bd.join("")
61
+ end
62
+ end
63
+
64
+ server = GoogleCalendar::Service.new(GCAL_ACCOUNT, GCAL_PASSWORD)
65
+ calendar = GoogleCalendar::Calendar.new(server, GCAL_FEED)
66
+
67
+ #
68
+ # * make an event of the calendar
69
+ # * set attributes of the event from email content.
70
+ # * update the event to the calendar.
71
+ #
72
+ def calendar.from_mail(mail)
73
+ event = self.create_event
74
+ yaml = YAML::load(mail.body)
75
+ event.st = Time.parse(yaml["st"].to_s) if yaml.has_key?("st")
76
+ event.en = Time.parse(yaml["en"].to_s) if yaml.has_key?("en")
77
+ event.title = yaml["title"].toutf8 if yaml.has_key?("title")
78
+ event.desc = yaml["desc"].toutf8 if yaml.has_key?("desc")
79
+ event.where = yaml["where"].toutf8 if yaml.has_key?("where")
80
+ event.allday = yaml["allday"] if yaml.has_key?("allday")
81
+ event.save!
82
+ end
83
+
84
+ pop = Net::POP3.APOP(true).new(POP_SERVER, POP_PORT)
85
+ pop.start(POP_ACCOUNT, POP_PASSWORD)
86
+
87
+ if pop.mails.empty? then
88
+ puts 'no mail.'
89
+ else
90
+ i = 0
91
+ pop.each_mail do |m|
92
+ mail = Mail.new(m.pop)
93
+ if mail.subject == TARGET_SUBJECT
94
+ calendar.from_mail(mail)
95
+ m.delete
96
+ i += 1
97
+ end
98
+ end
99
+ puts "#{i} mail(s) processed."
100
+ end
101
+ pop.finish
@@ -0,0 +1,55 @@
1
+ require "googlecalendar/calendar"
2
+ require "win32ole"
3
+ require "nkf"
4
+
5
+
6
+ # google calendar Feed URL
7
+ FEED_URL = "http://www.google.com/calendar/feeds/XXXXXXXXXXXXXXXX@group.calendar.google.com/private/full"
8
+ # email address
9
+ EMAIL = "XXXXXXXXXX@gmail.com"
10
+ # password
11
+ PASS = "XXXXXXX"
12
+
13
+ def each_event
14
+ created = false
15
+ ol = nil
16
+ begin
17
+ ol = WIN32OLE.connect("Outlook.Application")
18
+ rescue
19
+ created = true
20
+ ol = WIN32OLE.new("Outlook.Application")
21
+ end
22
+ ns = ol.GetNameSpace("MAPI")
23
+ folder = ns.GetDefaultFolder(9) #olFolderCalendar
24
+ folder.Items.each do |event|
25
+ GC.start
26
+ yield event
27
+ end
28
+ ol.Quit if created
29
+ end
30
+
31
+ #proxy setting
32
+ GoogleCalendar::Service.proxy_addr="192.168.0.1"
33
+ GoogleCalendar::Service.proxy_port="8080"
34
+
35
+ @srv = GoogleCalendar::Service.new(EMAIL, PASS)
36
+ @cal = GoogleCalendar::Calendar.new(@srv, FEED_URL)
37
+
38
+ # Delete All Future Data Of Google Calendar
39
+ now = Time.now
40
+ @cal.events(now, nil).each do |ev| ev.destroy! end
41
+
42
+ # Insert All Future Data Of Outlook
43
+ @nstr = now.strftime("%Y/%m/%d %H:%M:%S")
44
+ each_event do |oev|
45
+ if oev.Start > @nstr
46
+ gev = @cal.create_event
47
+ #NKF is used for japanese charcter code conversion
48
+ gev.title = NKF.nkf("-w", oev.Subject)
49
+ gev.where = NKF.nkf("-w", oev.Location)
50
+ gev.st = Time.parse(oev.Start)
51
+ gev.en = Time.parse(oev.End)
52
+ gev.allday = oev.AllDayEvent
53
+ gev.save!
54
+ end
55
+ end
@@ -0,0 +1,281 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: GoogleCalendar</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">GoogleCalendar</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/lib/googlecalendar/calendar_rb.html">
59
+ lib/googlecalendar/calendar.rb
60
+ </a>
61
+ <br />
62
+ <a href="../files/lib/googlecalendar/event_rb.html">
63
+ lib/googlecalendar/event.rb
64
+ </a>
65
+ <br />
66
+ <a href="../files/lib/googlecalendar/service_rb.html">
67
+ lib/googlecalendar/service.rb
68
+ </a>
69
+ <br />
70
+ </td>
71
+ </tr>
72
+
73
+ </table>
74
+ </div>
75
+ <!-- banner header -->
76
+
77
+ <div id="bodyContent">
78
+
79
+
80
+
81
+ <div id="contextContent">
82
+
83
+
84
+
85
+ </div>
86
+
87
+ <div id="method-list">
88
+ <h3 class="section-bar">Methods</h3>
89
+
90
+ <div class="name-list">
91
+ <a href="#M000004">create_event</a>&nbsp;&nbsp;
92
+ <a href="#M000003">events</a>&nbsp;&nbsp;
93
+ <a href="#M000001">new</a>&nbsp;&nbsp;
94
+ <a href="#M000002">source</a>&nbsp;&nbsp;
95
+ </div>
96
+ </div>
97
+
98
+ </div>
99
+
100
+
101
+ <!-- if includes -->
102
+
103
+ <div id="section">
104
+
105
+ <div id="class-list">
106
+ <h3 class="section-bar">Classes and Modules</h3>
107
+
108
+ Class <a href="GoogleCalendar/AuthenticationFailed.html" class="link">GoogleCalendar::AuthenticationFailed</a><br />
109
+ Class <a href="GoogleCalendar/Calendar.html" class="link">GoogleCalendar::Calendar</a><br />
110
+ Class <a href="GoogleCalendar/Event.html" class="link">GoogleCalendar::Event</a><br />
111
+ Class <a href="GoogleCalendar/EventDeleteFailed.html" class="link">GoogleCalendar::EventDeleteFailed</a><br />
112
+ Class <a href="GoogleCalendar/EventInsertFailed.html" class="link">GoogleCalendar::EventInsertFailed</a><br />
113
+ Class <a href="GoogleCalendar/EventUpdateFailed.html" class="link">GoogleCalendar::EventUpdateFailed</a><br />
114
+ Class <a href="GoogleCalendar/InvalidCalendarURL.html" class="link">GoogleCalendar::InvalidCalendarURL</a><br />
115
+ Class <a href="GoogleCalendar/Service.html" class="link">GoogleCalendar::Service</a><br />
116
+
117
+ </div>
118
+
119
+
120
+
121
+
122
+ <div id="attribute-list">
123
+ <h3 class="section-bar">Attributes</h3>
124
+
125
+ <div class="name-list">
126
+ <table>
127
+ <tr class="top-aligned-row context-row">
128
+ <td class="context-item-name">feed</td>
129
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
130
+ <td class="context-item-desc"></td>
131
+ </tr>
132
+ </table>
133
+ </div>
134
+ </div>
135
+
136
+
137
+
138
+ <!-- if method_list -->
139
+ <div id="methods">
140
+ <h3 class="section-bar">Public Class methods</h3>
141
+
142
+ <div id="method-M000001" class="method-detail">
143
+ <a name="M000001"></a>
144
+
145
+ <div class="method-heading">
146
+ <a href="#M000001" class="method-signature">
147
+ <span class="method-name">new</span><span class="method-args">(srv, feed)</span>
148
+ </a>
149
+ </div>
150
+
151
+ <div class="method-description">
152
+ <p>
153
+ srv: <a href="GoogleCalendar/Service.html">GoogleCalendar::Service</a>
154
+ object feed: <a href="GoogleCalendar/Calendar.html">Calendar</a>&#8217;s
155
+ editable feed url
156
+ </p>
157
+ <p><a class="source-toggle" href="#"
158
+ onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
159
+ <div class="method-source-code" id="M000001-source">
160
+ <pre>
161
+ <span class="ruby-comment cmt"># File lib/googlecalendar/calendar.rb, line 65</span>
162
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">srv</span>, <span class="ruby-identifier">feed</span>)
163
+ <span class="ruby-ivar">@srv</span> = <span class="ruby-identifier">srv</span>
164
+ <span class="ruby-ivar">@feed</span> = <span class="ruby-identifier">feed</span>
165
+ <span class="ruby-ivar">@source</span> = <span class="ruby-keyword kw">nil</span>
166
+ <span class="ruby-keyword kw">end</span>
167
+ </pre>
168
+ </div>
169
+ </div>
170
+ </div>
171
+
172
+ <h3 class="section-bar">Public Instance methods</h3>
173
+
174
+ <div id="method-M000004" class="method-detail">
175
+ <a name="M000004"></a>
176
+
177
+ <div class="method-heading">
178
+ <a href="#M000004" class="method-signature">
179
+ <span class="method-name">create_event</span><span class="method-args">()</span>
180
+ </a>
181
+ </div>
182
+
183
+ <div class="method-description">
184
+ <p>
185
+ creates a new <a href="GoogleCalendar/Event.html">Event</a> instance which
186
+ belongs to this clandar instance.
187
+ </p>
188
+ <p><a class="source-toggle" href="#"
189
+ onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
190
+ <div class="method-source-code" id="M000004-source">
191
+ <pre>
192
+ <span class="ruby-comment cmt"># File lib/googlecalendar/calendar.rb, line 100</span>
193
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">create_event</span>
194
+ <span class="ruby-identifier">ev</span> = <span class="ruby-constant">Event</span>.<span class="ruby-identifier">new</span>
195
+ <span class="ruby-identifier">ev</span>.<span class="ruby-identifier">srv</span> = <span class="ruby-ivar">@srv</span>
196
+ <span class="ruby-identifier">ev</span>.<span class="ruby-identifier">feed</span> = <span class="ruby-ivar">@feed</span>
197
+ <span class="ruby-identifier">ev</span>
198
+ <span class="ruby-keyword kw">end</span>
199
+ </pre>
200
+ </div>
201
+ </div>
202
+ </div>
203
+
204
+ <div id="method-M000003" class="method-detail">
205
+ <a name="M000003"></a>
206
+
207
+ <div class="method-heading">
208
+ <a href="#M000003" class="method-signature">
209
+ <span class="method-name">events</span><span class="method-args">(conditions = {})</span>
210
+ </a>
211
+ </div>
212
+
213
+ <div class="method-description">
214
+ <p>
215
+ send query to get events and returns an array of <a
216
+ href="GoogleCalendar/Event.html">Event</a> objects. if any conditions are
217
+ given, recent 25 entries are retrieved. For detail, see <a
218
+ href="GoogleCalendar/Service.html#M000020">Service#query</a>
219
+ </p>
220
+ <p><a class="source-toggle" href="#"
221
+ onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
222
+ <div class="method-source-code" id="M000003-source">
223
+ <pre>
224
+ <span class="ruby-comment cmt"># File lib/googlecalendar/calendar.rb, line 84</span>
225
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">events</span>(<span class="ruby-identifier">conditions</span> = {})
226
+ <span class="ruby-identifier">ret</span> = <span class="ruby-ivar">@srv</span>.<span class="ruby-identifier">query</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">feed</span>, <span class="ruby-identifier">conditions</span>)
227
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">InvalidCalendarURL</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">ret</span>.<span class="ruby-identifier">code</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;200&quot;</span>
228
+ <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">Document</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">ret</span>.<span class="ruby-identifier">body</span>).<span class="ruby-identifier">root</span>.<span class="ruby-identifier">elements</span>.<span class="ruby-identifier">each</span>(<span class="ruby-value str">&quot;entry&quot;</span>){}.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">elem</span><span class="ruby-operator">|</span>
229
+ <span class="ruby-identifier">elem</span>.<span class="ruby-identifier">attributes</span>[<span class="ruby-value str">&quot;xmlns:gCal&quot;</span>] = <span class="ruby-value str">&quot;http://schemas.google.com/gCal/2005&quot;</span>
230
+ <span class="ruby-identifier">elem</span>.<span class="ruby-identifier">attributes</span>[<span class="ruby-value str">&quot;xmlns:gd&quot;</span>] = <span class="ruby-value str">&quot;http://schemas.google.com/g/2005&quot;</span>
231
+ <span class="ruby-identifier">elem</span>.<span class="ruby-identifier">attributes</span>[<span class="ruby-value str">&quot;xmlns&quot;</span>] = <span class="ruby-value str">&quot;http://www.w3.org/2005/Atom&quot;</span>
232
+ <span class="ruby-identifier">entry</span> = <span class="ruby-constant">Event</span>.<span class="ruby-identifier">new</span>
233
+ <span class="ruby-identifier">entry</span>.<span class="ruby-identifier">srv</span> = <span class="ruby-ivar">@srv</span>
234
+ <span class="ruby-identifier">entry</span>.<span class="ruby-identifier">load_xml</span>(<span class="ruby-node">&quot;&lt;?xml version='1.0' encoding='UTF-8'?&gt;#{elem.to_s}&quot;</span>)
235
+ <span class="ruby-keyword kw">end</span>
236
+ <span class="ruby-keyword kw">end</span>
237
+ </pre>
238
+ </div>
239
+ </div>
240
+ </div>
241
+
242
+ <div id="method-M000002" class="method-detail">
243
+ <a name="M000002"></a>
244
+
245
+ <div class="method-heading">
246
+ <a href="#M000002" class="method-signature">
247
+ <span class="method-name">source</span><span class="method-args">()</span>
248
+ </a>
249
+ </div>
250
+
251
+ <div class="method-description">
252
+ <p>
253
+ REXML::Document object which represents calendar object
254
+ </p>
255
+ <p><a class="source-toggle" href="#"
256
+ onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
257
+ <div class="method-source-code" id="M000002-source">
258
+ <pre>
259
+ <span class="ruby-comment cmt"># File lib/googlecalendar/calendar.rb, line 74</span>
260
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">source</span>
261
+ <span class="ruby-ivar">@source</span> = <span class="ruby-identifier">get_data</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@source</span>
262
+ <span class="ruby-ivar">@source</span>
263
+ <span class="ruby-keyword kw">end</span>
264
+ </pre>
265
+ </div>
266
+ </div>
267
+ </div>
268
+
269
+
270
+ </div>
271
+
272
+
273
+ </div>
274
+
275
+
276
+ <div id="validator-badges">
277
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
278
+ </div>
279
+
280
+ </body>
281
+ </html>