google_contacts_api 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,9 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "1.8.7"
4
- - "1.9.2"
5
3
  - "1.9.3"
6
- - jruby-18mode # JRuby in 1.8 mode
4
+ - "2.0.0"
5
+ - "2.1.1"
7
6
  - jruby-19mode # JRuby in 1.9 mode
8
- - rbx-18mode
9
- - rbx-19mode
7
+ - rbx-19mode
8
+ - rbx-2
data/Gemfile CHANGED
@@ -11,7 +11,7 @@ gem "hashie"
11
11
  group :test, :development do
12
12
  gem "shoulda"
13
13
  gem "simplecov"
14
- gem "rspec"
14
+ gem "rspec", "~> 3.0"
15
15
  gem "rdoc"
16
16
  end
17
17
 
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ Jeweler::Tasks.new do |gem|
16
16
  gem.homepage = "http://github.com/aliang/google_contacts_api"
17
17
  gem.license = "MIT"
18
18
  gem.summary = %Q{Lets you read from the Google Contacts API}
19
- gem.description = %Q{Lets you read from the Google Contacts API. Posting to come later. Tests to come later.}
19
+ gem.description = %Q{Lets you read from the Google Contacts API. Posting to come later.}
20
20
  gem.email = "ayliang@gmail.com"
21
21
  gem.authors = ["Alvin Liang"]
22
22
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.4.0
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "google_contacts_api"
8
- s.version = "0.3.3"
8
+ s.version = "0.4.0"
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"]
12
- s.date = "2013-01-15"
13
- s.description = "Lets you read from the Google Contacts API. Posting to come later. Tests to come later."
12
+ s.date = "2014-08-21"
13
+ s.description = "Lets you read from the Google Contacts API. Posting to come later."
14
14
  s.email = "ayliang@gmail.com"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
@@ -58,7 +58,7 @@ Gem::Specification.new do |s|
58
58
  s.add_runtime_dependency(%q<hashie>, [">= 0"])
59
59
  s.add_development_dependency(%q<shoulda>, [">= 0"])
60
60
  s.add_development_dependency(%q<simplecov>, [">= 0"])
61
- s.add_development_dependency(%q<rspec>, [">= 0"])
61
+ s.add_development_dependency(%q<rspec>, ["~> 3.0"])
62
62
  s.add_development_dependency(%q<rdoc>, [">= 0"])
63
63
  s.add_development_dependency(%q<bundler>, [">= 0"])
64
64
  s.add_development_dependency(%q<jeweler>, [">= 0"])
@@ -70,7 +70,7 @@ Gem::Specification.new do |s|
70
70
  s.add_dependency(%q<hashie>, [">= 0"])
71
71
  s.add_dependency(%q<shoulda>, [">= 0"])
72
72
  s.add_dependency(%q<simplecov>, [">= 0"])
73
- s.add_dependency(%q<rspec>, [">= 0"])
73
+ s.add_dependency(%q<rspec>, ["~> 3.0"])
74
74
  s.add_dependency(%q<rdoc>, [">= 0"])
75
75
  s.add_dependency(%q<bundler>, [">= 0"])
76
76
  s.add_dependency(%q<jeweler>, [">= 0"])
@@ -83,7 +83,7 @@ Gem::Specification.new do |s|
83
83
  s.add_dependency(%q<hashie>, [">= 0"])
84
84
  s.add_dependency(%q<shoulda>, [">= 0"])
85
85
  s.add_dependency(%q<simplecov>, [">= 0"])
86
- s.add_dependency(%q<rspec>, [">= 0"])
86
+ s.add_dependency(%q<rspec>, ["~> 3.0"])
87
87
  s.add_dependency(%q<rdoc>, [">= 0"])
88
88
  s.add_dependency(%q<bundler>, [">= 0"])
89
89
  s.add_dependency(%q<jeweler>, [">= 0"])
@@ -1,3 +1,4 @@
1
+ require 'active_support'
1
2
  require 'active_support/core_ext'
2
3
 
3
4
  module GoogleContactsApi
