link_thumbnailer 3.3.1 → 3.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -1
  3. data/Gemfile +5 -3
  4. data/Rakefile +2 -0
  5. data/lib/generators/link_thumbnailer/install_generator.rb +2 -0
  6. data/lib/generators/templates/initializer.rb +2 -0
  7. data/lib/link_thumbnailer.rb +2 -0
  8. data/lib/link_thumbnailer/configuration.rb +72 -70
  9. data/lib/link_thumbnailer/exceptions.rb +2 -0
  10. data/lib/link_thumbnailer/grader.rb +2 -0
  11. data/lib/link_thumbnailer/graders/base.rb +2 -0
  12. data/lib/link_thumbnailer/graders/html_attribute.rb +2 -0
  13. data/lib/link_thumbnailer/graders/length.rb +2 -0
  14. data/lib/link_thumbnailer/graders/link_density.rb +2 -0
  15. data/lib/link_thumbnailer/graders/position.rb +2 -0
  16. data/lib/link_thumbnailer/image_comparator.rb +2 -0
  17. data/lib/link_thumbnailer/image_comparators/base.rb +2 -0
  18. data/lib/link_thumbnailer/image_comparators/size.rb +2 -0
  19. data/lib/link_thumbnailer/image_parser.rb +13 -1
  20. data/lib/link_thumbnailer/image_validator.rb +2 -0
  21. data/lib/link_thumbnailer/model.rb +20 -17
  22. data/lib/link_thumbnailer/models/description.rb +2 -0
  23. data/lib/link_thumbnailer/models/favicon.rb +2 -0
  24. data/lib/link_thumbnailer/models/image.rb +56 -54
  25. data/lib/link_thumbnailer/models/title.rb +2 -0
  26. data/lib/link_thumbnailer/models/video.rb +2 -0
  27. data/lib/link_thumbnailer/models/website.rb +54 -52
  28. data/lib/link_thumbnailer/page.rb +2 -0
  29. data/lib/link_thumbnailer/parser.rb +2 -0
  30. data/lib/link_thumbnailer/processor.rb +2 -0
  31. data/lib/link_thumbnailer/railtie.rb +2 -0
  32. data/lib/link_thumbnailer/response.rb +2 -0
  33. data/lib/link_thumbnailer/scraper.rb +62 -60
  34. data/lib/link_thumbnailer/scrapers/base.rb +69 -67
  35. data/lib/link_thumbnailer/scrapers/default/base.rb +2 -0
  36. data/lib/link_thumbnailer/scrapers/default/description.rb +2 -0
  37. data/lib/link_thumbnailer/scrapers/default/favicon.rb +2 -0
  38. data/lib/link_thumbnailer/scrapers/default/images.rb +5 -1
  39. data/lib/link_thumbnailer/scrapers/default/title.rb +2 -0
  40. data/lib/link_thumbnailer/scrapers/default/videos.rb +2 -0
  41. data/lib/link_thumbnailer/scrapers/opengraph/base.rb +2 -0
  42. data/lib/link_thumbnailer/scrapers/opengraph/description.rb +2 -0
  43. data/lib/link_thumbnailer/scrapers/opengraph/favicon.rb +2 -0
  44. data/lib/link_thumbnailer/scrapers/opengraph/image.rb +2 -0
  45. data/lib/link_thumbnailer/scrapers/opengraph/images.rb +2 -0
  46. data/lib/link_thumbnailer/scrapers/opengraph/title.rb +2 -0
  47. data/lib/link_thumbnailer/scrapers/opengraph/video.rb +2 -0
  48. data/lib/link_thumbnailer/scrapers/opengraph/videos.rb +2 -0
  49. data/lib/link_thumbnailer/uri.rb +2 -0
  50. data/lib/link_thumbnailer/version.rb +3 -1
  51. data/lib/link_thumbnailer/video_parser.rb +3 -1
  52. data/link_thumbnailer.gemspec +7 -5
  53. data/spec/configuration_spec.rb +2 -0
  54. data/spec/fixture_spec.rb +2 -0
  55. data/spec/grader_spec.rb +2 -0
  56. data/spec/graders/base_spec.rb +2 -0
  57. data/spec/graders/html_attribute_spec.rb +2 -0
  58. data/spec/graders/length_spec.rb +2 -0
  59. data/spec/graders/link_density_spec.rb +2 -0
  60. data/spec/graders/position_spec.rb +2 -0
  61. data/spec/image_comparators/size_spec.rb +2 -0
  62. data/spec/image_validator_spec.rb +2 -0
  63. data/spec/model_spec.rb +2 -0
  64. data/spec/models/description_spec.rb +2 -0
  65. data/spec/models/favicon_spec.rb +2 -0
  66. data/spec/models/image_spec.rb +2 -0
  67. data/spec/models/title_spec.rb +2 -0
  68. data/spec/models/video_spec.rb +2 -0
  69. data/spec/models/website_spec.rb +2 -0
  70. data/spec/page_spec.rb +2 -0
  71. data/spec/processor_spec.rb +2 -0
  72. data/spec/response_spec.rb +2 -0
  73. data/spec/scraper_spec.rb +2 -0
  74. data/spec/scrapers/base_spec.rb +2 -0
  75. data/spec/scrapers/opengraph/base_spec.rb +2 -0
  76. data/spec/spec_helper.rb +2 -0
  77. data/spec/uri_spec.rb +2 -0
  78. data/spec/video_parser_spec.rb +2 -0
  79. metadata +23 -23
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/model'
2
4
 
3
5
  module LinkThumbnailer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/model'
2
4
  require 'link_thumbnailer/video_parser'
3
5
 
@@ -1,52 +1,54 @@
1
- require 'link_thumbnailer/model'
2
-
3
- module LinkThumbnailer
4
- module Models
5
- class Website < ::LinkThumbnailer::Model
6
-
7
- attr_accessor :url, :title, :description, :images, :videos, :favicon
8
-
9
- def initialize
10
- @images = []
11
- @videos = []
12
- end
13
-
14
- def video=(video)
15
- self.videos = video
16
- end
17
-
18
- def videos=(videos)
19
- Array(videos).each do |video|
20
- @videos << video
21
- end
22
- end
23
-
24
- def image=(image)
25
- self.images = image
26
- end
27
-
28
- def images=(images)
29
- Array(images).each do |image|
30
- next unless image.valid?
31
- @images << image
32
- end
33
- end
34
-
35
- def images
36
- @images.sort!
37
- end
38
-
39
- def as_json(*)
40
- {
41
- url: url.to_s,
42
- favicon: favicon,
43
- title: title,
44
- description: description,
45
- images: images.map(&:as_json),
46
- videos: videos.map(&:as_json)
47
- }
48
- end
49
-
50
- end
51
- end
52
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'link_thumbnailer/model'
4
+
5
+ module LinkThumbnailer
6
+ module Models
7
+ class Website < ::LinkThumbnailer::Model
8
+
9
+ attr_accessor :url, :title, :description, :images, :videos, :favicon
10
+
11
+ def initialize
12
+ @images = []
13
+ @videos = []
14
+ end
15
+
16
+ def video=(video)
17
+ self.videos = video
18
+ end
19
+
20
+ def videos=(videos)
21
+ Array(videos).each do |video|
22
+ @videos << video
23
+ end
24
+ end
25
+
26
+ def image=(image)
27
+ self.images = image
28
+ end
29
+
30
+ def images=(images)
31
+ Array(images).each do |image|
32
+ next unless image.valid?
33
+ @images << image
34
+ end
35
+ end
36
+
37
+ def images
38
+ @images.sort!
39
+ end
40
+
41
+ def as_json(*)
42
+ {
43
+ url: url.to_s,
44
+ favicon: favicon,
45
+ title: title,
46
+ description: description,
47
+ images: images.map(&:as_json),
48
+ videos: videos.map(&:as_json)
49
+ }
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/response'
2
4
  require 'link_thumbnailer/processor'
3
5
  require 'link_thumbnailer/scraper'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'nokogiri'
2
4
 
3
5
  module LinkThumbnailer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delegate'
2
4
  require 'uri'
3
5
  require 'net/http/persistent'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  class Railtie < ::Rails::Railtie
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  class Response
3
5
  def initialize(response)
