google_contacts_api 0.4.1 → 0.4.2
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.
- data/README.markdown +8 -1
- data/VERSION +1 -1
- data/google_contacts_api.gemspec +2 -1
- data/lib/google_contacts_api.rb +1 -4
- data/lib/google_contacts_api/contact.rb +22 -14
- data/lib/google_contacts_api/contact_set.rb +2 -1
- data/lib/google_contacts_api/contacts.rb +1 -0
- data/lib/google_contacts_api/group.rb +8 -6
- data/lib/google_contacts_api/group_set.rb +1 -1
- data/lib/google_contacts_api/result.rb +7 -9
- data/lib/google_contacts_api/result_set.rb +2 -1
- data/lib/google_contacts_api/user.rb +2 -2
- data/lib/google_contacts_api/version.rb +10 -0
- data/spec/spec_helper.rb +1 -1
- metadata +3 -2
data/README.markdown
CHANGED
@@ -28,14 +28,19 @@ oauth_access_token_for_user
|
|
28
28
|
|
29
29
|
google_contacts_user = GoogleContactsApi::User.new(oauth_access_token_for_user)
|
30
30
|
contacts = google_contacts_user.contacts
|
31
|
+
# => <GoogleContactsApi::ContactSet: @start_index=1, @items_per_page=100000, @total_results=638>
|
31
32
|
groups = google_contacts_user.groups
|
33
|
+
# => <GoogleContactsApi::GroupSet: @start_index=1, @items_per_page=100000, @total_results=8>
|
32
34
|
|
33
35
|
# group methods
|
34
36
|
group = groups.first
|
37
|
+
# => <GoogleContactsApi::Group: System Group: My Contacts>
|
35
38
|
group.contacts
|
39
|
+
# => <GoogleContactsApi::ContactSet: @start_index=1, @items_per_page=100000, @total_results=20>
|
36
40
|
|
37
41
|
# contact methods
|
38
42
|
contact = contacts.first
|
43
|
+
# => <GoogleContactsApi::Contact: Alvin>
|
39
44
|
contact.photo
|
40
45
|
contact.title
|
41
46
|
contact.id
|
@@ -43,7 +48,9 @@ contact.primary_email
|
|
43
48
|
contact.emails
|
44
49
|
```
|
45
50
|
|
46
|
-
|
51
|
+
`ContactSet` and `GroupSet` both implement `Enumberable`.
|
52
|
+
|
53
|
+
In addition, `Contact` and `Group` are subclasses of [Hashie::Mash](https://github.com/intridea/hashie), so you can access any of the underlying data directly (for example, if Google returns new data [in their API](https://developers.google.com/google-apps/contacts/v3/)). Note that data is retrieved using Google's JSON API so the equivalent content of an XML element from the XML API is stored under the key "$t".
|
47
54
|
|
48
55
|
The easiest way to see the convenience methods I've provided is to look at the RSpec tests.
|
49
56
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.2
|
data/google_contacts_api.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "google_contacts_api"
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alvin Liang"]
|
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
|
|
35
35
|
"lib/google_contacts_api/result.rb",
|
36
36
|
"lib/google_contacts_api/result_set.rb",
|
37
37
|
"lib/google_contacts_api/user.rb",
|
38
|
+
"lib/google_contacts_api/version.rb",
|
38
39
|
"spec/contact_set.json",
|
39
40
|
"spec/empty_contact_set.json",
|
40
41
|
"spec/errors/auth_sub_401.html",
|
data/lib/google_contacts_api.rb
CHANGED
@@ -1,39 +1,40 @@
|
|
1
1
|
module GoogleContactsApi
|
2
|
+
# Represents a single contact.
|
3
|
+
# Methods we could implement:
|
4
|
+
# :categories, (:content again), :links, (:title again), :email
|
5
|
+
# :extended_properties, :deleted, :im, :name,
|
6
|
+
# :organizations, :phone_numbers, :structured_postal_addresses, :where
|
2
7
|
class Contact < GoogleContactsApi::Result
|
3
|
-
# :categories, (:content again), :links, (:title again), :email
|
4
|
-
# :extended_properties, :deleted, :im, :name,
|
5
|
-
# :organizations, :phone_numbers, :structured_postal_addresses, :where
|
6
|
-
|
7
8
|
# Returns the array of links, as link is an array for Hashie.
|
8
9
|
def links
|
9
10
|
self["link"].map { |l| l.href }
|
10
11
|
end
|
11
|
-
|
12
|
+
|
12
13
|
# Returns link to get this contact
|
13
14
|
def self_link
|
14
15
|
_link = self["link"].find { |l| l.rel == "self" }
|
15
16
|
_link ? _link.href : nil
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
# Returns alternative, possibly off-Google home page link
|
19
20
|
def alternate_link
|
20
21
|
_link = self["link"].find { |l| l.rel == "alternate" }
|
21
22
|
_link ? _link.href : nil
|
22
23
|
end
|
23
|
-
|
24
|
+
|
24
25
|
# Returns link for photo
|
25
26
|
# (still need authentication to get the photo data, though)
|
26
27
|
def photo_link
|
27
28
|
_link = self["link"].find { |l| l.rel == "http://schemas.google.com/contacts/2008/rel#photo" }
|
28
29
|
_link ? _link.href : nil
|
29
30
|
end
|
30
|
-
|
31
|
+
|
31
32
|
# Returns binary data for the photo. You can probably
|
32
33
|
# use it in a data-uri. This is in PNG format.
|
33
34
|
def photo
|
34
35
|
return nil unless @api && photo_link
|
35
36
|
response = @api.oauth.get(photo_link)
|
36
|
-
|
37
|
+
|
37
38
|
case GoogleContactsApi::Api.parse_response_code(response)
|
38
39
|
# maybe return a placeholder instead of nil
|
39
40
|
when 400; return nil
|
@@ -45,13 +46,13 @@ module GoogleContactsApi
|
|
45
46
|
else; return response.body
|
46
47
|
end
|
47
48
|
end
|
48
|
-
|
49
|
+
|
49
50
|
# Returns link to add/replace the photo
|
50
51
|
def edit_photo_link
|
51
52
|
_link = self["link"].find { |l| l.rel == "http://schemas.google.com/contacts/2008/rel#edit_photo" }
|
52
53
|
_link ? _link.href : nil
|
53
54
|
end
|
54
|
-
|
55
|
+
|
55
56
|
# Returns link to edit the contact
|
56
57
|
def edit_link
|
57
58
|
_link = self["link"].find { |l| l.rel == "edit" }
|
@@ -62,12 +63,12 @@ module GoogleContactsApi
|
|
62
63
|
def phone_numbers
|
63
64
|
self["gd$phoneNumber"] ? self["gd$phoneNumber"].map { |e| e['$t'] } : []
|
64
65
|
end
|
65
|
-
|
66
|
+
|
66
67
|
# Returns all email addresses for the contact
|
67
68
|
def emails
|
68
69
|
self["gd$email"] ? self["gd$email"].map { |e| e.address } : []
|
69
70
|
end
|
70
|
-
|
71
|
+
|
71
72
|
# Returns primary email for the contact
|
72
73
|
def primary_email
|
73
74
|
if self["gd$email"]
|
@@ -77,13 +78,15 @@ module GoogleContactsApi
|
|
77
78
|
nil # no emails at all
|
78
79
|
end
|
79
80
|
end
|
80
|
-
|
81
|
+
|
81
82
|
# Returns all instant messaging addresses for the contact.
|
82
83
|
# Doesn't yet distinguish protocols
|
83
84
|
def ims
|
84
85
|
self["gd$im"] ? self["gd$im"].map { |i| i.address } : []
|
85
86
|
end
|
86
87
|
|
88
|
+
# Convenience method to return a nested $t field.
|
89
|
+
# If the field doesn't exist, return nil
|
87
90
|
def nested_t_field_or_nil(level1, level2)
|
88
91
|
if self[level1]
|
89
92
|
self[level1][level2] ? self[level1][level2]['$t']: nil
|
@@ -116,12 +119,17 @@ module GoogleContactsApi
|
|
116
119
|
spouse_rel['$t'] if spouse_rel
|
117
120
|
end
|
118
121
|
|
122
|
+
# Return an Array of Hashes representing addresses with formatted metadata.
|
119
123
|
def addresses
|
120
124
|
self['gd$structuredPostalAddress'] ? self['gd$structuredPostalAddress'].map(&method(:format_address)) : []
|
121
125
|
end
|
126
|
+
|
127
|
+
# Return an Array of Hashes representing phone numbers with formatted metadata.
|
122
128
|
def phone_numbers_full
|
123
129
|
self["gd$phoneNumber"] ? self["gd$phoneNumber"].map(&method(:format_phone_number)) : []
|
124
130
|
end
|
131
|
+
|
132
|
+
# Return an Array of Hashes representing emails with formatted metadata.
|
125
133
|
def emails_full
|
126
134
|
self["gd$email"] ? self["gd$email"].map(&method(:format_email)) : []
|
127
135
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module GoogleContactsApi
|
2
|
+
# Represents a set of contacts.
|
2
3
|
class ContactSet < GoogleContactsApi::ResultSet
|
3
|
-
#
|
4
|
+
# Initialize a ContactSet from an API response body that contains contacts data
|
4
5
|
def initialize(response_body, api = nil)
|
5
6
|
super
|
6
7
|
if @parsed.nil? || @parsed.feed.nil? || @parsed.feed.entry.nil?
|
@@ -1,33 +1,35 @@
|
|
1
1
|
module GoogleContactsApi
|
2
|
+
# Represents a single group.
|
2
3
|
class Group < GoogleContactsApi::Result
|
3
4
|
include GoogleContactsApi::Contacts
|
4
|
-
# Populate from a single entry element in the result response
|
5
|
-
# when requesting a set of Contacts
|
6
5
|
|
6
|
+
# Return true if this is a system group.
|
7
7
|
def system_group?
|
8
8
|
!self["gContact$systemGroup"].nil?
|
9
9
|
end
|
10
10
|
|
11
|
+
# Return the contacts in this group and cache them.
|
11
12
|
def contacts(params = {})
|
12
13
|
# contacts in this group
|
13
14
|
@contacts ||= super({"group" => self.id}.merge(params))
|
14
15
|
end
|
15
|
-
|
16
|
+
|
17
|
+
# Return the contacts in this group, retrieving them again from the server.
|
16
18
|
def contacts!(params = {})
|
17
19
|
# contacts in this group
|
18
20
|
@contacts = super({"group" => self.id}.merge(params))
|
19
21
|
end
|
20
|
-
|
22
|
+
|
21
23
|
# Returns the array of links, as link is an array for Hashie.
|
22
24
|
def links
|
23
25
|
self["link"].map { |l| l.href }
|
24
26
|
end
|
25
|
-
|
27
|
+
|
26
28
|
def self_link
|
27
29
|
_link = self["link"].find { |l| l.rel == "self" }
|
28
30
|
_link ? _link.href : nil
|
29
31
|
end
|
30
|
-
|
32
|
+
|
31
33
|
def edit_link
|
32
34
|
_link = self["link"].find { |l| l.rel == "edit" }
|
33
35
|
_link ? _link.href : nil
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module GoogleContactsApi
|
2
2
|
class GroupSet < GoogleContactsApi::ResultSet
|
3
|
-
#
|
3
|
+
# Initialize a GroupSet from an API response body that contains groups data
|
4
4
|
def initialize(response_body, api = nil)
|
5
5
|
super
|
6
6
|
@results = @parsed.feed.entry.map { |e| GoogleContactsApi::Group.new(e, nil, api) }
|
@@ -1,16 +1,12 @@
|
|
1
1
|
require 'hashie'
|
2
2
|
|
3
3
|
module GoogleContactsApi
|
4
|
-
# Base class for Group and Contact
|
4
|
+
# Base class for Group and Contact.
|
5
|
+
# In the JSON responses, ":" from the equivalent XML response is replaced
|
6
|
+
# with a "$", while element content is instead keyed with "$t".
|
5
7
|
class Result < Hashie::Mash
|
6
|
-
# Note that the title is really just the (full) name
|
7
|
-
# ":" replaced with $, element content is keyed with $t
|
8
|
-
|
9
|
-
# These are the accessors we can write
|
10
|
-
# :id, :title, :updated, :content
|
11
|
-
|
12
8
|
attr_reader :api
|
13
|
-
#
|
9
|
+
# Initialize a Result from a single result's Hash/Hashie
|
14
10
|
def initialize(source_hash = nil, default = nil, api = nil, &blk)
|
15
11
|
@api = api if api
|
16
12
|
super(source_hash, default, &blk)
|
@@ -25,7 +21,9 @@ module GoogleContactsApi
|
|
25
21
|
_id = self["id"]
|
26
22
|
_id ? _id["$t"] : nil
|
27
23
|
end
|
28
|
-
|
24
|
+
|
25
|
+
# For Contacts, returns the (full) name.
|
26
|
+
# For Groups, returns the name of the group.
|
29
27
|
def title
|
30
28
|
_title = self["title"]
|
31
29
|
_title ? _title["$t"] : nil
|
@@ -7,8 +7,7 @@ module GoogleContactsApi
|
|
7
7
|
@api = GoogleContactsApi::Api.new(oauth)
|
8
8
|
end
|
9
9
|
|
10
|
-
# Retrieve the groups for this user
|
11
|
-
# TODO: Handle 403, 404, 401
|
10
|
+
# Retrieve the groups for this user.
|
12
11
|
def groups(params = {})
|
13
12
|
params = params.with_indifferent_access
|
14
13
|
# compose params into a string
|
@@ -27,6 +26,7 @@ module GoogleContactsApi
|
|
27
26
|
response = @api.get(url, params)
|
28
27
|
|
29
28
|
case GoogleContactsApi::Api.parse_response_code(response)
|
29
|
+
# TODO: Better handle 401, 403, 404
|
30
30
|
when 401; raise
|
31
31
|
when 403; raise
|
32
32
|
when 404; raise
|
data/spec/spec_helper.rb
CHANGED
@@ -6,7 +6,7 @@ require 'hashie'
|
|
6
6
|
require 'net/http'
|
7
7
|
require 'google_contacts_api'
|
8
8
|
|
9
|
-
puts "Testing version #{GoogleContactsApi::
|
9
|
+
puts "Testing version #{GoogleContactsApi::Version::STRING}"
|
10
10
|
|
11
11
|
# Requires supporting files with custom matchers and macros, etc,
|
12
12
|
# in ./support/ and its subdirectories.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_contacts_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -213,6 +213,7 @@ files:
|
|
213
213
|
- lib/google_contacts_api/result.rb
|
214
214
|
- lib/google_contacts_api/result_set.rb
|
215
215
|
- lib/google_contacts_api/user.rb
|
216
|
+
- lib/google_contacts_api/version.rb
|
216
217
|
- spec/contact_set.json
|
217
218
|
- spec/empty_contact_set.json
|
218
219
|
- spec/errors/auth_sub_401.html
|
@@ -234,7 +235,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
234
235
|
version: '0'
|
235
236
|
segments:
|
236
237
|
- 0
|
237
|
-
hash: -
|
238
|
+
hash: -1381068612794242354
|
238
239
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
239
240
|
none: false
|
240
241
|
requirements:
|