graybook 1.0.24 → 1.1.0
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/{CHANGES.md → CHANGELOG} +13 -2
- data/README +94 -0
- data/Rakefile +3 -22
- data/VERSION +1 -1
- data/VERSION.yml +2 -2
- data/VERSION_NAME +1 -1
- data/lib/graybook/importer/aol.rb +11 -11
- data/lib/graybook/importer/gmail.rb +20 -20
- data/lib/graybook/importer/hotmail.rb +2 -4
- data/lib/graybook/importer/page_scraper.rb +4 -2
- data/lib/graybook/importer/yahoo.rb +12 -12
- data/lib/graybook.rb +20 -21
- metadata +9 -102
- data/README.md +0 -66
- data/debug_graybook.rb +0 -10
- data/lib/graybook/exporter/vcf.rb +0 -45
- data/lib/graybook/exporter/xml.rb +0 -28
- data/lib/graybook/importer/csv.rb +0 -74
- data/lib/graybook/importer/freenet.rb +0 -62
- data/lib/graybook/importer/gmx.rb +0 -68
- data/lib/graybook/importer/web.de.rb +0 -67
- data/test/config/credentials.yml.example +0 -9
- data/test/fixtures/aol_application_page.html +0 -566
- data/test/fixtures/aol_bad_login_response_stage_3.html +0 -565
- data/test/fixtures/aol_contacts.html +0 -102
- data/test/fixtures/aol_login_response_stage_1.html +0 -158
- data/test/fixtures/aol_login_response_stage_2.html +0 -559
- data/test/fixtures/aol_login_response_stage_3.html +0 -48
- data/test/fixtures/aol_login_response_stage_4.html +0 -404
- data/test/fixtures/aol_login_response_stage_5.html +0 -404
- data/test/fixtures/aol_new_contacts.html +0 -431
- data/test/fixtures/gmail.csv +0 -3
- data/test/fixtures/gmail_bad_login_response_stage_2.html +0 -560
- data/test/fixtures/gmail_contacts.html +0 -228
- data/test/fixtures/gmail_login_response_stage_1.html +0 -556
- data/test/fixtures/gmail_login_response_stage_2.html +0 -1
- data/test/fixtures/gmail_login_response_stage_2a.html +0 -1
- data/test/fixtures/gmail_login_response_stage_3.html +0 -249
- data/test/fixtures/gmail_redirect_body.html +0 -10
- data/test/fixtures/hotmail_bad_login_response_stage_2.html +0 -31
- data/test/fixtures/hotmail_contacts.html +0 -262
- data/test/fixtures/hotmail_login_response_stage_1.html +0 -31
- data/test/fixtures/hotmail_login_response_stage_2.html +0 -1
- data/test/fixtures/hotmail_login_response_stage_3.html +0 -519
- data/test/fixtures/hotmail_scrape_first_page.html +0 -77
- data/test/fixtures/hotmail_scrape_response_stage_1.html +0 -90
- data/test/fixtures/hotmail_scrape_response_stage_2.html +0 -77
- data/test/fixtures/hotmail_scrape_response_stage_3.html +0 -0
- data/test/fixtures/yahoo_bad_login_response_stage_2.html +0 -443
- data/test/fixtures/yahoo_contacts.csv +0 -3
- data/test/fixtures/yahoo_contacts_not_logged_in.html +0 -432
- data/test/fixtures/yahoo_contacts_stage_1.html +0 -399
- data/test/fixtures/yahoo_login_response_stage_1.html +0 -433
- data/test/fixtures/yahoo_login_response_stage_2.html +0 -16
- data/test/fixtures/yahoo_no_user_response_stage_2.html +0 -574
- data/test/freenet_importer_test.rb +0 -53
- data/test/gmx_importer_test.rb +0 -53
- data/test/scripts/live_test.rb +0 -25
- data/test/test_graybook.rb +0 -60
- data/test/test_graybook_exporter_base.rb +0 -16
- data/test/test_graybook_exporter_vcf.rb +0 -52
- data/test/test_graybook_exporter_xml.rb +0 -16
- data/test/test_graybook_importer_aol.rb +0 -108
- data/test/test_graybook_importer_base.rb +0 -24
- data/test/test_graybook_importer_csv.rb +0 -60
- data/test/test_graybook_importer_gmail.rb +0 -116
- data/test/test_graybook_importer_hotmail.rb +0 -165
- data/test/test_graybook_importer_page_scraper.rb +0 -51
- data/test/test_graybook_importer_yahoo.rb +0 -137
- data/test/test_helper.rb +0 -71
- data/test/web.de_importer_test.rb +0 -53
- data/vendor/plugins/graybook/lib/autotest/discover.rb +0 -3
- data/vendor/plugins/graybook/lib/autotest/graybook.rb +0 -27
data/{CHANGES.md → CHANGELOG}
RENAMED
@@ -1,5 +1,16 @@
|
|
1
|
-
==1.0
|
2
|
-
|
1
|
+
==1.1.0 / 2009-10-01
|
2
|
+
|
3
|
+
* Removed the completely outdates tests (will write new tests next patch)
|
4
|
+
* Restricted importers to the following:
|
5
|
+
* AOL/AIM
|
6
|
+
* Yahoo
|
7
|
+
* Hotmail/Live/MSN
|
8
|
+
* Google Mail
|
9
|
+
* Restricted exporters to just basic.
|
10
|
+
* Got rid of exception raising and instead implemented Problem, a child
|
11
|
+
of Exception that returns true on .nil? This is to pass error
|
12
|
+
messages back all the way through the .get function to whatever it
|
13
|
+
originated from (e.g. Rails).
|
3
14
|
* Fixed Hotmail contact regexp to reflect new site.
|
4
15
|
|
5
16
|
==1.0.22 / 2009-09-30
|
data/README
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
,-------------------------,
|
2
|
+
| |,
|
3
|
+
(=========================||
|
4
|
+
(=========================||
|
5
|
+
(=========================||
|
6
|
+
| __, ,_ __, ||
|
7
|
+
| / | / | / | | | ||
|
8
|
+
| \_/|/ |_/\_/|_/ \_/|/ ||
|
9
|
+
| /| /| ||
|
10
|
+
| \| \| ||
|
11
|
+
| _ _ ||
|
12
|
+
| | | | | ||
|
13
|
+
| | | __ __ | | ||
|
14
|
+
| |/ \_/ \_/ \_|/_) ||
|
15
|
+
| \_/ \__/ \__/ | \_/ ||
|
16
|
+
(=========================||
|
17
|
+
(=========================||
|
18
|
+
(=========================||
|
19
|
+
| ||
|
20
|
+
|_________________________'|
|
21
|
+
'-------------------------'
|
22
|
+
|
23
|
+
Description:
|
24
|
+
------------
|
25
|
+
|
26
|
+
Pulls contact lists from EVERYWHERE! (Some sites not included.)
|
27
|
+
Originally based on Blackbook, but heavily modified and simplified.
|
28
|
+
|
29
|
+
Features:
|
30
|
+
---------
|
31
|
+
|
32
|
+
The current list of supported services and file types:
|
33
|
+
|
34
|
+
Services:
|
35
|
+
- AOL/AIM
|
36
|
+
- Yahoo
|
37
|
+
- Hotmail/Live/MSN
|
38
|
+
- Google Mail
|
39
|
+
|
40
|
+
Synopsis:
|
41
|
+
---------
|
42
|
+
|
43
|
+
Returns an array of hashes containing a name key and an email key can
|
44
|
+
be used as is oreasily be converted into a JSON that can be iterated
|
45
|
+
though.
|
46
|
+
|
47
|
+
>> contacts = Graybook.get :service,
|
48
|
+
:username => 'username@service.com',
|
49
|
+
:password => 'supersecret'
|
50
|
+
=> [{:name => 'john doe', :email => 'male@unknown.com'},
|
51
|
+
{:named => 'jane doe', :email => 'female@unknown.com'}]
|
52
|
+
|
53
|
+
Requirements:
|
54
|
+
-------------
|
55
|
+
|
56
|
+
* Mechanize >= 0.7.0 for page scraping
|
57
|
+
|
58
|
+
Install:
|
59
|
+
--------
|
60
|
+
|
61
|
+
1. gem install gemcutter
|
62
|
+
1. gem tumble
|
63
|
+
2. gem install graybook
|
64
|
+
|
65
|
+
Thanks:
|
66
|
+
-------
|
67
|
+
|
68
|
+
Big thanks to the peoples of Contentfree for making Blackbook.
|
69
|
+
More thanks to everyone else who maintained working forks of Blackbook.
|
70
|
+
|
71
|
+
License:
|
72
|
+
--------
|
73
|
+
|
74
|
+
Copyright (c) 2009, kojul.com
|
75
|
+
Copyright (c) 2007, Contentfree
|
76
|
+
|
77
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
78
|
+
a copy of this software and associated documentation files (the
|
79
|
+
'Software'), to deal in the Software without restriction, including
|
80
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
81
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
82
|
+
permit persons to whom the Software is furnished to do so, subject to
|
83
|
+
the following conditions:
|
84
|
+
|
85
|
+
The above copyright notice and this permission notice shall be
|
86
|
+
included in all copies or substantial portions of the Software.
|
87
|
+
|
88
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
89
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
90
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
91
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
92
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
93
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
94
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -1,39 +1,20 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
-
require 'hoe'
|
5
4
|
$LOAD_PATH.unshift 'lib'
|
6
5
|
require 'graybook'
|
7
6
|
|
8
|
-
begin
|
9
|
-
require 'rcov/rcovtask'
|
10
|
-
rescue LoadError
|
11
|
-
end
|
12
|
-
|
13
|
-
begin
|
14
|
-
Rcov::RcovTask.new do |t|
|
15
|
-
t.test_files = FileList['test/test*.rb']
|
16
|
-
t.verbose = true
|
17
|
-
#t.rcov_opts << "--exclude rcov.rb,hpricot.rb,hpricot/.*\.rb"
|
18
|
-
end
|
19
|
-
rescue NameError
|
20
|
-
end
|
21
|
-
|
22
|
-
require 'rubygems'
|
23
|
-
|
24
7
|
begin
|
25
8
|
require 'jeweler'
|
26
9
|
Jeweler::Tasks.new do |s|
|
27
10
|
s.name = "graybook"
|
28
|
-
s.summary = "It does things. Like import contacts from EVERYWHERE."
|
11
|
+
s.summary = "It does things. Like import contacts from EVERYWHERE. (Some sites may be excluded)"
|
29
12
|
s.email = "kojul@kojul.com"
|
30
13
|
s.homepage = "http://github.com/kojul/gray"
|
31
|
-
s.description = "
|
32
|
-
s.authors = ["kojul"]
|
14
|
+
s.description = "Graybook is used to import email contact lists from popular webmail sites. Currently supported are AOL/AIM, Yahoo, Hotmail/Live/MSN, and Google Mail (although not Google Apps Mail yet)."
|
15
|
+
s.authors = ["kojul", "Contentfree"]
|
33
16
|
s.add_dependency('hpricot', '>= 0.7.0')
|
34
17
|
s.add_dependency('mechanize', '>= 0.7.0')
|
35
|
-
s.add_dependency('hoe', '>= 1.5.0')
|
36
|
-
s.add_dependency('fastercsv', '>= 1.2.0')
|
37
18
|
end
|
38
19
|
rescue LoadError
|
39
20
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
data/VERSION.yml
CHANGED
data/VERSION_NAME
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Gray
|
1
|
+
Gray Grouper
|
@@ -11,7 +11,7 @@ class Graybook::Importer::Aol < Graybook::Importer::PageScraper
|
|
11
11
|
def =~( options )
|
12
12
|
options && options[:username] =~ /@(aol|aim)\.com$/i ? true : false
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
##
|
16
16
|
# Login process:
|
17
17
|
# - Get mail.aol.com which redirects to a page containing a javascript redirect
|
@@ -29,36 +29,36 @@ class Graybook::Importer::Aol < Graybook::Importer::PageScraper
|
|
29
29
|
|
30
30
|
case page.body
|
31
31
|
when /Invalid Screen Name or Password. Please try again./
|
32
|
-
|
32
|
+
return Problem.new("Username and password were not accepted. Please check them and try again.")
|
33
33
|
when /Terms of Service/
|
34
|
-
|
34
|
+
return Problem.new("Your AOL account is not setup for WebMail. Please signup: http://webmail.aol.com")
|
35
35
|
end
|
36
36
|
|
37
37
|
# aol bumps to a wait page while logging in. if we can't scrape out the js then its a bad login
|
38
38
|
extractor = proc { |var_name| page.body.scan(/var\s*#{var_name}\s*=\s*\"(.*?)\"\s*;/).first.first }
|
39
|
-
|
39
|
+
|
40
40
|
base_uri = extractor.call( 'gSuccessPath' )
|
41
|
-
|
41
|
+
return Problem.new("An error occurred. Please try again.") unless base_uri
|
42
42
|
page = agent.get base_uri
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
##
|
46
46
|
# must login to prepare
|
47
47
|
|
48
48
|
def prepare
|
49
49
|
login
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
##
|
53
53
|
# The url to scrape contacts from has to be put together from the Auth cookie
|
54
54
|
# and a known uri that hosts their contact service. An array of hashes with
|
55
55
|
# :name and :email keys is returned.
|
56
56
|
|
57
|
-
def scrape_contacts
|
57
|
+
def scrape_contacts
|
58
58
|
unless auth_cookie = agent.cookies.find{|c| c.name =~ /^Auth/}
|
59
|
-
|
59
|
+
return Problem.new("An error occurred. Please try again.")
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
# jump through the hoops of formulating a request to get printable contacts
|
63
63
|
uri = agent.current_page.uri.dup
|
64
64
|
inputs = agent.current_page.search("//input")
|
@@ -82,6 +82,6 @@ class Graybook::Importer::Aol < Graybook::Importer::PageScraper
|
|
82
82
|
}
|
83
83
|
end
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
Graybook.register :aol, self
|
87
87
|
end
|
@@ -9,11 +9,11 @@ class Graybook::Importer::Gmail < Graybook::Importer::PageScraper
|
|
9
9
|
RETRY_THRESHOLD = 5
|
10
10
|
##
|
11
11
|
# Matches this importer to an user's name/address
|
12
|
-
|
12
|
+
|
13
13
|
def =~(options = {})
|
14
14
|
options && options[:username] =~ /@(gmail|googlemail).com$/i ? true : false
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def import(*args)
|
18
18
|
# GMail depends on Hpricot for some reason...
|
19
19
|
parser = WWW::Mechanize.html_parser
|
@@ -22,41 +22,41 @@ class Graybook::Importer::Gmail < Graybook::Importer::PageScraper
|
|
22
22
|
WWW::Mechanize.html_parser = parser
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
##
|
27
27
|
# login to gmail
|
28
28
|
|
29
|
-
def login
|
29
|
+
def login
|
30
30
|
page = agent.get('http://mail.google.com/mail/')
|
31
31
|
form = page.forms.first
|
32
32
|
form.Email = options[:username]
|
33
33
|
form.Passwd = options[:password]
|
34
34
|
page = agent.submit(form,form.buttons.first)
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
|
36
|
+
return Problem.new("Username and password were not accepted. Please check them and try again.") if page.body =~ /Username and password do not match/
|
37
|
+
|
38
38
|
if page.search('//meta').first.attributes['content'] =~ /url='?(http.+?)'?$/i
|
39
39
|
page = agent.get $1
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
##
|
44
44
|
# prepare this importer
|
45
45
|
|
46
46
|
def prepare
|
47
47
|
login
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
##
|
51
51
|
# scrape gmail contacts for this importer
|
52
52
|
|
53
|
-
def scrape_contacts
|
54
|
-
unless agent.cookies.find { |c|
|
55
|
-
c.name == 'GAUSR' && c.value.match(/mail(.*?):#{options[:username]}/)
|
53
|
+
def scrape_contacts
|
54
|
+
unless agent.cookies.find { |c|
|
55
|
+
c.name == 'GAUSR' && c.value.match(/mail(.*?):#{options[:username]}/)
|
56
56
|
}
|
57
|
-
|
57
|
+
return Problem.new("Username and password were not accepted. Please check them and try again.")
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
page = agent.get('http://mail.google.com/mail/h/?v=cl&pnl=a')
|
61
61
|
title = page.search("//title").inner_text
|
62
62
|
if title == 'Redirecting'
|
@@ -64,22 +64,22 @@ class Graybook::Importer::Gmail < Graybook::Importer::PageScraper
|
|
64
64
|
url = redirect_text.match(/url='(http.*)'/i)[1]
|
65
65
|
page = agent.get(url)
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
contact_rows = page.search("//input[@name='c']/../..")
|
69
69
|
contact_rows.collect do |row|
|
70
70
|
columns = row/"td"
|
71
71
|
email = columns[2].inner_html.gsub( /(\n| )/, '' ) # email
|
72
|
-
clean_email = email[/[a-zA-Z0-9._%+-]+@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4}/]
|
73
|
-
|
72
|
+
clean_email = email[/[a-zA-Z0-9._%+-]+@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4}/]
|
73
|
+
|
74
74
|
unless clean_email.empty?
|
75
75
|
columns = row/"td"
|
76
|
-
{
|
76
|
+
{
|
77
77
|
:name => ( columns[1] / "b" / "a" ).inner_html.strip, # name
|
78
78
|
:email => clean_email
|
79
|
-
}
|
79
|
+
}
|
80
80
|
end
|
81
81
|
end.compact
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
Graybook.register(:gmail, self)
|
85
85
|
end
|
@@ -51,8 +51,7 @@ class Graybook::Importer::Hotmail < Graybook::Importer::PageScraper
|
|
51
51
|
# Check for login success
|
52
52
|
if page.body =~ /The e-mail address or password is incorrect/ ||
|
53
53
|
page.body =~ /Sign in failed\./
|
54
|
-
|
55
|
-
"That username and password was not accepted. Please check them and try again." )
|
54
|
+
return Problem.new("Username and password were not accepted. Please check them and try again.")
|
56
55
|
end
|
57
56
|
|
58
57
|
@first_page = agent.get( page.body.scan(/http\:\/\/[^"]+/).first )
|
@@ -68,12 +67,11 @@ class Graybook::Importer::Hotmail < Graybook::Importer::PageScraper
|
|
68
67
|
##
|
69
68
|
# Scrape contacts for Hotmail
|
70
69
|
# Seems like a POST to directly fetch CSV contacts from options.aspx?subsection=26&n=
|
71
|
-
# raises an end of file error in Net::HTTP via Mechanize.
|
72
70
|
# Seems like Hotmail addresses are now hosted on Windows Live.
|
73
71
|
|
74
72
|
def scrape_contacts
|
75
73
|
unless agent.cookies.find{|c| c.name == 'MSPPre' && c.value == options[:username]}
|
76
|
-
|
74
|
+
return Problem.new("Username and password were not accepted. Please check them and try again.")
|
77
75
|
end
|
78
76
|
|
79
77
|
page = agent.get('http://mail.live.com/')
|
@@ -60,8 +60,10 @@ class Graybook::Importer::PageScraper < Graybook::Importer::Base
|
|
60
60
|
|
61
61
|
def fetch_contacts!
|
62
62
|
create_agent
|
63
|
-
prepare
|
64
|
-
|
63
|
+
prep = prepare
|
64
|
+
return prep if prep.nil?
|
65
|
+
cont = scrape_contacts
|
66
|
+
return cont if cont.nil?
|
65
67
|
end
|
66
68
|
|
67
69
|
##
|
@@ -12,7 +12,7 @@ class Graybook::Importer::Yahoo < Graybook::Importer::PageScraper
|
|
12
12
|
def =~(options = {})
|
13
13
|
options && options[:username] =~ /@yahoo.co(m|\.uk)$/i ? true : false
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
##
|
17
17
|
# login for Yahoo!
|
18
18
|
|
@@ -22,42 +22,42 @@ class Graybook::Importer::Yahoo < Graybook::Importer::PageScraper
|
|
22
22
|
form.login = options[:username].split("@").first
|
23
23
|
form.passwd = options[:password]
|
24
24
|
page = agent.submit(form, form.buttons.first)
|
25
|
-
|
25
|
+
|
26
26
|
if page.body =~ /Invalid ID or password./ || page.body =~ /This ID is not yet taken./
|
27
|
-
|
27
|
+
return Problem.new("Username and password were not accepted. Please check them and try again.")
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
true
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
##
|
34
34
|
# prepare the importer
|
35
35
|
|
36
36
|
def prepare
|
37
37
|
login
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
##
|
41
41
|
# scrape yahoo contacts
|
42
42
|
|
43
43
|
def scrape_contacts
|
44
44
|
page = agent.get("http://address.yahoo.com/?1=&VPC=import_export")
|
45
45
|
if page.body =~ /To access Yahoo! Address Book\.\.\..*Sign in./m
|
46
|
-
|
46
|
+
return Problem.new("Username and password were not accepted. Please check them and try again.")
|
47
47
|
end
|
48
48
|
form = page.forms.last
|
49
49
|
csv = agent.submit(form, form.buttons[2]) # third button is Yahoo-format CSV
|
50
|
-
|
50
|
+
|
51
51
|
contact_rows = FasterCSV.parse(csv.body)
|
52
52
|
labels = contact_rows.shift # TODO: Actually use the labels to find the indexes of the data we want
|
53
53
|
contact_rows.collect do |row|
|
54
54
|
next if !row[7].empty? && options[:username] =~ /^#{Regexp.escape(row[7])}/ # Don't collect self
|
55
55
|
{
|
56
|
-
:name => "#{row[0]} #{row[2]}".to_s,
|
57
|
-
:email => (row[4] || "#{row[7]}@yahoo.com") # email is a field in the data, but will be blank for Yahoo users so we create their email address
|
58
|
-
}
|
56
|
+
:name => "#{row[0]} #{row[2]}".to_s,
|
57
|
+
:email => (row[4] || "#{row[7]}@yahoo.com") # email is a field in the data, but will be blank for Yahoo users so we create their email address
|
58
|
+
}
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
Graybook.register(:yahoo, self)
|
63
63
|
end
|
data/lib/graybook.rb
CHANGED
@@ -4,15 +4,17 @@ require 'rubygems'
|
|
4
4
|
|
5
5
|
class Graybook
|
6
6
|
include ::Singleton
|
7
|
-
VERSION = '1.0
|
8
|
-
|
9
|
-
class
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
VERSION = '1.1.0'
|
8
|
+
|
9
|
+
class Problem < Exception
|
10
|
+
def nil?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
13
15
|
attr_accessor :importers
|
14
16
|
attr_accessor :exporters
|
15
|
-
|
17
|
+
|
16
18
|
def self.get( *args )
|
17
19
|
instance.get( *args )
|
18
20
|
end
|
@@ -24,39 +26,36 @@ class Graybook
|
|
24
26
|
when Exporter::Base
|
25
27
|
instance.exporters[name.to_sym] = adapter
|
26
28
|
else
|
27
|
-
|
29
|
+
return nil
|
28
30
|
end
|
29
31
|
end
|
30
|
-
|
31
|
-
# Sends the vcards from the import to whatever is handling the export
|
32
|
+
|
32
33
|
def export( importer, exporter, options )
|
33
34
|
exporter.export importer.import( options )
|
34
35
|
end
|
35
|
-
|
36
|
+
|
36
37
|
# Searches registered importers for one that will handle the given options
|
37
38
|
def find_importer( options )
|
38
39
|
importers.each{ |key, importer| return importer if importer =~ options }
|
39
40
|
nil
|
40
41
|
end
|
41
|
-
|
42
|
+
|
42
43
|
# Fetches contacts from various services or filetypes. The default is to return an array
|
43
44
|
# of hashes - Graybook's internal format
|
44
|
-
#
|
45
|
+
#
|
45
46
|
# Handles several different calls:
|
46
47
|
# get( :username => 'something@gmail.com', :password => 'whatever' )
|
47
|
-
# get( :as => :xml, :username => 'something@gmail.com', :password => 'whatever' )
|
48
|
-
# get( :csv, :file => #<File:/path/to/file.csv> )
|
49
48
|
def get( *args )
|
50
49
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
51
|
-
to_format = exporters[
|
50
|
+
to_format = exporters[:basic]
|
52
51
|
source = (importers[args.first.to_sym] rescue nil) || find_importer(options)
|
53
52
|
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
return nil unless to_format
|
54
|
+
return nil unless source
|
55
|
+
|
57
56
|
export source, to_format, options
|
58
57
|
end
|
59
|
-
|
58
|
+
|
60
59
|
def initialize
|
61
60
|
self.importers = {}
|
62
61
|
self.exporters = {}
|
@@ -78,6 +77,6 @@ end
|
|
78
77
|
class Object
|
79
78
|
def blank?
|
80
79
|
respond_to?(:empty?) ? empty? : !self
|
81
|
-
end
|
80
|
+
end
|
82
81
|
end
|
83
82
|
|
metadata
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graybook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kojul
|
8
|
+
- Contentfree
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
@@ -32,112 +33,33 @@ dependencies:
|
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: 0.7.0
|
34
35
|
version:
|
35
|
-
|
36
|
-
name: hoe
|
37
|
-
type: :runtime
|
38
|
-
version_requirement:
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: 1.5.0
|
44
|
-
version:
|
45
|
-
- !ruby/object:Gem::Dependency
|
46
|
-
name: fastercsv
|
47
|
-
type: :runtime
|
48
|
-
version_requirement:
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.2.0
|
54
|
-
version:
|
55
|
-
description: It does things. Like import contacts from EVERYWHERE.
|
36
|
+
description: Graybook is used to import email contact lists from popular webmail sites. Currently supported are AOL/AIM, Yahoo, Hotmail/Live/MSN, and Google Mail (although not Google Apps Mail yet).
|
56
37
|
email: kojul@kojul.com
|
57
38
|
executables: []
|
58
39
|
|
59
40
|
extensions: []
|
60
41
|
|
61
42
|
extra_rdoc_files:
|
62
|
-
- README
|
43
|
+
- README
|
63
44
|
files:
|
64
45
|
- .gitignore
|
65
|
-
-
|
46
|
+
- CHANGELOG
|
66
47
|
- Manifest.txt
|
67
|
-
- README
|
48
|
+
- README
|
68
49
|
- Rakefile
|
69
50
|
- VERSION
|
70
51
|
- VERSION.yml
|
71
52
|
- VERSION_NAME
|
72
|
-
- debug_graybook.rb
|
73
53
|
- init.rb
|
74
54
|
- lib/graybook.rb
|
75
55
|
- lib/graybook/exporter/base.rb
|
76
|
-
- lib/graybook/exporter/vcf.rb
|
77
|
-
- lib/graybook/exporter/xml.rb
|
78
56
|
- lib/graybook/importer/aol.rb
|
79
57
|
- lib/graybook/importer/base.rb
|
80
|
-
- lib/graybook/importer/csv.rb
|
81
|
-
- lib/graybook/importer/freenet.rb
|
82
58
|
- lib/graybook/importer/gmail.rb
|
83
|
-
- lib/graybook/importer/gmx.rb
|
84
59
|
- lib/graybook/importer/hotmail.rb
|
85
60
|
- lib/graybook/importer/page_scraper.rb
|
86
|
-
- lib/graybook/importer/web.de.rb
|
87
61
|
- lib/graybook/importer/yahoo.rb
|
88
|
-
- test/config/credentials.yml.example
|
89
|
-
- test/fixtures/aol_application_page.html
|
90
|
-
- test/fixtures/aol_bad_login_response_stage_3.html
|
91
|
-
- test/fixtures/aol_contacts.html
|
92
|
-
- test/fixtures/aol_login_response_stage_1.html
|
93
|
-
- test/fixtures/aol_login_response_stage_2.html
|
94
|
-
- test/fixtures/aol_login_response_stage_3.html
|
95
|
-
- test/fixtures/aol_login_response_stage_4.html
|
96
|
-
- test/fixtures/aol_login_response_stage_5.html
|
97
|
-
- test/fixtures/aol_new_contacts.html
|
98
|
-
- test/fixtures/gmail.csv
|
99
|
-
- test/fixtures/gmail_bad_login_response_stage_2.html
|
100
|
-
- test/fixtures/gmail_contacts.html
|
101
|
-
- test/fixtures/gmail_login_response_stage_1.html
|
102
|
-
- test/fixtures/gmail_login_response_stage_2.html
|
103
|
-
- test/fixtures/gmail_login_response_stage_2a.html
|
104
|
-
- test/fixtures/gmail_login_response_stage_3.html
|
105
|
-
- test/fixtures/gmail_redirect_body.html
|
106
|
-
- test/fixtures/hotmail_bad_login_response_stage_2.html
|
107
|
-
- test/fixtures/hotmail_contacts.html
|
108
|
-
- test/fixtures/hotmail_login_response_stage_1.html
|
109
|
-
- test/fixtures/hotmail_login_response_stage_2.html
|
110
|
-
- test/fixtures/hotmail_login_response_stage_3.html
|
111
|
-
- test/fixtures/hotmail_scrape_first_page.html
|
112
|
-
- test/fixtures/hotmail_scrape_response_stage_1.html
|
113
|
-
- test/fixtures/hotmail_scrape_response_stage_2.html
|
114
|
-
- test/fixtures/hotmail_scrape_response_stage_3.html
|
115
|
-
- test/fixtures/yahoo_bad_login_response_stage_2.html
|
116
|
-
- test/fixtures/yahoo_contacts.csv
|
117
|
-
- test/fixtures/yahoo_contacts_not_logged_in.html
|
118
|
-
- test/fixtures/yahoo_contacts_stage_1.html
|
119
|
-
- test/fixtures/yahoo_login_response_stage_1.html
|
120
|
-
- test/fixtures/yahoo_login_response_stage_2.html
|
121
|
-
- test/fixtures/yahoo_no_user_response_stage_2.html
|
122
|
-
- test/freenet_importer_test.rb
|
123
|
-
- test/gmx_importer_test.rb
|
124
|
-
- test/scripts/live_test.rb
|
125
|
-
- test/test_graybook.rb
|
126
|
-
- test/test_graybook_exporter_base.rb
|
127
|
-
- test/test_graybook_exporter_vcf.rb
|
128
|
-
- test/test_graybook_exporter_xml.rb
|
129
|
-
- test/test_graybook_importer_aol.rb
|
130
|
-
- test/test_graybook_importer_base.rb
|
131
|
-
- test/test_graybook_importer_csv.rb
|
132
|
-
- test/test_graybook_importer_gmail.rb
|
133
|
-
- test/test_graybook_importer_hotmail.rb
|
134
|
-
- test/test_graybook_importer_page_scraper.rb
|
135
|
-
- test/test_graybook_importer_yahoo.rb
|
136
|
-
- test/test_helper.rb
|
137
|
-
- test/web.de_importer_test.rb
|
138
62
|
- updater.rb
|
139
|
-
- vendor/plugins/graybook/lib/autotest/discover.rb
|
140
|
-
- vendor/plugins/graybook/lib/autotest/graybook.rb
|
141
63
|
has_rdoc: true
|
142
64
|
homepage: http://github.com/kojul/gray
|
143
65
|
licenses: []
|
@@ -165,21 +87,6 @@ rubyforge_project:
|
|
165
87
|
rubygems_version: 1.3.5
|
166
88
|
signing_key:
|
167
89
|
specification_version: 3
|
168
|
-
summary: It does things. Like import contacts from EVERYWHERE.
|
169
|
-
test_files:
|
170
|
-
|
171
|
-
- test/gmx_importer_test.rb
|
172
|
-
- test/scripts/live_test.rb
|
173
|
-
- test/test_graybook.rb
|
174
|
-
- test/test_graybook_exporter_base.rb
|
175
|
-
- test/test_graybook_exporter_vcf.rb
|
176
|
-
- test/test_graybook_exporter_xml.rb
|
177
|
-
- test/test_graybook_importer_aol.rb
|
178
|
-
- test/test_graybook_importer_base.rb
|
179
|
-
- test/test_graybook_importer_csv.rb
|
180
|
-
- test/test_graybook_importer_gmail.rb
|
181
|
-
- test/test_graybook_importer_hotmail.rb
|
182
|
-
- test/test_graybook_importer_page_scraper.rb
|
183
|
-
- test/test_graybook_importer_yahoo.rb
|
184
|
-
- test/test_helper.rb
|
185
|
-
- test/web.de_importer_test.rb
|
90
|
+
summary: It does things. Like import contacts from EVERYWHERE. (Some sites may be excluded)
|
91
|
+
test_files: []
|
92
|
+
|