@@ -20,9 +21,9 @@ module GoogleContactsApi
20
21
  # ":" is replaced with $, element content is keyed with $t
21
22
  # Raise UnauthorizedError if not authorized.
22
23
  def get(link, params = {}, headers = {})
23
- params["alt"] = "json"
24
+ merged_params = params_with_defaults(params)
24
25
  begin
25
- result = @oauth.get("#{BASE_URL}#{link}?#{params.to_query}", headers)
26
+ result = @oauth.get("#{BASE_URL}#{link}?#{merged_params.to_query}", headers)
26
27
  rescue => e
27
28
  # TODO: OAuth 2.0 will raise a real error
28
29
  raise UnauthorizedError if defined?(e.response) && self.class.parse_response_code(e.response) == 401
@@ -63,5 +64,15 @@ module GoogleContactsApi
63
64
  def self.parse_response_code(response)
64
65
  (defined?(response.code) ? response.code : response.status).to_i
65
66
  end
67
+
68
+ private
69
+
70
+ def params_with_defaults(params)
71
+ p = params.merge({
72
+ "alt" => "json"
73
+ })
74
+ p['v'] = '3' unless p['v']
75
+ p
76
+ end
66
77
  end
67
78
  end
@@ -83,5 +83,76 @@ module GoogleContactsApi
83
83
  def ims
84
84
  self["gd$im"] ? self["gd$im"].map { |i| i.address } : []
85
85
  end
86
+
87
+ def nested_t_field_or_nil(level1, level2)
88
+ if self[level1]
89
+ self[level1][level2] ? self[level1][level2]['$t']: nil
90
+ end
91
+ end
92
+ def given_name
93
+ nested_t_field_or_nil 'gd$name', 'gd$givenName'
94
+ end
95
+ def family_name
96
+ nested_t_field_or_nil 'gd$name', 'gd$familyName'
97
+ end
98
+ def full_name
99
+ nested_t_field_or_nil 'gd$name', 'gd$fullName'
100
+ end
101
+ def additional_name
102
+ nested_t_field_or_nil 'gd$name', 'gd$additionalName'
103
+ end
104
+ def name_prefix
105
+ nested_t_field_or_nil 'gd$name', 'gd$namePrefix'
106
+ end
107
+ def name_suffix
108
+ nested_t_field_or_nil 'gd$name', 'gd$nameSuffix'
109
+ end
110
+
111
+ def relations
112
+ self['gContact$relation'] ? self['gContact$relation'] : []
113
+ end
114
+ def spouse
115
+ spouse_rel = relations.find {|r| r.rel = 'spouse'}
116
+ spouse_rel['$t'] if spouse_rel
117
+ end
118
+
119
+ def addresses
120
+ self['gd$structuredPostalAddress'] ? self['gd$structuredPostalAddress'].map(&method(:format_address)) : []
121
+ end
122
+ def phone_numbers_full
123
+ self["gd$phoneNumber"] ? self["gd$phoneNumber"].map(&method(:format_phone_number)) : []
124
+ end
125
+ def emails_full
126
+ self["gd$email"] ? self["gd$email"].map(&method(:format_email)) : []
127
+ end
128
+
129
+ private
130
+ def format_address(unformatted)
131
+ formatted = {}
132
+ formatted[:rel] = unformatted['rel'] ? unformatted['rel'].gsub('http://schemas.google.com/g/2005#', '') : 'work'
133
+ unformatted.delete 'rel'
134
+ unformatted.each do |key, value|
135
+ formatted[key.sub('gd$', '').underscore.to_sym] = value['$t']
136
+ end
137
+ formatted
138
+ end
139
+
140
+ def format_email_or_phone(unformatted)
141
+ formatted = {}
142
+ unformatted.each do |key, value|
143
+ formatted[key.underscore.to_sym] = value ? value.gsub('http://schemas.google.com/g/2005#', '') : value
144
+ end
145
+ formatted[:primary] = unformatted['primary'] ? unformatted['primary'] == 'true' : false
146
+ formatted
147
+ end
148
+
149
+ def format_phone_number(unformatted)
150
+ unformatted[:number] = unformatted['$t']
151
+ unformatted.delete '$t'
152
+ format_email_or_phone unformatted
153
+ end
154
+ def format_email(unformatted)
155
+ format_email_or_phone unformatted
156
+ end
86
157
  end
