gcalapi 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/Rakefile +19 -15
  2. data/VERSION +1 -1
  3. data/example/mixi2gcal.rb +88 -0
  4. data/html/classes/GoogleCalendar.html +149 -280
  5. data/html/classes/GoogleCalendar/AuthSubFailed.html +165 -0
  6. data/html/classes/GoogleCalendar/AuthSubUtil.html +397 -0
  7. data/html/classes/GoogleCalendar/AuthenticationFailed.html +110 -110
  8. data/html/classes/GoogleCalendar/Calendar.html +381 -203
  9. data/html/classes/GoogleCalendar/Event.html +800 -510
  10. data/html/classes/GoogleCalendar/EventDeleteFailed.html +110 -110
  11. data/html/classes/GoogleCalendar/EventGetFailed.html +111 -0
  12. data/html/classes/GoogleCalendar/EventInsertFailed.html +110 -110
  13. data/html/classes/GoogleCalendar/EventUpdateFailed.html +110 -110
  14. data/html/classes/GoogleCalendar/InvalidCalendarURL.html +110 -110
  15. data/html/classes/GoogleCalendar/Service.html +305 -594
  16. data/html/classes/GoogleCalendar/ServiceAuthSub.html +181 -0
  17. data/html/classes/GoogleCalendar/ServiceBase.html +694 -0
  18. data/html/created.rid +1 -1
  19. data/html/files/README.html +116 -116
  20. data/html/files/lib/googlecalendar/auth_sub_util_rb.html +111 -0
  21. data/html/files/lib/googlecalendar/calendar_rb.html +109 -109
  22. data/html/files/lib/googlecalendar/event_rb.html +109 -109
  23. data/html/files/lib/googlecalendar/service_auth_sub_rb.html +108 -0
  24. data/html/files/lib/googlecalendar/service_base_rb.html +114 -0
  25. data/html/files/lib/googlecalendar/service_rb.html +107 -113
  26. data/html/fr_class_index.html +39 -34
  27. data/html/fr_file_index.html +32 -29
  28. data/html/fr_method_index.html +75 -52
  29. data/html/index.html +23 -23
  30. data/html/rdoc-style.css +207 -207
  31. data/lib/googlecalendar/auth_sub_util.rb +143 -0
  32. data/lib/googlecalendar/calendar.rb +48 -36
  33. data/lib/googlecalendar/event.rb +16 -11
  34. data/lib/googlecalendar/service.rb +30 -180
  35. data/lib/googlecalendar/service_auth_sub.rb +18 -0
  36. data/lib/googlecalendar/service_base.rb +197 -0
  37. data/test/00_service_test.rb +2 -1
  38. data/test/01_calendar_test.rb +1 -1
  39. data/test/02_event_test.rb +28 -1
  40. data/test/03_authsub_test.rb +119 -0
  41. data/test/base_unit.rb +3 -0
  42. metadata +105 -62
