ficon 0.0.7 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0f448ec75fb5d9873e7ceb037778d157b7ca05fe
4
- data.tar.gz: e9e35f677407bfba88e236d1c395585d1f3576de
2
+ SHA256:
3
+ metadata.gz: 97c762adf3cdb126d047b66c426c3f388a3a8c61e2c6c009cff2f0dca3c7f219
4
+ data.tar.gz: 53a177388f199f7133991f1067ad1a71d747c5d84c99b88d379d7878a3196eb5
5
5
  SHA512:
6
- metadata.gz: eacbc439f9a3dd4c1bce7ebed05446ef3a9b5539d9831d5b745f7346f6b79353399860f1631f17efe8ec2ce1a567c3b00c76231ddaf712c2c4a0efefd122c009
7
- data.tar.gz: 46186733e3a604e5ab78030af4a8b01c6f909cc2e3aba194be286ac9304fe9e4114b81abe4de86f114c236f51525ad9ba41221ed2a50ef264b82e76c18009e1e
6
+ metadata.gz: 2af1238cf43c03e84081ddfeeb69a545613e0348b33dab4aa3670d8e152e9ce4089f9b8c892764ecb143cf2aaa90b6afa4fd7b844bb611e98a8b18b27ce161b6
7
+ data.tar.gz: 6eac859ed1529c3f22fcdaf5634a8e66ae1c625da7fbc0a1bce80afe53fc2a2a15145ac827cf65de414e68b7ea86be6cf25b808102606ab44f77def6a20124c4
data/README.md CHANGED
@@ -18,14 +18,21 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- irb(main)> Ficon::Site.new('https://booko.info/9780748109999').site_icons.first.url
21
+ irb(main)> Ficon.new('https://booko.info/9780748109999').site_icons.first.url
22
22
  => "https://booko.info/favicon-196x196.png"
23
23
 
24
- irb(main):008:0> Ficon::Site.new('https://booko.info/9780748109999').page_images.first.url
24
+ irb(main)> Ficon.new('https://booko.info/9780748109999').page_images.first.url
25
25
  => "https://covers.booko.com.au/9780748109999.jpg"
26
26
 
27
+ irb(main)> site = Ficon.new('https://booko.info/9780748109999')
28
+ irb(main)> site.title
29
+ => "Prices for Consider Phlebas by Iain M. Banks"
30
+ irb(main)> site.description
31
+ => "Prices (including delivery) for Consider Phlebas by Iain M. Banks range from $12.40 at Blackwell's up to $12.99."
27
32
 
28
- Or form the shell:
33
+
34
+
35
+ Or from the shell:
29
36
 
30
37
  $ ficon https://booko.info/9780748109999
31
38
  Site icon: https://booko.info/favicon-196x196.png([196, 196])
data/bin/ficon CHANGED
@@ -2,6 +2,5 @@
2
2
 
3
3
  $:.unshift File.join( File.dirname(__FILE__), "/../lib")
4
4
  require 'ficon'
5
- include Ficon
6
5
 
7
- puts Site.new(ARGV[0]).report
6
+ puts Ficon.new(ARGV[0]).report
data/ficon.gemspec CHANGED
@@ -12,19 +12,20 @@ Gem::Specification.new do |spec|
12
12
  spec.description = %q{Ficon finds icons for websites and optionally, the best icon}
13
13
  spec.homepage = "https://github.com/dkam/ficon"
14
14
  spec.license = "MIT"
15
+ spec.required_ruby_version = ">= 3.0"
15
16
 
16
17
  spec.files = `git ls-files -z`.split("\x0")
17
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
20
  spec.require_paths = ["lib"]
20
21
 
21
- spec.add_runtime_dependency 'nokogiri', "~> 1.7"
22
- spec.add_runtime_dependency 'addressable', "~> 2"
23
- spec.add_runtime_dependency 'fastimage', "~> 2"
24
- spec.add_runtime_dependency 'sqlite3', "~> 1"
22
+ spec.add_runtime_dependency 'nokogiri', "~> 1.15"
23
+ spec.add_runtime_dependency 'addressable', "~> 2.8"
24
+ spec.add_runtime_dependency 'fastimage', "~> 2.3"
25
+ spec.add_runtime_dependency 'sqlite3', "~> 2.0"
25
26
 
