gaah 0.1.6 → 0.1.7
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 +8 -8
- data/Gemfile.lock +1 -1
- data/lib/gaah/api_model.rb +9 -1
- data/lib/gaah/calendar/api.rb +6 -5
- data/lib/gaah/calendar/event.rb +32 -29
- data/lib/gaah/calendar/when.rb +7 -2
- data/lib/gaah/calendar/who.rb +6 -24
- data/lib/gaah/resource/api.rb +1 -1
- data/lib/gaah/version.rb +1 -1
- data/spec/fixtures/calendar.json +135 -0
- data/spec/models/event_spec.rb +31 -38
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OWViNTAxOWIxMzM5ZDFhMzJmZWNkYWQ5YjhkZjQwMGQ4N2E1ODJhMw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OTUxNThlOTM3ZjYzM2YxYzc5ZjliMTY4ODEzMTYyYmFiZDAxYjA5MA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MzI0Yzc1ZjMwMGJhOTA5ODY3MTRiM2U3Yjc5YTRhNmQ2NTUxZmE3OTkzODMw
|
10
|
+
OWRjM2M0NGQ2NzI2NWVkNGNhZGExZDZmNTc5OGQ3Zjg5NjI0ZjcwNDFhZWY4
|
11
|
+
YjBiYWFmZmI4NDNjNmFiNzZhYTYxOWUxNWJmNDZlYTA0NzgyYjk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZTExYjUyMDNjNmUxNmY2ODU4ZGI4NzU0MjExOTUyNTFlNTUyOTJhY2Q2OTkx
|
14
|
+
Mzg1Yzg1YjhjYmYwMGExNDUzMmMyYjUwMjJkNWZkOTJhODg5YTc0MzdhMGJj
|
15
|
+
NjcxYzk5YzQ0NGNhZmI0OWE4OGUxMmU1NDBmMjIwMjIwYzRlZmU=
|
data/Gemfile.lock
CHANGED
data/lib/gaah/api_model.rb
CHANGED
@@ -3,7 +3,11 @@ module Gaah
|
|
3
3
|
attr_reader :id
|
4
4
|
|
5
5
|
def self.batch_create(xml)
|
6
|
-
|
6
|
+
if xml.is_a? Array
|
7
|
+
xml.map(&method(:new))
|
8
|
+
else
|
9
|
+
(xml/:entry).map(&method(:new))
|
10
|
+
end
|
7
11
|
end
|
8
12
|
|
9
13
|
def ==(other)
|
@@ -12,6 +16,10 @@ module Gaah
|
|
12
16
|
|
13
17
|
private
|
14
18
|
|
19
|
+
def store_json(json)
|
20
|
+
@json = json.is_a?(String) ? JSON.load(json) : json
|
21
|
+
end
|
22
|
+
|
15
23
|
def store_xml(xml)
|
16
24
|
@xml = xml.is_a?(String) ? Nokogiri::XML(xml) : xml
|
17
25
|
end
|
data/lib/gaah/calendar/api.rb
CHANGED
@@ -9,15 +9,15 @@ module Gaah
|
|
9
9
|
def events(xoauth_requestor_id, options)
|
10
10
|
url = build_api_url(options[:email])
|
11
11
|
params = build_api_params(xoauth_requestor_id, options)
|
12
|
-
|
13
|
-
events =
|
14
|
-
Event.batch_create(events)
|
12
|
+
json = ApiClient.instance.get(url, params)
|
13
|
+
events = JSON.load(json)
|
14
|
+
Event.batch_create(events['items'])
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
19
|
def build_api_url(email)
|
20
|
-
API_URL.sub('
|
20
|
+
API_URL.sub('CAL_ID', email || 'default')
|
21
21
|
end
|
22
22
|
|
23
23
|
def build_api_params(xoauth_requestor_id, options)
|
@@ -34,7 +34,8 @@ module Gaah
|
|
34
34
|
time.nil? ? nil : time.strftime('%Y-%m-%dT17:00:00')
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
#API_URL = 'https://www.google.com/calendar/feeds/EMAIL/private/full'
|
38
|
+
API_URL = 'https://www.googleapis.com/calendar/v3/calendars/CAL_ID/events'
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
data/lib/gaah/calendar/event.rb
CHANGED
@@ -1,65 +1,68 @@
|
|
1
1
|
module Gaah
|
2
2
|
module Calendar
|
3
3
|
class Event < Gaah::ApiModel
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :updated, :summary, :description, :attendees, :when, :location, :creator, :transparency, :visibility
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
|
6
|
+
def initialize(json)
|
7
|
+
store_json(json)
|
8
8
|
|
9
|
-
@id =
|
10
|
-
@
|
11
|
-
@
|
12
|
-
@
|
13
|
-
@
|
14
|
-
@
|
15
|
-
@where = attr_value('gd|where', 'valueString')
|
16
|
-
@author = Who.new((@xml/:author).first)
|
9
|
+
@id = json['id']
|
10
|
+
@updated = Time.parse(json['updated'])
|
11
|
+
@summary = json['summary'].to_s
|
12
|
+
@description = json['description'].to_s
|
13
|
+
@location = json['location'].to_s
|
14
|
+
@creator = Who.new(json['creator']) if json['creator']
|
17
15
|
@when = parse_when
|
18
|
-
@
|
19
|
-
@transparency =
|
20
|
-
@visibility =
|
16
|
+
@attendees = parse_attendees
|
17
|
+
@transparency = json['transparency'].to_s
|
18
|
+
@visibility = json['visibility'] || 'default'
|
21
19
|
end
|
22
20
|
|
23
21
|
def to_json(*args)
|
24
22
|
{
|
25
23
|
id: @id,
|
26
|
-
published: @published,
|
27
24
|
updated: @updated,
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
author: @author,
|
25
|
+
summary: @summary,
|
26
|
+
description: @description,
|
27
|
+
location: @location,
|
28
|
+
creator: @creator,
|
33
29
|
when: @when,
|
34
|
-
|
30
|
+
attendees: @attendees,
|
35
31
|
transparency: @transparency,
|
36
32
|
visibility: @visibility,
|
37
33
|
}.to_json
|
38
34
|
end
|
39
35
|
|
36
|
+
# V2 -> V3
|
37
|
+
def author; creator; end
|
38
|
+
def content; description; end
|
39
|
+
def title; summary; end
|
40
|
+
def where; location; end
|
41
|
+
def who; attendees; end
|
42
|
+
|
40
43
|
def marshal_dump
|
41
|
-
[@id,
|
44
|
+
[@id, nil, @updated, @summary, @description, @location, @creator, @when, @attendees, @transparency, @visibility]
|
42
45
|
end
|
43
46
|
|
44
47
|
def marshal_load(array)
|
45
|
-
@id,
|
48
|
+
@id, _, @updated, @summary, @description, @location, @creator, @when, @attendees, @transparency, @visibility = array
|
46
49
|
end
|
47
50
|
|
48
51
|
private
|
49
52
|
|
50
|
-
def
|
53
|
+
def store_json(json)
|
51
54
|
super
|
52
|
-
unless @
|
53
|
-
puts "Possible invalid event
|
55
|
+
unless @json['kind'] == "calendar#event"
|
56
|
+
puts "Possible invalid event json - kind is #{ @json['kind'] }"
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
60
|
def parse_when
|
58
|
-
When.new(
|
61
|
+
When.new(@json['start'], @json['end'])
|
59
62
|
end
|
60
63
|
|
61
|
-
def
|
62
|
-
(@
|
64
|
+
def parse_attendees
|
65
|
+
(@json['attendees'] || []).map {|attendee| Who.new(attendee) }
|
63
66
|
end
|
64
67
|
end
|
65
68
|
end
|
data/lib/gaah/calendar/when.rb
CHANGED
@@ -3,8 +3,13 @@ module Gaah
|
|
3
3
|
class When
|
4
4
|
attr_accessor :start_time, :end_time
|
5
5
|
def initialize(start_time, end_time)
|
6
|
-
|
7
|
-
|
6
|
+
if start_time.is_a? Hash
|
7
|
+
@start_time = Time.parse(start_time.values.first)
|
8
|
+
@end_time = Time.parse(end_time.values.first)
|
9
|
+
else
|
10
|
+
@start_time = Time.parse(start_time)
|
11
|
+
@end_time = Time.parse(end_time)
|
12
|
+
end
|
8
13
|
end
|
9
14
|
|
10
15
|
def to_json(*args)
|
data/lib/gaah/calendar/who.rb
CHANGED
@@ -1,27 +1,10 @@
|
|
1
1
|
module Gaah
|
2
2
|
module Calendar
|
3
3
|
class Who
|
4
|
-
attr_reader :name, :email
|
5
|
-
def initialize(
|
6
|
-
@
|
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
|
4
|
+
attr_reader :name, :email
|
5
|
+
def initialize(json)
|
6
|
+
@name = json['displayName'].to_s
|
7
|
+
@email = json['email'].to_s
|
25
8
|
end
|
26
9
|
|
27
10
|
def catch_all_user?
|
@@ -30,9 +13,8 @@ module Gaah
|
|
30
13
|
|
31
14
|
def to_json(*args)
|
32
15
|
{
|
33
|
-
name:
|
34
|
-
email:
|
35
|
-
aliases: aliases,
|
16
|
+
name: name,
|
17
|
+
email: email,
|
36
18
|
}.to_json
|
37
19
|
end
|
38
20
|
|
data/lib/gaah/resource/api.rb
CHANGED
@@ -14,7 +14,7 @@ module Gaah
|
|
14
14
|
url = "https://apps-apis.google.com/a/feeds/calendar/resource/2.0/#{Gaah.domain}"
|
15
15
|
xml = ApiClient.instance.get(url)
|
16
16
|
parsed = Nokogiri::XML(xml)
|
17
|
-
|
17
|
+
|
18
18
|
current_list = Resource.batch_create(parsed/:entry)
|
19
19
|
next_link = (parsed/'link[rel=next]').first
|
20
20
|
|
data/lib/gaah/version.rb
CHANGED
@@ -0,0 +1,135 @@
|
|
1
|
+
{
|
2
|
+
"kind": "calendar#events",
|
3
|
+
"etag": "\"foo\"",
|
4
|
+
"summary": "_me",
|
5
|
+
"updated": "2013-08-26T22:16:43.629Z",
|
6
|
+
"timeZone": "America/Los_Angeles",
|
7
|
+
"accessRole": "owner",
|
8
|
+
"defaultReminders": [{
|
9
|
+
"method": "popup",
|
10
|
+
"minutes": 10
|
11
|
+
}],
|
12
|
+
"items": [{
|
13
|
+
"kind": "calendar#event",
|
14
|
+
"etag": "\"bar1\"",
|
15
|
+
"id": "one",
|
16
|
+
"status": "confirmed",
|
17
|
+
"htmlLink": "https://www.google.com/calendar/event?eid=one",
|
18
|
+
"created": "2012-12-05T23:51:16.000Z",
|
19
|
+
"updated": "2012-12-13T22:00:00Z",
|
20
|
+
"summary": "Holiday Dinner",
|
21
|
+
"description": "Holiday party time!",
|
22
|
+
"location": "Prospect, 300 Spear St, San Francisco, CA 94105",
|
23
|
+
"creator": {
|
24
|
+
"email": "alice@example.com",
|
25
|
+
"displayName": "Alice McAlice"
|
26
|
+
},
|
27
|
+
"organizer": {
|
28
|
+
"email": "bob@example.com",
|
29
|
+
"displayName": "Bob O'Bob"
|
30
|
+
},
|
31
|
+
"start": {
|
32
|
+
"dateTime": "2012-12-14T18:30:00-08:00"
|
33
|
+
},
|
34
|
+
"end": {
|
35
|
+
"dateTime": "2012-12-14T21:30:00-08:00"
|
36
|
+
},
|
37
|
+
"iCalUID": "foo@google.com",
|
38
|
+
"visibility": "private",
|
39
|
+
"sequence": 0,
|
40
|
+
"attendees": [{
|
41
|
+
"email": "bob@example.com",
|
42
|
+
"displayName": "Bob-Bob O'Bob",
|
43
|
+
"responseStatus": "needsAction"
|
44
|
+
}, {
|
45
|
+
"email": "alice@example.com",
|
46
|
+
"displayName": "Alice McAlice",
|
47
|
+
"organizer": true,
|
48
|
+
"self": true,
|
49
|
+
"responseStatus": "accepted"
|
50
|
+
}, {
|
51
|
+
"email": "chris@example.com",
|
52
|
+
"displayName": "Chris Christiansen",
|
53
|
+
"responseStatus": "accepted"
|
54
|
+
}],
|
55
|
+
"reminders": {
|
56
|
+
"useDefault": true
|
57
|
+
}
|
58
|
+
}, {
|
59
|
+
"kind": "calendar#event",
|
60
|
+
"etag": "\"bar2\"",
|
61
|
+
"id": "dos",
|
62
|
+
"status": "confirmed",
|
63
|
+
"htmlLink": "https://www.google.com/calendar/event?eid=two",
|
64
|
+
"created": "2012-12-18T16:34:06.000Z",
|
65
|
+
"updated": "2012-12-19T19:49:46.817Z",
|
66
|
+
"summary": "Meet for WeWork Walkthrough",
|
67
|
+
"location": "795 Folsom",
|
68
|
+
"creator": {
|
69
|
+
"email": "david@notexample.com"
|
70
|
+
},
|
71
|
+
"organizer": {
|
72
|
+
"email": "david@notexample.com"
|
73
|
+
},
|
74
|
+
"start": {
|
75
|
+
"dateTime": "2012-12-19T10:15:00-08:00"
|
76
|
+
},
|
77
|
+
"end": {
|
78
|
+
"dateTime": "2012-12-19T11:15:00-08:00"
|
79
|
+
},
|
80
|
+
"iCalUID": "bar@google.com",
|
81
|
+
"sequence": 0,
|
82
|
+
"transparency": "transparent",
|
83
|
+
"attendees": [{
|
84
|
+
"email": "bob@example.com",
|
85
|
+
"responseStatus": "accepted"
|
86
|
+
}, {
|
87
|
+
"email": "alice@example.com",
|
88
|
+
"displayName": "Alice McAlice",
|
89
|
+
"self": true,
|
90
|
+
"responseStatus": "declined"
|
91
|
+
}],
|
92
|
+
"reminders": {
|
93
|
+
"useDefault": true
|
94
|
+
}
|
95
|
+
}, {
|
96
|
+
"kind": "calendar#event",
|
97
|
+
"etag": "\"baz\"",
|
98
|
+
"id": "three",
|
99
|
+
"status": "confirmed",
|
100
|
+
"htmlLink": "https://www.google.com/calendar/event?eid=three",
|
101
|
+
"created": "2013-02-11T19:42:44.000Z",
|
102
|
+
"updated": "2013-02-12T00:55:43.590Z",
|
103
|
+
"summary": "Weekly Sync",
|
104
|
+
"creator": {
|
105
|
+
"email": "alice@example.com",
|
106
|
+
"displayName": "Alice McAlice"
|
107
|
+
},
|
108
|
+
"organizer": {
|
109
|
+
"email": "alice@example.com",
|
110
|
+
"displayName": "Alice McAlice"
|
111
|
+
},
|
112
|
+
"start": {
|
113
|
+
"dateTime": "2013-02-11T17:00:00-08:00"
|
114
|
+
},
|
115
|
+
"end": {
|
116
|
+
"dateTime": "2013-02-11T17:30:00-08:00"
|
117
|
+
},
|
118
|
+
"iCalUID": "tres@google.com",
|
119
|
+
"sequence": 0,
|
120
|
+
"attendees": [{
|
121
|
+
"email": "alice@example.com",
|
122
|
+
"displayName": "Alice McAlice",
|
123
|
+
"organizer": true,
|
124
|
+
"responseStatus": "accepted"
|
125
|
+
}, {
|
126
|
+
"email": "bob@example.com",
|
127
|
+
"displayName": "Bob McBob",
|
128
|
+
"self": true,
|
129
|
+
"responseStatus": "needsAction"
|
130
|
+
}],
|
131
|
+
"reminders": {
|
132
|
+
"useDefault": true
|
133
|
+
}
|
134
|
+
}]
|
135
|
+
}
|
data/spec/models/event_spec.rb
CHANGED
@@ -3,97 +3,90 @@ include Gaah::Calendar
|
|
3
3
|
|
4
4
|
describe Event do
|
5
5
|
let(:xml) { fixture('calendar.xml') }
|
6
|
-
let(:
|
6
|
+
let(:json) { fixture('calendar.json') }
|
7
|
+
#let(:events) { Nokogiri::XML(xml)/:entry }
|
8
|
+
let(:events) { JSON.load(json)['items'] }
|
7
9
|
let(:event) { Event.new(events.first) }
|
8
10
|
|
9
11
|
describe '#initialize' do
|
12
|
+
subject { event }
|
10
13
|
it 'parses ID' do
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'parses published time' do
|
15
|
-
event.published.should == Time.parse('2013-03-25T16:49:48.000Z')
|
14
|
+
subject.id.should == 'one'
|
16
15
|
end
|
17
16
|
|
18
17
|
it 'parses updated time' do
|
19
|
-
|
18
|
+
subject.updated.should == Time.parse('2012-12-13 22:00:00 UTC')
|
20
19
|
end
|
21
20
|
|
22
|
-
it 'parses
|
23
|
-
|
21
|
+
it 'parses summary' do
|
22
|
+
subject.summary.should == 'Holiday Dinner'
|
24
23
|
end
|
25
24
|
|
26
|
-
it 'parses
|
27
|
-
|
25
|
+
it 'parses description' do
|
26
|
+
subject.description.should == 'Holiday party time!'
|
28
27
|
end
|
29
28
|
|
30
|
-
|
31
|
-
event.
|
32
|
-
end
|
29
|
+
describe :attendees do
|
30
|
+
let(:subject) { event.attendees }
|
33
31
|
|
34
|
-
|
35
|
-
|
32
|
+
it 'parses all attendees' do
|
33
|
+
subject.length.should == 3
|
34
|
+
end
|
36
35
|
|
37
|
-
it 'parses
|
38
|
-
|
39
|
-
who.first.should be_an_instance_of(Gaah::Calendar::Who)
|
36
|
+
it 'parses Who object' do
|
37
|
+
subject.first.should be_an_instance_of(Gaah::Calendar::Who)
|
40
38
|
end
|
41
39
|
|
42
40
|
it 'parses name' do
|
43
|
-
|
41
|
+
subject.first.name.should == "Bob-Bob O'Bob"
|
44
42
|
end
|
45
43
|
|
46
44
|
it 'parses email' do
|
47
|
-
|
45
|
+
subject.first.email.should == 'bob@example.com'
|
48
46
|
end
|
49
47
|
end
|
50
48
|
|
51
49
|
describe :when do
|
52
|
-
let(:
|
50
|
+
let(:subject) { event.when }
|
53
51
|
|
54
|
-
it
|
55
|
-
_when.should be_an_instance_of(When)
|
56
|
-
end
|
52
|
+
it { should be_an_instance_of(When) }
|
57
53
|
|
58
54
|
it 'parses start_time' do
|
59
|
-
|
55
|
+
subject.start_time.should == Time.parse('2012-12-14 18:30:00 -0800')
|
60
56
|
end
|
61
57
|
|
62
58
|
it 'parses end_time' do
|
63
|
-
|
59
|
+
subject.end_time.should == Time.parse('2012-12-14 21:30:00 -0800')
|
64
60
|
end
|
65
61
|
end
|
66
62
|
|
67
|
-
it 'parses
|
68
|
-
|
63
|
+
it 'parses location' do
|
64
|
+
subject.location.should == "Prospect, 300 Spear St, San Francisco, CA 94105"
|
69
65
|
end
|
70
66
|
|
71
67
|
describe :author do
|
72
68
|
let(:author) { event.author }
|
73
69
|
|
74
70
|
it 'parses email' do
|
75
|
-
author.email.should == "
|
71
|
+
author.email.should == "alice@example.com"
|
76
72
|
end
|
77
73
|
|
78
74
|
it 'parses name' do
|
79
|
-
author.name.should == "
|
75
|
+
author.name.should == "Alice McAlice"
|
80
76
|
end
|
81
77
|
end
|
82
78
|
|
83
79
|
it 'parses transparency' do
|
84
|
-
|
80
|
+
subject.transparency.should == ''
|
85
81
|
end
|
86
82
|
|
87
83
|
it 'parses visibility' do
|
88
|
-
|
84
|
+
subject.visibility.should == 'private'
|
89
85
|
end
|
90
86
|
end
|
91
87
|
|
92
88
|
describe '.batch_create' do
|
93
|
-
let(:
|
94
|
-
|
95
|
-
it 'parses events' do
|
96
|
-
processed_events.count.should == 10
|
97
|
-
end
|
89
|
+
let(:subject) { Event.batch_create(events) }
|
90
|
+
it { subject.count.should == 3 }
|
98
91
|
end
|
99
92
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gaah
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hwan-Joon Choi
|
@@ -107,6 +107,7 @@ files:
|
|
107
107
|
- lib/gaah/resource/api.rb
|
108
108
|
- lib/gaah/resource/resource.rb
|
109
109
|
- lib/gaah/version.rb
|
110
|
+
- spec/fixtures/calendar.json
|
110
111
|
- spec/fixtures/calendar.xml
|
111
112
|
- spec/fixtures/provisioning.xml
|
112
113
|
- spec/models/event_spec.rb
|
@@ -137,6 +138,7 @@ signing_key:
|
|
137
138
|
specification_version: 4
|
138
139
|
summary: Limited API Wrapper for Google Apps API.
|
139
140
|
test_files:
|
141
|
+
- spec/fixtures/calendar.json
|
140
142
|
- spec/fixtures/calendar.xml
|
141
143
|
- spec/fixtures/provisioning.xml
|
142
144
|
- spec/models/event_spec.rb
|