gdata-jruby-client 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +22 -0
- data/README +25 -0
- data/lib/base.rb +16 -0
- data/lib/base_entry.rb +20 -0
- data/lib/calendar_event_entry.rb +3 -0
- data/lib/calendar_service.rb +19 -0
- data/lib/contacts_service.rb +17 -0
- data/lib/email.rb +16 -0
- data/lib/extended_property.rb +14 -0
- data/lib/gdata/COPYING +202 -0
- data/lib/gdata/RELEASE_NOTES.txt +448 -0
- data/lib/gdata/java/deps/google-collect-1.0-rc1.jar +0 -0
- data/lib/gdata/java/deps/jsr305.jar +0 -0
- data/lib/gdata/java/lib/gdata-analytics-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-analytics-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-appsforyourdomain-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-appsforyourdomain-meta-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-base-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-blogger-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-blogger-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-books-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-books-meta-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-calendar-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-calendar-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-client-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-client-meta-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-codesearch-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-codesearch-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-contacts-3.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-contacts-meta-3.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-core-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-docs-3.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-docs-meta-3.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-finance-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-finance-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-health-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-health-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-maps-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-maps-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-media-1.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-photos-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-photos-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-projecthosting-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-projecthosting-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-sidewiki-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-sidewiki-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-sites-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-sites-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-spreadsheet-3.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-spreadsheet-meta-3.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-webmastertools-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-webmastertools-meta-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-youtube-2.0.jar +0 -0
- data/lib/gdata/java/lib/gdata-youtube-meta-2.0.jar +0 -0
- data/lib/gdata/java/version.properties +46 -0
- data/lib/gdata_jruby_client.rb +22 -0
- data/lib/google_helpers.rb +14 -0
- data/lib/google_oauth_parameters.rb +13 -0
- data/lib/google_service.rb +58 -0
- data/lib/im.rb +16 -0
- data/lib/query.rb +12 -0
- data/lib/recurrence.rb +14 -0
- data/lib/string_ext.rb +10 -0
- data/lib/text_content.rb +5 -0
- data/lib/time_ext.rb +49 -0
- data/lib/when.rb +16 -0
- data/spec/entry_spec.rb +22 -0
- data/spec/google_calendar_service_spec.rb +296 -0
- data/spec/google_contacts_service_spec.rb +149 -0
- data/spec/google_keys.rb +11 -0
- data/spec/google_oauth_parameters_spec.rb +20 -0
- data/spec/images/sergey.jpg +0 -0
- data/spec/images/sergey_out.jpg +0 -0
- metadata +126 -0
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Define version number for GData client and property extension jars.
|
2
|
+
# Specification version
|
3
|
+
client.spec.version=1.0
|
4
|
+
media.spec.version=1.0
|
5
|
+
appsforyourdomain.spec.version=1.0
|
6
|
+
analytics.spec.version=2.0
|
7
|
+
base.spec.version=1.0
|
8
|
+
blogger.spec.version=2.0
|
9
|
+
books.spec.version=1.0
|
10
|
+
calendar.spec.version=2.0
|
11
|
+
codesearch.spec.version=2.0
|
12
|
+
contacts.spec.version=3.0
|
13
|
+
docs.spec.version=3.0
|
14
|
+
finance.spec.version=2.0
|
15
|
+
health.spec.version=2.0
|
16
|
+
maps.spec.version=2.0
|
17
|
+
photos.spec.version=2.0
|
18
|
+
projecthosting.spec.version=2.0
|
19
|
+
sidewiki.spec.version=2.0
|
20
|
+
sites.spec.version=2.0
|
21
|
+
spreadsheet.spec.version=3.0
|
22
|
+
youtube.spec.version=2.0
|
23
|
+
webmastertools.spec.version=2.0
|
24
|
+
|
25
|
+
# Implementation version
|
26
|
+
client.impl.version=1.39.1
|
27
|
+
media.impl.version=1.0.2
|
28
|
+
appsforyourdomain.impl.version=1.1.3
|
29
|
+
analytics.impl.version=2.0.0
|
30
|
+
base.impl.version=1.2.0
|
31
|
+
blogger.impl.version=2.0.0
|
32
|
+
books.impl.version=1.0.0
|
33
|
+
calendar.impl.version=2.0.2
|
34
|
+
codesearch.impl.version=2.0.0
|
35
|
+
contacts.impl.version=3.0.0
|
36
|
+
docs.impl.version=3.0.0
|
37
|
+
finance.impl.version=2.0.0
|
38
|
+
health.impl.version=2.0.1
|
39
|
+
maps.impl.version=2.0.1
|
40
|
+
photos.impl.version=2.0.0
|
41
|
+
projecthosting.impl.version=2.0.0
|
42
|
+
sidewiki.impl.version=2.0.1
|
43
|
+
sites.impl.version=2.0.0
|
44
|
+
spreadsheet.impl.version=3.0.1
|
45
|
+
youtube.impl.version=2.1.1
|
46
|
+
webmastertools.impl.version=2.0.0
|
@@ -0,0 +1,22 @@
|
|
1
|
+
DEFAULT_APPLICATION_NAME = "Presdo-GDataJRubyClient-0.1"
|
2
|
+
|
3
|
+
module GData end
|
4
|
+
|
5
|
+
require 'java'
|
6
|
+
require File.dirname(__FILE__) + '/base'
|
7
|
+
require File.dirname(__FILE__) + '/contacts_service'
|
8
|
+
require File.dirname(__FILE__) + '/time_ext'
|
9
|
+
require File.dirname(__FILE__) + '/string_ext'
|
10
|
+
require File.dirname(__FILE__) + '/google_helpers'
|
11
|
+
require File.dirname(__FILE__) + '/base_entry'
|
12
|
+
require File.dirname(__FILE__) + '/text_content'
|
13
|
+
require File.dirname(__FILE__) + '/query'
|
14
|
+
require File.dirname(__FILE__) + '/when'
|
15
|
+
require File.dirname(__FILE__) + '/email'
|
16
|
+
require File.dirname(__FILE__) + '/im'
|
17
|
+
require File.dirname(__FILE__) + '/extended_property'
|
18
|
+
require File.dirname(__FILE__) + '/recurrence'
|
19
|
+
require File.dirname(__FILE__) + '/calendar_event_entry'
|
20
|
+
require File.dirname(__FILE__) + '/google_oauth_parameters'
|
21
|
+
require File.dirname(__FILE__) + '/google_service'
|
22
|
+
require File.dirname(__FILE__) + '/calendar_service'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module GoogleHelpers
|
2
|
+
include_class 'java.net.URL'
|
3
|
+
|
4
|
+
def url_for(url_or_string)
|
5
|
+
(url_or_string.kind_of? String) ? URL.new(url_or_string) : url_or_string
|
6
|
+
end
|
7
|
+
|
8
|
+
def update_attributes(attributes)
|
9
|
+
attributes.each do |k, v|
|
10
|
+
self.send("#{k}=".to_sym, (v.kind_of? Time)? v.to_joda_time : v)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module GData
|
2
|
+
include_package 'com.google.gdata.client.authn.oauth'
|
3
|
+
end
|
4
|
+
|
5
|
+
class Java::ComGoogleGdataClientAuthnOauth::GoogleOAuthParameters
|
6
|
+
def attributes=(credentials = {})
|
7
|
+
self.oauth_consumer_key = credentials[:consumer_key] if credentials[:consumer_key]
|
8
|
+
self.oauth_consumer_secret = credentials[:consumer_secret] if credentials[:consumer_secret]
|
9
|
+
self.oauth_token = credentials[:token] if credentials[:token]
|
10
|
+
self.oauth_token_secret = credentials[:token_secret] if credentials[:token_secret]
|
11
|
+
self
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class Java::ComGoogleGdataClient::GoogleService
|
2
|
+
include GoogleHelpers
|
3
|
+
|
4
|
+
def oauth_credentials=(credientials, signer=GData::OAuthHmacSha1Signer.new)
|
5
|
+
self.set_oauth_credentials(credientials, signer)
|
6
|
+
end
|
7
|
+
|
8
|
+
def auth_sub_token=(token, private_key=nil)
|
9
|
+
self.set_auth_sub_token(token, private_key)
|
10
|
+
end
|
11
|
+
|
12
|
+
def find_feed(options={})
|
13
|
+
raise "URL or query is required" unless options[:url] or options[:query]
|
14
|
+
raise "Feed Class is required" unless options[:class]
|
15
|
+
options[:url] = url_for(options[:url]) if options[:url]
|
16
|
+
|
17
|
+
if options[:etag] or options[:modified_since]
|
18
|
+
get_feed(options[:url] || options[:query],
|
19
|
+
options[:class].java_class,
|
20
|
+
options[:etag] || options[:modified_since])
|
21
|
+
else
|
22
|
+
get_feed(options[:url] || options[:query],
|
23
|
+
options[:class].java_class)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_entry(options={})
|
28
|
+
raise "URL or query is required" unless options[:url] or option[:query]
|
29
|
+
raise "Entry Class is required" unless options[:class]
|
30
|
+
options[:url] = url_for(options[:url]) if options[:url]
|
31
|
+
|
32
|
+
if options[:etag] or options[:modified_since]
|
33
|
+
get_entry(options[:url] || options[:query],
|
34
|
+
options[:class].java_class,
|
35
|
+
options[:etag] || options[:modified_since])
|
36
|
+
else
|
37
|
+
get_entry(options[:url] || options[:query],
|
38
|
+
options[:class].java_class)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_entry(options={})
|
43
|
+
raise "Feed URL is required" unless options[:url]
|
44
|
+
raise "Entry is required" unless options[:entry]
|
45
|
+
options[:url] = url_for(options[:url]) if options[:url]
|
46
|
+
|
47
|
+
insert(options[:url], options[:entry])
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_batch(options={})
|
51
|
+
raise "Feed URL is required" unless options[:url]
|
52
|
+
raise "Feed is required" unless options[:feed]
|
53
|
+
options[:url] = url_for(options[:url]) if options[:url]
|
54
|
+
|
55
|
+
batch(options[:url], options[:feed])
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/lib/im.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class Java::ComGoogleGdataDataExtensions::Im
|
2
|
+
include GoogleHelpers
|
3
|
+
|
4
|
+
alias_method :orig_initialize, :initialize
|
5
|
+
|
6
|
+
def initialize(options=nil)
|
7
|
+
if options.is_a? Hash
|
8
|
+
orig_initialize()
|
9
|
+
update_attributes(options)
|
10
|
+
elsif options.nil?
|
11
|
+
orig_initialize()
|
12
|
+
else
|
13
|
+
orig_initialize
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/query.rb
ADDED
data/lib/recurrence.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class Java::ComGoogleGdataDataExtensions::Recurrence
|
2
|
+
include GoogleHelpers
|
3
|
+
|
4
|
+
alias_method :orig_initialize, :initialize
|
5
|
+
|
6
|
+
def initialize(value=nil)
|
7
|
+
if value.nil?
|
8
|
+
orig_initialize
|
9
|
+
else
|
10
|
+
orig_initialize
|
11
|
+
self.value = value
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/string_ext.rb
ADDED
data/lib/text_content.rb
ADDED
data/lib/time_ext.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'parsedate'
|
2
|
+
|
3
|
+
class Time
|
4
|
+
include_class('com.google.gdata.data.DateTime') {|package,name| "G#{name}" }
|
5
|
+
|
6
|
+
def to_joda_time
|
7
|
+
GDateTime.parseDateTime(self.iso8601)
|
8
|
+
end
|
9
|
+
|
10
|
+
alias_method :to_gdata, :to_joda_time
|
11
|
+
alias_method :to_date_time, :to_joda_time
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def from_joda_time(gdatetime)
|
15
|
+
if defined? parse
|
16
|
+
self.parse(gdatetime.to_s)
|
17
|
+
else
|
18
|
+
res = ParseDate.parsedate(gdatetime.to_s)
|
19
|
+
Time.local(*res)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
alias_method :from_gdata, :from_joda_time
|
24
|
+
alias_method :from_date_time, :from_joda_time
|
25
|
+
end
|
26
|
+
|
27
|
+
unless defined? iso8601
|
28
|
+
# The following are copied from Rails. If you are using Rails, everything
|
29
|
+
# is already defined in ActiveSupport
|
30
|
+
def iso8601(fraction_digits = 0)
|
31
|
+
fraction = if fraction_digits > 0
|
32
|
+
".%i" % self.usec.to_s[0, fraction_digits]
|
33
|
+
end
|
34
|
+
"#{self.strftime("%Y-%m-%dT%H:%M:%S")}#{fraction}#{formatted_offset(true, 'Z')}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def formatted_offset(colon = true, alternate_utc_string = nil)
|
38
|
+
utc? && alternate_utc_string || to_utc_offset_s(utc_offset, colon)
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_utc_offset_s(utc_offset, colon=true)
|
42
|
+
seconds = utc_offset
|
43
|
+
sign = (seconds < 0 ? -1 : 1)
|
44
|
+
hours = seconds.abs / 3600
|
45
|
+
minutes = (seconds.abs % 3600) / 60
|
46
|
+
"%+03d%s%02d" % [ hours * sign, colon ? ":" : "", minutes ]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/when.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class Java::ComGoogleGdataDataExtensions::When
|
2
|
+
include GoogleHelpers
|
3
|
+
|
4
|
+
alias_method :orig_initialize, :initialize
|
5
|
+
|
6
|
+
def initialize(options=nil)
|
7
|
+
if options.is_a? Hash
|
8
|
+
orig_initialize()
|
9
|
+
update_attributes(options)
|
10
|
+
elsif options.nil?
|
11
|
+
orig_initialize()
|
12
|
+
else
|
13
|
+
orig_initialize
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/entry_spec.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require File.dirname(__FILE__) + '/../lib/gdata_jruby_client'
|
3
|
+
|
4
|
+
include GoogleHelpers
|
5
|
+
|
6
|
+
describe GData::Entry do
|
7
|
+
it "should able to initialize a new entry without attributes" do
|
8
|
+
entry = GData::CalendarEventEntry.new
|
9
|
+
entry.title = 'New Title'.to_plain_text
|
10
|
+
|
11
|
+
entry.title.plain_text.should == 'New Title'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should able to initialize a new entry with attributes" do
|
15
|
+
entry = GData::CalendarEventEntry.new({
|
16
|
+
:title => 'New Title'.to_plain_text,
|
17
|
+
:content => 'New Content'.to_plain_text })
|
18
|
+
|
19
|
+
entry.title.plain_text.should == 'New Title'
|
20
|
+
entry.content.plain_text.should == 'New Content'
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,296 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require File.dirname(__FILE__) + '/../lib/gdata_jruby_client'
|
3
|
+
require File.dirname(__FILE__) + '/google_keys.rb'
|
4
|
+
|
5
|
+
include GoogleHelpers
|
6
|
+
|
7
|
+
describe GData::CalendarService do
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
create_service
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should able to retrieving all calendars" do
|
14
|
+
feed = @service.find_feed(:url => GData::CalendarService::ALL_CALENDAR_URL)
|
15
|
+
feed.should_not be_nil
|
16
|
+
entries = feed.entries
|
17
|
+
entries.size.should > 0
|
18
|
+
entries.each do |e|
|
19
|
+
e.title.plain_text.should_not be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should able to retrieving own calendars" do
|
24
|
+
feed = @service.find_feed(:url => GData::CalendarService::OWN_CALENDAR_URL)
|
25
|
+
feed.should_not be_nil
|
26
|
+
entries = feed.entries
|
27
|
+
entries.size.should > 0
|
28
|
+
entries.each do |e|
|
29
|
+
e.title.plain_text.should_not be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Commented out if you run this test case too many times which will hit
|
34
|
+
# the API throttle limit
|
35
|
+
it "should be able to create, update and delete new calendars" do
|
36
|
+
# Create a new calendar
|
37
|
+
calendar = GData::CalendarEntry.new(
|
38
|
+
:title => "New Calendar".to_plain_text,
|
39
|
+
:summary => "This is a new Calendar.".to_plain_text,
|
40
|
+
:time_zone => GData::TimeZoneProperty.new('America/Los_Angeles'),
|
41
|
+
:hidden => GData::HiddenProperty::FALSE,
|
42
|
+
:color => GData::ColorProperty.new('#2952A3'))
|
43
|
+
calendar.add_location GData::Where.new("", "", "Palo Alto")
|
44
|
+
|
45
|
+
calendar = @service.create_entry(:url => GData::CalendarService::OWN_CALENDAR_URL,
|
46
|
+
:entry => calendar)
|
47
|
+
calendar.should_not be_nil
|
48
|
+
calendar.id.should_not be_nil
|
49
|
+
calendar.title.plain_text.should == "New Calendar"
|
50
|
+
|
51
|
+
#Update a new calendar
|
52
|
+
calendar.title = "New Title".to_gdata
|
53
|
+
calendar = calendar.update
|
54
|
+
calendar.title.plain_text.should == "New Title"
|
55
|
+
|
56
|
+
# Delete the calendar
|
57
|
+
lambda do
|
58
|
+
calendar.delete
|
59
|
+
end.should_not raise_error
|
60
|
+
|
61
|
+
feed = @service.find_feed(:url => GData::CalendarService::OWN_CALENDAR_URL)
|
62
|
+
entries = feed.entries
|
63
|
+
entries.each do |e|
|
64
|
+
e.id.should_not == calendar.id
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should be able to create, update, and delete events" do
|
69
|
+
event = GData::CalendarEventEntry.new(
|
70
|
+
:title => 'New Event'.to_plain_text,
|
71
|
+
:content => 'New Content'.to_plain_text)
|
72
|
+
event_time = GData::When.new(
|
73
|
+
:start_time => Time.local(2010, "dec", 25, 20, 0, 0),
|
74
|
+
:end_time => Time.local(2010, "dec", 25, 21, 0, 0))
|
75
|
+
event.add_time(event_time)
|
76
|
+
event = @service.create_entry(:url => GData::CalendarService::DEFAULT_CALENDAR_URI,
|
77
|
+
:entry => event)
|
78
|
+
event.id.should_not be_nil
|
79
|
+
|
80
|
+
event.title = 'New Title'.to_plain_text
|
81
|
+
event = event.update
|
82
|
+
event.title.plain_text.should == 'New Title'
|
83
|
+
|
84
|
+
lambda do
|
85
|
+
event.delete
|
86
|
+
end.should_not raise_error
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should able to quick add an event" do
|
90
|
+
event = GData::CalendarEventEntry.new(
|
91
|
+
:content => "Say Hi to Jerry Oct 31, 2010 12pm-1pm".to_plain_text,
|
92
|
+
:quick_add => true)
|
93
|
+
|
94
|
+
event = @service.create_entry(:url => GData::CalendarService::DEFAULT_CALENDAR_URI,
|
95
|
+
:entry => event)
|
96
|
+
|
97
|
+
event.id.should_not be_nil
|
98
|
+
|
99
|
+
event.title.plain_text.should == "Say Hi to Jerry"
|
100
|
+
start_time = Time.from_joda_time(event.times.first.start_time)
|
101
|
+
start_time.should == Time.local(2010, 10, 31, 12, 0, 0, "-07:00", nil)
|
102
|
+
|
103
|
+
lambda do
|
104
|
+
event.delete
|
105
|
+
end.should_not raise_error
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should be able to create recurring events" do
|
109
|
+
recur_data = "DTSTART;VALUE=DATE:20070501\n" +
|
110
|
+
"DTEND;VALUE=DATE:20070502\n" +
|
111
|
+
"RRULE:FREQ=WEEKLY;BYDAY=Tu;UNTIL=20070904"
|
112
|
+
recur = GData::Recurrence.new(recur_data)
|
113
|
+
event = GData::CalendarEventEntry.new(:recurrence => recur)
|
114
|
+
|
115
|
+
event = @service.create_entry(:url => GData::CalendarService::DEFAULT_CALENDAR_URI,
|
116
|
+
:entry => event)
|
117
|
+
|
118
|
+
event.id.should_not be_nil
|
119
|
+
event.recurrence.value.should == recur_data
|
120
|
+
|
121
|
+
lambda do
|
122
|
+
event.delete
|
123
|
+
end.should_not raise_error
|
124
|
+
end
|
125
|
+
|
126
|
+
# Copied from Google: When working with batch requests, the size of the request must be
|
127
|
+
# under a megabyte and it's best to limit batches to 50-100 operations at a time.
|
128
|
+
it "should be able to perform multiple operations with a batch request" do
|
129
|
+
# Create a test calendar so this test case won't have dependency on the test account
|
130
|
+
calendar = GData::CalendarEntry.new(:title => "Test Calendar".to_plain_text)
|
131
|
+
calendar = @service.create_entry(:url => GData::CalendarService::OWN_CALENDAR_URL,
|
132
|
+
:entry => calendar)
|
133
|
+
calendar_url = calendar.get_link(nil, nil).href
|
134
|
+
|
135
|
+
# Create some events
|
136
|
+
1.upto 3 do |i|
|
137
|
+
event = GData::CalendarEventEntry.new(:title => "Test Event #{i}".to_plain_text)
|
138
|
+
event = @service.create_entry(:url => calendar_url, :entry => event)
|
139
|
+
end
|
140
|
+
|
141
|
+
# Give it a small delay such that the changes is propagated
|
142
|
+
sleep(2)
|
143
|
+
|
144
|
+
# Get some events to operate on
|
145
|
+
feed = @service.find_feed(:url => calendar_url)
|
146
|
+
|
147
|
+
insert_event = GData::CalendarEventEntry.new(:title => 'first batch event'.to_plain_text)
|
148
|
+
GData::BatchUtils.set_batch_id(insert_event, "1")
|
149
|
+
GData::BatchUtils.set_batch_operation_type(insert_event, GData::BatchOperationType::INSERT)
|
150
|
+
|
151
|
+
query_event = feed.entries[0]
|
152
|
+
GData::BatchUtils.set_batch_id(query_event, "2")
|
153
|
+
GData::BatchUtils.set_batch_operation_type(query_event, GData::BatchOperationType::QUERY)
|
154
|
+
|
155
|
+
update_event = feed.entries[1]
|
156
|
+
update_event.title = 'update via batch'.to_plain_text
|
157
|
+
GData::BatchUtils.set_batch_id(update_event, "3")
|
158
|
+
GData::BatchUtils.set_batch_operation_type(update_event, GData::BatchOperationType::UPDATE)
|
159
|
+
|
160
|
+
delete_event = feed.entries[2]
|
161
|
+
GData::BatchUtils.set_batch_id(delete_event, "4")
|
162
|
+
GData::BatchUtils.set_batch_operation_type(delete_event, GData::BatchOperationType::DELETE)
|
163
|
+
|
164
|
+
batch_request = GData::CalendarEventFeed.new
|
165
|
+
batch_request.entries << insert_event
|
166
|
+
batch_request.entries << query_event
|
167
|
+
batch_request.entries << update_event
|
168
|
+
batch_request.entries << delete_event
|
169
|
+
|
170
|
+
# Get the batch link URL and send the batch request there
|
171
|
+
batch_url = feed.get_link(GData::Link::Rel::FEED_BATCH, GData::Link::Type::ATOM).href
|
172
|
+
batch_response = @service.create_batch(:url => batch_url, :feed => batch_request)
|
173
|
+
|
174
|
+
batch_response.entries.each do |entry|
|
175
|
+
unless GData::BatchUtils.success?(entry)
|
176
|
+
batch_id = GData::BatchUtils.getBatchId(entry)
|
177
|
+
status = GData::BatchUtils.getBatchStatus(entry)
|
178
|
+
puts "#{batch_id} failed (#{status.reason}) #{status.content}"
|
179
|
+
end
|
180
|
+
GData::BatchUtils.success?(entry).should == true
|
181
|
+
end
|
182
|
+
|
183
|
+
# Clean up
|
184
|
+
sleep(3)
|
185
|
+
calendar.delete
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should be able to add extented properties to the event" do
|
189
|
+
event = GData::CalendarEventEntry.new(
|
190
|
+
:title => 'New Event'.to_plain_text,
|
191
|
+
:content => 'New Content'.to_plain_text)
|
192
|
+
event_time = GData::When.new(
|
193
|
+
:start_time => Time.local(2010, "dec", 25, 20, 0, 0),
|
194
|
+
:end_time => Time.local(2010, "dec", 25, 21, 0, 0))
|
195
|
+
event.add_time(event_time)
|
196
|
+
|
197
|
+
property = GData::ExtendedProperty.new(
|
198
|
+
:name => 'http://schemas.presdo.com/2009#event.id',
|
199
|
+
:value => '1234')
|
200
|
+
event.add_extended_property(property)
|
201
|
+
|
202
|
+
event = @service.create_entry(:url => GData::CalendarService::DEFAULT_CALENDAR_URI,
|
203
|
+
:entry => event)
|
204
|
+
event.id.should_not be_nil
|
205
|
+
|
206
|
+
event.extended_properties.first.name.should == 'http://schemas.presdo.com/2009#event.id'
|
207
|
+
event.extended_properties.first.value.should == '1234'
|
208
|
+
|
209
|
+
lambda do
|
210
|
+
event.delete
|
211
|
+
end.should_not raise_error
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "Retrieving events" do
|
215
|
+
before(:all) do
|
216
|
+
create_service
|
217
|
+
|
218
|
+
@calendar = GData::CalendarEntry.new(
|
219
|
+
:title => "Test Calendar".to_plain_text,
|
220
|
+
:time_zone => GData::TimeZoneProperty.new('America/Los_Angeles'))
|
221
|
+
@calendar = @service.create_entry(:url => GData::CalendarService::OWN_CALENDAR_URL,
|
222
|
+
:entry => @calendar)
|
223
|
+
@calendar_url = @calendar.get_link(nil, nil).href
|
224
|
+
|
225
|
+
@event = GData::CalendarEventEntry.new(:title => 'Test Event'.to_plain_text)
|
226
|
+
@event_time = GData::When.new(
|
227
|
+
:start_time => Time.local(2010, "dec", 25, 20, 0, 0),
|
228
|
+
:end_time => Time.local(2010, "dec", 25, 21, 0, 0))
|
229
|
+
@event.add_time(@event_time)
|
230
|
+
@event = @service.create_entry(:url => @calendar_url, :entry => @event)
|
231
|
+
end
|
232
|
+
|
233
|
+
after(:all) do
|
234
|
+
sleep(3)
|
235
|
+
@calendar.delete
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should retrieve events without query parameters" do
|
239
|
+
feed = @service.find_feed(:url => @calendar_url)
|
240
|
+
feed.should_not be_nil
|
241
|
+
entries = feed.entries
|
242
|
+
entries.size.should == 1
|
243
|
+
entries.first.id.should == @event.id
|
244
|
+
end
|
245
|
+
|
246
|
+
it "should retrieve events for a specified date range" do
|
247
|
+
query = GData::CalendarQuery.new(
|
248
|
+
:url => @calendar_url,
|
249
|
+
:minimum_start_time => Time.local(2010, "dec", 25, 0, 0, 0),
|
250
|
+
:maximum_start_time => Time.local(2010, "dec", 26, 0, 0, 0))
|
251
|
+
|
252
|
+
feed = @service.find_feed(:query => query)
|
253
|
+
feed.should_not be_nil
|
254
|
+
entries = feed.entries
|
255
|
+
entries.size.should == 1
|
256
|
+
entries.first.id.should == @event.id
|
257
|
+
|
258
|
+
query = GData::CalendarQuery.new(@calendar_url)
|
259
|
+
query.minimum_start_time = Time.local(2010, "dec", 20, 0, 0, 0).to_joda_time
|
260
|
+
query.maximum_start_time = Time.local(2010, "dec", 21, 0, 0, 0).to_joda_time
|
261
|
+
|
262
|
+
feed = @service.find_feed(:query => query)
|
263
|
+
feed.should_not be_nil
|
264
|
+
feed.entries.size.should == 0
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should retrieve events matching a full text query" do
|
268
|
+
query = GData::CalendarQuery.new(
|
269
|
+
:url => @calendar_url,
|
270
|
+
:full_text_query => "Test Event")
|
271
|
+
|
272
|
+
feed = @service.find_feed(:query => query)
|
273
|
+
feed.should_not be_nil
|
274
|
+
entries = feed.entries
|
275
|
+
entries.size.should == 1
|
276
|
+
entries.first.id.should == @event.id
|
277
|
+
end
|
278
|
+
|
279
|
+
end
|
280
|
+
|
281
|
+
def create_service
|
282
|
+
@service = GData::CalendarService.new DEFAULT_APPLICATION_NAME
|
283
|
+
# Use OAuth
|
284
|
+
credentials = GData::GoogleOAuthParameters.new
|
285
|
+
credentials.attributes = {
|
286
|
+
:consumer_key => CONSUMER_KEY,
|
287
|
+
:consumer_secret => CONSUMER_SECRET,
|
288
|
+
:token => TOKEN,
|
289
|
+
:token_secret => TOKEN_SECRET }
|
290
|
+
@service.oauth_credentials = credentials
|
291
|
+
# Use AuthSubToken
|
292
|
+
# @service.auth_sub_token = SESSION_TOKEN
|
293
|
+
@service
|
294
|
+
end
|
295
|
+
|
296
|
+
end
|