@@ -1,60 +1,62 @@
1
- require 'delegate'
2
- require 'active_support/core_ext/object/blank'
3
- require 'active_support/inflector'
4
-
5
- require 'link_thumbnailer/parser'
6
- require 'link_thumbnailer/models/website'
7
- require 'link_thumbnailer/scrapers/default/title'
8
- require 'link_thumbnailer/scrapers/opengraph/title'
9
- require 'link_thumbnailer/scrapers/default/description'
10
- require 'link_thumbnailer/scrapers/opengraph/description'
11
- require 'link_thumbnailer/scrapers/default/images'
12
- require 'link_thumbnailer/scrapers/opengraph/images'
13
- require 'link_thumbnailer/scrapers/default/videos'
14
- require 'link_thumbnailer/scrapers/opengraph/videos'
15
- require 'link_thumbnailer/scrapers/default/favicon'
16
- require 'link_thumbnailer/scrapers/opengraph/favicon'
17
-
18
- module LinkThumbnailer
19
- class Scraper < ::SimpleDelegator
20
-
21
- attr_reader :document, :source, :url, :config, :website
22
-
23
- def initialize(source, url)
24
- @source = source
25
- @url = url
26
- @config = ::LinkThumbnailer.page.config
27
- @document = parser.call(source)
28
- @website = ::LinkThumbnailer::Models::Website.new
29
- @website.url = url
30
-
31
- super(config)
32
- end
33
-
34
- def call
35
- config.attributes.each do |name|
36
- config.scrapers.each do |scraper_prefix|
37
- scraper_class(scraper_prefix, name).new(document, website).call(name.to_s)
38
- break unless website.send(name).blank?
39
- end
40
- end
41
-
42
- website
43
- end
44
-
45
- private
46
-
47
- def scraper_class(prefix, name)
48
- prefix = "::LinkThumbnailer::Scrapers::#{prefix.to_s.camelize}"
49
- name = name.to_s.camelize
50
- "#{prefix}::#{name}".constantize
51
- rescue NameError
52
- raise ::LinkThumbnailer::ScraperInvalid, "scraper named '#{prefix}::#{name}' does not exists."
53
- end
54
-
55
- def parser
56
- ::LinkThumbnailer::Parser.new
57
- end
58
-
59
- end
60
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+ require 'active_support/core_ext/object/blank'
5
+ require 'active_support/inflector'
6
+
7
+ require 'link_thumbnailer/parser'
8
+ require 'link_thumbnailer/models/website'
9
+ require 'link_thumbnailer/scrapers/default/title'
10
+ require 'link_thumbnailer/scrapers/opengraph/title'
11
+ require 'link_thumbnailer/scrapers/default/description'
12
+ require 'link_thumbnailer/scrapers/opengraph/description'
13
+ require 'link_thumbnailer/scrapers/default/images'
14
+ require 'link_thumbnailer/scrapers/opengraph/images'
15
+ require 'link_thumbnailer/scrapers/default/videos'
16
+ require 'link_thumbnailer/scrapers/opengraph/videos'
17
+ require 'link_thumbnailer/scrapers/default/favicon'
18
+ require 'link_thumbnailer/scrapers/opengraph/favicon'
19
+
20
+ module LinkThumbnailer
21
+ class Scraper < ::SimpleDelegator
22
+
23
+ attr_reader :document, :source, :url, :config, :website
24
+
25
+ def initialize(source, url)
26
+ @source = source
27
+ @url = url
28
+ @config = ::LinkThumbnailer.page.config
29
+ @document = parser.call(source)
30
+ @website = ::LinkThumbnailer::Models::Website.new
31
+ @website.url = url
32
+
33
+ super(config)
34
+ end
35
+
36
+ def call
37
+ config.attributes.each do |name|
38
+ config.scrapers.each do |scraper_prefix|
39
+ scraper_class(scraper_prefix, name).new(document, website).call(name.to_s)
40
+ break unless website.send(name).blank?
41
+ end
42
+ end
43
+
44
+ website
45
+ end
46
+
47
+ private
48
+
49
+ def scraper_class(prefix, name)
50
+ prefix = "::LinkThumbnailer::Scrapers::#{prefix.to_s.camelize}"
51
+ name = name.to_s.camelize
52
+ "#{prefix}::#{name}".constantize
53
+ rescue NameError
54
+ raise ::LinkThumbnailer::ScraperInvalid, "scraper named '#{prefix}::#{name}' does not exists."
55
+ end
56
+
57
+ def parser
58
+ ::LinkThumbnailer::Parser.new
59
+ end
60
+
61
+ end
62
+ end
@@ -1,67 +1,69 @@
1
- require 'delegate'
2
- require 'link_thumbnailer/models/title'
3
- require 'link_thumbnailer/models/description'
4
- require 'link_thumbnailer/models/image'
5
- require 'link_thumbnailer/models/video'
6
-
7
- module LinkThumbnailer
8
- module Scrapers
9
- class Base < ::SimpleDelegator
10
-
11
- attr_reader :config, :document, :website, :attribute_name
12
-
13
- def initialize(document, website = nil)
14
- @config = ::LinkThumbnailer.page.config
15
- @document = document
16
- @website = website
17
-
18
- super(config)
19
- end
20
-
21
- def call(attribute_name)
22
- return false unless website.present?
23
- return false unless applicable?
24
-
25
- @attribute_name = attribute_name
26
-
27
- website.send("#{attribute_name}=", value)
28
- website
29
- end
30
-
31
- def applicable?
32
- true
33
- end
34
-
35
- def value
36
- fail NotImplementedError
37
- end
38
-
39
- private
40
-
41
- def meta_xpath(options = {})
42
- meta_xpaths(options).first
43
- end
44
-
45
- def meta_xpaths(options = {})
46
- key = options.fetch(:key, :property)
47
- value = options.fetch(:value, :content)
48
- attribute = options.fetch(:attribute, attribute_name)
49
-
50
- document.xpath("//meta[translate(@#{key},'#{abc.upcase}','#{abc}') = '#{attribute}' and string-length(@#{value}) > 0]")
51
- end
52
-
53
- def abc
54
- 'abcdefghijklmnopqrstuvwxyz'
55
- end
56
-
57
- def model_class
58
- "::LinkThumbnailer::Models::#{attribute_name.to_s.camelize}".constantize
59
- end
60
-
61
- def modelize(node, text = nil)
62
- model_class.new(node, text)
63
- end
64
-
65
- end
66
- end
67
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+ require 'link_thumbnailer/models/title'
5
+ require 'link_thumbnailer/models/description'
6
+ require 'link_thumbnailer/models/image'
7
+ require 'link_thumbnailer/models/video'
8
+
9
+ module LinkThumbnailer
10
+ module Scrapers
11
+ class Base < ::SimpleDelegator
12
+
13
+ attr_reader :config, :document, :website, :attribute_name
14
+
15
+ def initialize(document, website = nil)
16
+ @config = ::LinkThumbnailer.page.config
17
+ @document = document
18
+ @website = website
19
+
20
+ super(config)
21
+ end
22
+
23
+ def call(attribute_name)
24
+ return false unless website.present?
25
+ return false unless applicable?
26
+
27
+ @attribute_name = attribute_name
28
+
29
+ website.send("#{attribute_name}=", value)
30
+ website
31
+ end
32
+
33
+ def applicable?
34
+ true
35
+ end
36
+
37
+ def value
38
+ fail NotImplementedError
39
+ end
40
+
41
+ private
42
+
43
+ def meta_xpath(options = {})
44
+ meta_xpaths(options).first
45
+ end
46
+
47
+ def meta_xpaths(options = {})
48
+ key = options.fetch(:key, :property)
49
+ value = options.fetch(:value, :content)
50
+ attribute = options.fetch(:attribute, attribute_name)
51
+
52
+ document.xpath("//meta[translate(@#{key},'#{abc.upcase}','#{abc}') = '#{attribute}' and string-length(@#{value}) > 0]")
53
+ end
54
+
55
+ def abc
56
+ 'abcdefghijklmnopqrstuvwxyz'
57
+ end
58
+
59
+ def model_class
60
+ "::LinkThumbnailer::Models::#{attribute_name.to_s.camelize}".constantize
61
+ end
62
+
63
+ def modelize(node, text = nil)
64
+ model_class.new(node, text)
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/scrapers/base'
2
4
 
3
5
  module LinkThumbnailer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/scrapers/default/base'
2
4
 
3
5
  module LinkThumbnailer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/scrapers/default/base'
2
4
  require 'link_thumbnailer/models/favicon'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/scrapers/default/base'
2
4
  require 'link_thumbnailer/models/image'
3
5
 
@@ -57,7 +59,9 @@ module LinkThumbnailer
57
59
 
58
60
  def base_href
59
61
  base = document.at('//head/base')
60
- base['href'] if base
62
+ base['href'] if base && ::URI.parse(base['href']).host
63
+ rescue ::URI::InvalidURIError
64
+ nil
61
65
  end
62
66
 
63
67
  def model_class