kulesa-contacts 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitmodules +3 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +51 -0
- data/LICENSE +18 -0
- data/README.markdown +111 -0
- data/Rakefile +47 -0
- data/VERSION +1 -0
- data/kulesa-contacts.gemspec +104 -0
- data/lib/contacts.rb +90 -0
- data/lib/contacts/consumer.rb +123 -0
- data/lib/contacts/google.rb +85 -0
- data/lib/contacts/oauth_consumer.rb +71 -0
- data/lib/contacts/railtie.rb +14 -0
- data/lib/contacts/util.rb +24 -0
- data/lib/contacts/version.rb +10 -0
- data/lib/contacts/windows_live.rb +192 -0
- data/lib/contacts/yahoo.rb +89 -0
- data/spec/config/contacts.yml +15 -0
- data/spec/contact_spec.rb +29 -0
- data/spec/feeds/google-many.xml +76 -0
- data/spec/feeds/wl_contacts.xml +29 -0
- data/spec/feeds/yh_contacts.txt +241 -0
- data/spec/gmail/google_spec.rb +54 -0
- data/spec/rcov.opts +2 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/windows_live/windows_live_spec.rb +44 -0
- data/spec/yahoo/yahoo_spec.rb +52 -0
- metadata +213 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'contacts'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Contacts
|
5
|
+
class Yahoo < OAuthConsumer
|
6
|
+
CONSUMER_OPTIONS = Util.frozen_hash(
|
7
|
+
:site => "https://api.login.yahoo.com",
|
8
|
+
:request_token_path => "/oauth/v2/get_request_token",
|
9
|
+
:access_token_path => "/oauth/v2/get_token",
|
10
|
+
:authorize_path => "/oauth/v2/request_auth"
|
11
|
+
)
|
12
|
+
|
13
|
+
REQUEST_TOKEN_PARAMS = {}
|
14
|
+
|
15
|
+
def initialize(options={})
|
16
|
+
super(CONSUMER_OPTIONS, REQUEST_TOKEN_PARAMS)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize_serialized(data)
|
20
|
+
super
|
21
|
+
if @access_token && (guid = data['guid'])
|
22
|
+
@access_token.params['xoauth_yahoo_guid'] = guid
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def contacts(options={})
|
27
|
+
return nil if @access_token.nil?
|
28
|
+
params = {:limit => 200}.update(options)
|
29
|
+
yahoo_params = translate_contacts_options(params).merge('format' => 'json')
|
30
|
+
guid = @access_token.params['xoauth_yahoo_guid']
|
31
|
+
uri = URI.parse("http://social.yahooapis.com/v1/user/#{guid}/contacts")
|
32
|
+
uri.query = params_to_query(yahoo_params)
|
33
|
+
begin
|
34
|
+
response = @access_token.get(uri.to_s)
|
35
|
+
rescue OAuth::Unauthorized => error
|
36
|
+
# Token probably expired.
|
37
|
+
@error = error.message
|
38
|
+
return nil
|
39
|
+
end
|
40
|
+
parse_contacts(response.body)
|
41
|
+
end
|
42
|
+
|
43
|
+
def serializable_data
|
44
|
+
data = super
|
45
|
+
data['guid'] = @access_token.params['xoauth_yahoo_guid'] if @access_token
|
46
|
+
data
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def translate_contacts_options(options)
|
52
|
+
params = {}
|
53
|
+
value = options[:limit] and
|
54
|
+
params['count'] = value
|
55
|
+
value = options[:offset] and
|
56
|
+
params['start'] = value
|
57
|
+
params['sort'] = (value = options[:descending]) ? 'desc' : 'asc'
|
58
|
+
params['sort-fields'] = 'email'
|
59
|
+
# :updated_after not supported. Yahoo! appears to support
|
60
|
+
# filtering by updated, but does not support a date comparison
|
61
|
+
# operation. Lame. TODO: filter unwanted records out of the
|
62
|
+
# response ourselves.
|
63
|
+
params
|
64
|
+
end
|
65
|
+
|
66
|
+
def parse_contacts(text)
|
67
|
+
result = JSON.parse(text)
|
68
|
+
if result['contacts']
|
69
|
+
result['contacts']['contact'].map do |contact_object|
|
70
|
+
name, emails = nil, []
|
71
|
+
contact_object['fields'].each do |field_object|
|
72
|
+
case field_object['type']
|
73
|
+
when 'nickname'
|
74
|
+
name = field_object['value']
|
75
|
+
when 'name'
|
76
|
+
name ||= field_object['value'].values_at('givenName', 'familyName').compact.join(' ')
|
77
|
+
when 'email'
|
78
|
+
emails << field_object['value']
|
79
|
+
end
|
80
|
+
end
|
81
|
+
next if emails.empty?
|
82
|
+
Contact.new(emails, name)
|
83
|
+
end.compact
|
84
|
+
else
|
85
|
+
[]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
test:
|
2
|
+
windows_live:
|
3
|
+
application_id: app_id
|
4
|
+
secret_key: your_secret
|
5
|
+
privacy_policy_url: http://yourserver.com/you_policy_url
|
6
|
+
return_url: 'http://phaseiii.mine.nu:3000/friends/load_contacts'
|
7
|
+
yahoo:
|
8
|
+
consumer_key: your_key
|
9
|
+
consumer_secret: your_secret_key
|
10
|
+
return_url: 'http://phaseiii.mine.nu:3000/friends/load_contacts'
|
11
|
+
google:
|
12
|
+
consumer_key: your_key
|
13
|
+
consumer_secret: your_secret_key
|
14
|
+
return_url: 'http://phaseiii.mine.nu:3000/friends/load_contacts'
|
15
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'contacts'
|
3
|
+
|
4
|
+
describe Contacts::Contact do
|
5
|
+
describe 'instance' do
|
6
|
+
before do
|
7
|
+
@contact = Contacts::Contact.new('max@example.com', 'Max Power', 'maxpower')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should have email" do
|
11
|
+
@contact.email.should == 'max@example.com'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should have name" do
|
15
|
+
@contact.name.should == 'Max Power'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should support multiple emails" do
|
19
|
+
@contact.emails << 'maxpower@example.com'
|
20
|
+
@contact.email.should == 'max@example.com'
|
21
|
+
@contact.emails.should == ['max@example.com', 'maxpower@example.com']
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should have username" do
|
25
|
+
@contact.username.should == 'maxpower'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
<feed xmlns='http://www.w3.org/2005/Atom'
|
2
|
+
xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'
|
3
|
+
xmlns:gContact='http://schemas.google.com/contact/2008'
|
4
|
+
xmlns:batch='http://schemas.google.com/gdata/batch'
|
5
|
+
xmlns:gd='http://schemas.google.com/g/2005'
|
6
|
+
gd:etag='W/"CUMBRHo_fip7ImA9WxRbGU0."'>
|
7
|
+
<id>liz@gmail.com</id>
|
8
|
+
<updated>2008-12-10T10:04:15.446Z</updated>
|
9
|
+
<category scheme='http://schemas.google.com/g/2005#kind'
|
10
|
+
term='http://schemas.google.com/contact/2008#contact' />
|
11
|
+
<title>Elizabeth Bennet's Contacts</title>
|
12
|
+
<link rel='http://schemas.google.com/g/2005#feed'
|
13
|
+
type='application/atom+xml'
|
14
|
+
href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full' />
|
15
|
+
<link rel='http://schemas.google.com/g/2005#post'
|
16
|
+
type='application/atom+xml'
|
17
|
+
href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full' />
|
18
|
+
<link rel='http://schemas.google.com/g/2005#batch'
|
19
|
+
type='application/atom+xml'
|
20
|
+
href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/batch' />
|
21
|
+
<link rel='self' type='application/atom+xml'
|
22
|
+
href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full?max-results=25' />
|
23
|
+
<author>
|
24
|
+
<name>Elizabeth Bennet</name>
|
25
|
+
<email>liz@gmail.com</email>
|
26
|
+
</author>
|
27
|
+
<generator version='1.0' uri='http://www.google.com/m8/feeds'>
|
28
|
+
Contacts
|
29
|
+
</generator>
|
30
|
+
<openSearch:totalResults>1</openSearch:totalResults>
|
31
|
+
<openSearch:startIndex>1</openSearch:startIndex>
|
32
|
+
<openSearch:itemsPerPage>25</openSearch:itemsPerPage>
|
33
|
+
|
34
|
+
<entry gd:etag='"Qn04eTVSLyp7ImA9WxRbGEUORAQ."'>
|
35
|
+
<id>
|
36
|
+
http://www.google.com/m8/feeds/contacts/liz%40gmail.com/base/c9012de
|
37
|
+
</id>
|
38
|
+
<updated>2008-12-10T04:45:03.331Z</updated>
|
39
|
+
<app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-10T04:45:03.331Z</app:edited>
|
40
|
+
<category scheme='http://schemas.google.com/g/2005#kind'
|
41
|
+
term='http://schemas.google.com/contact/2008#contact' />
|
42
|
+
<title>Fitzwilliam</title>
|
43
|
+
<link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*'
|
44
|
+
href='https://www.google.com/m8/feeds/photos/media/liz%40gmail.com/c9012de'
|
45
|
+
gd:etag='"KTlcZWs1bCp7ImBBPV43VUV4LXEZCXERZAc."' />
|
46
|
+
<link rel='self' type='application/atom+xml'
|
47
|
+
href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/c9012de' />
|
48
|
+
<link rel='edit' type='application/atom+xml'
|
49
|
+
href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/c9012de' />
|
50
|
+
<gd:phoneNumber rel='http://schemas.google.com/g/2005#home'
|
51
|
+
primary='true'>
|
52
|
+
456
|
53
|
+
</gd:phoneNumber>
|
54
|
+
<gd:email rel='http://schemas.google.com/g/2005#work'
|
55
|
+
address='liz@gmail.com' />
|
56
|
+
<gd:extendedProperty name='pet' value='hamster' />
|
57
|
+
<gContact:groupMembershipInfo deleted='false'
|
58
|
+
href='http://www.google.com/m8/feeds/groups/liz%40gmail.com/base/270f' />
|
59
|
+
</entry>
|
60
|
+
|
61
|
+
<entry>
|
62
|
+
<title>Poor Jack</title>
|
63
|
+
<content>Poor Jack doesn't have an e-mail address</content>
|
64
|
+
</entry>
|
65
|
+
|
66
|
+
<entry>
|
67
|
+
<title>William Paginate</title>
|
68
|
+
<gd:email address='will_paginate@googlegroups.com' />
|
69
|
+
<gd:email address='will_paginate_also@googlegroups.com' />
|
70
|
+
</entry>
|
71
|
+
|
72
|
+
<entry>
|
73
|
+
<content>This guy doesn't have a name</content>
|
74
|
+
<gd:email address='anonymous@example.com' />
|
75
|
+
</entry>
|
76
|
+
</feed>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<LiveContacts>
|
3
|
+
<Owner>
|
4
|
+
<WindowsLiveID>hugo@hotmail.com</WindowsLiveID>
|
5
|
+
</Owner>
|
6
|
+
<Contacts>
|
7
|
+
<Contact>
|
8
|
+
<Profiles>
|
9
|
+
<Personal />
|
10
|
+
</Profiles>
|
11
|
+
<PreferredEmail>froz@gmail.com</PreferredEmail>
|
12
|
+
</Contact>
|
13
|
+
<Contact>
|
14
|
+
<Profiles>
|
15
|
+
<Personal>
|
16
|
+
<FirstName>Rafael</FirstName>
|
17
|
+
<LastName>Timbo</LastName>
|
18
|
+
</Personal>
|
19
|
+
</Profiles>
|
20
|
+
<PreferredEmail>timbo@hotmail.com</PreferredEmail>
|
21
|
+
</Contact>
|
22
|
+
<Contact>
|
23
|
+
<Profiles>
|
24
|
+
<Personal />
|
25
|
+
</Profiles>
|
26
|
+
<PreferredEmail>betinho@hotmail.com</PreferredEmail>
|
27
|
+
</Contact>
|
28
|
+
</Contacts>
|
29
|
+
</LiveContacts>
|
@@ -0,0 +1,241 @@
|
|
1
|
+
{
|
2
|
+
"contacts":
|
3
|
+
{
|
4
|
+
"start": 0,
|
5
|
+
"count": 2,
|
6
|
+
"total": 2,
|
7
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contacts",
|
8
|
+
"contact":
|
9
|
+
[
|
10
|
+
{
|
11
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/2",
|
12
|
+
"created": "2008-08-28T01:07:55Z",
|
13
|
+
"updated": "2008-08-28T01:07:55Z",
|
14
|
+
"isConnection": false,
|
15
|
+
"id": 2,
|
16
|
+
|
17
|
+
"fields":
|
18
|
+
[
|
19
|
+
{
|
20
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/2\/nickname\/1",
|
21
|
+
"created": "2008-08-28T01:07:55Z",
|
22
|
+
"updated": "2008-08-28T01:07:55Z",
|
23
|
+
"id": 1,
|
24
|
+
"type": "nickname",
|
25
|
+
"value": "HeadClown",
|
26
|
+
"flags": []
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/email\/3",
|
30
|
+
"created": "2008-09-25T22:49:06Z",
|
31
|
+
"updated": "2008-09-25T22:49:06Z",
|
32
|
+
"id": 14,
|
33
|
+
"type": "email",
|
34
|
+
"value": "HeadClown@example.com",
|
35
|
+
"flags": []
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/2\/address\/6",
|
39
|
+
"created": "2008-08-28T01:07:55Z",
|
40
|
+
"updated": "2008-08-28T01:07:55Z",
|
41
|
+
"id": 6,
|
42
|
+
"type": "address",
|
43
|
+
"value":
|
44
|
+
{
|
45
|
+
"street": "1234",
|
46
|
+
"city": "NowheresVille",
|
47
|
+
"stateOrProvince": "ca",
|
48
|
+
"postalCode": "91234",
|
49
|
+
"country": "usa"
|
50
|
+
},
|
51
|
+
"flags":
|
52
|
+
[
|
53
|
+
"HOME"
|
54
|
+
]
|
55
|
+
}
|
56
|
+
],
|
57
|
+
"categories":
|
58
|
+
[
|
59
|
+
{
|
60
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/2\/category\/Clowns",
|
61
|
+
"created": "2008-08-28T01:05:17Z",
|
62
|
+
"updated": "2008-09-25T22:49:06Z",
|
63
|
+
"id": 1,
|
64
|
+
"name": "Clowns"
|
65
|
+
}
|
66
|
+
]
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5",
|
70
|
+
"created": "2008-09-25T22:49:06Z",
|
71
|
+
"updated": "2008-09-25T22:49:06Z",
|
72
|
+
"isConnection": false,
|
73
|
+
"id": 5,
|
74
|
+
"fields":
|
75
|
+
[
|
76
|
+
{
|
77
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/nickname\/14",
|
78
|
+
"created": "2008-09-25T22:49:06Z",
|
79
|
+
"updated": "2008-09-25T22:49:06Z",
|
80
|
+
"id": 14,
|
81
|
+
"type": "nickname",
|
82
|
+
"value": "StarGirl",
|
83
|
+
"flags": []
|
84
|
+
},
|
85
|
+
{
|
86
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/email\/14",
|
87
|
+
"created": "2008-09-25T22:49:06Z",
|
88
|
+
"updated": "2008-09-25T22:49:06Z",
|
89
|
+
"id": 14,
|
90
|
+
"type": "email",
|
91
|
+
"value": "StarGirl@example.com",
|
92
|
+
"flags": []
|
93
|
+
},
|
94
|
+
{
|
95
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/email\/15",
|
96
|
+
"created": "2008-09-25T22:49:06Z",
|
97
|
+
"updated": "2008-09-25T22:49:06Z",
|
98
|
+
"id": 14,
|
99
|
+
"type": "email",
|
100
|
+
"value": "StarGirl1@example.com",
|
101
|
+
"flags": []
|
102
|
+
},
|
103
|
+
{
|
104
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/address\/21",
|
105
|
+
"created": "2008-09-25T22:49:06Z",
|
106
|
+
"updated": "2008-09-25T22:49:06Z",
|
107
|
+
"id": 21,
|
108
|
+
"type": "address",
|
109
|
+
"value":
|
110
|
+
{
|
111
|
+
"street": "0123",
|
112
|
+
"city": "NowheresVille",
|
113
|
+
"stateOrProvince": "Ca",
|
114
|
+
"postalCode": "90012",
|
115
|
+
"country": "USA"
|
116
|
+
},
|
117
|
+
"flags":
|
118
|
+
[
|
119
|
+
"HOME"
|
120
|
+
]
|
121
|
+
}
|
122
|
+
],
|
123
|
+
"categories":
|
124
|
+
[
|
125
|
+
{
|
126
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/category\/Clowns",
|
127
|
+
"created": "2008-08-28T01:05:17Z",
|
128
|
+
"updated": "2008-09-25T22:49:06Z",
|
129
|
+
"id": 1,
|
130
|
+
"name": "Clowns"
|
131
|
+
}
|
132
|
+
]
|
133
|
+
},
|
134
|
+
{
|
135
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5",
|
136
|
+
"created": "2008-09-25T22:49:06Z",
|
137
|
+
"updated": "2008-09-25T22:49:06Z",
|
138
|
+
"isConnection": false,
|
139
|
+
"id": 5,
|
140
|
+
"fields":
|
141
|
+
[
|
142
|
+
{
|
143
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/nickname\/14",
|
144
|
+
"created": "2008-09-25T22:49:06Z",
|
145
|
+
"updated": "2008-09-25T22:49:06Z",
|
146
|
+
"id": 14,
|
147
|
+
"type": "nickname",
|
148
|
+
"value": "MoonGirl",
|
149
|
+
"flags": []
|
150
|
+
},
|
151
|
+
{
|
152
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/email\/14",
|
153
|
+
"created": "2008-09-25T22:49:06Z",
|
154
|
+
"updated": "2008-09-25T22:49:06Z",
|
155
|
+
"id": 14,
|
156
|
+
"type": "email",
|
157
|
+
"value": "MoonGirl@example.com",
|
158
|
+
"flags": []
|
159
|
+
},
|
160
|
+
{
|
161
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/address\/21",
|
162
|
+
"created": "2008-09-25T22:49:06Z",
|
163
|
+
"updated": "2008-09-25T22:49:06Z",
|
164
|
+
"id": 21,
|
165
|
+
"type": "address",
|
166
|
+
"value":
|
167
|
+
{
|
168
|
+
"street": "0123",
|
169
|
+
"city": "NowheresVille",
|
170
|
+
"stateOrProvince": "Ca",
|
171
|
+
"postalCode": "90012",
|
172
|
+
"country": "USA"
|
173
|
+
},
|
174
|
+
"flags":
|
175
|
+
[
|
176
|
+
"HOME"
|
177
|
+
]
|
178
|
+
}
|
179
|
+
],
|
180
|
+
"categories":
|
181
|
+
[
|
182
|
+
{
|
183
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/category\/Clowns",
|
184
|
+
"created": "2008-08-28T01:05:17Z",
|
185
|
+
"updated": "2008-09-25T22:49:06Z",
|
186
|
+
"id": 1,
|
187
|
+
"name": "Clowns"
|
188
|
+
}
|
189
|
+
]
|
190
|
+
} ,
|
191
|
+
{
|
192
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5",
|
193
|
+
"created": "2008-09-25T22:49:06Z",
|
194
|
+
"updated": "2008-09-25T22:49:06Z",
|
195
|
+
"isConnection": false,
|
196
|
+
"id": 5,
|
197
|
+
"fields":
|
198
|
+
[
|
199
|
+
{
|
200
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/nickname\/14",
|
201
|
+
"created": "2008-09-25T22:49:06Z",
|
202
|
+
"updated": "2008-09-25T22:49:06Z",
|
203
|
+
"id": 14,
|
204
|
+
"type": "nickname",
|
205
|
+
"value": "NoEmailGirl",
|
206
|
+
"flags": []
|
207
|
+
},
|
208
|
+
{
|
209
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/address\/21",
|
210
|
+
"created": "2008-09-25T22:49:06Z",
|
211
|
+
"updated": "2008-09-25T22:49:06Z",
|
212
|
+
"id": 21,
|
213
|
+
"type": "address",
|
214
|
+
"value":
|
215
|
+
{
|
216
|
+
"street": "0123",
|
217
|
+
"city": "NowheresVille",
|
218
|
+
"stateOrProvince": "Ca",
|
219
|
+
"postalCode": "90012",
|
220
|
+
"country": "USA"
|
221
|
+
},
|
222
|
+
"flags":
|
223
|
+
[
|
224
|
+
"HOME"
|
225
|
+
]
|
226
|
+
}
|
227
|
+
],
|
228
|
+
"categories":
|
229
|
+
[
|
230
|
+
{
|
231
|
+
"uri": "http:\/\/social.yahooapis.com\/v1\/user\/XYZUHL23NH5DGGGGXM\/contact\/5\/category\/Clowns",
|
232
|
+
"created": "2008-08-28T01:05:17Z",
|
233
|
+
"updated": "2008-09-25T22:49:06Z",
|
234
|
+
"id": 1,
|
235
|
+
"name": "Clowns"
|
236
|
+
}
|
237
|
+
]
|
238
|
+
}
|
239
|
+
]
|
240
|
+
}
|
241
|
+
}
|