26
- spec.add_development_dependency "bundler", "~> 1"
27
- spec.add_development_dependency "rake", "~> 12"
28
- spec.add_development_dependency "minitest", "~> 5"
29
- spec.add_development_dependency "byebug", "~> 9"
27
+ spec.add_development_dependency "bundler", "~> 2.0"
28
+ spec.add_development_dependency "rake", "~> 13.0"
29
+ spec.add_development_dependency "minitest", "~> 5.0"
30
+ spec.add_development_dependency "debug", "~> 1.0"
30
31
  end
data/lib/ficon/cache.rb CHANGED
@@ -1,61 +1,50 @@
1
- require 'sqlite3'
2
- require 'json'
3
-
4
- module Ficon
1
+ require "sqlite3"
5
2
 
3
+ class Ficon
6
4
  class Cache
7
5
  def initialize(url)
8
6
  @url = url.to_s
9
- Cache.setup_cache(db) if db.execute( "SELECT name FROM sqlite_master WHERE type='table' AND name='urls'" ).length == 0
7
+ Cache.setup_cache(db) if db.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='urls'").length == 0
10
8
  end
11
9
 
12
10
  def db
13
11
  _db = SQLite3::Database.new Cache.db_file
14
- _db.busy_timeout=1000
15
- return _db
12
+ _db.busy_timeout = 1000
13
+ _db
16
14
  end
17
15
 
18
16
  def data
19
- JSON.parse db.execute( "select data from urls where url=?limit 1", @url ).first&.first
20
- rescue
21
- return nil
17
+ db.execute("select data from urls where url=? limit 1", @url).first&.first
22
18
  end
23
19
 
24
20
  def data=(_value)
25
- value = _value.to_json
26
- db.execute("INSERT OR IGNORE INTO urls (url, data) VALUES (?, ?)", [@url, value])
27
- db.execute("UPDATE urls SET data=? WHERE url=?", [value, @url])
21
+ db.execute("INSERT OR IGNORE INTO urls (url, data) VALUES (?, ?)", [@url, _value])
22
+ db.execute("UPDATE urls SET data=? WHERE url=?", [_value, @url])
28
23
  end
29
24
 
30
25
  def etag
31
- JSON.parse db.execute( "select etag from urls where url=?limit 1", @url ).first&.first
32
- rescue
33
- return nil
26
+ db.execute("select etag from urls where url=? limit 1", @url).first&.first
34
27
  end
35
28
 
36
29
  def etag=(_value)
37
- value = _value.to_json
38
- db.execute("INSERT OR IGNORE INTO urls (url, etag) VALUES (?, ?)", [@url, value])
39
- db.execute("UPDATE urls SET etag=? WHERE url=?", [value, @url])
30
+ db.execute("INSERT OR IGNORE INTO urls (url, etag) VALUES (?, ?)", [@url, _value])
31
+ db.execute("UPDATE urls SET etag=? WHERE url=?", [_value, @url])
40
32
  end
41
33
 
42
34
  def not_before
43
- JSON.parse db.execute( "select not_before from urls where url=?limit 1", @url ).first&.first
44
- rescue
45
- return nil
35
+ db.execute("select not_before from urls where url=? limit 1", @url).first&.first
46
36
  end
47
37
 
48
38
  def not_before=(_value)
49
- value = _value.to_json
50
- db.execute("INSERT OR IGNORE INTO urls (url, not_before) VALUES (?, ?)", [@url, value])
51
- db.execute("UPDATE urls SET not_before=? WHERE url=?", [value, @url])
39
+ db.execute("INSERT OR IGNORE INTO urls (url, not_before) VALUES (?, ?)", [@url, _value])
40
+ db.execute("UPDATE urls SET not_before=? WHERE url=?", [_value, @url])
52
41
  end
53
42
 
54
43
  def self.db_file
55
- if ENV['FICON_DB'].nil?
56
- File.expand_path('~/.ficon.db')
44
+ if ENV["FICON_DB"].nil?
45
+ File.expand_path("~/.ficon.db")
57
46
  else