87
158
  end
@@ -12,18 +12,29 @@ describe "GoogleContactsApi" do
12
12
  describe "Api" do
13
13
  before(:each) do
14
14
  @oauth = double("oauth")
15
- @oauth.stub(:get).and_return("get response")
15
+ allow(@oauth).to receive(:get).and_return("get response")
16
16
  @api = GoogleContactsApi::Api.new(@oauth)
17
17
  end
18
18
 
19
- it "should perform a get request using oauth returning json" do
20
- # expectation should come before execution
21
- @oauth.should_receive(:get).with(
22
- GoogleContactsApi::Api::BASE_URL + "any_url?alt=json&param=param", {"header" => "header"})
23
- @api.get("any_url",
24
- {"param" => "param"},
25
- {"header" => "header"}).should == ("get response")
19
+ describe ".get" do
20
+ it "should perform a get request using oauth returning json with version 3" do
21
+ # expectation should come before execution
22
+ expect(@oauth).to receive(:get).with(
23
+ GoogleContactsApi::Api::BASE_URL + "any_url?alt=json&param=param&v=3", {"header" => "header"})
24
+ expect(@api.get("any_url",
25
+ {"param" => "param"},
26
+ {"header" => "header"})).to eq("get response")
27
+ end
28
+
29
+ it "should perform a get request using oauth with the version specified" do
30
+ expect(@oauth).to receive(:get).with(
31
+ GoogleContactsApi::Api::BASE_URL + "any_url?alt=json&param=param&v=2", {"header" => "header"})
32
+ expect(@api.get("any_url",
33
+ {"param" => "param", "v" => "2"},
34
+ {"header" => "header"})).to eq("get response")
35
+ end
26
36
  end
37
+
27
38
  # Not implemented yet
28
39
  pending "should perform a post request using oauth"
29
40
  pending "should perform a put request using oauth"
@@ -32,21 +43,21 @@ describe "GoogleContactsApi" do
32
43
  it "should raise UnauthorizedError if OAuth 1.0 returns unauthorized" do
33
44
  oauth = double("oauth")
34
45
  error_html = load_file(File.join('errors', 'auth_sub_401.html'))
35
- oauth.stub(:get).and_return(Net::HTTPUnauthorized.new("1.1", 401, error_html))
46
+ allow(oauth).to receive(:get).and_return(Net::HTTPUnauthorized.new("1.1", 401, error_html))
36
47
  api = GoogleContactsApi::Api.new(oauth)
37
- lambda { api.get("any url",
48
+ expect { api.get("any url",
38
49
  {"param" => "param"},
39
- {"header" => "header"}) }.should raise_error(GoogleContactsApi::UnauthorizedError)
50
+ {"header" => "header"}) }.to raise_error(GoogleContactsApi::UnauthorizedError)
40
51
  end
41
52
 
42
53
  it "should raise UnauthorizedError if OAuth 2.0 returns unauthorized" do
43
54
  oauth = double("oauth2")
44
55
  oauth2_response = Struct.new(:status)
45
- oauth.stub(:get).and_raise(MockOAuth2Error.new(oauth2_response.new(401)))
56
+ allow(oauth).to receive(:get).and_raise(MockOAuth2Error.new(oauth2_response.new(401)))
46
57
  api = GoogleContactsApi::Api.new(oauth)
47
- lambda { api.get("any url",
58
+ expect { api.get("any url",
48
59
  {"param" => "param"},
49
- {"header" => "header"}) }.should raise_error(GoogleContactsApi::UnauthorizedError)
60
+ {"header" => "header"}) }.to raise_error(GoogleContactsApi::UnauthorizedError)
50
61
  end
51
62
 
52
63
  describe "parsing response code" do
@@ -55,41 +66,41 @@ describe "GoogleContactsApi" do
55
66
  @Oauth2 = Struct.new(:status)
56
67
  end
