gaah 0.1.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.
- checksums.yaml +15 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +24 -0
- data/README.md +51 -0
- data/gaah.gemspec +25 -0
- data/lib/gaah.rb +1 -0
- data/lib/gaah/api_client.rb +49 -0
- data/lib/gaah/api_model.rb +40 -0
- data/lib/gaah/base.rb +22 -0
- data/lib/gaah/calendar/api.rb +41 -0
- data/lib/gaah/calendar/event.rb +58 -0
- data/lib/gaah/calendar/when.rb +18 -0
- data/lib/gaah/calendar/who.rb +51 -0
- data/lib/gaah/provisioning/api.rb +16 -0
- data/lib/gaah/provisioning/user.rb +53 -0
- data/lib/gaah/version.rb +3 -0
- data/spec/fixtures/calendar.xml +369 -0
- data/spec/fixtures/provisioning.xml +39 -0
- data/spec/models/event_spec.rb +99 -0
- data/spec/models/user_spec.rb +34 -0
- data/spec/spec_helper.rb +8 -0
- metadata +126 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YTZkNjZhYTVmMjJiMjBiNzMzYWRiOTZjNDFlOTQ0MjQ2OTE5ZDg0YQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTUwMmEwN2E1MDVjNzNlMTdiOTNiZDA3YTdmOWZiOTAxMTAwNWFhYQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NTc5OTQwNGY3MzU0MzVjYzljY2E1ZDNiZWIyOGU3ZGI4ZGU1ZDhiZmRjMTdl
|
10
|
+
ZmJmNGY2ZDI2ZDRjNDU1YjAyMTIzM2M2ZDY0NTg1ZjMyMTQzZTI2MzY1NmUx
|
11
|
+
M2I5NmQ3MmFmZmJhOTY1MmI3NTQ5MTA4MjY4MmUyZDI2MzY3ODM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDNlYzRjYWI0ZWU1M2U3YjU5NjdhOTA5ZGQwNzI3ZGNiNjk1Y2IwODc3NDEz
|
14
|
+
YzI0YWMxOTIxZDZmMTQ4ZTYxZmI0ODIzODlmNjlmYWYxNWNiYjJiNWJkOGJi
|
15
|
+
ZTg3ZDk3MTZmOGI5NjM0YmMwMDU4NjVlMmRlOGUyNTk2OTFiYTk=
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
tmp
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.2.2)
|
5
|
+
nokogiri (1.5.9)
|
6
|
+
oauth (0.4.7)
|
7
|
+
queryparams (0.0.3)
|
8
|
+
rspec (2.13.0)
|
9
|
+
rspec-core (~> 2.13.0)
|
10
|
+
rspec-expectations (~> 2.13.0)
|
11
|
+
rspec-mocks (~> 2.13.0)
|
12
|
+
rspec-core (2.13.1)
|
13
|
+
rspec-expectations (2.13.0)
|
14
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
15
|
+
rspec-mocks (2.13.0)
|
16
|
+
|
17
|
+
PLATFORMS
|
18
|
+
ruby
|
19
|
+
|
20
|
+
DEPENDENCIES
|
21
|
+
nokogiri (~> 1.5)
|
22
|
+
oauth (~> 0.4)
|
23
|
+
queryparams (= 0.0.3)
|
24
|
+
rspec (~> 2.5)
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# GAAH - Google Apps API Helper
|
2
|
+
|
3
|
+
### API Wrapper for Google Apps Marketplace
|
4
|
+
|
5
|
+
Currently supports:
|
6
|
+
|
7
|
+
 Provisioning API (read-only)
|
8
|
+
|
9
|
+
 Calendar API
