possible_email 0.0.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.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +17 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +6 -0
  6. data/Gemfile +2 -0
  7. data/Guardfile +11 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +161 -0
  10. data/Rakefile +13 -0
  11. data/bin/possible_email +6 -0
  12. data/lib/possible_email.rb +56 -0
  13. data/lib/possible_email/cli.rb +33 -0
  14. data/lib/possible_email/error.rb +3 -0
  15. data/lib/possible_email/patterns.rb +38 -0
  16. data/lib/possible_email/permutator.rb +64 -0
  17. data/lib/possible_email/profile/image.rb +11 -0
  18. data/lib/possible_email/profile/membership.rb +12 -0
  19. data/lib/possible_email/profile/occupation.rb +10 -0
  20. data/lib/possible_email/profile/phone.rb +5 -0
  21. data/lib/possible_email/profile/profile.rb +58 -0
  22. data/lib/possible_email/rapportive_requester.rb +49 -0
  23. data/lib/possible_email/response.rb +26 -0
  24. data/lib/possible_email/response_getter.rb +37 -0
  25. data/lib/possible_email/version.rb +3 -0
  26. data/possible_email.gemspec +35 -0
  27. data/spec/PossibleEmail/possible_email/permutator_spec.rb +83 -0
  28. data/spec/PossibleEmail/possible_email/profile/image_spec.rb +20 -0
  29. data/spec/PossibleEmail/possible_email/profile/membership_spec.rb +26 -0
  30. data/spec/PossibleEmail/possible_email/profile/occupation_spec.rb +15 -0
  31. data/spec/PossibleEmail/possible_email/profile/phone_spec.rb +0 -0
  32. data/spec/PossibleEmail/possible_email/profile/profile_spec.rb +100 -0
  33. data/spec/PossibleEmail/possible_email/rapportive_requester_spec.rb +67 -0
  34. data/spec/PossibleEmail/possible_email/response_getter_spec.rb +50 -0
  35. data/spec/PossibleEmail/possible_email/response_spec.rb +22 -0
  36. data/spec/PossibleEmail/possible_email_spec.rb +92 -0
  37. data/spec/fixtures/rapportive_example_data.json +509 -0
  38. data/spec/spec_helper.rb +12 -0
  39. metadata +274 -0
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe PossibleEmail::RapportiveRequester do
4
+
5
+ describe '.request' do
6
+ context 'when one email is passed in' do
7
+ let(:rapportive_requester) { PossibleEmail::RapportiveRequester.request('bob@gmail.com') }
8
+
9
+ it 'does not return an error' do
10
+ expect { rapportive_requester }.not_to raise_error
11
+ end
12
+
13
+ it 'returns a single Profile' do
14
+ expect(rapportive_requester).to be_instance_of(PossibleEmail::Profile)
15
+ end
16
+ end
17
+
18
+ context 'when more than one email are passed in' do
19
+ context 'as splat String arguments' do
20
+ let(:rapportive_requester) { PossibleEmail::RapportiveRequester.request('bob@gmail.com', 'kevinrose@gmail.com') }
21
+
22
+ it 'does not return an error' do
23
+ expect { rapportive_requester }.not_to raise_error
24
+ end
25
+
26
+ it 'returns a Response instance' do
27
+ expect(rapportive_requester).to be_instance_of(PossibleEmail::Response)
28
+ end
29
+
30
+ it 'returns a Response of the correct size' do
31
+ expect(rapportive_requester.size).to eq(2)
32
+ end
33
+ end
34
+
35
+ context 'as an Array' do
36
+ let(:data) { ['bob@gmail.com', 'kevinrose@gmail.com'] }
37
+ let(:rapportive_requester) { PossibleEmail::RapportiveRequester.request(data) }
38
+
39
+ it 'does not return an error' do
40
+ expect { rapportive_requester }.not_to raise_error
41
+ end
42
+
43
+ it 'returns a Response instance' do
44
+ expect(rapportive_requester).to be_instance_of(PossibleEmail::Response)
45
+ end
46
+
47
+ it 'returns a Response of the correct size' do
48
+ expect(rapportive_requester.size).to eq(2)
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '#create_profile_for_email' do
55
+ it 'returns an empty array if no session token was received' do
56
+ allow(PossibleEmail::ResponseGetter).to receive(:create_session_token).and_return(nil)
57
+
58
+ expect(PossibleEmail::RapportiveRequester.request('bob@gmail.com')).to be_empty
59
+ end
60
+
61
+ it 'returns an empty array if invalid response' do
62
+ allow(PossibleEmail::ResponseGetter).to receive(:retrieve_email_profile_using_session_token).and_return(nil)
63
+
64
+ expect(PossibleEmail::RapportiveRequester.request('bob@gmail.com')).to be_empty
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe PossibleEmail::ResponseGetter do
4
+
5
+ describe '.create_session_token' do
6
+ context 'when valid response' do
7
+ it 'returns a session token' do
8
+ expect(PossibleEmail::ResponseGetter.create_session_token('bob@gmail.com')).to be_instance_of(String)
9
+ end
10
+ end
11
+
12
+ context 'when an invalid response' do
13
+ context 'and response is nil' do
14
+ it 'returns nil' do
15
+ allow(PossibleEmail::ResponseGetter).to receive(:valid_response?).and_return(nil)
16
+ expect(PossibleEmail::ResponseGetter.create_session_token('bob@gmail.com')).to be_nil
17
+ end
18
+ end
19
+
20
+ context 'and theres an error ' do
21
+ it 'returns nil' do
22
+ allow(PossibleEmail::ResponseGetter).to receive(:request_url).and_return('error' => true, 'status' => 200)
23
+ expect(PossibleEmail::ResponseGetter.create_session_token('bob@gmail.com')).to be_nil
24
+ end
25
+ end
26
+
27
+ context 'and status is not 200' do
28
+ it 'returns nil' do
29
+ allow(PossibleEmail::ResponseGetter).to receive(:request_url).and_return('status' => 400)
30
+ expect(PossibleEmail::ResponseGetter.create_session_token('bob@gmail.com')).to be_nil
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '.retrieve_email_profile_using_session_token' do
37
+ context 'when valid response' do
38
+ it 'returns a response' do
39
+ expect(PossibleEmail::ResponseGetter.retrieve_email_profile_using_session_token('bob@gmail.com', 'session')).to be_instance_of(Hash)
40
+ end
41
+ end
42
+
43
+ context 'when invalid response' do
44
+ it 'returns nil' do
45
+ allow(PossibleEmail::ResponseGetter).to receive(:request_url).and_return(nil)
46
+ expect(PossibleEmail::ResponseGetter.retrieve_email_profile_using_session_token('bob@gmail.com', 'session')).to be_nil
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe PossibleEmail::Response do
4
+ let(:response) { PossibleEmail.search('kevin', 'rose', 'gmail.com') }
5
+
6
+ it 'returns an instance of Response' do
7
+ expect(response).to be_instance_of(PossibleEmail::Response)
8
+ end
9
+
10
+ it 'returns entries' do
11
+ expect(response.first).to be_instance_of(PossibleEmail::Profile)
12
+ end
13
+ describe '#[]' do
14
+ it 'is able to receive [] to get a certain profile within' do
15
+ expect(response[2]).to be_instance_of(PossibleEmail::Profile)
16
+ end
17
+
18
+ it 'returns nil when not within array' do
19
+ expect(response[9999]).to be_nil
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ describe PossibleEmail do
4
+ describe '.search' do
5
+ let(:find_any_email_search) { PossibleEmail.search('kevin', 'rose', 'gmail.com') }
6
+
7
+ context 'when only one domain is given' do
8
+ it 'returns an Response of Profiles' do
9
+ expect(find_any_email_search).to be_instance_of(PossibleEmail::Response).and all be_instance_of(PossibleEmail::Profile)
10
+ end
11
+
12
+ it 'returns an Response with the correct number of Profiles' do
13
+ expect(find_any_email_search.size).to eq(36)
14
+ end
15
+ end
16
+
17
+ context 'when more than one domain is given' do
18
+ context 'as splat arguments' do
19
+ let(:find_any_email_search) { PossibleEmail.search('kevin', 'rose', 'example.com', 'gmail.com') }
20
+
21
+ it 'does not raise an error' do
22
+ expect { find_any_email_search }.not_to raise_error
23
+ end
24
+
25
+ it 'returns an Array with the correct number of Profiles' do
26
+ expect(find_any_email_search.size).to eq(PATTERNS.split.size * 2) # two domains
27
+ end
28
+
29
+ it 'returns an Response of Profiles' do
30
+ expect(find_any_email_search).to be_instance_of(PossibleEmail::Response).and all be_instance_of(PossibleEmail::Profile)
31
+ end
32
+ end
33
+
34
+ context 'as an Array' do
35
+ let(:domain) { ['example.com', 'gmail.com'] }
36
+ let(:find_any_email_search) { PossibleEmail.search('kevin', 'rose', domain ) }
37
+
38
+ it 'does not raise an error' do
39
+ expect { find_any_email_search }.not_to raise_error
40
+ end
41
+
42
+ it 'returns an Response with the correct number of Profiles' do
43
+ expect(find_any_email_search.size).to eq(PATTERNS.split.size * domain.size)
44
+ end
45
+
46
+ it 'returns an Response of Profiles' do
47
+ expect(find_any_email_search).to be_instance_of(PossibleEmail::Response).and all be_instance_of(PossibleEmail::Profile)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ describe '.find_profile' do
54
+ context 'when one email address is passed in' do
55
+ context 'with correctly formatted email address' do
56
+ it 'returns a single profile'do
57
+ expect(PossibleEmail.find_profile('kevinrose@gmail.com')).to be_instance_of(PossibleEmail::Profile)
58
+ end
59
+
60
+ it 'does not return an Response' do
61
+ expect(PossibleEmail.find_profile('kevinrose@gmail.com')).not_to be_instance_of(PossibleEmail::Response)
62
+ end
63
+ end
64
+
65
+ context 'with incorrectly formatted email address' do
66
+ it 'return the correct error' do
67
+ expect { PossibleEmail.find_profile('@gmail.com') }.to raise_error(PossibleEmail::InvalidEmailFormat)
68
+ end
69
+
70
+ it 'return the correct error message' do
71
+ expect { PossibleEmail.find_profile('@gmail.com').message }.to raise_error(PossibleEmail::InvalidEmailFormat, 'Email arguments were not formatted correctly ["@gmail.com"]')
72
+ end
73
+ end
74
+ end
75
+
76
+ context 'when more than one email address is passed in' do
77
+ it 'accept an Array of email addresses' do
78
+ expect { PossibleEmail.find_profile(['bob@gmail.com', 'jones@gmail.com']) }.not_to raise_error
79
+ end
80
+
81
+ it 'accept splat email address String arguments' do
82
+ expect { PossibleEmail.find_profile('bob@gmail.com', 'jones@gmail.com') }.not_to raise_error
83
+ end
84
+
85
+ # it 'skips emails that are not formatted correctly'
86
+
87
+ it 'returns an Response of Profiles' do
88
+ expect(PossibleEmail.find_profile('bob@gmail.com', 'jones@gmail.com')).to be_instance_of(PossibleEmail::Response).and all be_instance_of(PossibleEmail::Profile)
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,509 @@
1
+ {
2
+ "contact":{
3
+ "point_type":"email",
4
+ "email":"kevinrose@gmail.com",
5
+ "contact_id":null,
6
+ "twitter_username":"kevinrose",
7
+ "is_current_user":false,
8
+ "can_be_edited":false,
9
+ "is_privately_same_user":null,
10
+ "etag":"9a5be333f1c1818d3c19b7bf59d88ce6",
11
+ "notes_available":false,
12
+ "name":"Kevin Rose",
13
+ "first_name":"Kevin",
14
+ "last_name":"Rose",
15
+ "friendly_name":"Kevin",
16
+ "location":"San Francisco Bay Area",
17
+ "headline":"General Partner at Google Ventures",
18
+ "image_url_raw":"https:\/\/secure.gravatar.com\/avatar\/91b5cd9aa8e32f847fcec46fa6b81eca?s=80&d=404",
19
+ "image_url_proxied":"https:\/\/secure.gravatar.com\/avatar\/91b5cd9aa8e32f847fcec46fa6b81eca?s=80&d=404",
20
+ "images":[
21
+ {
22
+ "url":"https:\/\/secure.gravatar.com\/avatar\/91b5cd9aa8e32f847fcec46fa6b81eca?s=80&d=404",
23
+ "service":null,
24
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F91b5cd9aa8e32f847fcec46fa6b81eca%3Fs%3D80%26d%3D404"
25
+ },
26
+ {
27
+ "url":"http:\/\/m.c.lnkd.licdn.com\/mpr\/mpr\/p\/6\/005\/03b\/0c1\/11f1310.jpg",
28
+ "service":"LinkedIn",
29
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=http%3A%2F%2Fm.c.lnkd.licdn.com%2Fmpr%2Fmpr%2Fp%2F6%2F005%2F03b%2F0c1%2F11f1310.jpg"
30
+ },
31
+ {
32
+ "url":"http:\/\/a0.twimg.com\/profile_images\/1468433864\/kr_normal.jpg",
33
+ "service":"Twitter",
34
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=http%3A%2F%2Fa0.twimg.com%2Fprofile_images%2F1468433864%2Fkr_normal.jpg"
35
+ },
36
+ {
37
+ "url":"http:\/\/profile.ak.fbcdn.net\/hprofile-ak-snc6\/274326_500014674_1887082300_n.jpg",
38
+ "service":"Facebook",
39
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=http%3A%2F%2Fprofile.ak.fbcdn.net%2Fhprofile-ak-snc6%2F274326_500014674_1887082300_n.jpg"
40
+ },
41
+ {
42
+ "url":"http:\/\/graph.facebook.com\/6162642477\/picture?type=large",
43
+ "service":"Facebook",
44
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=http%3A%2F%2Fgraph.facebook.com%2F6162642477%2Fpicture%3Ftype%3Dlarge"
45
+ },
46
+ {
47
+ "url":"https:\/\/lh5.googleusercontent.com\/-tYQfZDZw_sQ\/AAAAAAAAAAI\/AAAAAAAAAD0\/eAo_mCPZ3Xg\/s250-c-k\/photo.jpg",
48
+ "service":"Google Profile",
49
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=https%3A%2F%2Flh5.googleusercontent.com%2F-tYQfZDZw_sQ%2FAAAAAAAAAAI%2FAAAAAAAAAD0%2FeAo_mCPZ3Xg%2Fs250-c-k%2Fphoto.jpg"
50
+ },
51
+ {
52
+ "url":"https:\/\/lh5.googleusercontent.com\/-YryY58seG10\/AAAAAAAAAAI\/AAAAAAAAAAA\/Fi3rZ4ut4F0\/photo.jpg?sz=200",
53
+ "service":"Google Profile",
54
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=https%3A%2F%2Flh5.googleusercontent.com%2F-YryY58seG10%2FAAAAAAAAAAI%2FAAAAAAAAAAA%2FFi3rZ4ut4F0%2Fphoto.jpg%3Fsz%3D200"
55
+ },
56
+ {
57
+ "url":"https:\/\/s3.amazonaws.com\/photos.angel.co\/users\/498-medium_jpg?1294803689",
58
+ "service":"AngelList",
59
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=https%3A%2F%2Fs3.amazonaws.com%2Fphotos.angel.co%2Fusers%2F498-medium_jpg%3F1294803689"
60
+ },
61
+ {
62
+ "url":"http:\/\/farm1.static.flickr.com\/199\/buddyicons\/28588039@N00.jpg",
63
+ "service":"Flickr",
64
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=http%3A%2F%2Ffarm1.static.flickr.com%2F199%2Fbuddyicons%2F28588039%40N00.jpg"
65
+ },
66
+ {
67
+ "url":"http:\/\/b.vimeocdn.com\/ps\/840\/840112_100.jpg",
68
+ "service":"Vimeo",
69
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=http%3A%2F%2Fb.vimeocdn.com%2Fps%2F840%2F840112_100.jpg"
70
+ },
71
+ {
72
+ "url":"https:\/\/lh4.googleusercontent.com\/-YryY58seG10\/AAAAAAAAAAI\/AAAAAAAACDs\/2W9d8eoNx6c\/s200-c-k\/photo.jpg",
73
+ "service":null,
74
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=https%3A%2F%2Flh4.googleusercontent.com%2F-YryY58seG10%2FAAAAAAAAAAI%2FAAAAAAAACDs%2F2W9d8eoNx6c%2Fs200-c-k%2Fphoto.jpg"
75
+ },
76
+ {
77
+ "url":"https:\/\/lh4.googleusercontent.com\/-YryY58seG10\/AAAAAAAAAAI\/AAAAAAAAE_0\/aKFNlrXXSTk\/s250-c-k\/photo.jpg",
78
+ "service":null,
79
+ "url_proxied":"https:\/\/rapportive-proxy.heroku.com\/proxy?url=https%3A%2F%2Flh4.googleusercontent.com%2F-YryY58seG10%2FAAAAAAAAAAI%2FAAAAAAAAE_0%2FaKFNlrXXSTk%2Fs250-c-k%2Fphoto.jpg"
80
+ }
81
+ ],
82
+ "phones":[
83
+
84
+ ],
85
+ "occupations":[
86
+ {
87
+ "job_title":"General Partner",
88
+ "company":"Google Ventures",
89
+ "edit_path":"\/contacts\/email\/kevinrose@gmail.com\/occupations\/6e77701b583cdd929823d0a062b60f66?_method=put",
90
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/occupations\/6e77701b583cdd929823d0a062b60f66?_method=delete"
91
+ },
92
+ {
93
+ "job_title":"Board Member",
94
+ "company":"Tony Hawk Foundation",
95
+ "edit_path":"\/contacts\/email\/kevinrose@gmail.com\/occupations\/137d97f56e6c74e48bd32c2e4be416b9?_method=put",
96
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/occupations\/137d97f56e6c74e48bd32c2e4be416b9?_method=delete"
97
+ }
98
+ ],
99
+ "memberships":[
100
+ {
101
+ "profile_url":"http:\/\/twitter.com\/kevinrose",
102
+ "profile_id":"657863",
103
+ "username":"kevinrose",
104
+ "formatted":"@kevinrose",
105
+ "site_name":"Twitter",
106
+ "icon_name":"twitter",
107
+ "display_name":"Twitter",
108
+ "view_text":"",
109
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/twitter.com\/3be04893c7371ad7b5ef28770d4da546?_method=delete",
110
+ "widget_name":"twitter",
111
+ "widget":{
112
+ "intro_authorization_url":"https:\/\/rapportive.com\/authorization\/intro\/Twitter",
113
+ "authorization_status_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/twitter.com\/3be04893c7371ad7b5ef28770d4da546\/connected",
114
+ "tweet_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/twitter.com\/3be04893c7371ad7b5ef28770d4da546\/tweet?_method=post",
115
+ "follow_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/twitter.com\/3be04893c7371ad7b5ef28770d4da546\/follow?_method=post",
116
+ "logged_in":false,
117
+ "authorized":null,
118
+ "own_profile":false,
119
+ "screen_name":null,
120
+ "following_user":false,
121
+ "followed_by_user":false,
122
+ "membership_avatar":null,
123
+ "preload_connected_url":null,
124
+ "authorized_twitter_proxy":null
125
+ }
126
+ },
127
+ {
128
+ "profile_url":"http:\/\/www.facebook.com\/kevinrose",
129
+ "profile_id":"500014674",
130
+ "username":"kevinrose",
131
+ "formatted":"Facebook",
132
+ "site_name":"Facebook",
133
+ "icon_name":"facebook",
134
+ "display_name":"Facebook",
135
+ "view_text":"",
136
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/b5b729d2e3e60182f467b2e4cc790832?_method=delete",
137
+ "widget_name":"facebook",
138
+ "widget":{
139
+ "authorized":null,
140
+ "own_profile":false,
141
+ "write_authorized":null,
142
+ "connected":false,
143
+ "invited":null,
144
+ "facebook_user_id":null,
145
+ "is_page_only":true,
146
+ "add_friend_url":"https:\/\/rapportive.com\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/b5b729d2e3e60182f467b2e4cc790832\/add_friend",
147
+ "connection_status_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/b5b729d2e3e60182f467b2e4cc790832\/connected?reload=true",
148
+ "intro_authorization_url":"https:\/\/rapportive.com\/authorization\/intro\/Facebook?return_to=%2Fcontacts%2Femail%2Fkevinrose%40gmail.com%2Fmemberships%2Ffacebook.com%2Fb5b729d2e3e60182f467b2e4cc790832%2Fadd_friend",
149
+ "upgrade_authorization_url":"https:\/\/rapportive.com\/authorization\/intro\/Facebook?ability=write",
150
+ "import_authorization_path":"\/authorization\/import\/Facebook?_method=post",
151
+ "jsonp_api_proxy_url":"https:\/\/rapportive-proxy.heroku.com\/proxy?secret=",
152
+ "comment_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/b5b729d2e3e60182f467b2e4cc790832\/comment?_method=post",
153
+ "like_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/b5b729d2e3e60182f467b2e4cc790832\/like?_method=post"
154
+ }
155
+ },
156
+ {
157
+ "profile_url":"http:\/\/www.facebook.com\/profile.php?id=6162642477",
158
+ "profile_id":"6162642477",
159
+ "username":null,
160
+ "formatted":"Facebook",
161
+ "site_name":"Facebook",
162
+ "icon_name":"facebook",
163
+ "display_name":"Facebook",
164
+ "view_text":"",
165
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/754dc4dca2156baf02f32c0340608dea?_method=delete",
166
+ "widget_name":"facebook",
167
+ "widget":{
168
+ "authorized":null,
169
+ "own_profile":false,
170
+ "write_authorized":null,
171
+ "connected":false,
172
+ "invited":null,
173
+ "facebook_user_id":null,
174
+ "is_page_only":false,
175
+ "add_friend_url":"https:\/\/rapportive.com\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/754dc4dca2156baf02f32c0340608dea\/add_friend",
176
+ "connection_status_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/754dc4dca2156baf02f32c0340608dea\/connected?reload=true",
177
+ "intro_authorization_url":"https:\/\/rapportive.com\/authorization\/intro\/Facebook?return_to=%2Fcontacts%2Femail%2Fkevinrose%40gmail.com%2Fmemberships%2Ffacebook.com%2F754dc4dca2156baf02f32c0340608dea%2Fadd_friend",
178
+ "upgrade_authorization_url":"https:\/\/rapportive.com\/authorization\/intro\/Facebook?ability=write",
179
+ "import_authorization_path":"\/authorization\/import\/Facebook?_method=post",
180
+ "jsonp_api_proxy_url":"https:\/\/rapportive-proxy.heroku.com\/proxy?secret=",
181
+ "comment_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/754dc4dca2156baf02f32c0340608dea\/comment?_method=post",
182
+ "like_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/facebook.com\/754dc4dca2156baf02f32c0340608dea\/like?_method=post"
183
+ }
184
+ },
185
+ {
186
+ "profile_url":"http:\/\/www.linkedin.com\/in\/kevinrose",
187
+ "profile_id":null,
188
+ "username":"kevinrose",
189
+ "formatted":"LinkedIn",
190
+ "site_name":"LinkedIn",
191
+ "icon_name":"linkedin",
192
+ "display_name":"LinkedIn",
193
+ "view_text":"",
194
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/linkedin.com\/bcb3f8c193c79ae8395a8f1d919f325d?_method=delete",
195
+ "widget_name":"linked_in",
196
+ "widget":{
197
+ "authorized":false,
198
+ "own_profile":false,
199
+ "connected":false,
200
+ "invited":null,
201
+ "mutual_connections":[
202
+
203
+ ],
204
+ "network_updates":[
205
+
206
+ ],
207
+ "latest_updates_url":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/linkedin.com\/bcb3f8c193c79ae8395a8f1d919f325d\/updates",
208
+ "comment_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/linkedin.com\/bcb3f8c193c79ae8395a8f1d919f325d\/comment?_method=post",
209
+ "authz_avatar":null,
210
+ "like_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/linkedin.com\/bcb3f8c193c79ae8395a8f1d919f325d\/like?_method=post",
211
+ "mutual_connection_count":0,
212
+ "connect_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/linkedin.com\/bcb3f8c193c79ae8395a8f1d919f325d\/connect?_method=post",
213
+ "connection_status_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/linkedin.com\/bcb3f8c193c79ae8395a8f1d919f325d\/connected",
214
+ "import_authorization_path":"\/authorization\/import\/LinkedIn?_method=post",
215
+ "intro_authorization_url":"https:\/\/rapportive.com\/authorization\/intro\/LinkedIn",
216
+ "may_connect":true
217
+ }
218
+ },
219
+ {
220
+ "profile_url":"http:\/\/about.me\/kevinrose",
221
+ "profile_id":null,
222
+ "username":"kevinrose",
223
+ "formatted":"About.me",
224
+ "site_name":"About.me",
225
+ "icon_name":"aboutme",
226
+ "display_name":"About.me",
227
+ "view_text":"View Kevin's profile on About.me",
228
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/about.me\/770b73745c419a5921db0380b7a37170?_method=delete",
229
+ "widget_name":null,
230
+ "widget":null
231
+ },
232
+ {
233
+ "profile_url":"http:\/\/angel.co\/kevin",
234
+ "profile_id":"498",
235
+ "username":null,
236
+ "formatted":"AngelList",
237
+ "site_name":"AngelList",
238
+ "icon_name":"angellist",
239
+ "display_name":"AngelList",
240
+ "view_text":"View Kevin's profile on AngelList",
241
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/angel.co\/c9f2c5e18af742a1facd497b520b068e?_method=delete",
242
+ "widget_name":null,
243
+ "widget":null
244
+ },
245
+ {
246
+ "profile_url":"http:\/\/delicious.com\/kevinrose",
247
+ "profile_id":null,
248
+ "username":null,
249
+ "formatted":"Delicious",
250
+ "site_name":"Delicious",
251
+ "icon_name":"delicious",
252
+ "display_name":"Delicious",
253
+ "view_text":"View Kevin's profile on Delicious",
254
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/delicious.com\/3ba407f58c54c7d742fc05e7883d7e5f?_method=delete",
255
+ "widget_name":null,
256
+ "widget":null
257
+ },
258
+ {
259
+ "profile_url":"http:\/\/digg.com\/kevinrose",
260
+ "profile_id":null,
261
+ "username":null,
262
+ "formatted":"Digg",
263
+ "site_name":"Digg",
264
+ "icon_name":"digg",
265
+ "display_name":"Digg",
266
+ "view_text":"View Kevin's profile on Digg",
267
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/digg.com\/af0479480a3135c23abc515b4eed50f6?_method=delete",
268
+ "widget_name":null,
269
+ "widget":null
270
+ },
271
+ {
272
+ "profile_url":"http:\/\/www.flickr.com\/photos\/kevinrose\/",
273
+ "profile_id":"28588039@N00",
274
+ "username":"kevinrose",
275
+ "formatted":"Flickr",
276
+ "site_name":"Flickr",
277
+ "icon_name":"flickr",
278
+ "display_name":"Flickr",
279
+ "view_text":"View Kevin's profile on Flickr",
280
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/flickr.com\/c65d0f9c2ded0900c88fb692e4d7c602?_method=delete",
281
+ "widget_name":null,
282
+ "widget":null
283
+ },
284
+ {
285
+ "profile_url":"http:\/\/foursquare.com\/kevinrose",
286
+ "profile_id":null,
287
+ "username":null,
288
+ "formatted":"Foursquare",
289
+ "site_name":"Foursquare",
290
+ "icon_name":"foursquare",
291
+ "display_name":"Foursquare",
292
+ "view_text":"View Kevin's profile on Foursquare",
293
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/foursquare.com\/8754642822b33434c3b11e5210285155?_method=delete",
294
+ "widget_name":null,
295
+ "widget":null
296
+ },
297
+ {
298
+ "profile_url":"http:\/\/friendfeed.com\/kevinrose",
299
+ "profile_id":null,
300
+ "username":null,
301
+ "formatted":"FriendFeed",
302
+ "site_name":"FriendFeed",
303
+ "icon_name":"friendfeed",
304
+ "display_name":"FriendFeed",
305
+ "view_text":"View Kevin's profile on FriendFeed",
306
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/friendfeed.com\/ea2bd33d85142e14d85d116df4e80862?_method=delete",
307
+ "widget_name":null,
308
+ "widget":null
309
+ },
310
+ {
311
+ "profile_url":"https:\/\/plus.google.com\/110318982509514011806\/posts",
312
+ "profile_id":"110318982509514011806",
313
+ "username":null,
314
+ "formatted":"Google+",
315
+ "site_name":"Google+",
316
+ "icon_name":"googleplus",
317
+ "display_name":"Google+",
318
+ "view_text":"View Kevin's profile on Google+",
319
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/plus.google.com\/0567c7a0692228ac933638261f049444?_method=delete",
320
+ "widget_name":null,
321
+ "widget":null
322
+ },
323
+ {
324
+ "profile_url":"https:\/\/profiles.google.com\/115676926487344928572",
325
+ "profile_id":null,
326
+ "username":"115676926487344928572",
327
+ "formatted":"Google+",
328
+ "site_name":"Google Profile",
329
+ "icon_name":"googleplus",
330
+ "display_name":"Google+",
331
+ "view_text":"View Kevin's Google Profile",
332
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/google.com%2Fprofiles\/5280b69bf5b163595371bfa327335f6a?_method=delete",
333
+ "widget_name":null,
334
+ "widget":null
335
+ },
336
+ {
337
+ "profile_url":"https:\/\/profiles.google.com\/kevinrose",
338
+ "profile_id":null,
339
+ "username":"kevinrose",
340
+ "formatted":"Google+",
341
+ "site_name":"Google Profile",
342
+ "icon_name":"googleplus",
343
+ "display_name":"Google+",
344
+ "view_text":"View Kevin's Google Profile",
345
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/google.com%2Fprofiles\/2ac57a8b72e3ff59a64e2991491872c0?_method=delete",
346
+ "widget_name":null,
347
+ "widget":null
348
+ },
349
+ {
350
+ "profile_url":"http:\/\/gowalla.com\/krose",
351
+ "profile_id":null,
352
+ "username":null,
353
+ "formatted":"Gowalla",
354
+ "site_name":"Gowalla",
355
+ "icon_name":"gowalla",
356
+ "display_name":"Gowalla",
357
+ "view_text":"View Kevin's profile on Gowalla",
358
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/gowalla.com\/d9e8526b30df272a177a69ee0cd0f990?_method=delete",
359
+ "widget_name":null,
360
+ "widget":null
361
+ },
362
+ {
363
+ "profile_url":"http:\/\/quora.com\/kevin-rose",
364
+ "profile_id":null,
365
+ "username":null,
366
+ "formatted":"Quora",
367
+ "site_name":"Quora",
368
+ "icon_name":"quora",
369
+ "display_name":"Quora",
370
+ "view_text":"View Kevin's profile on Quora",
371
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/quora.com\/4ae21c7041168f02e5af57cf9ab564a4?_method=delete",
372
+ "widget_name":null,
373
+ "widget":null
374
+ },
375
+ {
376
+ "profile_url":"http:\/\/vimeo.com\/kevinrose",
377
+ "profile_id":"344320",
378
+ "username":"kevinrose",
379
+ "formatted":"Vimeo",
380
+ "site_name":"Vimeo",
381
+ "icon_name":"vimeo",
382
+ "display_name":"Vimeo",
383
+ "view_text":"View Kevin's profile on Vimeo",
384
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/vimeo.com\/d58058aa973c00484b7583394991fe15?_method=delete",
385
+ "widget_name":"vimeo",
386
+ "widget":{
387
+ "videos":[
388
+
389
+ ]
390
+ }
391
+ },
392
+ {
393
+ "profile_url":"http:\/\/youtube.com\/kevinrose",
394
+ "profile_id":null,
395
+ "username":null,
396
+ "formatted":"YouTube",
397
+ "site_name":"YouTube",
398
+ "icon_name":"youtube",
399
+ "display_name":"YouTube",
400
+ "view_text":"View Kevin's profile on YouTube",
401
+ "delete_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships\/youtube.com\/b35c3c7bd0bbc330539e595063944f8b?_method=delete",
402
+ "widget_name":null,
403
+ "widget":null
404
+ }
405
+ ],
406
+ "notes":[
407
+
408
+ ],
409
+ "google_contacts":{
410
+ "primary_id":null
411
+ },
412
+ "raplets":[
413
+
414
+ ],
415
+ "is_interesting_domain":false,
416
+ "is_sms_gateway":false,
417
+ "is_organisation":false,
418
+ "organisation":{
419
+ "title":"Gmail",
420
+ "final_url":"https:\/\/accounts.google.com:443\/ServiceLogin?service=mail&passive=true&rm=false&continue=https:\/\/mail.google.com\/mail\/&ss=1&scc=1&ltmpl=default&ltmplcache=2&emr=1",
421
+ "favicon":"https:\/\/rapportive-proxy.heroku.com\/proxy?rapportive_secret=BAhJIgGaTkVvWGwwdjZVODRBQVB6Z0dDbEdCYjVtaHNmV0NoNklaU0VvWWZpZ1F5MnJmUlV6N0RDNmVpVGx3dkRxaEhsK0RCUnFIL2ZRVUZRTkJwVHFpbDYrQlc1SVhhWjN5eXhsVnhyNHVUUlIvUW94eDJXSmxDNUtscFdpSTFuU0ludUwtLWNQTzFjQ0dxeG1oQWE0NWhvYnhZRGc9PQY6BkVG--30fc94e3bb4f5b4bdf10bc195874c9b434983e4d",
422
+ "description":[
423
+ "Gmail is email that's intuitive, efficient, and useful. 15 GB of storage, less spam, and mobile access."
424
+ ],
425
+ "links":[
426
+ {
427
+ "href":"https:\/\/accounts.google.com:443\/",
428
+ "display_name":"Home"
429
+ },
430
+ {
431
+ "href":"https:\/\/accounts.google.com\/RecoverAccount?service=mail&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F",
432
+ "display_name":"Help"
433
+ }
434
+ ]
435
+ },
436
+ "urls":{
437
+ "update_name_path":"\/contacts\/email\/kevinrose@gmail.com\/name?_method=put",
438
+ "update_location_path":"\/contacts\/email\/kevinrose@gmail.com\/location?_method=put",
439
+ "create_occupation_path":"\/contacts\/email\/kevinrose@gmail.com\/occupations?_method=post",
440
+ "create_membership_path":"\/contacts\/email\/kevinrose@gmail.com\/memberships?_method=post",
441
+ "create_note_path":"\/contacts\/email\/kevinrose@gmail.com\/notes?_method=post"
442
+ }
443
+ },
444
+ "highrise":{
445
+ "authorization_needed":true
446
+ },
447
+ "user":{
448
+ "display_name":" ",
449
+ "logged_in":false,
450
+ "uservoice_sso_token":"zpuDfi6DXleM09Dh5R1AURjUjQqegGa72fB4mfnjDqyonnaElMHaumNkDt%2B%2FNi38oN8I00Uae6sa7PYVaY123CIwKP1ADVL91jAfpyegcADQR%2FRTKLUxNkQDY886lDxc",
451
+ "has_notes":false,
452
+ "authorizations":{
453
+ "wanted":[
454
+ {
455
+ "type_name":"LinkedIn",
456
+ "human_name":"LinkedIn",
457
+ "slug":"linkedin",
458
+ "intro_url":"https:\/\/rapportive.com\/authorization\/intro\/LinkedIn",
459
+ "import_path":"\/authorization\/import\/LinkedIn?_method=post",
460
+ "hide_path":"\/preferences\/set\/hide_linkedin_authorization_instructions?_method=post"
461
+ },
462
+ {
463
+ "type_name":"Facebook",
464
+ "human_name":"Facebook",
465
+ "slug":"facebook",
466
+ "intro_url":"https:\/\/rapportive.com\/authorization\/intro\/Facebook",
467
+ "import_path":"\/authorization\/import\/Facebook?_method=post",
468
+ "hide_path":"\/preferences\/set\/hide_facebook_authorization_instructions?_method=post"
469
+ },
470
+ {
471
+ "type_name":"GoogleAll",
472
+ "human_name":"Google Contacts",
473
+ "slug":"googleall",
474
+ "intro_url":"https:\/\/rapportive.com\/authorization\/intro\/GoogleAll",
475
+ "import_path":"\/authorization\/import\/GoogleAll?_method=post",
476
+ "hide_path":"\/preferences\/set\/hide_googleall_authorization_instructions?_method=post"
477
+ }
478
+ ],
479
+ "loading":[
480
+
481
+ ]
482
+ }
483
+ },
484
+ "show_ad":false,
485
+ "would_show_ad":false,
486
+ "success":"image_and_occupation_and_useful_membership",
487
+ "estimated_sidebar_height":1785,
488
+ "rapportive_base_url":"https:\/\/rapportive.com",
489
+ "status":200,
490
+ "authenticated_as":null,
491
+ "active_auths":[
492
+
493
+ ],
494
+ "claimed_emails":null,
495
+ "user_preferences":{
496
+ "enhance_contact_limit":false
497
+ },
498
+ "has_ads":false,
499
+ "plan":{
500
+ "key":"free",
501
+ "name":"Free",
502
+ "price":0
503
+ },
504
+ "has_paid":false,
505
+ "user_full_name":" ",
506
+ "recheck_after":false,
507
+ "session_token":"session_token"
508
+
509
+ }