57
68
  it "should parse something that looks like an oauth gem response" do
58
- GoogleContactsApi::Api.parse_response_code(@Oauth.new("401")).should == 401
69
+ expect(GoogleContactsApi::Api.parse_response_code(@Oauth.new("401"))).to eq(401)
59
70
  end
60
-
71
+
61
72
  it "should parse something that looks like an oauth2 gem response" do
62
- GoogleContactsApi::Api.parse_response_code(@Oauth2.new(401)).should == 401
73
+ expect(GoogleContactsApi::Api.parse_response_code(@Oauth2.new(401))).to eq(401)
63
74
  end
64
75
  end
65
76
  end
66
-
77
+
67
78
  describe "User" do
68
79
  before(:each) do
69
80
  @oauth = double("oauth")
70
81
  @user = GoogleContactsApi::User.new(@oauth)
71
- @user.api.stub(:get).and_return(Hashie::Mash.new({
82
+ allow(@user.api).to receive(:get).and_return(Hashie::Mash.new({
72
83
  "body" => "some response", # could use example response here
73
84
  "code" => 200
74
85
  }))
75
- GoogleContactsApi::GroupSet.stub(:new).and_return("group set")
76
- GoogleContactsApi::ContactSet.stub(:new).and_return("contact set")
86
+ allow(GoogleContactsApi::GroupSet).to receive(:new).and_return("group set")
87
+ allow(GoogleContactsApi::ContactSet).to receive(:new).and_return("contact set")
77
88
  end
78
89
  # Should hit the right URLs and return the right stuff
79
90
  it "should be able to get groups including system groups" do
80
- @user.api.should_receive(:get).with("groups/default/full", hash_including(:v => 2))
81
- @user.groups.should == "group set"
91
+ expect(@user.api).to receive(:get).with("groups/default/full", hash_including(:v => 2))
92
+ expect(@user.groups).to eq("group set")
82
93
  end
83
94
  it "should be able to get contacts" do
84
- @user.api.should_receive(:get).with("contacts/default/full", anything)
85
- @user.contacts.should == "contact set"
95
+ expect(@user.api).to receive(:get).with("contacts/default/full", anything)
96
+ expect(@user.contacts).to eq("contact set")
86
97
  end
87
98
  end
88
-
99
+
89
100
  describe "ResultSet" do
90
101
  # no testing, it's just an implementation detail to use inheritance
91
102
  end
92
-
103
+
93
104
  describe "ContactSet" do
94
105
  describe "with entries" do
95
106
  before(:all) do
@@ -98,31 +109,31 @@ describe "GoogleContactsApi" do
98
109
  end
99
110
 
100
111
  it "should return the right starting index" do
101
- @contact_set.start_index.should == 1
112
+ expect(@contact_set.start_index).to eq(1)
102
113
  end
103
114
  it "should return the right number of results per page" do
104
- @contact_set.items_per_page.should == 25
115
+ expect(@contact_set.items_per_page).to eq(25)
105
116
  end
106
117
  it "should return the right number of total results" do
107
- @contact_set.total_results.should == 500
118
+ expect(@contact_set.total_results).to eq(500)
108
119
  end
109
120
  it "should tell me if there are more results" do
110
121
  # yeah this is an awkward assertion and matcher
111
- @contact_set.should be_has_more
112
- @contact_set.has_more?.should == true
122
+ expect(@contact_set).to be_has_more
123
+ expect(@contact_set.has_more?).to eq(true)
113
124
  end
114
125
  it "should parse results into Contacts" do
115
- @contact_set.to_a.first.should be_instance_of(GoogleContactsApi::Contact)
126
+ expect(@contact_set.to_a.first).to be_instance_of(GoogleContactsApi::Contact)
116
127
  end
117
128
  end
118
129
  it "should parse nil results into an empty array" do
119
130
  @empty_contact_set_json = empty_contact_set_json
120
131
  @empty_contact_set = GoogleContactsApi::ContactSet.new(@empty_contact_set_json)
121
- @empty_contact_set.total_results.should == 0
122
- @empty_contact_set.instance_variable_get("@results").should == []
132
+ expect(@empty_contact_set.total_results).to eq(0)
133
+ expect(@empty_contact_set.instance_variable_get("@results")).to eq([])
123
134
  end
124
135
  end
125
-
136
+
126
137
  describe "GroupSet" do
127
138
  before(:all) do
128
139
  @group_set_json = group_set_json
@@ -130,28 +141,28 @@ describe "GoogleContactsApi" do
130
141
  end
131
142
 
132
143
  it "should return the right starting index" do
133
- @group_set.start_index.should == 1
144
+ expect(@group_set.start_index).to eq(1)
134
145
  end
135
146
  it "should return the right number of results per page" do
136
- @group_set.items_per_page.should == 25
147
+ expect(@group_set.items_per_page).to eq(25)
137
148
  end
138
149
  it "should return the right number of total results" do
139
- @group_set.total_results.should == 5
150
+ expect(@group_set.total_results).to eq(5)
140
151
  end
141
152
  it "should tell me if there are more results" do
142
153
  # yeah this is an awkward assertion and matcher
143
- @group_set.should_not be_has_more
144
- @group_set.has_more?.should == false
154
+ expect(@group_set).not_to be_has_more
155
+ expect(@group_set.has_more?).to eq(false)
145
156
  end
146
157
  it "should parse results into Groups" do
147
- @group_set.to_a.first.should be_instance_of(GoogleContactsApi::Group)
158
+ expect(@group_set.to_a.first).to be_instance_of(GoogleContactsApi::Group)
148
159
  end
149
160
  end
150
-
161
+
151
162
  describe "Result" do
152
163
  # no testing, it's just an implementation detail to inherit
153
164
  end
154
-
165
+
155
166
  describe "Contact" do
156
167
  before(:all) do
157
168
  @contact_json_hash = contact_json_hash
@@ -159,72 +170,193 @@ describe "GoogleContactsApi" do
159
170
  end
160
171
  # ok, these tests are kind of silly
161
172
  it "should return the right title" do
162
- @contact.title.should == "Contact 1"
173
+ expect(@contact.title).to eq("Contact 1")
163
174
  end
164
175
  it "should return the right id" do
165
- @contact.id.should == "http://www.google.com/m8/feeds/contacts/example%40gmail.com/base/0"
176
+ expect(@contact.id).to eq("http://www.google.com/m8/feeds/contacts/example%40gmail.com/base/0")
166
177
  end
167
178
  it "should return the right content" do
168
179
  # TODO: Nothing in source, oops
169
- @contact.content.should == nil
180
+ expect(@contact.content).to eq(nil)
170
181
  end
171
182
  it "should return the right updated time" do
172
183
  # different representation slightly
173
- @contact.updated.to_s.should == "2011-07-07T21:02:42+00:00"
184
+ expect(@contact.updated.to_s).to eq("2011-07-07T21:02:42+00:00")
174
185
  end
175
186
  it "should return the right self link" do
176
- @contact.self_link.should == "https://www.google.com/m8/feeds/contacts/example%40gmail.com/full/0"
187
+ expect(@contact.self_link).to eq("https://www.google.com/m8/feeds/contacts/example%40gmail.com/full/0")
177
188
  end
178
189
  it "should return the right photo link" do
179
- @contact.photo_link.should == "https://www.google.com/m8/feeds/photos/media/example%40gmail.com/0"
190
+ expect(@contact.photo_link).to eq("https://www.google.com/m8/feeds/photos/media/example%40gmail.com/0")
180
191
  end
181
192
  it "should return the right edit link" do
182
- @contact.edit_link.should == "https://www.google.com/m8/feeds/contacts/example%40gmail.com/full/0"
193
+ expect(@contact.edit_link).to eq("https://www.google.com/m8/feeds/contacts/example%40gmail.com/full/0")
183
194
  end
184
195
  it "should return the right edit photo link" do
185
196
  # TODO: there isn't one in this contact, hahah
186
- @contact.edit_photo_link.should == nil
197
+ expect(@contact.edit_photo_link).to eq(nil)
187
198
  end
188
199
  it "should try to fetch a photo" do
189
- @oauth = mock("oauth")
190
- @oauth.stub(:get).and_return(Hashie::Mash.new({
200
+ @oauth = double("oauth")
201
+ allow(@oauth).to receive(:get).and_return(Hashie::Mash.new({
191
202
  "body" => "some response", # could use example response here
192
203
  "code" => 200
193
204
  }))
194
205
  # @api = GoogleContactsApi::Api.new(@oauth)
195
- @api = mock("api")
196
- @api.stub(:oauth).and_return(@oauth)
206
+ @api = double("api")
207
+ allow(@api).to receive(:oauth).and_return(@oauth)
197
208
  @contact = GoogleContactsApi::Contact.new(@contact_json_hash, nil, @api)
198
- @oauth.should_receive("get").with(@contact.photo_link)
209
+ expect(@oauth).to receive("get").with(@contact.photo_link)
199
210
  @contact.photo
200
211
  end
201
212
  # TODO: there isn't any phone number in here
202
213
  pending "should return all phone numbers"
203
214
  it "should return all e-mail addresses" do
204
- @contact.emails.should == ["contact1@example.com"]
215
+ expect(@contact.emails).to eq(["contact1@example.com"])
205
216
  end
206
217
  it "should return the right primary e-mail address" do
207
- @contact.primary_email.should == "contact1@example.com"
218
+ expect(@contact.primary_email).to eq("contact1@example.com")
208
219
  end
209
220
  it "should return an empty array if there are no e-mail addresses" do
210
221
  @contact = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
211
- @contact.emails.should == []
222
+ expect(@contact.emails).to eq([])
212
223
  end
213
224
  it "should return nil if there is no primary e-mail address" do
214
225
  @contact2 = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
215
- @contact2.primary_email.should be_nil
226
+ expect(@contact2.primary_email).to be_nil
216
227
  @contact3 = GoogleContactsApi::Contact.new(contact_no_primary_email_json_hash)
217
- @contact3.primary_email.should be_nil
228
+ expect(@contact3.primary_email).to be_nil
218
229
  end
219
230
  it "should return all instant messaging accounts" do
220
- @contact.ims.should == ["contact1@example.com"]
231
+ expect(@contact.ims).to eq(["contact1@example.com"])
221
232
  end
222
233
  it "should return an empty array if there are no instant messaging accounts" do
223
234
  @contact = GoogleContactsApi::Contact.new(contact_no_emails_json_hash)
224
- @contact.ims.should == []
235
+ expect(@contact.ims).to eq([])
236
+ end
237
+
238
+ #
239
+ describe 'Contacts API v3 fields' do
240
+ before do
241
+ @empty = GoogleContactsApi::Contact.new
242
+
243
+ @partly_empty = GoogleContactsApi::Contact.new(
244
+ 'gd$name' => {},
245
+ 'gContact$relation' => []
246
+ )
247
+
248
+ @contact_v3 = GoogleContactsApi::Contact.new(
249
+ 'gd$name' => {
250
+ 'gd$givenName' => { '$t' => 'John' },
251
+ 'gd$familyName' => { '$t' => 'Doe' },
252
+ 'gd$fullName' => { '$t' => 'John Doe' }
253
+ },
254
+ 'gContact$relation' => [ { '$t' => 'Jane', 'rel' => 'spouse' } ],
255
+ 'gd$structuredPostalAddress' => [
256
+ {
257
+ 'gd$country' => { '$t' => 'United States of America' },
258
+ 'gd$formattedAddress' => { '$t' => "2345 Long Dr. #232\nSomwhere\nIL\n12345\nUnited States of America" },
259
+ 'gd$city' => { '$t' => 'Somwhere' },
260
+ 'gd$street' => { '$t' => '2345 Long Dr. #232' },
261
+ 'gd$region' => { '$t' => 'IL' },
262
+ 'gd$postcode' => { '$t' => '12345' }
263
+ },
264
+ {
265
+ 'rel' => 'http://schemas.google.com/g/2005#home',
266
+ 'gd$country' => { '$t' => 'United States of America' },
267
+ 'gd$formattedAddress' => { '$t' => "123 Far Ln.\nAnywhere\nMO\n67891\nUnited States of America" },
268
+ 'gd$city' => { '$t' => 'Anywhere' },
269
+ 'gd$street' => { '$t' => '123 Far Ln.' },
270
+ 'gd$region' => { '$t' => 'MO' },
271
+ 'gd$postcode' => { '$t' => '67891' }
272
+ }
273
+ ],
274
+ 'gd$email' => [
275
+ {
276
+ 'primary' => 'true',
277
+ 'rel' => 'http://schemas.google.com/g/2005#other',
278
+ 'address' => 'johnsmith@example.com'
279
+ }
280
+ ],
281
+ 'gd$phoneNumber' => [
282
+ {
283
+ 'primary' => 'true',
284
+ '$t' => '(123) 334-5158',
285
+ 'rel' => 'http://schemas.google.com/g/2005#mobile'
286
+ }
287
+ ]
288
+ )
289
+ end
290
+
291
+ it 'should catch nil values for nested fields' do
292
+ expect(@empty.nested_t_field_or_nil('gd$name', 'gd$givenName')).to be_nil
293
+ expect(@partly_empty.nested_t_field_or_nil('gd$name', 'gd$givenName')).to be_nil
294
+ expect(@contact_v3.nested_t_field_or_nil('gd$name', 'gd$givenName')).to eq('John')
295
+ end
296
+
297
+ it 'has given_name' do
298
+ expect(@contact_v3).to receive(:nested_t_field_or_nil).with('gd$name', 'gd$givenName').and_return('val')
299
+ expect(@contact_v3.given_name).to eq('val')
300
+ end
301
+
302
+ it 'has family_name' do
303
+ expect(@contact_v3).to receive(:nested_t_field_or_nil).with('gd$name', 'gd$familyName').and_return('val')
304
+ expect(@contact_v3.family_name).to eq('val')
305
+ end
306
+
307
+ it 'has full_name' do
308
+ expect(@contact_v3).to receive(:nested_t_field_or_nil).with('gd$name', 'gd$fullName').and_return('val')
309
+ expect(@contact_v3.full_name).to eq('val')
310
+ end
311
+
312
+ it 'has relations' do
313
+ expect(@empty.relations).to eq([])
314
+ expect(@partly_empty.relations).to eq([])
315
+ expect(@contact_v3.relations).to eq([ { '$t' => 'Jane', 'rel' => 'spouse' } ])
316
+ end
317
+ it 'has spouse' do
318
+ expect(@empty.spouse).to be_nil
319
+ expect(@partly_empty.spouse).to be_nil
320
+ expect(@contact_v3.spouse).to eq('Jane')
321
+ end
322
+
323
+ it 'has addresses' do
324
+ expect(@empty.addresses).to eq([])
325
+
326
+ formatted_addresses = [
327
+ {
328
+ :rel => 'work',
329
+ :country => 'United States of America',
330
+ :formatted_address => "2345 Long Dr. #232\nSomwhere\nIL\n12345\nUnited States of America",
331
+ :city => 'Somwhere',
332
+ :street => '2345 Long Dr. #232',
333
+ :region => 'IL',
334
+ :postcode => '12345'
335
+ },
336
+ {
337
+ :rel => 'home',
338
+ :country => 'United States of America',
339
+ :formatted_address => "123 Far Ln.\nAnywhere\nMO\n67891\nUnited States of America",
340
+ :city => 'Anywhere',
341
+ :street => '123 Far Ln.',
342
+ :region => 'MO',
343
+ :postcode => '67891'
344
+ }
345
+ ]
346
+ expect(@contact_v3.addresses).to eq(formatted_addresses)
347
+ end
348
+
349
+ it 'has full phone numbers' do
350
+ expect(@empty.phone_numbers_full).to eq([])
351
+ expect(@contact_v3.phone_numbers_full).to eq([ { :primary => true, :number => '(123) 334-5158', :rel => 'mobile' } ])
352
+ end
353
+ it 'has full emails' do
354
+ expect(@empty.emails_full).to eq([])
355
+ expect(@contact_v3.emails_full).to eq([ { :primary => true, :address => 'johnsmith@example.com', :rel => 'other' } ])
356
+ end
225
357
  end
226
358
  end
227
-
359
+
228
360
  describe "Group" do
229
361
  before(:all) do
230
362
  @group_json_hash = group_json_hash
@@ -232,31 +364,31 @@ describe "GoogleContactsApi" do
232
364
  end
233
365
  # ok, these tests are kind of silly
234
366
  it "should return the right title" do
235
- @group.title.should == "System Group: My Contacts"
367
+ expect(@group.title).to eq("System Group: My Contacts")
236
368
  end
237
369
  it "should return the right id" do
238
- @group.id.should == "http://www.google.com/m8/feeds/groups/example%40gmail.com/base/6"
370
+ expect(@group.id).to eq("http://www.google.com/m8/feeds/groups/example%40gmail.com/base/6")
239
371
  end
240
372
  it "should return the right content" do
241
373
  # TODO: Nothing in source, oops
242
- @group.content.should == "System Group: My Contacts"
374
+ expect(@group.content).to eq("System Group: My Contacts")
243
375
  end
244
376
  it "should return the right updated time" do
245
377
  # different representation slightly
246
- @group.updated.to_s.should == "1970-01-01T00:00:00+00:00"
378
+ expect(@group.updated.to_s).to eq("1970-01-01T00:00:00+00:00")
247
379
  end
248
380
  it "should tell me if it's a system group" do
249
- @group.should be_system_group
381
+ expect(@group).to be_system_group
250
382
  end
251
383
  it "should get contacts from the group and cache them" do
252
- @api = mock("api")
253
- @api.stub(:get).and_return(Hashie::Mash.new({
384
+ @api = double("api")
385
+ allow(@api).to receive(:get).and_return(Hashie::Mash.new({
254
386
  "body" => "some response", # could use example response here
255
387
  "code" => 200
256
388
  }))
257
- GoogleContactsApi::ContactSet.stub(:new).and_return("contact set")
389
+ allow(GoogleContactsApi::ContactSet).to receive(:new).and_return("contact set")
258
390
  @group = GoogleContactsApi::Group.new(@contact_json_hash, nil, @api)
259
- @api.should_receive("get").with(an_instance_of(String),
391
+ expect(@api).to receive("get").with(an_instance_of(String),
260
392
  hash_including({"group" => @group.id})).once
261
393
  @group.contacts
262
394
  @group.contacts
data/spec/spec_helper.rb CHANGED
@@ -13,7 +13,6 @@ puts "Testing version #{GoogleContactsApi::VERSION}"
13
13
  # Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
14
14
 
15
15
  RSpec.configure do |config|
16
- config.mock_framework = :rspec
17
16
  end
18
17
 
19
18
  def load_file(filename)
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.3.3
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-15 00:00:00.000000000 Z
12
+ date: 2014-08-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -112,17 +112,17 @@ dependencies:
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  none: false
114
114
  requirements:
115
- - - ! '>='
115
+ - - ~>
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '3.0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  none: false
122
122
  requirements:
123
- - - ! '>='
123
+ - - ~>
124
124
  - !ruby/object:Gem::Version
125
- version: '0'
125
+ version: '3.0'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: rdoc
128
128
  requirement: !ruby/object:Gem::Requirement
@@ -187,8 +187,7 @@ dependencies:
187
187
  - - ! '>='
188
188
  - !ruby/object:Gem::Version
189
189
  version: '0'
190
- description: Lets you read from the Google Contacts API. Posting to come later. Tests
191
- to come later.
190
+ description: Lets you read from the Google Contacts API. Posting to come later.
192
191
  email: ayliang@gmail.com
193
192
  executables: []
194
193
  extensions: []
@@ -235,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
234
  version: '0'
236
235
  segments:
237
236
  - 0
238
- hash: -4068781390085911167
237
+ hash: -813692119890348937
239
238
  required_rubygems_version: !ruby/object:Gem::Requirement
240
239
  none: false
241
240
  requirements: