picture_from 0.0.1 → 1.0.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.
- 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
         
     |