webstract 0.0.3 → 0.0.4
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/lib/webstract/errors.rb +4 -0
 - data/lib/webstract/favicon.rb +43 -3
 - data/lib/webstract/version.rb +1 -1
 - metadata +31 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 2021ffa427679aad2c1ad7953e64bc09c787ff36
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 31800e37441971669644353ee402ec9526337007
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: b1593c55dd96f86c4717a5d734f4659cad3b45ab9552e43f7fa113524f2e90bab792e128102b7ba00f25d7f1639bcdd1704126a55255afa4293adff2a8b75032
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 8ccdafd69a089fed785756520933c4977432add9b08c7443d3996b062bb11e36ad76eac7e718a2566c61bc7e9064192414850b6ec6f34ea123f65fc4b9b8e1e0
         
     | 
    
        data/lib/webstract/errors.rb
    CHANGED
    
    | 
         @@ -9,5 +9,9 @@ module Webstract 
     | 
|
| 
       9 
9 
     | 
    
         
             
                # raised when the target page could not be reached
         
     | 
| 
       10 
10 
     | 
    
         
             
                # but due to server errors like 404, or 500.
         
     | 
| 
       11 
11 
     | 
    
         
             
                class PageError < StandardError; ;end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                # favicon errors
         
     | 
| 
      
 14 
     | 
    
         
            +
                class MissingFavicon < StandardError; ;end
         
     | 
| 
      
 15 
     | 
    
         
            +
                class InvalidFavicon < StandardError; ;end
         
     | 
| 
       12 
16 
     | 
    
         
             
              end
         
     | 
| 
       13 
17 
     | 
    
         
             
            end
         
     | 
    
        data/lib/webstract/favicon.rb
    CHANGED
    
    | 
         @@ -1,8 +1,11 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require ' 
     | 
| 
      
 1 
     | 
    
         
            +
            require 'open_uri_redirections'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'nokogiri'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'open-uri'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "addressable/uri"
         
     | 
| 
       2 
5 
     | 
    
         | 
| 
       3 
6 
     | 
    
         
             
            module Webstract
         
     | 
| 
       4 
7 
     | 
    
         
             
              class Favicon
         
     | 
| 
       5 
     | 
    
         
            -
                attr_accessor :url, : 
     | 
| 
      
 8 
     | 
    
         
            +
                attr_accessor :url, :data
         
     | 
| 
       6 
9 
     | 
    
         | 
| 
       7 
10 
     | 
    
         
             
                def initialize(options = {})
         
     | 
| 
       8 
11 
     | 
    
         
             
                  raise(ArgumentError.new("requires url")) unless options.key?(:url)
         
     | 
| 
         @@ -10,7 +13,7 @@ module Webstract 
     | 
|
| 
       10 
13 
     | 
    
         
             
                end
         
     | 
| 
       11 
14 
     | 
    
         | 
| 
       12 
15 
     | 
    
         
             
                def fetch
         
     | 
| 
       13 
     | 
    
         
            -
                  @ 
     | 
| 
      
 16 
     | 
    
         
            +
                  @data = self.class.get(url).data
         
     | 
| 
       14 
17 
     | 
    
         
             
                end
         
     | 
| 
       15 
18 
     | 
    
         | 
| 
       16 
19 
     | 
    
         
             
                def fetch_and_save(path)
         
     | 
| 
         @@ -21,5 +24,42 @@ module Webstract 
     | 
|
| 
       21 
24 
     | 
    
         
             
                  end
         
     | 
| 
       22 
25 
     | 
    
         
             
                end
         
     | 
| 
       23 
26 
     | 
    
         | 
| 
      
 27 
     | 
    
         
            +
                def self.get(url)
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  uri = Addressable::URI.heuristic_parse(url)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  uri = Addressable::URI.encode(uri) # needed for chars with accents in url
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                  doc = Nokogiri::HTML(open(uri, allow_redirections: :all))
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  path = doc.xpath("//link[@rel='shortcut icon' or @rel='icon']/@href").first
         
     | 
| 
      
 35 
     | 
    
         
            +
                  path = path ? path.to_s : '/favicon.ico'
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                  fav_uri = Addressable::URI.join(uri, path.to_s)
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                    stream = open(fav_uri, allow_redirections: :all)
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                    unless stream.content_type[/^image/]
         
     | 
| 
      
 44 
     | 
    
         
            +
                      raise(Errors::InvalidFavicon, "wrong content_type (#{stream.content_type})")
         
     | 
| 
      
 45 
     | 
    
         
            +
                    end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                    data = stream.read
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                    if data.size == 0
         
     | 
| 
      
 50 
     | 
    
         
            +
                      raise(Errors::InvalidFavicon, "zero data")
         
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                    fav = Favicon.new(url: fav_uri.to_s)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    fav.data = data
         
     | 
| 
      
 55 
     | 
    
         
            +
                    return fav
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  rescue OpenURI::HTTPError => e
         
     | 
| 
      
 58 
     | 
    
         
            +
                    raise Errors::MissingFavicon if e.to_s[/404/]
         
     | 
| 
      
 59 
     | 
    
         
            +
                    raise # nevermind, reraise the previous exception
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
       24 
64 
     | 
    
         
             
              end
         
     | 
| 
       25 
65 
     | 
    
         
             
            end
         
     | 
    
        data/lib/webstract/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: webstract
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.4
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - John Faucett
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2014-10- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2014-10-13 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: activesupport
         
     | 
| 
         @@ -45,7 +45,35 @@ dependencies: 
     | 
|
| 
       45 
45 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       46 
46 
     | 
    
         
             
                    version: '1.5'
         
     | 
| 
       47 
47 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       48 
     | 
    
         
            -
              name:  
     | 
| 
      
 48 
     | 
    
         
            +
              name: open_uri_redirections
         
     | 
| 
      
 49 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 50 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 51 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 52 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 53 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 54 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 55 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 56 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 57 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 58 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 59 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 60 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 61 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 62 
     | 
    
         
            +
              name: addressable
         
     | 
| 
      
 63 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 64 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 65 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 66 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 67 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 68 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 69 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 70 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 71 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 72 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 73 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 74 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 75 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 76 
     | 
    
         
            +
              name: nokogiri
         
     | 
| 
       49 
77 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       50 
78 
     | 
    
         
             
                requirements:
         
     | 
| 
       51 
79 
     | 
    
         
             
                - - ">="
         
     |