58
- ENV['FICON_DB']
47
+ ENV["FICON_DB"]
59
48
  end
60
49
  end
61
50
 
@@ -63,9 +52,5 @@ module Ficon
63
52
  db.execute("CREATE TABLE urls(url, etag, not_before, data)")
64
53
  db.execute("CREATE UNIQUE INDEX `url` ON `urls` (`url`)")
65
54
  end
66
-
67
55
  end
68
56
  end
69
-
70
-
71
-
data/lib/ficon/image.rb CHANGED
@@ -1,21 +1,24 @@
1
- require 'open-uri'
2
- require 'fastimage'
1
+ require "net/http"
2
+ require "fastimage"
3
+ require "json"
3
4
 
4
- module Ficon
5
+ class Ficon
5
6
  class Image
6
- require 'fastimage'
7
-
8
- attr_reader :url, :size, :area
9
- def initialize(url)
7
+ attr_reader :url, :size, :area, :tile_color
8
+ def initialize(url, tile_color = nil)
10
9
  @url = url
10
+ @tile_color = tile_color
11
11
  c = Cache.new(@url)
12
- @size = Cache.new(url).data || FastImage.size(url)
13
- c.data = @size
12
+ cached_size = Cache.new(url).data
13
+ @size = cached_size ? JSON.parse(cached_size) : FastImage.size(url)
14
+ c.data = @size.to_json if @size
14
15
  @area = @size&.inject(&:*) || 0
15
16
  end
16
17
 
17
18
  def to_s
18
- @url.to_s + " (#{@size})"
19
+ result = @url.to_s + " (#{@size})"
20
+ result += " [#{@tile_color}]" if @tile_color
21
+ result
19
22
  end
20
23
  end
21
24
  end
data/lib/ficon/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module Ficon
2
- VERSION = "0.0.7"
1
+ class Ficon
2
+ VERSION = "0.2"
3
3
  end
data/lib/ficon.rb CHANGED
@@ -1,125 +1,143 @@
1
- require 'open-uri'
2
- require 'nokogiri'
3
- require 'uri'
4
- require "ostruct"
5
- require 'addressable/uri'
6
- require 'byebug'
7
-
8
- require_relative 'ficon/version'
9
- require_relative 'ficon/image'
10
- require_relative 'ficon/cache'
11
-
12
- module Ficon
13
- class Site
14
-
15
- attr_reader :site
16
- def initialize(uri)
17
- @uri = Addressable::URI.heuristic_parse(uri)
18
- @site = OpenStruct.new
19
- process
1
+ require "net/http"
2
+ require "nokogiri"
3
+ require "uri"
4
+ require "addressable/uri"
5
+ require "debug"
6
+
7
+ require_relative "ficon/version"
8
+ require_relative "ficon/image"
9
+ require_relative "ficon/cache"
10
+
11
+ class Ficon
12
+ attr_reader :site
13
+ attr_accessor :user_agent
14
+
15
+ def initialize(uri, user_agent: nil)
16
+ @uri = Addressable::URI.heuristic_parse(uri)
17
+ @site = {}
18
+ @user_agent = user_agent || "Ficon/#{VERSION} (Ruby icon finder; https://github.com/dkam/ficon)"
19
+ process
20
+ end
21
+
22
+ def doc
23
+ cache = Cache.new(@uri)
24
+
25
+ @data ||= cache.data
26
+
27
+ if @data.nil?
28
+ response = fetch_url(@uri)
29
+ return nil unless response
30
+
31
+ @data = response.body.force_encoding("UTF-8")
32
+ cache.data = @data
33
+ cache.etag = response["etag"] if response["etag"]
34
+ cache.not_before = response["last-modified"] if response["last-modified"]
20
35
  end
21
36
 