|
10
|
+
|
11
|
+
### Example Code
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
CLIENT_KEY = '000000000000.apps.googleusercontent.com'
|
15
|
+
CLIENT_SECRET = 'abcdefghijklmnopqrstuvwx'
|
16
|
+
DOMAIN = 'example.com'
|
17
|
+
|
18
|
+
# Setup
|
19
|
+
require 'gaah'
|
20
|
+
Gaah.setup_oauth(CLIENT_KEY, CLIENT_SECRET)
|
21
|
+
Gaah.domain = DOMAIN
|
22
|
+
|
23
|
+
# Get users
|
24
|
+
users = Gaah::Provisioning::Api.users
|
25
|
+
user = users.first
|
26
|
+
user.id # "https://apps-apis.google.com/a/feeds/example.com/user/2.0/bobert"
|
27
|
+
user.name # "Bobert Jones"
|
28
|
+
user.title # "bobert"
|
29
|
+
|
30
|
+
# Get calendar events
|
31
|
+
xoauth_requestor_id = 'me@example.com'
|
32
|
+
events = user.events(xoauth_requestor_id)
|
33
|
+
event = events.first
|
34
|
+
event.title # "Meeting with Joe"
|
35
|
+
event.when.start_time # 2013-04-16 13:00:00 -0400
|
36
|
+
```
|
37
|
+
|
38
|
+
### Resources
|
39
|
+
|
40
|
+
Warning: Google documentation links sometimes move without good redirection.
|
41
|
+
|
42
|
+
* [Google Data APIs](https://developers.google.com/gdata/)
|
43
|
+
* [Google Apps Application APIs](https://developers.google.com/google-apps/app-apis)
|
44
|
+
* [Google Apps Administrative APIs](https://developers.google.com/google-apps/admin-apis)
|
45
|
+
* [Google Calendar API v2](https://developers.google.com/google-apps/calendar/v2/developers_guide_protocol)
|
46
|
+
* [Google Apps Provisioning API v2](https://developers.google.com/google-apps/provisioning/)
|
47
|
+
|
48
|
+
### Todo
|
49
|
+
* Look into data api v3 when Provisioning API is updated
|
50
|
+
* Possibly integrate [Google Apps Calendar Resource API](https://developers.google.com/google-apps/calendar-resource/)
|
51
|
+
* Error handling
|
data/gaah.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "gaah/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "gaah"
|
7
|
+
s.version = Gaah::VERSION
|
8
|
+
s.date = "2013-04-03"
|
9
|
+
s.authors = ["Hwan-Joon Choi"]
|
10
|
+
s.email = ["hc5duke@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/distill-inc/gaah"
|
12
|
+
|
13
|
+
s.summary = "Limited API Wrapper for Google Apps API."
|
14
|
+
s.description = "Google Apps Marketplace API wrapper in ruby for Distill."
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency "nokogiri", "~> 1.5"
|
22
|
+
s.add_dependency 'oauth', "~> 0.4"
|
23
|
+
s.add_dependency 'queryparams', "0.0.3"
|
24
|
+
s.add_development_dependency "rspec", "~> 2.5"
|
25
|
+
end
|
data/lib/gaah.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'gaah/base'
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Gaah
|
2
|
+
class ApiClient
|
3
|
+
class << self
|
4
|
+
attr_accessor :consumer_key, :consumer_secret, :instance
|
5
|
+
|
6
|
+
def setup_oauth(key, secret)
|
7
|
+
@@consumer_key = key
|
8
|
+
@@consumer_secret = secret
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
12
|
+
def not_setup?
|
13
|
+
@@consumer_key.nil? || @@consumer_secret.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def instance
|
17
|
+
@@instance ||= new
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
raise 'consumer_key and consumer_secret not set' if ApiClient.not_setup?
|
23
|
+
oauth_consumer = OAuth::Consumer.new(@@consumer_key, @@consumer_secret)
|
24
|
+
@token = OAuth::AccessToken.new(oauth_consumer)
|
25
|
+
end
|
26
|
+
|
27
|
+
def get(base, query_params={})
|
28
|
+
url = base
|
29
|
+
url = "#{base}?#{QueryParams.encode(query_params)}" if query_params.keys.length > 0
|
30
|
+
make_request(:get, url)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def make_request(method, url)
|
36
|
+
response = @token.request(method, url, 'GData-Version' => '2.0')
|
37
|
+
|
38
|
+
if response.is_a? Net::HTTPSuccess
|
39
|
+
response.body
|
40
|
+
elsif response.is_a? Net::HTTPFound
|
41
|
+
url = response['Location']
|
42
|
+
make_request(method, response['Location'])
|
43
|
+
else
|
44
|
+
# TODO: error handling
|
45
|
+
response
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Gaah
|
2
|
+
class ApiModel
|
3
|
+
attr_reader :id
|
4
|
+
|
5
|
+
def self.batch_create(xml)
|
6
|
+
(xml/:entry).map(&method(:new))
|
7
|
+
end
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def ==(other)
|
12
|
+
@id == other.id
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def store_xml(xml)
|
18
|
+
@xml = xml.is_a?(String) ? Nokogiri::XML(xml) : xml
|
19
|
+
end
|
20
|
+
|
21
|
+
def inner_text(tag)
|
22
|
+
(@xml/tag).inner_text
|
23
|
+
end
|
24
|
+
|
25
|
+
def attr_value(tag, attribute = 'value')
|
26
|
+
node = (@xml/tag).first
|
27
|
+
return nil if node.nil?
|
28
|
+
attr = node.attr(attribute)
|
29
|
+
attr.respond_to?(:value) ? attr.value : attr
|
30
|
+
end
|
31
|
+
|
32
|
+
def tag_value(tag)
|
33
|
+
attr_value(tag).split('.').last
|
34
|
+
end
|
35
|
+
|
36
|
+
def inspect
|
37
|
+
"#<#{self.class}:#{object_id}>"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/gaah/base.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'time'
|
3
|
+
require 'date'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
require 'oauth'
|
7
|
+
require 'nokogiri'
|
8
|
+
require 'queryparams'
|
9
|
+
|
10
|
+
require 'gaah/api_client'
|
11
|
+
require 'gaah/api_model'
|
12
|
+
require 'gaah/calendar/api'
|
13
|
+
require 'gaah/provisioning/api'
|
14
|
+
|
15
|
+
module Gaah
|
16
|
+
class << self
|
17
|
+
attr_accessor :domain
|
18
|
+
def setup_oauth(key, secret)
|
19
|
+
ApiClient.setup_oauth(key, secret)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'gaah/calendar/event'
|
2
|
+
require 'gaah/calendar/when'
|
3
|
+
require 'gaah/calendar/who'
|
4
|
+
|
5
|
+
module Gaah
|
6
|
+
module Calendar
|
7
|
+
class Api
|
8
|
+
class << self
|
9
|
+
def events(xoauth_requestor_id, options)
|
10
|
+
url = build_api_url(options[:email])
|
11
|
+
params = build_api_params(xoauth_requestor_id, options)
|
12
|
+
xml = ApiClient.instance.get(url, params)
|
13
|
+
events = Nokogiri::XML(xml)/:entry
|
14
|
+
Event.batch_create(events)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def build_api_url(email)
|
20
|
+
API_URL.sub('EMAIL', email || 'default')
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_api_params(xoauth_requestor_id, options)
|
24
|
+
api_params = { xoauth_requestor_id: xoauth_requestor_id }
|
25
|
+
api_params[:orderby] = options.delete(:order_by) || 'starttime'
|
26
|
+
api_params[:singleevents] = options.delete(:single_events) || true
|
27
|
+
api_params[:sortorder] = options.delete(:sort_order) || 'a'
|
28
|
+
api_params['start-min'] = stringify(options.delete(:start_min))
|
29
|
+
api_params['start-max'] = stringify(options.delete(:start_max))
|
30
|
+
api_params
|
31
|
+
end
|
32
|
+
|
33
|
+
def stringify(time)
|
34
|
+
time.nil? ? nil : time.strftime('%Y-%m-%dT17:00:00')
|
35
|
+
end
|
36
|
+
|
37
|
+
API_URL = 'https://www.google.com/calendar/feeds/EMAIL/private/full'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Gaah
|
2
|
+
module Calendar
|
3
|
+
class Event < Gaah::ApiModel
|
4
|
+
attr_reader :published, :updated, :title, :content, :status, :who, :when, :where, :author, :transparency, :visibility
|
5
|
+
|
6
|
+
def initialize(xml)
|
7
|
+
store_xml(xml)
|
8
|
+
|
9
|
+
@id = inner_text(:id)
|
10
|
+
@published = Time.parse(inner_text(:published))
|
11
|
+
@updated = Time.parse(inner_text(:updated))
|
12
|
+
@title = inner_text(:title)
|
13
|
+
@content = inner_text(:content)
|
14
|
+
@status = tag_value('gd|eventStatus')
|
15
|
+
@where = attr_value('gd|where', 'valueString')
|
16
|
+
@author = Who.new((@xml/:author).first)
|
17
|
+
@when = parse_when
|
18
|
+
@who = parse_who
|
19
|
+
@transparency = tag_value('gd|transparency')
|
20
|
+
@visibility = tag_value('gd|visibility')
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_json(*args)
|
24
|
+
{
|
25
|
+
id: @id,
|
26
|
+
published: @published,
|
27
|
+
updated: @updated,
|
28
|
+
title: @title,
|
29
|
+
content: @content,
|
30
|
+
status: @status,
|
31
|
+
where: @where,
|
32
|
+
author: @author,
|
33
|
+
when: @when,
|
34
|
+
who: @who,
|
35
|
+
transparency: @transparency,
|
36
|
+
visibility: @visibility,
|
37
|
+
}.to_json
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def store_xml(xml)
|
43
|
+
super
|
44
|
+
unless @xml.attr('gd:kind') == "calendar#event"
|
45
|
+
puts "Possible invalid event xml - gd:kind is #{ @xml.attr('gd:kind') }"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse_when
|
50
|
+
When.new(attr_value('> gd|when', 'startTime'), attr_value('> gd|when', 'endTime'))
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse_who
|
54
|
+
(@xml/'gd|who').map {|attendee| Who.new(attendee) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Gaah
|
2
|
+
module Calendar
|
3
|
+
class When
|
4
|
+
attr_accessor :start_time, :end_time
|
5
|
+
def initialize(start_time, end_time)
|
6
|
+
@start_time = Time.parse(start_time)
|
7
|
+
@end_time = Time.parse(end_time)
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_json(*args)
|
11
|
+
{
|
12
|
+
start_time: @start_time,
|
13
|
+
end_time: @end_time,
|
14
|
+
}.to_json
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Gaah
|
2
|
+
module Calendar
|
3
|
+
class Who
|
4
|
+
attr_reader :name, :email, :aliases
|
5
|
+
def initialize(xml)
|
6
|
+
@aliases = []
|
7
|
+
|
8
|
+
case xml.name
|
9
|
+
when 'author'
|
10
|
+
@name = (xml/:name).inner_text
|
11
|
+
@email = (xml/:email).inner_text
|
12
|
+
when 'who'
|
13
|
+
@name = xml.attr(:valueString)
|
14
|
+
@email = xml.attr(:email)
|
15
|
+
when 'entry'
|
16
|
+
@name = (xml/:title).inner_text
|
17
|
+
(xml/'gd|email').each do |gd_email|
|
18
|
+
email = gd_email.attr('address')
|
19
|
+
@aliases << email
|
20
|
+
@email = email if gd_email.attr('primary') == 'true'
|
21
|
+
end
|
22
|
+
else
|
23
|
+
raise "Invalid person record #{xml.name}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def catch_all_user?
|
28
|
+
self.email.to_s =~ /^\.@/
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_json(*args)
|
32
|
+
{
|
33
|
+
name: name,
|
34
|
+
email: email,
|
35
|
+
aliases: aliases,
|
36
|
+
}.to_json
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.batch_process(xml, exclude_catch_all_user = true)
|
40
|
+
(xml/:entry).map do |entry|
|
41
|
+
who = new(entry)
|
42
|
+
if exclude_catch_all_user && who.catch_all_user?
|
43
|
+
nil
|
44
|
+
else
|
45
|
+
who
|
46
|
+
end
|
47
|
+
end.compact
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'gaah/provisioning/user'
|
2
|
+
|
3
|
+
module Gaah
|
4
|
+
module Provisioning
|
5
|
+
class Api
|
6
|
+
class << self
|
7
|
+
def users
|
8
|
+
url = "https://apps-apis.google.com/a/feeds/#{Gaah.domain}/user/2.0"
|
9
|
+
xml = ApiClient.instance.get(url)
|
10
|
+
users = Nokogiri::XML(xml)/:entry
|
11
|
+
User.batch_create(users)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Gaah
|
2
|
+
module Provisioning
|
3
|
+
class User < Gaah::ApiModel
|
4
|
+
attr_reader :suspended, :admin, :title, :user_name, :family_name, :given_name, :name, :email
|
5
|
+
|
6
|
+
def initialize(entry)
|
7
|
+
store_xml(entry)
|
8
|
+
|
9
|
+
# Meta
|
10
|
+
@id = inner_text(:id)
|
11
|
+
@email = parse_email
|
12
|
+
@suspended = attr_value('apps|login', 'suspended') == 'true'
|
13
|
+
@admin = attr_value('apps|login', 'admin') == 'true'
|
14
|
+
|
15
|
+
# Name
|
16
|
+
@title = inner_text(:title)
|
17
|
+
@user_name = attr_value('apps|login', 'userName')
|
18
|
+
@family_name = attr_value('apps|name', 'familyName')
|
19
|
+
@given_name = attr_value('apps|name', 'givenName')
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse_email
|
23
|
+
email_link = (@xml/'gd|feedLink').select { |link|
|
24
|
+
link.attr('rel').end_with?('user.emailLists')
|
25
|
+
}.first
|
26
|
+
return nil if email_link.nil?
|
27
|
+
CGI::unescape(email_link.attr('href').split('recipient=').last)
|
28
|
+
end
|
29
|
+
|
30
|
+
def name
|
31
|
+
"#{@given_name} #{@family_name}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def events(xoauth_requestor_id, options = {})
|
35
|
+
options[:email] = @email
|
36
|
+
Gaah::Calendar::Api.events(xoauth_requestor_id, options)
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_json(*args)
|
40
|
+
{
|
41
|
+
id: @id,
|
42
|
+
suspended: @suspended,
|
43
|
+
admin: @admin,
|
44
|
+
title: @title,
|
45
|
+
user_name: @user_name,
|
46
|
+
family_name: @family_name,
|
47
|
+
given_name: @given_name,
|
48
|
+
name: @name,
|
49
|
+
}.to_json
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/gaah/version.rb
ADDED
@@ -0,0 +1,369 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/"CU4CQn47eCp7JGA9WhBXGUg."" gd:kind="calendar#eventFeed">
|
3
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/private/full</id>
|
4
|
+
<updated>2013-04-03T01:52:43.000Z</updated>
|
5
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
6
|
+
<title>bobert@example.com</title>
|
7
|
+
<subtitle>bobert@example.com</subtitle>
|
8
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/embed?src=bobert%40example.com"/>
|
9
|
+
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full?xoauth_requestor_id=bobert@example.com"/>
|
10
|
+
<link rel="http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/batch?xoauth_requestor_id=bobert@example.com"/>
|
11
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full?max-results=25&start-min=2013-03-31T17%3A00%3A00&singleevents=true&start-max=2013-04-07T17%3A00%3A00&sortorder=a&orderby=starttime&xoauth_requestor_id=bobert@example.com"/>
|
12
|
+
<author>
|
13
|
+
<name>Bobert Jones</name>
|
14
|
+
<email>bobert@example.com</email>
|
15
|
+
</author>
|
16
|
+
<generator version="1.0" uri="http://www.google.com/calendar">Google Calendar</generator>
|
17
|
+
<openSearch:totalResults>10</openSearch:totalResults>
|
18
|
+
<openSearch:startIndex>1</openSearch:startIndex>
|
19
|
+
<openSearch:itemsPerPage>25</openSearch:itemsPerPage>
|
20
|
+
<gCal:timezone value="America/Los_Angeles"/>
|
21
|
+
<gCal:timesCleaned value="0"/>
|
22
|
+
<entry gd:etag=""GUQLQwVIfip7JGA6WhJa"" gd:kind="calendar#event">
|
23
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/n9ommrehhjm5dc6q89ofkm3f8g</id>
|
24
|
+
<published>2013-03-25T16:49:48.000Z</published>
|
25
|
+
<updated>2013-03-25T17:03:10.000Z</updated>
|
26
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
27
|
+
<title>MomCorp</title>
|
28
|
+
<content/>
|
29
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=bjlvbW1yZWhoam01ZGM2cTg5b2ZrbTNmOGcga2FpQGRpc3RpbGwuY2M" title="alternate"/>
|
30
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/n9ommrehhjm5dc6q89ofkm3f8g?xoauth_requestor_id=bobert@example.com"/>
|
31
|
+
<author>
|
32
|
+
<name>Bobert Jones</name>
|
33
|
+
<email>bobert@example.com</email>
|
34
|
+
</author>
|
35
|
+
<gd:comments>
|
36
|
+
<gd:feedLink href="https://www.google.com"/>
|
37
|
+
</gd:comments>
|
38
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
39
|
+
<gd:where valueString=""/>
|
40
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="Bobert Jones">
|
41
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
42
|
+
</gd:who>
|
43
|
+
<gd:who email="fry@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Philip Fry">
|
44
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
45
|
+
</gd:who>
|
46
|
+
<gd:when endTime="2013-04-01T11:00:00.000-07:00" startTime="2013-04-01T10:00:00.000-07:00"/>
|
47
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
48
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
49
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
50
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
51
|
+
<gCal:guestsCanModify value="false"/>
|
52
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
53
|
+
<gCal:sequence value="0"/>
|
54
|
+
<gCal:uid value="n9ommrehhjm5dc6q89ofkm3f8g@google.com"/>
|
55
|
+
</entry>
|
56
|
+
<entry gd:etag=""EEgITgRIdip7JGA6WhNT"" gd:kind="calendar#event">
|
57
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/b2if8georrqg4ie9p04t3jdvd0_20130401T233000Z</id>
|
58
|
+
<published>2013-03-04T16:52:10.000Z</published>
|
59
|
+
<updated>2013-04-01T19:51:38.000Z</updated>
|
60
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
61
|
+
<title>Weekly Sync</title>
|
62
|
+
<content/>
|
63
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=YjJpZjhnZW9ycnFnNGllOXAwNHQzamR2ZDBfMjAxMzA0MDFUMjMzMDAwWiBrYWlAZGlzdGlsbC5jYw" title="alternate"/>
|
64
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/b2if8georrqg4ie9p04t3jdvd0_20130401T233000Z?xoauth_requestor_id=bobert@example.com"/>
|
65
|
+
<author>
|
66
|
+
<name>Bobert Jones</name>
|
67
|
+
<email>bobert@example.com</email>
|
68
|
+
</author>
|
69
|
+
<gd:comments>
|
70
|
+
<gd:feedLink href="https://www.google.com"/>
|
71
|
+
</gd:comments>
|
72
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
73
|
+
<gd:where valueString=""/>
|
74
|
+
<gd:originalEvent href="http://www.google.com/calendar/feeds/bobert%40example.com/private/full/b2if8georrqg4ie9p04t3jdvd0" id="b2if8georrqg4ie9p04t3jdvd0">
|
75
|
+
<gd:when startTime="2013-04-01T16:30:00.000-07:00"/>
|
76
|
+
</gd:originalEvent>
|
77
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="Bobert Jones">
|
78
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
79
|
+
</gd:who>
|
80
|
+
<gd:who email="fry@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Philip Fry">
|
81
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
82
|
+
</gd:who>
|
83
|
+
<gd:who email="leela@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Turanga Leela">
|
84
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
85
|
+
</gd:who>
|
86
|
+
<gd:who email="bender@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Bender Rodriguez">
|
87
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.invited"/>
|
88
|
+
</gd:who>
|
89
|
+
<gd:who email="farnsworth@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Hubert Farnsworth">
|
90
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
91
|
+
</gd:who>
|
92
|
+
<gd:who email="zoidberg@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="John Zoidberg">
|
93
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.invited"/>
|
94
|
+
</gd:who>
|
95
|
+
<gd:when endTime="2013-04-01T13:00:00.000-07:00" startTime="2013-04-01T12:00:00.000-07:00"/>
|
96
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
97
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
98
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
99
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
100
|
+
<gCal:guestsCanModify value="true"/>
|
101
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
102
|
+
<gCal:sequence value="1"/>
|
103
|
+
<gCal:uid value="b2if8georrqg4ie9p04t3jdvd0@google.com"/>
|
104
|
+
</entry>
|
105
|
+
<entry gd:etag=""EE8IQQdHfyp7JGA6WhNT"" gd:kind="calendar#event">
|
106
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/8ac5lhpq27gockkrh8ncsjbrq8</id>
|
107
|
+
<published>2013-03-29T00:33:26.000Z</published>
|
108
|
+
<updated>2013-03-29T07:46:01.000Z</updated>
|
109
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
110
|
+
<title>Mars University</title>
|
111
|
+
<content/>
|
112
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=OGFjNWxocHEyN2dvY2trcmg4bmNzamJycTgga2FpQGRpc3RpbGwuY2M" title="alternate"/>
|
113
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/8ac5lhpq27gockkrh8ncsjbrq8?xoauth_requestor_id=bobert@example.com"/>
|
114
|
+
<author>
|
115
|
+
<name>Bobert Jones</name>
|
116
|
+
<email>bobert@example.com</email>
|
117
|
+
</author>
|
118
|
+
<gd:comments>
|
119
|
+
<gd:feedLink href="https://www.google.com"/>
|
120
|
+
</gd:comments>
|
121
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
122
|
+
<gd:where valueString=""/>
|
123
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="Bobert Jones">
|
124
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
125
|
+
</gd:who>
|
126
|
+
<gd:who email="fry@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Philip Fry">
|
127
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
128
|
+
</gd:who>
|
129
|
+
<gd:when endTime="2013-04-01T15:00:00.000-07:00" startTime="2013-04-01T14:00:00.000-07:00"/>
|
130
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
131
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
132
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
133
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
134
|
+
<gCal:guestsCanModify value="false"/>
|
135
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
136
|
+
<gCal:sequence value="0"/>
|
137
|
+
<gCal:uid value="8ac5lhpq27gockkrh8ncsjbrq8@google.com"/>
|
138
|
+
</entry>
|
139
|
+
<entry gd:etag=""GU4DTgRGdyp7JGA6WhJa"" gd:kind="calendar#event">
|
140
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/_6t332c2464ojeb9m6p23gb9k8krjcb9o6ko3iba668q38cpm64s46ga68c</id>
|
141
|
+
<published>2013-03-19T17:57:11.000Z</published>
|
142
|
+
<updated>2013-03-19T17:57:59.000Z</updated>
|
143
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
144
|
+
<title>Block for strategy session</title>
|
145
|
+
<content>Palo Alto</content>
|
146
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=XzZ0MzMyYzI0NjRvamViOW02cDIzZ2I5azhrcmpjYjlvNmtvM2liYTY2OHEzOGNwbTY0czQ2Z2E2OGMga2FpQGRpc3RpbGwuY2M" title="alternate"/>
|
147
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/_6t332c2464ojeb9m6p23gb9k8krjcb9o6ko3iba668q38cpm64s46ga68c?xoauth_requestor_id=bobert@example.com"/>
|
148
|
+
<author>
|
149
|
+
<name>Bobert Jones</name>
|
150
|
+
<email>bobert@example.com</email>
|
151
|
+
</author>
|
152
|
+
<gd:comments>
|
153
|
+
<gd:feedLink href="https://www.google.com"/>
|
154
|
+
</gd:comments>
|
155
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
156
|
+
<gd:where valueString="530 Lytton Ave Suite 305 Palo Alto"/>
|
157
|
+
<gd:who email="amy@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Amy Wong">
|
158
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.invited"/>
|
159
|
+
</gd:who>
|
160
|
+
<gd:who email="bender@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Bender Rodriguez">
|
161
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.invited"/>
|
162
|
+
</gd:who>
|
163
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Bobert Jones">
|
164
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
165
|
+
</gd:who>
|
166
|
+
<gd:who email="hermes@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="hermes@examle.com"/>
|
167
|
+
<gd:when endTime="2013-04-02T12:30:00.000-07:00" startTime="2013-04-02T11:00:00.000-07:00"/>
|
168
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
169
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
170
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
171
|
+
<gCal:guestsCanInviteOthers value="false"/>
|
172
|
+
<gCal:guestsCanModify value="false"/>
|
173
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
174
|
+
<gCal:privateCopy value="true"/>
|
175
|
+
<gCal:sequence value="0"/>
|
176
|
+
<gCal:uid value="7F10D117-66D8-4E76-8509-F2443618CAFC"/>
|
177
|
+
</entry>
|
178
|
+
<entry gd:etag=""EEsLTg1Fdyp7JGA6WhNT"" gd:kind="calendar#event">
|
179
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/c55b0pe0odp94803fgv803c22c</id>
|
180
|
+
<published>2013-04-02T21:05:49.000Z</published>
|
181
|
+
<updated>2013-04-02T21:05:49.000Z</updated>
|
182
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
183
|
+
<title>D.O.O.P.</title>
|
184
|
+
<content/>
|
185
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=YzU1YjBwZTBvZHA5NDgwM2ZndjgwM2MyMmMga2FpQGRpc3RpbGwuY2M" title="alternate"/>
|
186
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/c55b0pe0odp94803fgv803c22c?xoauth_requestor_id=bobert@example.com"/>
|
187
|
+
<author>
|
188
|
+
<name>Bobert Jones</name>
|
189
|
+
<email>bobert@example.com</email>
|
190
|
+
</author>
|
191
|
+
<gd:comments>
|
192
|
+
<gd:feedLink href="https://www.google.com"/>
|
193
|
+
</gd:comments>
|
194
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
195
|
+
<gd:where valueString=""/>
|
196
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="bobert@example.com"/>
|
197
|
+
<gd:when endTime="2013-04-02T15:00:00.000-07:00" startTime="2013-04-02T14:30:00.000-07:00"/>
|
198
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
199
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
200
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
201
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
202
|
+
<gCal:guestsCanModify value="false"/>
|
203
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
204
|
+
<gCal:sequence value="0"/>
|
205
|
+
<gCal:uid value="c55b0pe0odp94803fgv803c22c@google.com"/>
|
206
|
+
</entry>
|
207
|
+
<entry gd:etag=""EEgJQQFJeCp7JGA6WhNT"" gd:kind="calendar#event">
|
208
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/d0fq0gul9ml5t7i6oeiii37ql4</id>
|
209
|
+
<published>2013-04-01T21:53:55.000Z</published>
|
210
|
+
<updated>2013-04-01T21:56:26.000Z</updated>
|
211
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
212
|
+
<title>Head Museum</title>
|
213
|
+
<content/>
|
214
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=ZDBmcTBndWw5bWw1dDdpNm9laWlpMzdxbDQga2FpQGRpc3RpbGwuY2M" title="alternate"/>
|
215
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/d0fq0gul9ml5t7i6oeiii37ql4?xoauth_requestor_id=bobert@example.com"/>
|
216
|
+
<author>
|
217
|
+
<name>Bobert Jones</name>
|
218
|
+
<email>bobert@example.com</email>
|
219
|
+
</author>
|
220
|
+
<gd:comments>
|
221
|
+
<gd:feedLink href="https://www.google.com"/>
|
222
|
+
</gd:comments>
|
223
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
224
|
+
<gd:where valueString=""/>
|
225
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="Bobert Jones">
|
226
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
227
|
+
</gd:who>
|
228
|
+
<gd:who email="fry@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Philip Fry">
|
229
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
230
|
+
</gd:who>
|
231
|
+
<gd:when endTime="2013-04-03T14:00:00.000-07:00" startTime="2013-04-03T13:00:00.000-07:00"/>
|
232
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
233
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
234
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
235
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
236
|
+
<gCal:guestsCanModify value="false"/>
|
237
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
238
|
+
<gCal:sequence value="0"/>
|
239
|
+
<gCal:uid value="d0fq0gul9ml5t7i6oeiii37ql4@google.com"/>
|
240
|
+
</entry>
|
241
|
+
<entry gd:etag=""EEgJQQJIeCp7JGA6WhNT"" gd:kind="calendar#event">
|
242
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/m0g74buir5cj3004qc0l393lto</id>
|
243
|
+
<published>2013-03-14T23:12:43.000Z</published>
|
244
|
+
<updated>2013-04-01T21:58:16.000Z</updated>
|
245
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
246
|
+
<title>Omicron Persei 8</title>
|
247
|
+
<content/>
|
248
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=bTBnNzRidWlyNWNqMzAwNHFjMGwzOTNsdG8ga2FpQGRpc3RpbGwuY2M" title="alternate"/>
|
249
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/m0g74buir5cj3004qc0l393lto?xoauth_requestor_id=bobert@example.com"/>
|
250
|
+
<author>
|
251
|
+
<name>Bobert Jones</name>
|
252
|
+
<email>bobert@example.com</email>
|
253
|
+
</author>
|
254
|
+
<gd:comments>
|
255
|
+
<gd:feedLink href="https://www.google.com"/>
|
256
|
+
</gd:comments>
|
257
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
258
|
+
<gd:where valueString="Planet Omicron Persei 8 "/>
|
259
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="Bobert Jones">
|
260
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
261
|
+
</gd:who>
|
262
|
+
<gd:who email="fry@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Philip Fry">
|
263
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
264
|
+
</gd:who>
|
265
|
+
<gd:when endTime="2013-04-03T16:00:00.000-07:00" startTime="2013-04-03T15:00:00.000-07:00"/>
|
266
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
267
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
268
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
269
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
270
|
+
<gCal:guestsCanModify value="false"/>
|
271
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
272
|
+
<gCal:sequence value="1"/>
|
273
|
+
<gCal:uid value="m0g74buir5cj3004qc0l393lto@google.com"/>
|
274
|
+
</entry>
|
275
|
+
<entry gd:etag=""GU4LRABJfCp7JGA6WhJa"" gd:kind="calendar#event">
|
276
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/_60q30c1g60o30e1i60o4ac1g60rj8gpl88rj2c1h84s34h9g60s30c1g60o30c1g6so32ghp8h33egi568pk6h9g64o30c1g60o30c1g60o30c1g60o32c1g60o30c1g8h23cc2388ojida36t2jgg9k610k6ga48p2j6cho6grkcdhm84qg</id>
|
277
|
+
<published>2013-03-18T16:57:14.000Z</published>
|
278
|
+
<updated>2013-03-18T18:11:22.000Z</updated>
|
279
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
280
|
+
<title>Meeting with Lrrr</title>
|
281
|
+
<content>password: example</content>
|
282
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=XzYwcTMwYzFnNjBvMzBlMWk2MG80YWMxZzYwcmo4Z3BsODhyajJjMWg4NHMzNGg5ZzYwczMwYzFnNjBvMzBjMWc2c28zMmdocDhoMzNlZ2k1NjhwazZoOWc2NG8zMGMxZzYwbzMwYzFnNjBvMzBjMWc2MG8zMmMxZzYwbzMwYzFnOGgyM2NjMjM4OG9qaWRhMzZ0MmpnZzlrNjEwazZnYTQ4cDJqNmNobzZncmtjZGhtODRxZyBrYWlAZGlzdGlsbC5jYw" title="alternate"/>
|
283
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/_60q30c1g60o30e1i60o4ac1g60rj8gpl88rj2c1h84s34h9g60s30c1g60o30c1g6so32ghp8h33egi568pk6h9g64o30c1g60o30c1g60o30c1g60o32c1g60o30c1g8h23cc2388ojida36t2jgg9k610k6ga48p2j6cho6grkcdhm84qg?xoauth_requestor_id=bobert@example.com"/>
|
284
|
+
<author>
|
285
|
+
<name>Bobert Jones</name>
|
286
|
+
<email>bobert@example.com</email>
|
287
|
+
</author>
|
288
|
+
<gd:comments>
|
289
|
+
<gd:feedLink href="https://www.google.com"/>
|
290
|
+
</gd:comments>
|
291
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
292
|
+
<gd:where valueString="Omicron Persei 8 "/>
|
293
|
+
<gd:who email="planet.express@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Planet Express">
|
294
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.invited"/>
|
295
|
+
</gd:who>
|
296
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.attendee" valueString="Bobert Jones">
|
297
|
+
<gd:attendeeStatus value="http://schemas.google.com/g/2005#event.accepted"/>
|
298
|
+
</gd:who>
|
299
|
+
<gd:who email="zapp@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="Zapp Brannigan"/>
|
300
|
+
<gd:when endTime="2013-04-03T16:00:00.000-07:00" startTime="2013-04-03T15:00:00.000-07:00"/>
|
301
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
302
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
303
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
304
|
+
<gCal:guestsCanInviteOthers value="false"/>
|
305
|
+
<gCal:guestsCanModify value="false"/>
|
306
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
307
|
+
<gCal:privateCopy value="true"/>
|
308
|
+
<gCal:sequence value="0"/>
|
309
|
+
<gCal:uid value="040000008200E00074C5B7101A82E00800000000701B9DF7BE23CE01000000000000000010000000DD60CB195C7E8A40ACADFE32847F66A5"/>
|
310
|
+
</entry>
|
311
|
+
<entry gd:etag=""GE4CRgFGeip7JGA6WhJa"" gd:kind="calendar#event">
|
312
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/qhehinrhaaqi7lsc1p8ukn1k1k</id>
|
313
|
+
<published>2013-03-07T23:19:14.000Z</published>
|
314
|
+
<updated>2013-03-07T23:19:34.000Z</updated>
|
315
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
316
|
+
<title>Alumni Event</title>
|
317
|
+
<content/>
|
318
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=cWhlaGlucmhhYXFpN2xzYzFwOHVrbjFrMWsga2FpQGRpc3RpbGwuY2M" title="alternate"/>
|
319
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/qhehinrhaaqi7lsc1p8ukn1k1k?xoauth_requestor_id=bobert@example.com"/>
|
320
|
+
<author>
|
321
|
+
<name>Bobert Jones</name>
|
322
|
+
<email>bobert@example.com</email>
|
323
|
+
</author>
|
324
|
+
<gd:comments>
|
325
|
+
<gd:feedLink href="https://www.google.com"/>
|
326
|
+
</gd:comments>
|
327
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
328
|
+
<gd:where valueString="Mars University"/>
|
329
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="bobert@example.com"/>
|
330
|
+
<gd:when endTime="2013-04-04T19:00:00.000-07:00" startTime="2013-04-04T18:00:00.000-07:00"/>
|
331
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
332
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
333
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
334
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
335
|
+
<gCal:guestsCanModify value="false"/>
|
336
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
337
|
+
<gCal:sequence value="0"/>
|
338
|
+
<gCal:uid value="qhehinrhaaqi7lsc1p8ukn1k1k@google.com"/>
|
339
|
+
</entry>
|
340
|
+
<entry gd:etag=""EEsITwBGeSp7JGA6WhNT"" gd:kind="calendar#event">
|
341
|
+
<id>http://www.google.com/calendar/feeds/bobert%40example.com/events/bqup9tohkrmo7685ks63jrkokc</id>
|
342
|
+
<published>2013-04-02T23:26:58.000Z</published>
|
343
|
+
<updated>2013-04-02T23:27:57.000Z</updated>
|
344
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
345
|
+
<title>The Donbot</title>
|
346
|
+
<content/>
|
347
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=YnF1cDl0b2hrcm1vNzY4NWtzNjNqcmtva2Mga2FpQGRpc3RpbGwuY2M" title="alternate"/>
|
348
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/bobert%40example.com/private/full/bqup9tohkrmo7685ks63jrkokc?xoauth_requestor_id=bobert@example.com"/>
|
349
|
+
<author>
|
350
|
+
<name>Bobert Jones</name>
|
351
|
+
<email>bobert@example.com</email>
|
352
|
+
</author>
|
353
|
+
<gd:comments>
|
354
|
+
<gd:feedLink href="https://www.google.com"/>
|
355
|
+
</gd:comments>
|
356
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
357
|
+
<gd:where valueString="Elzar's"/>
|
358
|
+
<gd:who email="bobert@example.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="bobert@example.com"/>
|
359
|
+
<gd:when endTime="2013-04-05T11:00:00.000-07:00" startTime="2013-04-05T10:00:00.000-07:00"/>
|
360
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
|
361
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
362
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
363
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
364
|
+
<gCal:guestsCanModify value="false"/>
|
365
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
366
|
+
<gCal:sequence value="0"/>
|
367
|
+
<gCal:uid value="bqup9tohkrmo7685ks63jrkokc@google.com"/>
|
368
|
+
</entry>
|
369
|
+
</feed>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:apps="http://schemas.google.com/apps/2006" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/"YDwqeyI."">
|
3
|
+
<id>https://apps-apis.google.com/a/feeds/example.com/user/2.0</id>
|
4
|
+
<updated>1970-01-01T00:00:00.000Z</updated>
|
5
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/apps/2006#user"/>
|
6
|
+
<title>Users</title>
|
7
|
+
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://apps-apis.google.com/a/feeds/example.com/user/2.0"/>
|
8
|
+
<link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="https://apps-apis.google.com/a/feeds/example.com/user/2.0"/>
|
9
|
+
<link rel="self" type="application/atom+xml" href="https://apps-apis.google.com/a/feeds/example.com/user/2.0"/>
|
10
|
+
<openSearch:startIndex>1</openSearch:startIndex>
|
11
|
+
<entry gd:etag="W/"YDwqeyI."">
|
12
|
+
<id>https://apps-apis.google.com/a/feeds/example.com/user/2.0/fry</id>
|
13
|
+
<updated>1970-01-01T00:00:00.000Z</updated>
|
14
|
+
<app:edited xmlns:app="http://www.w3.org/2007/app">1970-01-01T00:00:00.000Z</app:edited>
|
15
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/apps/2006#user"/>
|
16
|
+
<title>fry</title>
|
17
|
+
<link rel="self" type="application/atom+xml" href="https://apps-apis.google.com/a/feeds/example.com/user/2.0/fry"/>
|
18
|
+
<link rel="edit" type="application/atom+xml" href="https://apps-apis.google.com/a/feeds/example.com/user/2.0/fry"/>
|
19
|
+
<apps:login userName="fry" suspended="false" ipWhitelisted="false" admin="false" changePasswordAtNextLogin="false" agreedToTerms="true"/>
|
20
|
+
<apps:quota limit="25600"/>
|
21
|
+
<apps:name familyName="Fry" givenName="Philip"/>
|
22
|
+
<gd:feedLink rel="http://schemas.google.com/apps/2006#user.nicknames" href="https://apps-apis.google.com/a/feeds/example.com/nickname/2.0?username=fry"/>
|
23
|
+
<gd:feedLink rel="http://schemas.google.com/apps/2006#user.emailLists" href="https://apps-apis.google.com/a/feeds/example.com/emailList/2.0?recipient=fry%40example.com"/>
|
24
|
+
</entry>
|
25
|
+
<entry gd:etag="W/"YDwqeyI."">
|
26
|
+
<id>https://apps-apis.google.com/a/feeds/example.com/user/2.0/bender</id>
|
27
|
+
<updated>1970-01-01T00:00:00.000Z</updated>
|
28
|
+
<app:edited xmlns:app="http://www.w3.org/2007/app">1970-01-01T00:00:00.000Z</app:edited>
|
29
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/apps/2006#user"/>
|
30
|
+
<title>bender</title>
|
31
|
+
<link rel="self" type="application/atom+xml" href="https://apps-apis.google.com/a/feeds/example.com/user/2.0/bender"/>
|
32
|
+
<link rel="edit" type="application/atom+xml" href="https://apps-apis.google.com/a/feeds/example.com/user/2.0/bender"/>
|
33
|
+
<apps:login userName="bender" suspended="true" ipWhitelisted="false" admin="true" changePasswordAtNextLogin="false" agreedToTerms="true"/>
|
34
|
+
<apps:quota limit="25600"/>
|
35
|
+
<apps:name familyName="Rodriguez" givenName="Bender"/>
|
36
|
+
<gd:feedLink rel="http://schemas.google.com/apps/2006#user.nicknames" href="https://apps-apis.google.com/a/feeds/example.com/nickname/2.0?username=bender"/>
|
37
|
+
<gd:feedLink rel="http://schemas.google.com/apps/2006#user.emailLists" href="https://apps-apis.google.com/a/feeds/example.com/emailList/2.0?recipient=bender%40example.com"/>
|
38
|
+
</entry>
|
39
|
+
</feed>
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include Gaah::Calendar
|
3
|
+
|
4
|
+
describe Event do
|
5
|
+
let(:xml) { fixture('calendar.xml') }
|
6
|
+
let(:events) { Nokogiri::XML(xml)/:entry }
|
7
|
+
let(:event) { Event.new(events.first) }
|
8
|
+
|
9
|
+
describe '#initialize' do
|
10
|
+
it 'parses ID' do
|
11
|
+
event.id.should == 'http://www.google.com/calendar/feeds/bobert%40example.com/events/n9ommrehhjm5dc6q89ofkm3f8g'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'parses published time' do
|
15
|
+
event.published.should == Time.parse('2013-03-25T16:49:48.000Z')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'parses updated time' do
|
19
|
+
event.updated.should == Time.parse('2013-03-25T17:03:10.000Z')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'parses title' do
|
23
|
+
event.title.should == 'MomCorp'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'parses content' do
|
27
|
+
event.content.should == ''
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'parses status' do
|
31
|
+
event.status.should == 'confirmed'
|
32
|
+
end
|
33
|
+
|
34
|
+
describe :who do
|
35
|
+
let(:who) { event.who }
|
36
|
+
|
37
|
+
it 'parses who' do
|
38
|
+
who.length.should == 2
|
39
|
+
who.first.should be_an_instance_of(Gaah::Calendar::Who)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'parses name' do
|
43
|
+
who.first.name.should == 'Bobert Jones'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'parses email' do
|
47
|
+
who.first.email.should == 'bobert@example.com'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe :when do
|
52
|
+
let(:_when) { event.when }
|
53
|
+
|
54
|
+
it 'parses when' do
|
55
|
+
_when.should be_an_instance_of(When)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'parses start_time' do
|
59
|
+
_when.start_time.should == Time.parse('2013-04-01 10:00:00 -0700')
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'parses end_time' do
|
63
|
+
_when.end_time.should == Time.parse('2013-04-01 11:00:00 -0700')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'parses where' do
|
68
|
+
event.where.should == ''
|
69
|
+
end
|
70
|
+
|
71
|
+
describe :author do
|
72
|
+
let(:author) { event.author }
|
73
|
+
|
74
|
+
it 'parses email' do
|
75
|
+
author.email.should == "bobert@example.com"
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'parses name' do
|
79
|
+
author.name.should == "Bobert Jones"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'parses transparency' do
|
84
|
+
event.transparency.should == 'opaque'
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'parses visibility' do
|
88
|
+
event.visibility.should == 'default'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe '.batch_create' do
|
93
|
+
let(:processed_events) { Event.batch_create(events) }
|
94
|
+
|
95
|
+
it 'parses events' do
|
96
|
+
processed_events.count.should == 10
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include Gaah::Provisioning
|
3
|
+
|
4
|
+
describe User do
|
5
|
+
let(:xml) { fixture('provisioning.xml') }
|
6
|
+
let(:users) { Nokogiri::XML(xml)/:entry }
|
7
|
+
let(:user) { User.new(users.first) }
|
8
|
+
|
9
|
+
describe '#initialize' do
|
10
|
+
it 'parses ID' do
|
11
|
+
user.id.should == 'https://apps-apis.google.com/a/feeds/example.com/user/2.0/fry'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'parses suspended' do
|
15
|
+
user.suspended.should == false
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'parses admin' do
|
19
|
+
user.admin.should == false
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'parses title' do
|
23
|
+
user.title.should == 'fry'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'parses user_name' do
|
27
|
+
user.user_name.should == 'fry'
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'parses name' do
|
31
|
+
user.name.should == 'Philip Fry'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gaah
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Hwan-Joon Choi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-04-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.5'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: oauth
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.4'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: queryparams
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.0.3
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.0.3
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.5'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.5'
|
69
|
+
description: Google Apps Marketplace API wrapper in ruby for Distill.
|
70
|
+
email:
|
71
|
+
- hc5duke@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- .gitignore
|
77
|
+
- .rspec
|
78
|
+
- Gemfile
|
79
|
+
- Gemfile.lock
|
80
|
+
- README.md
|
81
|
+
- gaah.gemspec
|
82
|
+
- lib/gaah.rb
|
83
|
+
- lib/gaah/api_client.rb
|
84
|
+
- lib/gaah/api_model.rb
|
85
|
+
- lib/gaah/base.rb
|
86
|
+
- lib/gaah/calendar/api.rb
|
87
|
+
- lib/gaah/calendar/event.rb
|
88
|
+
- lib/gaah/calendar/when.rb
|
89
|
+
- lib/gaah/calendar/who.rb
|
90
|
+
- lib/gaah/provisioning/api.rb
|
91
|
+
- lib/gaah/provisioning/user.rb
|
92
|
+
- lib/gaah/version.rb
|
93
|
+
- spec/fixtures/calendar.xml
|
94
|
+
- spec/fixtures/provisioning.xml
|
95
|
+
- spec/models/event_spec.rb
|
96
|
+
- spec/models/user_spec.rb
|
97
|
+
- spec/spec_helper.rb
|
98
|
+
homepage: https://github.com/distill-inc/gaah
|
99
|
+
licenses: []
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.0.3
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Limited API Wrapper for Google Apps API.
|
121
|
+
test_files:
|
122
|
+
- spec/fixtures/calendar.xml
|
123
|
+
- spec/fixtures/provisioning.xml
|
124
|
+
- spec/models/event_spec.rb
|
125
|
+
- spec/models/user_spec.rb
|
126
|
+
- spec/spec_helper.rb
|