@@ -0,0 +1,18 @@
1
+ require "googlecalendar/service_base"
2
+
3
+ module GoogleCalendar
4
+ #
5
+ # this class interacts with Google Calendar and uses AuthSub interface for authentication.
6
+ #
7
+ class ServiceAuthSub < ServiceBase
8
+
9
+ def initialize(token)
10
+ @auth = token
11
+ end
12
+
13
+ private
14
+ def add_authorize_header(header)
15
+ header["Authorization"] = "AuthSub token=#{@auth}"
16
+ end
17
+ end # ServiceAuthSub
18
+ end # GoogleCalendar
@@ -0,0 +1,197 @@
1
+ require "cgi"
2
+ require "uri"
3
+ require "net/http"
4
+ require "net/https"
5
+ require "open-uri"
6
+ require "nkf"
7
+ require "time"
8
+
9
+ Net::HTTP.version_1_2
10
+
11
+ module GoogleCalendar
12
+
13
+ class AuthenticationFailed < StandardError; end #:nodoc: all
14
+
15
+ #
16
+ # This class interacts with google calendar service.
17
+ #
18
+ class ServiceBase
19
+ # Server name to Authenticate
20
+ AUTH_SERVER = "www.google.com"
21
+
22
+ # proxy server address
23
+ @@proxy_addr = nil
24
+ def self.proxy_addr
25
+ @@proxy_addr
26
+ end
27
+
28
+ def self.proxy_addr=(addr)
29
+ @@proxy_addr=addr
30
+ end
31
+
32
+ # proxy server port number
33
+ @@proxy_port = nil
34
+ def self.proxy_port
35
+ @@proxy_port
36
+ end
37
+
38
+ def self.proxy_port=(port)
39
+ @@proxy_port = port
40
+ end
41
+
42
+ # proxy server username
43
+ @@proxy_user = nil
44
+ def self.proxy_user
45
+ @@proxy_user
46
+ end
47
+
48
+ def self.proxy_user=(user)
49
+ @@proxy_user = user
50
+ end
51
+
52
+ # proxy server password
53
+ @@proxy_pass = nil
54
+ def self.proxy_pass
55
+ @@proxy_pass
56
+ end
57
+
58
+ def self.proxy_pass=(pass)
59
+ @@proxy_pass = pass
60
+ end
61
+
62
+ attr_accessor :logger
63
+
64
+ #
65
+ # send query for events of a calendar and returns http response object.
66
+ # available condtions are
67
+ # * :q => query string
68
+ # * :max-results => max contents count. (default: 25)
69
+ # * :start-index => 1-based index of the first result to be retrieved
70
+ # * :orderby => the order of retrieved data.
71
+ # * :published-min => Bounds on the entry publication date(oldest)
72
+ # * :published-max => Bounds on the entry publication date(newest)
73
+ # * :updated-min => Bounds on the entry update date(oldest)
74
+ # * :updated-max => Bounds on the entry update date(newest)
75
+ # * :author => Entry author
76
+ # and so on.
77
+ # For detail, see http://code.google.com/apis/gdata/protocol.html#Queries
78
+ # and http://code.google.com/apis/calendar/reference.html#Parameters
79
+ #
80
+ def query(cal_url, conditions = nil)
81
+ logger.info("-- query st --") if logger
82
+ auth unless @auth
83
+ uri = URI.parse(cal_url)
84
+ uri.query = conditions.map do |key, val|
85
+ "#{key}=#{URI.escape(val.kind_of?(Time) ? val.getutc.iso8601 : val.to_s)}"
86
+ end.join("&") unless conditions.nil?
87
+ res = do_get(uri, {})
88
+ logger.info("-- query en (#{res.message}) --") if logger
89
+ res
90
+ end
91
+
92
+ #
93
+ # delete an event.
94
+ #
95
+ def delete(feed)
96
+ logger.info("-- delete st --") if logger
97
+ auth unless @auth
98
+ uri = URI.parse(feed)
99
+ res = do_post(uri,
100
+ {"X-HTTP-Method-Override" => "DELETE"},
101
+ "DELETE " + uri.path)
102
+ logger.info("-- delete en (#{res.message}) --") if logger
103
+ res
104
+ end
105
+
106
+ #
107
+ # insert an event
108
+ #
109
+ def insert(feed, event)
110
+ logger.info("-- insert st --") if logger
111
+ auth unless @auth
112
+ uri = URI.parse(feed)
113
+ res = do_post(uri,
114
+ {"Content-Type" => "application/atom+xml",
115
+ "Content-Length" => event.length.to_s}, event)
116
+ logger.info("-- insert en (#{res.message}) --") if logger
117
+ res
118
+ end
119
+
120
+ #
121
+ # update an event.
122
+ #
123
+ def update(feed, event)
124
+ logger.info("-- update st --") if logger
125
+ auth unless @auth
126
+ uri = URI.parse(feed)
127
+ res = do_post(uri,
128
+ {"X-HTTP-Method-Override" => "PUT",
129
+ "Content-Type" => "application/atom+xml",
130
+ "Content-Length" => event.length.to_s}, event)
131
+ logger.info("-- update en (#{res.message}) --") if logger
132
+ res
133
+ end
134
+
135
+ private
136
+
137
+ # authencate
138
+ def auth
139
+ raise AuthenticationFailed
140
+ end
141
+
142
+ def do_post(uri, header, content)
143
+ logger.debug("POST:" + uri.to_s) if logger
144
+ res = nil
145
+ try_http(uri, header, content) do |http,path,head,args|
146
+ cont = args[0]
147
+ res = http.post(path, cont, head)
148
+ end
149
+ res
150
+ end
151
+
152
+ def do_get(uri, header)
153
+ logger.debug("GET:" + uri.to_s) if logger
154
+ res = nil
155
+ try_http(uri, header) do |http,path,head|
156
+ res = http.get(path, head)
157
+ end
158
+ res
159
+ end
160
+
161
+ def try_http(uri, header, *args)
162
+ res = nil
163
+ add_authorize_header(header)
164
+ Net::HTTP.start(uri.host, uri.port, @@proxy_addr, @@proxy_port, @@proxy_user, @@proxy_pass) do |http|
165
+ header["Cookie"] = @cookie if @cookie
166
+ res = yield(http, path_with_authorized_query(uri), header, args)
167
+ logger.debug(res) if logger
168
+ if res.code == "302"
169
+ ck = sess = nil
170
+ ck = res["set-cookie"] if res.key?("set-cookie")
171
+ uri = URI.parse(res["location"]) if res.key?("location")
172
+ if uri && uri.query
173
+ qr = CGI.parse(uri.query)
174
+ sess = qr["gsessionid"][0] if qr.key?("gsessionid")
175
+ end
176
+ if ck && sess
177
+ logger.debug("cookie: #{ck}, gsessionid:#{sess}") if logger
178
+ header["Cookie"] = @cookie = ck
179
+ @session = sess
180
+ res = yield(http, path_with_authorized_query(uri), header, args)
181
+ logger.debug(res) if logger
182
+ else
183
+ logger.fatal res.body.gsub(/\n/, ' ') if logger
184
+ end
185
+ end
186
+ end
187
+ res
188
+ end
189
+
190
+ def path_with_authorized_query(uri)
191
+ query = CGI.parse(uri.query.nil? ? "" : uri.query)
192
+ query["gsessionid"] = [@session] if @session
193
+ qs = query.map do |k,v| "#{CGI.escape(k)}=#{CGI.escape(v[0])}" end.join("&")
194
+ qs.empty? ? uri.path : "#{uri.path}?#{qs}"
195
+ end
196
+ end # class ServiceBase
197
+ end # module
@@ -1,11 +1,12 @@
1
1
  require "base_unit"