22
- def doc
23
- cache = Cache.new(@uri)
24
-
25
- @data ||= cache.data
26
-
27
- if @data.nil?
28
- @data = open(@uri)
29
- cache.data = @data.read.force_encoding('UTF-8')
30
- cache.etag = @data.meta['etag'] if @data.respond_to?(:meta)
31
- cache.not_before = @data.meta['last-modified'] if @data.respond_to?(:meta)
32
- @data.rewind
33
- end
34
-
35
- @doc ||= Nokogiri::HTML(@data)
36
- return @doc
37
- rescue OpenURI::HTTPError, SocketError => e
38
- puts "OpenURI: #{e.inspect}"
39
- return nil
40
- rescue TypeError => e
41
- if uri.to_s =~ /^http/
42
- puts "#{e.inspect}"
43
- puts "#{e.backtrace.join('\n')}"
44
- else
45
- puts "Please prepend http:// or https:// to the URL"
46
- end
47
- return nil
48
- rescue RuntimeError => e
49
- puts "#{e.message}"
50
- return nil
37
+ @doc ||= Nokogiri::HTML(@data)
38
+ @doc
39
+ rescue Net::HTTPError, SocketError => e
40
+ puts "HTTP Error: #{e.inspect}"
41
+ nil
42
+ rescue TypeError => e
43
+ if /^http/.match?(@uri.to_s)
44
+ puts "#{e.inspect}"
45
+ puts "#{e.backtrace.join('\n')}"
46
+ else
47
+ puts "Please prepend http:// or https:// to the URL"
51
48
  end
49
+ nil
50
+ rescue RuntimeError => e
51
+ puts "#{e.message}"
52
+ nil
53
+ end
52
54
 
55
+ def process
56
+ @site[:images] = self.class.site_images(@uri, doc) || []
57
+ @site[:page_images] = self.class.page_images(@uri, doc) || []
58
+ other_page_data
59
+ nil
60
+ end
53
61
 
54
- def process
55
- @site.images = Site.site_images(@uri, doc)||[]
56
- @site.page_images = Site.page_images(@uri, doc)||[]
57
- other_page_data
58
- return
59
- end
62
+ def report
63
+ <<~REPORT
64
+ Site icon: #{@site[:images].first}
65
+ Page icon: #{@site[:page_images].first}
66
+ Page title: #{@site[:title]}
67
+ Page description: #{@site[:description]}
68
+ Canonical URL: #{@site[:canonical]}
69
+ REPORT
70
+ end
60
71
 
61
- def report
62
- r = "Site icon: #{@site.images.first.to_s}\n"
63
- r += "Page icon: #{@site.page_images.first.to_s}\n"
64
- r += "Page title: #{@site.title}\n"
65
- r += "Page description: #{@site.description}\n"
66
- r += "Canonical URL: #{@site.canonical}\n"
72
+ def site_icons
73
+ @site[:images]
74
+ end
67
75
 
68
- return r
69
- end
76
+ def page_images
77
+ @site[:page_images]
78
+ end
70
79
 
71
- def site_icons
72
- @site.images
73
- end
80
+ def title
81
+ @site[:title]
82
+ end
74
83
 
75
- def page_images
76
- @site.page_images
77
- end
84
+ def description
85
+ @site[:description]
86
+ end
78
87
 
79
- def title
80
- @site.title
81
- end
88
+ def other_page_data
89
+ @site[:title] = doc.at_xpath("//meta[@property='og:title']/@content")&.value || @doc.at_xpath("//title")&.text&.strip
90
+ @site[:description] = doc.at_xpath("//meta[@property='og:description']/@content")&.value
91
+ canonical = doc.at_xpath("//link[@rel='canonical']/@href")&.value
92
+ @site[:canonical] = canonical unless canonical == @url
93
+ end
82
94
 
83
- def description
84
- @site.description
85
- end
95
+ def self.site_images(uri, doc)
96
+ results = []
86
97
 
87
- def other_page_data
88
- @site.title = doc.at_xpath("//meta[@property='og:title']/@content")&.value || @doc.at_xpath("//title")&.text&.strip
89
- @site.description = doc.at_xpath("//meta[@property='og:description']/@content")&.value
90
- canonical = doc.at_xpath("//link[@rel='canonical']/@href")&.value
91
- @site.canonical = canonical unless canonical == @url
92
- end
98
+ # Get tile color for Windows tiles
99
+ tile_color = doc.at_xpath("//meta[@name='msapplication-TileColor']/@content")&.value
93
100
 
