link_thumbnailer 3.3.1 → 3.3.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.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fef68fdf205078290139fd831a9b8d46581e64eb
4
- data.tar.gz: 27a3e86b0181068e06bd80e8f053fca17d3a906b
3
+ metadata.gz: 281992a6403788c75541c08d69586ab9b85c097e
4
+ data.tar.gz: 7cd32584b4c3a96b6a54185576597115fdb84764
5
5
  SHA512:
6
- metadata.gz: 5dcfa7683c65f546ce8e794d51c9d7103736fb3cf9f5919ddbcea611fbe7243faf3ef76ed372d99ea316a6d193032d9b47e48411dc9c0fb1c972d77c29bc2a2a
7
- data.tar.gz: e041d9174be5b066fac70b70b965bc28b053235bffa808c0a109c3c1f10512643ae58dc21b3f8691ca3ff6a3b9f5346e31c4b0cf1430d16ac829244d3252ab96
6
+ metadata.gz: d77d1ae2545a92f79363a1e90d19edd61c610080d5497207cf22bdb9afe0d0acb5569aa95d7c16485dc9aa3ff0beac5c900b7cea24278d87d5a0812900f7aa91
7
+ data.tar.gz: 69c55be441d1581c50e54b3f3652130d8c4f9220047714607d978a993c6be581b28b70cb19a62ad3f27dc09c91455d67f4e83bceff753b451a4d3b3a1e532763
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
+ # 3.3.2
2
+
3
+ - Frozen strings https://github.com/gottfrois/link_thumbnailer/pull/125
4
+
1
5
  # 3.3.1
2
6
 
3
- Gem upgrade (json)
7
+ - Gem upgrade (json)
4
8
 
5
9
  # 3.3.0
6
10
 
data/Gemfile CHANGED
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in link_thumbnailer.gemspec
4
6
  gemspec
5
7
 
6
8
  group :development, :test do
7
- gem 'rspec', '~> 3.5.0'
8
- gem 'webmock', '~> 2.3.2'
9
- gem 'pry', '~> 0.10.4'
9
+ gem 'rspec', '>= 2.14'
10
+ gem 'webmock', '>= 1.14'
11
+ gem 'pry', '>= 0.9'
10
12
  end
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  module Generators
3
5
  class InstallGenerator < ::Rails::Generators::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Use this hook to configure LinkThumbnailer bahaviors.
2
4
  LinkThumbnailer.configure do |config|
3
5
  # Numbers of redirects before raising an exception when trying to parse given url.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'link_thumbnailer/version'
3
5
  require 'link_thumbnailer/configuration'
@@ -1,70 +1,72 @@
1
- module LinkThumbnailer
2
-
3
- # Access point for the gem configurations.
4
- #
5
- # @return [LinkThumbnailer::Configuration] a configuration instance.
6
- def self.config
7
- @config ||= Configuration.new
8
- end
9
-
10
- # Configure hook used in the gem initializer. Convinient way to set all the
11
- # gem configurations.
12
- #
13
- # @example inside config/initializers/link_thumbnaler.rb
14
- # LinkThumbnailer.configure do |config|
15
- # config.user_agent = 'link_thumbnailer'
16
- # end
17
- #
18
- # @return [void]
19
- def self.configure
20
- yield config if block_given?
21
- end
22
-
23
- class Configuration
24
-
25
- attr_accessor :redirect_limit, :blacklist_urls, :user_agent,
26
- :verify_ssl, :http_open_timeout, :http_read_timeout, :attributes,
27
- :graders, :description_min_length, :positive_regex, :negative_regex,
28
- :image_limit, :image_stats, :raise_on_invalid_format, :max_concurrency,
29
- :scrapers, :http_override_headers, :encoding
30
-
31
- alias_method :http_timeout, :http_open_timeout
32
- alias_method :http_timeout=, :http_open_timeout=
33
-
34
- # Create a new instance.
35
- #
36
- # @return [LinkThumbnailer::Configuration]
37
- def initialize
38
- @redirect_limit = 3
39
- @user_agent = 'link_thumbnailer'
40
- @verify_ssl = true
41
- @http_open_timeout = 5
42
- @http_read_timeout = 5
43
- @blacklist_urls = [
44
- %r{^http://ad\.doubleclick\.net/},
45
- %r{^http://b\.scorecardresearch\.com/},
46
- %r{^http://pixel\.quantserve\.com/},
47
- %r{^http://s7\.addthis\.com/}
48
- ]
49
- @attributes = [:title, :images, :description, :videos, :favicon]
50
- @graders = [
51
- ->(description) { ::LinkThumbnailer::Graders::Length.new(description) },
52
- ->(description) { ::LinkThumbnailer::Graders::HtmlAttribute.new(description, :class) },
53
- ->(description) { ::LinkThumbnailer::Graders::HtmlAttribute.new(description, :id) },
54
- ->(description) { ::LinkThumbnailer::Graders::Position.new(description, weigth: 3) },
55
- ->(description) { ::LinkThumbnailer::Graders::LinkDensity.new(description) },
56
- ]
57
- @description_min_length = 50
58
- @positive_regex = /article|body|content|entry|hentry|main|page|pagination|post|text|blog|story/i
59
- @negative_regex = /combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget|modal/i
60
- @image_limit = 5
61
- @image_stats = true
62
- @raise_on_invalid_format = false
63
- @max_concurrency = 20
64
- @scrapers = [:opengraph, :default]
65
- @http_override_headers = { 'Accept-Encoding' => 'none' }
66
- @encoding = 'utf-8'
67
- end
68
-
69
- end
70
- end
1
+ # frozen_string_literal: true
2
+
3
+ module LinkThumbnailer
4
+
5
+ # Access point for the gem configurations.
6
+ #
7
+ # @return [LinkThumbnailer::Configuration] a configuration instance.
8
+ def self.config
9
+ @config ||= Configuration.new
10
+ end
11
+
12
+ # Configure hook used in the gem initializer. Convinient way to set all the
13
+ # gem configurations.
14
+ #
15
+ # @example inside config/initializers/link_thumbnaler.rb
16
+ # LinkThumbnailer.configure do |config|
17
+ # config.user_agent = 'link_thumbnailer'
18
+ # end
19
+ #
20
+ # @return [void]
21
+ def self.configure
22
+ yield config if block_given?
23
+ end
24
+
25
+ class Configuration
26
+
27
+ attr_accessor :redirect_limit, :blacklist_urls, :user_agent,
28
+ :verify_ssl, :http_open_timeout, :http_read_timeout, :attributes,
29
+ :graders, :description_min_length, :positive_regex, :negative_regex,
30
+ :image_limit, :image_stats, :raise_on_invalid_format, :max_concurrency,
31
+ :scrapers, :http_override_headers, :encoding
32
+
33
+ alias_method :http_timeout, :http_open_timeout
34
+ alias_method :http_timeout=, :http_open_timeout=
35
+
36
+ # Create a new instance.
37
+ #
38
+ # @return [LinkThumbnailer::Configuration]
39
+ def initialize
40
+ @redirect_limit = 3
41
+ @user_agent = 'link_thumbnailer'
42
+ @verify_ssl = true
43
+ @http_open_timeout = 5
44
+ @http_read_timeout = 5
45
+ @blacklist_urls = [
46
+ %r{^http://ad\.doubleclick\.net/},
47
+ %r{^http://b\.scorecardresearch\.com/},
48
+ %r{^http://pixel\.quantserve\.com/},
49
+ %r{^http://s7\.addthis\.com/}
50
+ ]
51
+ @attributes = [:title, :images, :description, :videos, :favicon]
52
+ @graders = [
53
+ ->(description) { ::LinkThumbnailer::Graders::Length.new(description) },
54
+ ->(description) { ::LinkThumbnailer::Graders::HtmlAttribute.new(description, :class) },
55
+ ->(description) { ::LinkThumbnailer::Graders::HtmlAttribute.new(description, :id) },
56
+ ->(description) { ::LinkThumbnailer::Graders::Position.new(description, weigth: 3) },
57
+ ->(description) { ::LinkThumbnailer::Graders::LinkDensity.new(description) },
58
+ ]
59
+ @description_min_length = 50
60
+ @positive_regex = /article|body|content|entry|hentry|main|page|pagination|post|text|blog|story/i
61
+ @negative_regex = /combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget|modal/i
62
+ @image_limit = 5
63
+ @image_stats = true
64
+ @raise_on_invalid_format = false
65
+ @max_concurrency = 20
66
+ @scrapers = [:opengraph, :default]
67
+ @http_override_headers = { 'Accept-Encoding' => 'none' }
68
+ @encoding = 'utf-8'
69
+ end
70
+
71
+ end
72
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  Exceptions = Class.new(StandardError)
3
5
  RedirectLimit = Class.new(Exceptions)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delegate'
2
4
  require 'link_thumbnailer/graders/base'
3
5
  require 'link_thumbnailer/graders/length'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delegate'
2
4
 
3
5
  module LinkThumbnailer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  module Graders
3
5
  class HtmlAttribute < ::LinkThumbnailer::Graders::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  module Graders
3
5
  class Length < ::LinkThumbnailer::Graders::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  module Graders
3
5
  class LinkDensity < ::LinkThumbnailer::Graders::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  module Graders
3
5
  class Position < ::LinkThumbnailer::Graders::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/image_comparators/base'
2
4
  require 'link_thumbnailer/image_comparators/size'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  module ImageComparators
3
5
  class Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LinkThumbnailer
2
4
  module ImageComparators
3
5
  class Size < ::LinkThumbnailer::ImageComparators::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'image_info'
2
4
 
3
5
  module LinkThumbnailer
@@ -6,7 +8,7 @@ module LinkThumbnailer
6
8
  attr_reader :images
7
9
 
8
10
  def initialize(urls)
9
- @images = perform? ? ::ImageInfo.from(urls, max_concurrency: max_concurrency) : Array(urls).compact.map(&method(:build_default_image))
11
+ @images = perform? ? image_info(urls) : default_images(urls)
10
12
  end
11
13
 
12
14
  def size
@@ -19,6 +21,10 @@ module LinkThumbnailer
19
21
 
20
22
  private
21
23
 
24
+ def default_images(urls)
25
+ Array(urls).compact.map(&method(:build_default_image))
26
+ end
27
+
22
28
  def build_default_image(uri)
23
29
  NullImage.new(uri)
24
30
  end
@@ -31,6 +37,12 @@ module LinkThumbnailer
31
37
  ::LinkThumbnailer.page.config.max_concurrency
32
38
  end
33
39
 
40
+ def image_info(urls)
41
+ ::ImageInfo.from(urls, max_concurrency: max_concurrency)
42
+ rescue
43
+ default_images(urls)
44
+ end
45
+
34
46
  class NullImage
35
47
  attr_reader :uri
36
48
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'delegate'
2
4
 
3
5
  module LinkThumbnailer
@@ -1,17 +1,20 @@
1
- module LinkThumbnailer
2
- class Model
3
-
4
- def to_json(*args)
5
- as_json.to_json(*args)
6
- end
7
-
8
- private
9
-
10
- def sanitize(str)
11
- return unless str
12
-
13
- str.encode!("UTF-16", "UTF-8", invalid: :replace, undef: :replace, replace: "")
14
- str.encode!("UTF-8", "UTF-16").strip.gsub(/[\r\n\f]+/, "\n")
15
- end
16
- end
17
- end
1
+ # frozen_string_literal: true
2
+
3
+ module LinkThumbnailer
4
+ class Model
5
+
6
+ def to_json(*args)
7
+ as_json.to_json(*args)
8
+ end
9
+
10
+ private
11
+
12
+ def sanitize(str)
13
+ return unless str
14
+
15
+ str = str.dup
16
+ str.encode!("UTF-16", "UTF-8", invalid: :replace, undef: :replace, replace: "")
17
+ str.encode!("UTF-8", "UTF-16").strip.gsub(/[\r\n\f]+/, "\n")
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/model'
2
4
  require 'link_thumbnailer/grader'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'link_thumbnailer/model'
2
4
 
3
5
  module LinkThumbnailer
@@ -1,54 +1,56 @@
1
- require 'link_thumbnailer/model'
2
- require 'link_thumbnailer/image_parser'
3
- require 'link_thumbnailer/image_comparator'
4
- require 'link_thumbnailer/image_validator'
5
-
6
- module LinkThumbnailer
7
- module Models
8
- class Image < ::LinkThumbnailer::Model
9
-
10
- attr_reader :src, :type, :size
11
-
12
- def initialize(src, size = nil, type = nil)
13
- @src = src
14
- @size = size || parser.size
15
- @type = type || parser.type
16
- end
17
-
18
- def to_s
19
- src.to_s
20
- end
21
-
22
- def <=>(other)
23
- comparator.call(other)
24
- end
25
-
26
- def valid?
27
- validator.call
28
- end
29
-
30
- def as_json(*)
31
- {
32
- src: src.to_s,
33
- size: size,
34
- type: type
35
- }
36
- end
37
-
38
- private
39
-
40
- def parser
41
- @parser ||= ::LinkThumbnailer::ImageParser.new(src)
42
- end
43
-
44
- def validator
45
- ::LinkThumbnailer::ImageValidator.new(self)
46
- end
47
-
48
- def comparator
49
- ::LinkThumbnailer::ImageComparator.new(self)
50
- end
51
-
52
- end
53
- end
54
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'link_thumbnailer/model'
4
+ require 'link_thumbnailer/image_parser'
5
+ require 'link_thumbnailer/image_comparator'
6
+ require 'link_thumbnailer/image_validator'
7
+
8
+ module LinkThumbnailer
9
+ module Models
10
+ class Image < ::LinkThumbnailer::Model
11
+
12
+ attr_reader :src, :type, :size
13
+
14
+ def initialize(src, size = nil, type = nil)
15
+ @src = src
16
+ @size = size || parser.size
17
+ @type = type || parser.type
18
+ end
19
+
20
+ def to_s
21
+ src.to_s
22
+ end
23
+
24
+ def <=>(other)
25
+ comparator.call(other)
26
+ end
27
+
28
+ def valid?
29
+ validator.call
30
+ end
31
+
32
+ def as_json(*)
33
+ {
34
+ src: src.to_s,
35
+ size: size,
36
+ type: type
37
+ }
38
+ end
39
+
40
+ private
41
+
42
+ def parser
43
+ @parser ||= ::LinkThumbnailer::ImageParser.new(src)
44
+ end
45
+
46
+ def validator
47
+ ::LinkThumbnailer::ImageValidator.new(self)
48
+ end
49
+
50
+ def comparator
51
+ ::LinkThumbnailer::ImageComparator.new(self)
52
+ end
53
+
54
+ end
55
+ end
56
+ end