2
2
 
3
- class TestService < Test::Unit::TestCase
3
+ class TestService0 < Test::Unit::TestCase
4
4
  include GoogleCalendar
5
5
  include CalendarTest
6
6
 
7
7
  def test_invalid_auth
8
8
  s = GoogleCalendar::Service.new("invalid@example.com", "invalidpassword")
9
+ s.logger = @srv.logger
9
10
  assert_raise(GoogleCalendar::AuthenticationFailed) do
10
11
  s.calendar_list
11
12
  end
@@ -1,6 +1,6 @@
1
1
  require "base_unit"
2
2
 
3
- class TestCalendar < Test::Unit::TestCase
3
+ class TestCalendar1 < Test::Unit::TestCase
4
4
  include GoogleCalendar
5
5
  include CalendarTest
6
6
 
@@ -1,6 +1,6 @@
1
1
  require "base_unit"
2
2
 
3
- class TestCalendar < Test::Unit::TestCase
3
+ class TestCalendar2 < Test::Unit::TestCase
4
4
  include GoogleCalendar
5
5
  include CalendarTest
6
6
 
@@ -44,6 +44,33 @@ class TestCalendar < Test::Unit::TestCase
44
44
  assert_equal(0, @cal.events.length)
45
45
  end
46
46
 
47
+ def test_get_event
48
+ ev = @cal.create_event
49
+ ev.title = "title"
50
+ ev.desc = "desc"
51
+ ev.st = Time.now
52
+ ev.en = Time.now + 3600
53
+ ev.save!
54
+
55
+ #@srv.logger.level = Logger::DEBUG
56
+ e2 = Event.get(ev.feed, @srv)
57
+ assert_same_event(ev, e2)
58
+
59
+ e2.desc = "changed"
60
+ e2.save!
61
+ assert_equal("changed", e2.desc)
62
+
63
+ e3 = Event.get(ev.feed, @srv)
64
+ assert_same_event(e2, e3)
65
+ end
66
+
67
+ def test_get_event_fail
68
+ #@srv.logger.level = Logger::DEBUG
69
+ assert_raise(GoogleCalendar::EventGetFailed) do
70
+ Event.get(GoogleCalendar::Calendar::DEFAULT_CALENDAR_FEED + "/XXXXXXXXXXXXXXXXXXXXX", @srv)
71
+ end
72
+ end
73
+
47
74
  def setup
48
75
  @srv = get_service
49
76
  clear_all(@srv, FEED)
@@ -0,0 +1,119 @@
1
+ require "base_unit"
2
+ require "rubygems"
3
+ require "mechanize"
4
+ require "logger"
5
+ require "cgi"
6
+ require "uri"
7
+ require "googlecalendar/service_auth_sub"
8
+ require "googlecalendar/auth_sub_util"
9
+
10
+ class TestService3 < Test::Unit::TestCase
11
+ SAMPLE_URL = "http://www.example.com/sample.html"
12
+ attr_accessor :logger
13
+ # get one-time token
14
+ def test_get_onetime_token
15
+ # login google account
16
+ agent = WWW::Mechanize.new do |a| a.log = logger end
17
+ page = agent.get("https://www.google.com/accounts/Login")
18
+
19
+ form = page.forms[0]
20
+ form["Email"] = MAIL
21
+ form["Passwd"] = PASS
22
+ page = agent.submit(form)
23
+
24
+ # get auth sub request url
25
+ next_url = SAMPLE_URL
26
+ use_secure = false
27
+ use_session = true
28
+ request_url = GoogleCalendar::AuthSubUtil.build_request_url(
29
+ next_url, GoogleCalendar::AuthSubUtil::CALENDAR_SCOPE, use_secure, use_session)
30
+ query = "next=#{CGI.escape(next_url)}&scope=#{CGI.escape(GoogleCalendar::AuthSubUtil::CALENDAR_SCOPE)}&secure=#{use_secure ? "1" : "0"}&session=#{use_session ? "1" : "0"}"
31
+ logger.debug(request_url)
32
+ assert_equal(query, URI.parse(request_url).query)
33
+
34
+ # get authsub request
35
+ page = agent.get(request_url)
36
+ form = page.forms[0]
37
+ agent.redirect_ok = false
38
+ page = agent.submit(form, form.buttons.first)
39
+
40
+ #get one time token
41
+ #
42
+ # In the real world, Google shows the link for your website. When the user clicks the link, you can
43
+ # get the one time token.
44
+ # But in this UNIT TEST, this process is omitted and the token is retrieved directly from google's response.
45
+ #
46
+ uri = URI.parse(page.links.first.href)
47
+ params = CGI.parse(uri.query)
48
+ expected = params["token"][0]
49
+ logger.debug " token: #{expected}"
50
+ one_time_token = GoogleCalendar::AuthSubUtil.get_one_time_token(page.links.first.href)
51
+ assert_equal(expected, one_time_token)
52
+ return one_time_token
53
+ end
54
+
55
+ def test_use_session_token
56
+ one_time_token = test_get_onetime_token
57
+ session_token = nil
58
+ srv = nil
59
+ begin
60
+ #get session token
61
+ session_token = GoogleCalendar::AuthSubUtil.exchange_session_token(one_time_token)
62
+ assert_not_nil(session_token)
63
+ logger.debug(session_token)
64
+ srv = GoogleCalendar::ServiceAuthSub.new(session_token)
65
+ srv.logger = logger
66
+ ret = srv.query(FEED, {})
67
+ logger.debug(ret.body)
68
+ assert_equal("200", ret.code)
69
+
70
+ #do something
71
+ yield(session_token, srv) if block_given?
72
+ ensure
73
+ #revoke token
74
+ unless session_token.nil?
75
+ GoogleCalendar::AuthSubUtil.revoke_session_token(session_token)
76
+ ret = srv.query(FEED, {})
77
+ logger.debug(ret)
78
+ assert_equal("401", ret.code)
79
+ end
80
+ end
81
+ end
82
+
83
+ def test_query_with_session_token
84
+ test_use_session_token do |token, srv|
85
+ ret = srv.query(GoogleCalendar::Calendar::DEFAULT_CALENDAR_FEED, {})
86
+ assert_equal("200", ret.code)
87
+ end
88
+ end
89
+
90
+ def test_with_session_token
91
+ test_use_session_token do |token, srv|
92
+ cal = GoogleCalendar::Calendar.new(srv)
93
+ event = cal.create_event
94
+ event.desc = "desc"
95
+ event.st = Time.now
96
+ event.en = Time.now + 3600
97
+ ret = event.save
98
+ assert(ret)
99
+ event.destroy!
100
+ end
101
+ end
102
+
103
+ def test_session_info
104
+ test_use_session_token do |token, session|
105
+ ret = GoogleCalendar::AuthSubUtil.token_info(token)
106
+ expected = {"Secure" => "false",
107
+ "Scope" => GoogleCalendar::AuthSubUtil::CALENDAR_SCOPE,
108
+ "Target" => "www.example.com"}
109
+ expected.each do |k,v|
110
+ assert(ret.key?(k))
111
+ assert_equal(v, ret[k]) if ret.key?(k)
112
+ end
113
+ end
114
+ end
115
+
116
+ def setup
117
+ @logger = Logger.new("authsub.log")
118
+ end
119
+ end
data/test/base_unit.rb CHANGED
@@ -3,11 +3,14 @@ $:.unshift(File.dirname(__FILE__) + '/../lib')
3
3
  require "parameters"
4
4
  require 'test/unit'
5
5
  require "googlecalendar/calendar"
6
+ require "logger"
6
7
 
7
8
  module CalendarTest
8
9
  include GoogleCalendar
9
10
  def get_service
10
11
  srv = Service.new(MAIL, PASS)
12
+ srv.logger = Logger.new("testlog.log")
13
+ srv.logger.level = Logger::INFO
11
14
  assert_instance_of(Service, srv)
12
15
  srv.send("auth")
13
16
  assert_not_nil(srv.instance_eval("@auth"))
metadata CHANGED
@@ -1,87 +1,130 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.10
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: gcalapi
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.4
7
- date: 2006-12-28
6
+ version: 0.1.0
7
+ date: 2007-02-18 00:00:00 +09:00
8
8
  summary: Google Calendar API
9
9
  require_paths:
10
- - lib
10
+ - lib
11
11
  email: zoriorz@gmail.com
12
12
  homepage: http://gcalapi.rubyforge.net
13
13
  rubyforge_project: gcalapi
14
- description: ''
14
+ description: ""
15
15
  autorequire: googlecalendar/calendar
16
16
  default_executable:
17
17
  bindir: bin
18
18
  has_rdoc: true
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
- -
22
- - ">"
23
- - !ruby/object:Gem::Version
24
- version: 0.0.0
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
25
24
  version:
26
25
  platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
27
29
  authors:
28
- - zorio
30
+ - zorio
29
31
  files:
30
- - lib
31
- - html
32
- - test
33
- - Rakefile
34
- - README
35
- - example
36
- - VERSION
37
- - lib/googlecalendar
38
- - lib/gcalapi.rb
39
- - lib/googlecalendar/calendar.rb
40
- - lib/googlecalendar/event.rb
41
- - lib/googlecalendar/service.rb
42
- - html/files
43
- - html/index.html
44
- - html/rdoc-style.css
45
- - html/fr_method_index.html
46
- - html/fr_class_index.html
47
- - html/fr_file_index.html
48
- - html/created.rid
49
- - html/classes
50
- - html/files/lib
51
- - html/files/README.html
52
- - html/files/lib/googlecalendar
53
- - html/files/lib/googlecalendar/event_rb.html
54
- - html/files/lib/googlecalendar/service_rb.html
55
- - html/files/lib/googlecalendar/calendar_rb.html
56
- - html/classes/GoogleCalendar.html
57
- - html/classes/GoogleCalendar
58
- - html/classes/GoogleCalendar/Service.html
59
- - html/classes/GoogleCalendar/EventUpdateFailed.html
60
- - html/classes/GoogleCalendar/Calendar.html
61
- - html/classes/GoogleCalendar/EventInsertFailed.html
62
- - html/classes/GoogleCalendar/EventDeleteFailed.html
63
- - html/classes/GoogleCalendar/Event.html
64
- - html/classes/GoogleCalendar/InvalidCalendarURL.html
65
- - html/classes/GoogleCalendar/AuthenticationFailed.html
66
- - test/each.sh
67
- - test/00_service_test.rb
68
- - test/template.parameters.rb
69
- - test/all.sh
70
- - test/base_unit.rb
71
- - test/01_calendar_test.rb
72
- - test/02_event_test.rb
73
- - example/ol2gcal.rb
74
- - example/mail2gcal.rb
32
+ - doc
33
+ - example
34
+ - html
35
+ - lib
36
+ - Rakefile
37
+ - README
38
+ - test
39
+ - VERSION
40
+ - doc/classes
41
+ - doc/files
42
+ - doc/classes/CalendarTest.src
43
+ - doc/classes/GoogleCalendar
44
+ - doc/classes/GoogleCalendar.src
45
+ - doc/classes/Mail.src
46
+ - doc/classes/TestCalendar1.src
47
+ - doc/classes/TestCalendar2.src
48
+ - doc/classes/TestService0.src
49
+ - doc/classes/TestService3.src
50
+ - doc/classes/GoogleCalendar/AuthSubFailed.src
51
+ - doc/classes/GoogleCalendar/AuthSubUtil.src
52
+ - doc/classes/GoogleCalendar/Calendar.src
53
+ - doc/classes/GoogleCalendar/Event.src
54
+ - doc/classes/GoogleCalendar/Service.src
55
+ - doc/classes/GoogleCalendar/ServiceAuthSub.src
56
+ - doc/classes/GoogleCalendar/ServiceBase.src
57
+ - doc/files/example
58
+ - doc/files/lib
59
+ - doc/files/test
60
+ - doc/files/example/ol2gcal_rb.src
61
+ - doc/files/lib/googlecalendar
62
+ - example/mail2gcal.rb
63
+ - example/mixi2gcal.rb
64
+ - example/ol2gcal.rb
65
+ - html/classes
66
+ - html/created.rid
67
+ - html/files
68
+ - html/fr_class_index.html
69
+ - html/fr_file_index.html
70
+ - html/fr_method_index.html
71
+ - html/index.html
72
+ - html/rdoc-style.css
73
+ - html/classes/GoogleCalendar
74
+ - html/classes/GoogleCalendar.html
75
+ - html/classes/GoogleCalendar/AuthenticationFailed.html
76
+ - html/classes/GoogleCalendar/AuthSubFailed.html
77
+ - html/classes/GoogleCalendar/AuthSubUtil.html
78
+ - html/classes/GoogleCalendar/Calendar.html
79
+ - html/classes/GoogleCalendar/Event.html
80
+ - html/classes/GoogleCalendar/EventDeleteFailed.html
81
+ - html/classes/GoogleCalendar/EventGetFailed.html
82
+ - html/classes/GoogleCalendar/EventInsertFailed.html
83
+ - html/classes/GoogleCalendar/EventUpdateFailed.html
84
+ - html/classes/GoogleCalendar/InvalidCalendarURL.html
85
+ - html/classes/GoogleCalendar/Service.html
86
+ - html/classes/GoogleCalendar/ServiceAuthSub.html
87
+ - html/classes/GoogleCalendar/ServiceBase.html
88
+ - html/files/lib
89
+ - html/files/README.html
90
+ - html/files/lib/googlecalendar
91
+ - html/files/lib/googlecalendar/auth_sub_util_rb.html
92
+ - html/files/lib/googlecalendar/calendar_rb.html
93
+ - html/files/lib/googlecalendar/event_rb.html
94
+ - html/files/lib/googlecalendar/service_auth_sub_rb.html
95
+ - html/files/lib/googlecalendar/service_base_rb.html
96
+ - html/files/lib/googlecalendar/service_rb.html
97
+ - lib/gcalapi.rb
98
+ - lib/googlecalendar
99
+ - lib/googlecalendar/auth_sub_util.rb
100
+ - lib/googlecalendar/calendar.rb
101
+ - lib/googlecalendar/event.rb
102
+ - lib/googlecalendar/service.rb
103
+ - lib/googlecalendar/service_auth_sub.rb
104
+ - lib/googlecalendar/service_base.rb
105
+ - test/00_service_test.rb
106
+ - test/01_calendar_test.rb
107
+ - test/02_event_test.rb
108
+ - test/03_authsub_test.rb
109
+ - test/all.sh
110
+ - test/base_unit.rb
111
+ - test/each.sh
112
+ - test/template.parameters.rb
75
113
  test_files:
76
- - test/00_service_test.rb
77
- - test/01_calendar_test.rb
78
- - test/02_event_test.rb
114
+ - test/00_service_test.rb
115
+ - test/01_calendar_test.rb
116
+ - test/02_event_test.rb
117
+ - test/03_authsub_test.rb
79
118
  rdoc_options:
80
- - "--line-numbers"
81
- - "--inline-source"
119
+ - --line-numbers
120
+ - --inline-source
82
121
  extra_rdoc_files:
83
- - README
122
+ - README
84
123
  executables: []
124
+
85
125
  extensions: []
126
+
86
127
  requirements: []
87
- dependencies: []
128
+
129
+ dependencies: []
130
+