94
- def to_s
95
- @url
96
- end
101
+ paths = "//meta[@name='msapplication-TileImage']|//link[@type='image/ico' or @type='image/vnd.microsoft.icon']|//link[@rel='icon' or @rel='shortcut icon' or @rel='apple-touch-icon-precomposed' or @rel='apple-touch-icon']"
102
+ results += doc.xpath(paths).collect { |e| e.values.select { |v| v =~ /\.png$|\.jpg$|\.gif$|\.ico$|\.svg$|\.ico\?\d*$/ } }.flatten.collect { |v| (v[/^http/] || v[/^\//]) ? v : "/" + v }
97
103
 
98
- def self.site_images(uri, doc, site=nil)
99
- results = []
104
+ results.collect { |result| normalise(uri, result) }.uniq.collect do |url|
105
+ # Check if this is a tile image to pass the color
106
+ is_tile = doc.at_xpath("//meta[@name='msapplication-TileImage' and @content='#{url}' or @content='#{url.sub(uri.to_s, "")}']")
107
+ Image.new(url, is_tile ? tile_color : nil)
108
+ end.sort_by(&:area).reverse
109
+ end
100
110
 
101
- paths = "//meta[@name='msapplication-TileImage']|//link[@type='image/ico' or @type='image/vnd.microsoft.icon']|//link[@rel='icon' or @rel='shortcut icon' or @rel='apple-touch-icon-precomposed' or @rel='apple-touch-icon']"
102
- results += doc.xpath(paths).collect {|e| e.values.select {|v| v =~ /\.png$|\.jpg$|\.gif$|\.ico$|\.svg$|\.ico\?\d*$/ }}.flatten.collect {|v| v[/^http/] || v[/^\//] ? v : '/' + v }
111
+ def self.page_images(uri, doc)
112
+ doc.xpath("//meta[@property='og:image']")
113
+ .collect { |e| e.values.reject(&:empty?) }.flatten
114
+ .collect { |v| (v[/^http/] || v[/^\//]) ? v : "/" + v }.collect { |result| normalise(uri, result) }.uniq.collect { |i| Image.new(i) }.sort_by(&:area).reverse
115
+ end
103
116
 
104
- results = results.collect {|result| normalise(uri, result)}.uniq.collect {|i| Image.new(i) }.sort {|a,b| a.area <=> b.area }.reverse
105
- end
117
+ def self.normalise(base, candidate)
118
+ parsed_candidate = URI(candidate)
119
+ base = URI(base) unless base.is_a? URI
106
120
 
107
- def self.page_images(uri, doc, site=nil)
108
- doc.xpath("//meta[@property='og:image']").
109
- collect {|e| e.values.select {|v| v =~ /\.png$|\.jpg$|\.gif$|\.ico$|\.svg$|\.ico\?\d*$/ }}.flatten.
110
- collect {|v| v[/^http/] || v[/^\//] ? v : '/' + v }.collect {|result| normalise(uri, result)}.uniq.collect {|i| Image.new(i)}.sort {|a, b| a.area <=> b.area }.reverse
111
- end
121
+ parsed_candidate.host = base.host if parsed_candidate.host.nil? # Set relative URLs to absolute
122
+ parsed_candidate.scheme = base.scheme if parsed_candidate.scheme.nil? # Set the schema if missing
112
123
 
113
- def self.normalise(base, candidate)
114
- parsed_candidate = URI(candidate);
115
- base = URI(base) unless base.is_a? URI
116
-
117
- parsed_candidate.host = base.host if parsed_candidate.host.nil? # Set relative URLs to absolute
118
- parsed_candidate.scheme = base.scheme if parsed_candidate.scheme.nil? # Set the schema if missing
124
+ parsed_candidate.to_s
125
+ end
119
126
 
120
- parsed_candidate.to_s
121
- end
127
+ private
122
128
 
129
+ def fetch_url(uri)
130
+ uri = URI(uri) unless uri.is_a?(URI)
123
131
 
132
+ Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
133
+ http.read_timeout = 10
134
+ http.open_timeout = 5
135
+ request = Net::HTTP::Get.new(uri)
136
+ request["User-Agent"] = @user_agent
137
+ http.request(request)
138
+ end
139
+ rescue Net::HTTPError, SocketError, Timeout::Error => e
140
+ puts "Failed to fetch #{uri}: #{e.inspect}"
141
+ nil
124
142
  end
125
- end
143
+ end
data/test/ficon_test.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #require 'rubygems'
2
- require 'byebug'
2
+ require 'debug'
3
3
 
4
4
  require "minitest/autorun"
5
5
 
@@ -29,22 +29,44 @@ require 'ficon'
29
29
  SiteTests << { html: %Q{<link rel="shortcut icon" href="https://fbstatic-a.akamaihd.net/rsrc.php/yl/r/H3nktOa7ZMg.ico" />}, value: 'https://fbstatic-a.akamaihd.net/rsrc.php/yl/r/H3nktOa7ZMg.ico' }
30
30
  SiteTests << { html: %Q{<link rel="icon" type="image/vnd.microsoft.icon" href="/viconline/img/favicon.ico?1393375504" />}, value: 'https://site.com/viconline/img/favicon.ico?1393375504' }
31
31
  SiteTests << { html: %Q{<link rel="shortcut icon" type="image/x-icon" href="/viconline/img/favicon.ico?1393375504" />}, value: 'https://site.com/viconline/img/favicon.ico?1393375504' }
32
+ SiteTests << { html: %Q{<meta name="msapplication-TileImage" content="/win8-tile-144.png"/><meta name="msapplication-TileColor" content="#00aced"/>}, value: 'https://site.com/win8-tile-144.png' }
32
33
 
33
34
  PageTests = []
34
35
  PageTests << { html: %Q{<meta property="og:image" content="https://www.facebook.com/images/fb_icon_325x325.png" />}, value: 'https://www.facebook.com/images/fb_icon_325x325.png' }
35
36
 
36
37
 
37
38
  class FiconTest < Minitest::Test
38
- include Ficon
39
39
  ENV['FICON_DB']=File.join( File.dirname(__FILE__), 'test.db')
40
40
  def test_html_chunks
41
41
  SiteTests.each do |t|
42
- result = Site.site_images('https://site.com', Nokogiri::HTML(t[:html]) )[0]
42
+ result = Ficon.site_images('https://site.com', Nokogiri::HTML(t[:html]) )[0]
43
43
  assert result&.url == t[:value], "Seaching |#{t[:html]}| expected #{t[:value]}, got #{result}"
44
44
  end
45
45
  PageTests.each do |t|
46
- result = Site.page_images('https://site.com', Nokogiri::HTML(t[:html]) )[0]
46
+ result = Ficon.page_images('https://site.com', Nokogiri::HTML(t[:html]) )[0]
47
47
  assert result&.url == t[:value], "Seaching |#{t[:html]}| expected #{t[:value]}, got #{result}"
48
48
  end
49
49
  end
50
+
51
+ def test_tile_color_extraction
52
+ html = %Q{<meta name="msapplication-TileImage" content="/win8-tile-144.png"/><meta name="msapplication-TileColor" content="#00aced"/>}
53
+ result = Ficon.site_images('https://site.com', Nokogiri::HTML(html))[0]
54
+ assert_equal 'https://site.com/win8-tile-144.png', result.url
55
+ assert_equal '#00aced', result.tile_color
56
+ end
57
+
58
+ def test_custom_user_agent
59
+ # Test default user agent
60
+ ficon_default = Ficon.new('https://example.com')
61
+ assert_match(/^Ficon\/0\.2/, ficon_default.user_agent)
62
+
63
+ # Test custom user agent
64
+ custom_agent = 'MyApp/1.0 (Custom Bot)'
65
+ ficon_custom = Ficon.new('https://example.com', user_agent: custom_agent)
66
+ assert_equal custom_agent, ficon_custom.user_agent
67
+
68
+ # Test user agent can be changed after initialization
69
+ ficon_custom.user_agent = 'Changed/2.0'
70
+ assert_equal 'Changed/2.0', ficon_custom.user_agent
71
+ end
50
72
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ficon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: '0.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Milne
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2017-04-20 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: nokogiri
@@ -16,112 +15,112 @@ dependencies:
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '1.7'
18
+ version: '1.15'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
- version: '1.7'
25
+ version: '1.15'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: addressable
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
- version: '2'
32
+ version: '2.8'
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
- version: '2'
39
+ version: '2.8'
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: fastimage
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
- version: '2'
46
+ version: '2.3'
48
47
  type: :runtime
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
- version: '2'
53
+ version: '2.3'
55
54
  - !ruby/object:Gem::Dependency
56
55
  name: sqlite3
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - "~>"
60
59
  - !ruby/object:Gem::Version
61
- version: '1'
60
+ version: '2.0'
62
61
  type: :runtime
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
65
  - - "~>"
67
66
  - !ruby/object:Gem::Version
68
- version: '1'
67
+ version: '2.0'
69
68
  - !ruby/object:Gem::Dependency
70
69
  name: bundler
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
72
  - - "~>"
74
73
  - !ruby/object:Gem::Version
75
- version: '1'
74
+ version: '2.0'
76
75
  type: :development
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
79
  - - "~>"
81
80
  - !ruby/object:Gem::Version
82
- version: '1'
81
+ version: '2.0'
83
82
  - !ruby/object:Gem::Dependency
84
83
  name: rake
85
84
  requirement: !ruby/object:Gem::Requirement
86
85
  requirements:
87
86
  - - "~>"
88
87
  - !ruby/object:Gem::Version
89
- version: '12'
88
+ version: '13.0'
90
89
  type: :development
91
90
  prerelease: false
92
91
  version_requirements: !ruby/object:Gem::Requirement
93
92
  requirements:
94
93
  - - "~>"
95
94
  - !ruby/object:Gem::Version
96
- version: '12'
95
+ version: '13.0'
97
96
  - !ruby/object:Gem::Dependency
98
97
  name: minitest
99
98
  requirement: !ruby/object:Gem::Requirement
100
99
  requirements:
101
100
  - - "~>"
102
101
  - !ruby/object:Gem::Version
103
- version: '5'
102
+ version: '5.0'
104
103
  type: :development
105
104
  prerelease: false
106
105
  version_requirements: !ruby/object:Gem::Requirement
107
106
  requirements:
108
107
  - - "~>"
109
108
  - !ruby/object:Gem::Version
110
- version: '5'
109
+ version: '5.0'
111
110
  - !ruby/object:Gem::Dependency
112
- name: byebug
111
+ name: debug
113
112
  requirement: !ruby/object:Gem::Requirement
114
113
  requirements:
115
114
  - - "~>"
116
115
  - !ruby/object:Gem::Version
117
- version: '9'
116
+ version: '1.0'
118
117
  type: :development
119
118
  prerelease: false
120
119
  version_requirements: !ruby/object:Gem::Requirement
121
120
  requirements:
122
121
  - - "~>"
123
122
  - !ruby/object:Gem::Version
124
- version: '9'
123
+ version: '1.0'
125
124
  description: Ficon finds icons for websites and optionally, the best icon
126
125
  email:
127
126
  - d@nmilne.com
@@ -146,7 +145,6 @@ homepage: https://github.com/dkam/ficon
146
145
  licenses:
147
146
  - MIT
148
147
  metadata: {}
149
- post_install_message:
150
148
  rdoc_options: []
151
149
  require_paths:
152
150
  - lib
@@ -154,16 +152,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
154
152
  requirements:
155
153
  - - ">="
156
154
  - !ruby/object:Gem::Version
157
- version: '0'
155
+ version: '3.0'
158
156
  required_rubygems_version: !ruby/object:Gem::Requirement
159
157
  requirements:
160
158
  - - ">="
161
159
  - !ruby/object:Gem::Version
162
160
  version: '0'
163
161
  requirements: []
164
- rubyforge_project:
165
- rubygems_version: 2.6.11
166
- signing_key:
162
+ rubygems_version: 3.6.9
167
163
  specification_version: 4
168
164
  summary: Find website icons
169
165
  test_files: