picture_from 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/README.md +4 -10
- data/Rakefile +8 -0
- data/lib/picture_from/apis/facebook_api.rb +23 -0
- data/lib/picture_from/crawlers/base_crawler.rb +19 -0
- data/lib/picture_from/crawlers/facebook_crawler.rb +20 -16
- data/lib/picture_from/crawlers/twitter_crawler.rb +22 -0
- data/lib/picture_from/facebook_picture.rb +3 -2
- data/lib/picture_from/gravatar_picture.rb +2 -0
- data/lib/picture_from/keyword.rb +22 -0
- data/lib/picture_from/search_engine.rb +44 -0
- data/lib/picture_from/twitter_picture.rb +13 -0
- data/lib/picture_from/version.rb +1 -1
- data/lib/picture_from.rb +12 -1
- data/spec/fixtures/twitter_crawler.response +5356 -0
- data/spec/lib/picture_from/apis/facebook_api_spec.rb +46 -0
- data/spec/lib/picture_from/crawlers/facebook_crawler_spec.rb +40 -34
- data/spec/lib/picture_from/crawlers/twitter_crawler_spec.rb +32 -0
- data/spec/lib/picture_from/facebook_picture_spec.rb +8 -8
- data/spec/lib/picture_from/keyword_spec.rb +41 -0
- data/spec/lib/picture_from/search_engine_spec.rb +9 -0
- data/spec/lib/picture_from/twitter_picture_spec.rb +18 -0
- data/spec/lib/picture_from_spec.rb +32 -0
- data/spec/support/fake_web_helper.rb +14 -7
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb7f865aafa5ad8a359f4a3c9cbf3bcdfc9f19b4
|
4
|
+
data.tar.gz: 5d8e3f71b4186d10eaf1ab0c218ba61d2bdb1c32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2ae1cc6afd91c116577c9c5ffc4b4c6cba109282258a27a68cca707c3f093dbd6f7f6168e82a5308a5ffe1490dfe1e3cbefe4fe46d241d9b1939acba9b228e9
|
7
|
+
data.tar.gz: 6fa907f00f53441ade90e99257fed809af8964fab8475c696a40cbf57b96d0f20f0d2ec5632fb169d9fb6a872864e4b4d9620e6191e2e30f67078e05a10b9b4f
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -29,21 +29,15 @@ PictureFrom.url('karreiro')
|
|
29
29
|
|
30
30
|
Engines
|
31
31
|
------------
|
32
|
-
PicutreFrom has many engines for finding the
|
32
|
+
PicutreFrom has many engines for finding the appropriate image for any user in your application:
|
33
33
|
|
34
34
|
- Gravatar
|
35
|
-
- by e-mail
|
36
|
-
- by GitHub username
|
35
|
+
- by e-mail
|
37
36
|
- Facebook
|
38
|
-
- by username ✔
|
39
|
-
- by e-mail ✔
|
40
|
-
- by user information ✔
|
41
|
-
- Twitter
|
42
37
|
- by username
|
38
|
+
- by e-mail
|
43
39
|
- by user information
|
44
|
-
-
|
45
|
-
- by username
|
46
|
-
- Ello
|
40
|
+
- Twitter
|
47
41
|
- by username
|
48
42
|
|
49
43
|
Contributing
|
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
require 'rspec/core/rake_task'
|
3
|
+
require 'rubocop/rake_task'
|
3
4
|
|
4
5
|
begin
|
5
6
|
Bundler.setup :default, :development
|
@@ -17,6 +18,13 @@ task :coverage do
|
|
17
18
|
end
|
18
19
|
|
19
20
|
RSpec::Core::RakeTask.new(:spec)
|
21
|
+
RuboCop::RakeTask.new(:rubocop)
|
20
22
|
|
21
23
|
desc 'Default: run tests'
|
22
24
|
task default: [:spec]
|
25
|
+
|
26
|
+
desc 'C.I: run tests and rubocop'
|
27
|
+
task :ci do
|
28
|
+
Rake::Task['rubocop'].execute
|
29
|
+
Rake::Task['spec'].execute
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
module PictureFrom
|
5
|
+
module Apis
|
6
|
+
class FacebookApi
|
7
|
+
|
8
|
+
# TODO: Use the http://graph.facebook.com/karreiro/picture?redirect=false
|
9
|
+
# API to identify silhouette pictures.
|
10
|
+
def image_url_by_username(username)
|
11
|
+
url = "http://graph.facebook.com/#{username}/picture"
|
12
|
+
open URI.escape(url)
|
13
|
+
rescue OpenURI::HTTPError
|
14
|
+
# handle 404 and 400
|
15
|
+
nil
|
16
|
+
rescue RuntimeError
|
17
|
+
# handle 302
|
18
|
+
url
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
module PictureFrom
|
5
|
+
module Crawlers
|
6
|
+
class BaseCrawler
|
7
|
+
|
8
|
+
class Page
|
9
|
+
def open_url(url)
|
10
|
+
uri = URI.escape(url)
|
11
|
+
Nokogiri::HTML open(uri)
|
12
|
+
rescue OpenURI::HTTPError
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,27 +1,31 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
require 'nokogiri'
|
3
|
-
|
4
1
|
module PictureFrom
|
5
2
|
module Crawlers
|
6
3
|
class FacebookCrawler
|
7
4
|
|
8
|
-
def
|
9
|
-
page =
|
10
|
-
|
11
|
-
username_from_url(results.first['href']) if results.size > 0
|
5
|
+
def image_url_by_user_info(user_info)
|
6
|
+
page = SearchPage.new(user_info)
|
7
|
+
page.usernames.first
|
12
8
|
end
|
13
9
|
|
14
|
-
|
10
|
+
class SearchPage < BaseCrawler::Page
|
11
|
+
def initialize(user_info)
|
12
|
+
@page = open_url("https://www.facebook.com/search.php?q=#{user_info}")
|
13
|
+
end
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
def usernames
|
16
|
+
results.map { |result| username_from_url(result['href']) }.compact
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def username_from_url(url)
|
22
|
+
match = %r{^https?://(www\.)?facebook.com/(?<u>[^/\.]*)/?$}.match(url)
|
23
|
+
match[:u] if match
|
24
|
+
end
|
20
25
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
match[:username] if match
|
26
|
+
def results
|
27
|
+
@page.css('#pagelet_search_results .instant_search_title a')
|
28
|
+
end
|
25
29
|
end
|
26
30
|
|
27
31
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PictureFrom
|
2
|
+
module Crawlers
|
3
|
+
class TwitterCrawler
|
4
|
+
|
5
|
+
def image_url_by_username(username)
|
6
|
+
page = ProfilePage.new(username)
|
7
|
+
page.avatar_image
|
8
|
+
end
|
9
|
+
|
10
|
+
class ProfilePage < BaseCrawler::Page
|
11
|
+
def initialize(username)
|
12
|
+
@page = open_url("https://twitter.com/#{username}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def avatar_image
|
16
|
+
@page.css('.ProfileAvatar-image').first['src'] if @page
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -3,14 +3,15 @@ module PictureFrom
|
|
3
3
|
|
4
4
|
def initialize
|
5
5
|
@facebook_crawler = Crawlers::FacebookCrawler.new
|
6
|
+
@facebook_api = Apis::FacebookApi.new
|
6
7
|
end
|
7
8
|
|
8
9
|
def picture_from_username(username)
|
9
|
-
|
10
|
+
@facebook_api.image_url_by_username(username)
|
10
11
|
end
|
11
12
|
|
12
13
|
def picture_from_user_info(user_info)
|
13
|
-
username = @facebook_crawler.
|
14
|
+
username = @facebook_crawler.image_url_by_user_info(user_info)
|
14
15
|
picture_from_username(username)
|
15
16
|
end
|
16
17
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PictureFrom
|
2
|
+
class Keyword
|
3
|
+
|
4
|
+
attr_reader :value
|
5
|
+
|
6
|
+
def initialize(value)
|
7
|
+
@value = value
|
8
|
+
end
|
9
|
+
|
10
|
+
def type
|
11
|
+
case value
|
12
|
+
when /^@?([\w\.])*$/
|
13
|
+
:username
|
14
|
+
when /.+@.+/
|
15
|
+
:email
|
16
|
+
else
|
17
|
+
:user_info
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module PictureFrom
|
2
|
+
class SearchEngine
|
3
|
+
|
4
|
+
DEFAULT_RULES = {
|
5
|
+
username: [
|
6
|
+
{ facebook: :picture_from_username },
|
7
|
+
{ twitter: :picture_from_username },
|
8
|
+
{ facebook: :picture_from_user_info }
|
9
|
+
],
|
10
|
+
email: [
|
11
|
+
{ gravatar: :picture_from_email },
|
12
|
+
{ facebook: :picture_from_user_info }
|
13
|
+
],
|
14
|
+
user_info: [
|
15
|
+
{ facebook: :picture_from_user_info }
|
16
|
+
]
|
17
|
+
}
|
18
|
+
|
19
|
+
def initialize(keyword_value = '')
|
20
|
+
@keyword = Keyword.new(keyword_value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def image_url
|
24
|
+
default_rules.each do |rule|
|
25
|
+
rule.each do |provider, method|
|
26
|
+
image_url = initialize_provider(provider).send(method, @keyword.value)
|
27
|
+
return image_url if image_url
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def default_rules
|
35
|
+
DEFAULT_RULES[@keyword.type]
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize_provider(provider)
|
39
|
+
provider_name = "#{provider.capitalize}Picture"
|
40
|
+
PictureFrom.const_get(provider_name).new
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
data/lib/picture_from/version.rb
CHANGED
data/lib/picture_from.rb
CHANGED
@@ -1,7 +1,18 @@
|
|
1
|
+
require 'picture_from/crawlers/base_crawler'
|
1
2
|
require 'picture_from/crawlers/facebook_crawler'
|
3
|
+
require 'picture_from/crawlers/twitter_crawler'
|
4
|
+
require 'picture_from/apis/facebook_api'
|
2
5
|
require 'picture_from/facebook_picture'
|
3
6
|
require 'picture_from/gravatar_picture'
|
7
|
+
require 'picture_from/twitter_picture'
|
8
|
+
require 'picture_from/search_engine'
|
9
|
+
require 'picture_from/keyword'
|
4
10
|
|
5
11
|
module PictureFrom
|
6
|
-
|
12
|
+
|
13
|
+
def self.url(keyword_value)
|
14
|
+
search_engine = SearchEngine.new(keyword_value)
|
15
|
+
search_engine.image_url
|
16
|
+
end
|
17
|
+
|
7
18
|
end
|