link_thumbnailer 3.3.0 → 3.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/.travis.yml +2 -1
- data/CHANGELOG.md +4 -0
- data/Gemfile +3 -3
- data/README.md +4 -0
- data/lib/generators/templates/initializer.rb +4 -0
- data/lib/link_thumbnailer/configuration.rb +2 -1
- data/lib/link_thumbnailer/page.rb +1 -0
- data/lib/link_thumbnailer/parser.rb +1 -1
- data/lib/link_thumbnailer/processor.rb +1 -1
- data/lib/link_thumbnailer/response.rb +37 -0
- data/lib/link_thumbnailer/version.rb +1 -1
- data/link_thumbnailer.gemspec +6 -6
- data/spec/configuration_spec.rb +2 -2
- data/spec/fixtures/google_shift_jis.html +6 -0
- data/spec/fixtures/google_utf8.html +6 -0
- data/spec/grader_spec.rb +1 -1
- data/spec/graders/html_attribute_spec.rb +7 -7
- data/spec/graders/length_spec.rb +8 -6
- data/spec/graders/link_density_spec.rb +2 -2
- data/spec/graders/position_spec.rb +6 -6
- data/spec/image_validator_spec.rb +1 -1
- data/spec/models/description_spec.rb +1 -1
- data/spec/models/image_spec.rb +4 -4
- data/spec/models/video_spec.rb +5 -5
- data/spec/models/website_spec.rb +3 -3
- data/spec/processor_spec.rb +50 -21
- data/spec/response_spec.rb +60 -0
- data/spec/scraper_spec.rb +4 -4
- data/spec/scrapers/base_spec.rb +4 -4
- data/spec/scrapers/opengraph/base_spec.rb +6 -6
- data/spec/uri_spec.rb +2 -2
- data/spec/video_parser_spec.rb +13 -13
- metadata +21 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fef68fdf205078290139fd831a9b8d46581e64eb
|
4
|
+
data.tar.gz: 27a3e86b0181068e06bd80e8f053fca17d3a906b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5dcfa7683c65f546ce8e794d51c9d7103736fb3cf9f5919ddbcea611fbe7243faf3ef76ed372d99ea316a6d193032d9b47e48411dc9c0fb1c972d77c29bc2a2a
|
7
|
+
data.tar.gz: e041d9174be5b066fac70b70b965bc28b053235bffa808c0a109c3c1f10512643ae58dc21b3f8691ca3ff6a3b9f5346e31c4b0cf1430d16ac829244d3252ab96
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.0
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -165,6 +165,10 @@ LinkThumbnailer.configure do |config|
|
|
165
165
|
# Sets number of concurrent http connections that can be opened to fetch images informations such as size and type.
|
166
166
|
#
|
167
167
|
# config.max_concurrency = 20
|
168
|
+
|
169
|
+
# Sets the default encoding.
|
170
|
+
#
|
171
|
+
# config.encoding = 'utf-8'
|
168
172
|
end
|
169
173
|
```
|
170
174
|
|
@@ -80,4 +80,8 @@ LinkThumbnailer.configure do |config|
|
|
80
80
|
# Defines the strategies to use to scrap the website. See the [Open Graph Protocol](http://ogp.me/) for more information.
|
81
81
|
#
|
82
82
|
# config.scrapers = [:opengraph, :default]
|
83
|
+
|
84
|
+
# Sets the default encoding.
|
85
|
+
#
|
86
|
+
# config.encoding = 'utf-8'
|
83
87
|
end
|
@@ -26,7 +26,7 @@ module LinkThumbnailer
|
|
26
26
|
:verify_ssl, :http_open_timeout, :http_read_timeout, :attributes,
|
27
27
|
:graders, :description_min_length, :positive_regex, :negative_regex,
|
28
28
|
:image_limit, :image_stats, :raise_on_invalid_format, :max_concurrency,
|
29
|
-
:scrapers, :http_override_headers
|
29
|
+
:scrapers, :http_override_headers, :encoding
|
30
30
|
|
31
31
|
alias_method :http_timeout, :http_open_timeout
|
32
32
|
alias_method :http_timeout=, :http_open_timeout=
|
@@ -63,6 +63,7 @@ module LinkThumbnailer
|
|
63
63
|
@max_concurrency = 20
|
64
64
|
@scrapers = [:opengraph, :default]
|
65
65
|
@http_override_headers = { 'Accept-Encoding' => 'none' }
|
66
|
+
@encoding = 'utf-8'
|
66
67
|
end
|
67
68
|
|
68
69
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module LinkThumbnailer
|
2
|
+
class Response
|
3
|
+
def initialize(response)
|
4
|
+
@response = response
|
5
|
+
end
|
6
|
+
|
7
|
+
def charset
|
8
|
+
@charset ||= extract_charset
|
9
|
+
end
|
10
|
+
|
11
|
+
def body
|
12
|
+
@body ||= extract_body
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def extract_charset
|
18
|
+
content_type = @response['Content-Type'] || ''
|
19
|
+
m = content_type.match(/charset=(\w+)/)
|
20
|
+
(m && m[1]) || ''
|
21
|
+
end
|
22
|
+
|
23
|
+
def extract_body
|
24
|
+
should_convert_body_to_utf8? ? convert_encoding_to_utf8(@response.body, charset) : @response.body
|
25
|
+
end
|
26
|
+
|
27
|
+
def should_convert_body_to_utf8?
|
28
|
+
charset != '' && charset != 'utf-8'
|
29
|
+
end
|
30
|
+
|
31
|
+
def convert_encoding_to_utf8(body, from)
|
32
|
+
Encoding::Converter.new(from, 'utf-8').convert(body)
|
33
|
+
rescue EncodingError
|
34
|
+
body
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/link_thumbnailer.gemspec
CHANGED
@@ -18,10 +18,10 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
20
|
spec.add_dependency 'activesupport', '>= 3.0'
|
21
|
-
spec.add_dependency 'json',
|
22
|
-
spec.add_dependency 'rake', '>= 0.9'
|
23
|
-
spec.add_dependency 'nokogiri', '~> 1.
|
24
|
-
spec.add_dependency 'net-http-persistent', '~>
|
25
|
-
spec.add_dependency 'video_info', '~> 2.
|
26
|
-
spec.add_dependency 'image_info', '~> 1.
|
21
|
+
spec.add_dependency 'json', '~> 2.1'
|
22
|
+
spec.add_dependency 'rake', ['>= 0.9']
|
23
|
+
spec.add_dependency 'nokogiri', '~> 1.7'
|
24
|
+
spec.add_dependency 'net-http-persistent', '~> 3.0'
|
25
|
+
spec.add_dependency 'video_info', '~> 2.7'
|
26
|
+
spec.add_dependency 'image_info', '~> 1.1'
|
27
27
|
end
|
data/spec/configuration_spec.rb
CHANGED
@@ -18,6 +18,7 @@ describe LinkThumbnailer::Configuration do
|
|
18
18
|
it { expect(instance.image_limit).to eq(5) }
|
19
19
|
it { expect(instance.image_stats).to eq(true) }
|
20
20
|
it { expect(instance.max_concurrency).to eq(20) }
|
21
|
+
it { expect(instance.encoding).to eq('utf-8') }
|
21
22
|
|
22
23
|
describe "#http_timeout" do
|
23
24
|
it { expect(instance.method(:http_timeout)).to eq(instance.method(:http_open_timeout)) }
|
@@ -33,7 +34,7 @@ describe LinkThumbnailer::Configuration do
|
|
33
34
|
describe '.configure' do
|
34
35
|
|
35
36
|
before do
|
36
|
-
LinkThumbnailer.
|
37
|
+
allow(LinkThumbnailer).to receive(:config).and_return(instance)
|
37
38
|
end
|
38
39
|
|
39
40
|
context 'when block given' do
|
@@ -56,4 +57,3 @@ describe LinkThumbnailer::Configuration do
|
|
56
57
|
end
|
57
58
|
|
58
59
|
end
|
59
|
-
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="���E���̂���������������邽�߂̃c�[������Ă��܂��B���܂��܂Ȍ����@�\�����p���āA���T���̏��������Ă��������B" name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script>(function(){window.google={kEI:'716VWJL3JYq18QWo_qzoAg',kEXPI:'750722,1351903,1352241,1352381,3700253,3700347,4028875,4029815,4032677,4038012,4043492,4045839,4048347,4062666,4065787,4068816,4069773,4069838,4069840,4070138,4072773,4073405,4073726,4073959,4076096,4076931,4076999,4077777,4078438,4079081,4079105,4079894,4081038,4081485,4082194,4082201,4082298,4082619,4083044,4083476,4084343,4084673,4085336,4085412,4085683,4086011,4089003,4089144,4089183,4089427,4089538,4089913,4090414,4090547,4090549,4090598,4090657,4090806,4090893,4091966,4092028,4092182,4092218,4092474,4092478,4092598,4092864,4092867,4092875,4092897,4092934,4093073,4093948,4094169,4094250,4094769,4094987,4094997,4095554,4095771,4095907,4095998,8300096,8300272,8507380,8507419,8507861,8507940,8508624,8510023,10200083,13500022,13500024',authuser:0,kscs:'c9c918f0_24'};google.kHL='ja';})();(function(){google.lc=[];google.li=0;google.getEI=function(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||google.kEI};google.getLEI=function(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b};google.https=function(){return"https:"==window.location.protocol};google.ml=function(){return null};google.wl=function(a,b){try{google.ml(Error(a),!1,b)}catch(c){}};google.time=function(){return(new Date).getTime()};google.log=function(a,b,c,d,g){a=google.logUrl(a,b,c,d,g);if(""!=a){b=new Image;var e=google.lc,f=google.li;e[f]=b;b.onerror=b.onload=b.onabort=function(){delete e[f]};window.google&&window.google.vel&&window.google.vel.lu&&window.google.vel.lu(a);b.src=a;google.li=f+1}};google.logUrl=function(a,b,c,d,g){var e="",f=google.ls||"";c||-1!=b.search("&ei=")||(e="&ei="+google.getEI(d),-1==b.search("&lei=")&&(d=google.getLEI(d))&&(e+="&lei="+d));a=c||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+b+e+f+"&zx="+google.time();/^http:/i.test(a)&&google.https()&&(google.ml(Error("a"),!1,{src:a,glmm:1}),a="");return a};google.y={};google.x=function(a,b){google.y[a.id]=[a,b];return!1};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};}).call(this);var a=window.location,b=a.href.indexOf("#");if(0<=b){var c=a.href.substring(b+1);/(^|&)q=/.test(c)&&-1==c.indexOf("#")&&a.replace("/search?"+c.replace(/(^|&)fp=[^&]*/g,"")+"&cad=h")};</script><style>#gbar,#guser{font-size:13px;padding-top:1px !important;}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}
|
2
|
+
</style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#36c}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}a.gb1,a.gb2,a.gb3,a.gb4{color:#11c !important}body{background:#fff;color:black}a{color:#11c;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#36c}a:visited{color:#551a8b}a.gb1,a.gb4{text-decoration:underline}a.gb3:hover{text-decoration:none}#ghead a.gb2:hover{color:#fff !important}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#eee;border:solid 1px;border-color:#ccc #999 #999 #ccc;height:30px}.lsbb{display:block}.ftl,#fll a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#ccc}.lst:focus{outline:none}</style><script></script><link href="/images/branding/product/ico/googleg_lodp.ico" rel="shortcut icon"></head><body bgcolor="#fff"><script>(function(){var src='/images/nav_logo229.png';var iesg=false;document.body.onload = function(){window.n && window.n();if (document.images){new Image().src=src;}
|
3
|
+
if (!iesg){document.f&&document.f.q.focus();document.gbqf&&document.gbqf.q.focus();}
|
4
|
+
}
|
5
|
+
})();</script><div id="mngb"> <div id=gbar><nobr><b class=gb1>����</b> <a class=gb1 href="https://www.google.co.jp/imghp?hl=ja&tab=wi">�摜</a> <a class=gb1 href="https://maps.google.co.jp/maps?hl=ja&tab=wl">�}�b�v</a> <a class=gb1 href="https://play.google.com/?hl=ja&tab=w8">Play</a> <a class=gb1 href="https://www.youtube.com/?gl=JP&tab=w1">YouTube</a> <a class=gb1 href="https://news.google.co.jp/nwshp?hl=ja&tab=wn">�j���[�X</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">�h���C�u</a> <a class=gb1 style="text-decoration:none" href="https://www.google.co.jp/intl/ja/options/"><u>�����ƌ���</u> »</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.co.jp/history/optout?hl=ja" class=gb4>�E�F�u����</a> | <a href="/preferences?hl=ja" class=gb4>�ݒ�</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=ja&passive=true&continue=https://www.google.co.jp/" class=gb4>���O�C��</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div> </div><center><br clear="all" id="lgpd"><div id="lga"><div style="padding:28px 0 3px"><div style="height:110px;width:276px;background:url(/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png) no-repeat" title="Google" align="left" id="hplogo" onload="window.lol&&lol()"><div style="color:#777;font-size:16px;font-weight:bold;position:relative;top:70px;left:218px" nowrap="">���{</div></div></div><br></div><form action="/search" name="f"><table cellpadding="0" cellspacing="0"><tr valign="top"><td width="25%"> </td><td align="center" nowrap=""><input name="ie" value="Shift_JIS" type="hidden"><input value="ja" name="hl" type="hidden"><input name="source" type="hidden" value="hp"><input name="biw" type="hidden"><input name="bih" type="hidden"><div class="ds" style="height:32px;margin:4px 0"><input style="color:#000;margin:0;padding:5px 8px 0 6px;vertical-align:top" autocomplete="off" class="lst" value="" title="Google ����" maxlength="2048" name="q" size="57"></div><br style="line-height:0"><span class="ds"><span class="lsbb"><input class="lsb" value="Google ����" name="btnG" type="submit"></span></span><span class="ds"><span class="lsbb"><input class="lsb" value="I'm Feeling Lucky" name="btnI" onclick="if(this.form.q.value)this.checked=1; else top.location='/doodles/'" type="submit"></span></span></td><td class="fl sblc" align="left" nowrap="" width="25%"><a href="/advanced_search?hl=ja&authuser=0">�����I�v�V����</a><a href="/language_tools?hl=ja&authuser=0">����c�[��</a></td></tr></table><input id="gbv" name="gbv" type="hidden" value="1"></form><div id="gac_scont"></div><div style="font-size:83%;min-height:3.5em"><br></div><span id="footer"><div style="font-size:10pt"><div style="margin:19px auto;text-align:center" id="fll"><a href="/intl/ja/ads/">�L���f��</a><a href="http://www.google.co.jp/intl/ja/services/">�r�W�l�X �\�����[�V����</a><a href="https://plus.google.com/115899767381375908215" rel="publisher">+Google</a><a href="/intl/ja/about.html">Google �ɂ���</a><a href="https://www.google.co.jp/setprefdomain?prefdom=US&sig=__NSwOcr0nRFmauaxJWrHJmztdkTc%3D" id="fehl">Google.com</a></div></div><p style="color:#767676;font-size:8pt">© 2017 - <a href="/intl/ja/policies/privacy/">�v���C�o�V�[</a> - <a href="/intl/ja/policies/terms/">�K��</a></p></span></center><script>(function(){window.google.cdo={height:0,width:0};(function(){var a=window.innerWidth,b=window.innerHeight;if(!a||!b)var c=window.document,d="CSS1Compat"==c.compatMode?c.documentElement:c.body,a=d.clientWidth,b=d.clientHeight;a&&b&&(a!=google.cdo.width||b!=google.cdo.height)&&google.log("","","/client_204?&atyp=i&biw="+a+"&bih="+b+"&ei="+google.kEI);}).call(this);})();</script><div id="xjsd"></div><div id="xjsi"><script>(function(){function c(b){window.setTimeout(function(){var a=document.createElement("script");a.src=b;document.getElementById("xjsd").appendChild(a)},0)}google.dljp=function(b,a){google.xjsu=b;c(a)};google.dlj=c;}).call(this);(function(){window.google.xjsrm=[];})();if(google.y)google.y.first=[];if(!google.xjs){window._=window._||{};window._._DumpException=function(e){throw e};if(google.timers&&google.timers.load.t){google.timers.load.t.xjsls=new Date().getTime();}google.dljp('/xjs/_/js/k\x3dxjs.hp.en_US.usfcb5N0rIw.O/m\x3dsb_he,d/rt\x3dj/d\x3d1/t\x3dzcms/rs\x3dACT90oH_6o1ZdJ1OdBerX9LppN-xEd11Eg','/xjs/_/js/k\x3dxjs.hp.en_US.usfcb5N0rIw.O/m\x3dsb_he,d/rt\x3dj/d\x3d1/t\x3dzcms/rs\x3dACT90oH_6o1ZdJ1OdBerX9LppN-xEd11Eg');google.xjs=1;}google.pmc={"sb_he":{"agen":true,"cgen":true,"client":"heirloom-hp","dh":true,"dhqt":true,"ds":"","fl":true,"host":"google.co.jp","isbh":28,"jam":0,"jsonp":true,"msgs":{"cibl":"�������N���A","dym":"����������:","lcky":"I\u0026#39;m Feeling Lucky","lml":"�ڍ�","oskt":"���̓c�[��","psrc":"���̌����L�[���[�h��\u003Ca href=\"/history\"\u003E�E�F�u����\u003C/a\u003E����폜����܂���","psrl":"�폜","sbit":"�摜�Ō���","srch":"Google ����"},"nds":true,"ovr":{},"pq":"","refpd":true,"refspre":true,"rfs":[],"scd":10,"sce":5,"stok":"WXDdTX_0YGr0J9JRNcHRvk23BlI"},"d":{}};google.y.first.push(function(){if(google.med){google.med('init');google.initHistory();google.med('history');}});if(google.j&&google.j.en&&google.j.xi){window.setTimeout(google.j.xi,0);}
|
6
|
+
</script></div></body></html>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。" name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script>(function(){window.google={kEI:'716VWJL3JYq18QWo_qzoAg',kEXPI:'750722,1351903,1352241,1352381,3700253,3700347,4028875,4029815,4032677,4038012,4043492,4045839,4048347,4062666,4065787,4068816,4069773,4069838,4069840,4070138,4072773,4073405,4073726,4073959,4076096,4076931,4076999,4077777,4078438,4079081,4079105,4079894,4081038,4081485,4082194,4082201,4082298,4082619,4083044,4083476,4084343,4084673,4085336,4085412,4085683,4086011,4089003,4089144,4089183,4089427,4089538,4089913,4090414,4090547,4090549,4090598,4090657,4090806,4090893,4091966,4092028,4092182,4092218,4092474,4092478,4092598,4092864,4092867,4092875,4092897,4092934,4093073,4093948,4094169,4094250,4094769,4094987,4094997,4095554,4095771,4095907,4095998,8300096,8300272,8507380,8507419,8507861,8507940,8508624,8510023,10200083,13500022,13500024',authuser:0,kscs:'c9c918f0_24'};google.kHL='ja';})();(function(){google.lc=[];google.li=0;google.getEI=function(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||google.kEI};google.getLEI=function(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b};google.https=function(){return"https:"==window.location.protocol};google.ml=function(){return null};google.wl=function(a,b){try{google.ml(Error(a),!1,b)}catch(c){}};google.time=function(){return(new Date).getTime()};google.log=function(a,b,c,d,g){a=google.logUrl(a,b,c,d,g);if(""!=a){b=new Image;var e=google.lc,f=google.li;e[f]=b;b.onerror=b.onload=b.onabort=function(){delete e[f]};window.google&&window.google.vel&&window.google.vel.lu&&window.google.vel.lu(a);b.src=a;google.li=f+1}};google.logUrl=function(a,b,c,d,g){var e="",f=google.ls||"";c||-1!=b.search("&ei=")||(e="&ei="+google.getEI(d),-1==b.search("&lei=")&&(d=google.getLEI(d))&&(e+="&lei="+d));a=c||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+b+e+f+"&zx="+google.time();/^http:/i.test(a)&&google.https()&&(google.ml(Error("a"),!1,{src:a,glmm:1}),a="");return a};google.y={};google.x=function(a,b){google.y[a.id]=[a,b];return!1};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};}).call(this);var a=window.location,b=a.href.indexOf("#");if(0<=b){var c=a.href.substring(b+1);/(^|&)q=/.test(c)&&-1==c.indexOf("#")&&a.replace("/search?"+c.replace(/(^|&)fp=[^&]*/g,"")+"&cad=h")};</script><style>#gbar,#guser{font-size:13px;padding-top:1px !important;}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}
|
2
|
+
</style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#36c}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}a.gb1,a.gb2,a.gb3,a.gb4{color:#11c !important}body{background:#fff;color:black}a{color:#11c;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#36c}a:visited{color:#551a8b}a.gb1,a.gb4{text-decoration:underline}a.gb3:hover{text-decoration:none}#ghead a.gb2:hover{color:#fff !important}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#eee;border:solid 1px;border-color:#ccc #999 #999 #ccc;height:30px}.lsbb{display:block}.ftl,#fll a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#ccc}.lst:focus{outline:none}</style><script></script><link href="/images/branding/product/ico/googleg_lodp.ico" rel="shortcut icon"></head><body bgcolor="#fff"><script>(function(){var src='/images/nav_logo229.png';var iesg=false;document.body.onload = function(){window.n && window.n();if (document.images){new Image().src=src;}
|
3
|
+
if (!iesg){document.f&&document.f.q.focus();document.gbqf&&document.gbqf.q.focus();}
|
4
|
+
}
|
5
|
+
})();</script><div id="mngb"> <div id=gbar><nobr><b class=gb1>検索</b> <a class=gb1 href="https://www.google.co.jp/imghp?hl=ja&tab=wi">画像</a> <a class=gb1 href="https://maps.google.co.jp/maps?hl=ja&tab=wl">マップ</a> <a class=gb1 href="https://play.google.com/?hl=ja&tab=w8">Play</a> <a class=gb1 href="https://www.youtube.com/?gl=JP&tab=w1">YouTube</a> <a class=gb1 href="https://news.google.co.jp/nwshp?hl=ja&tab=wn">ニュース</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">ドライブ</a> <a class=gb1 style="text-decoration:none" href="https://www.google.co.jp/intl/ja/options/"><u>もっと見る</u> »</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.co.jp/history/optout?hl=ja" class=gb4>ウェブ履歴</a> | <a href="/preferences?hl=ja" class=gb4>設定</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=ja&passive=true&continue=https://www.google.co.jp/" class=gb4>ログイン</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div> </div><center><br clear="all" id="lgpd"><div id="lga"><div style="padding:28px 0 3px"><div style="height:110px;width:276px;background:url(/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png) no-repeat" title="Google" align="left" id="hplogo" onload="window.lol&&lol()"><div style="color:#777;font-size:16px;font-weight:bold;position:relative;top:70px;left:218px" nowrap="">日本</div></div></div><br></div><form action="/search" name="f"><table cellpadding="0" cellspacing="0"><tr valign="top"><td width="25%"> </td><td align="center" nowrap=""><input name="ie" value="Shift_JIS" type="hidden"><input value="ja" name="hl" type="hidden"><input name="source" type="hidden" value="hp"><input name="biw" type="hidden"><input name="bih" type="hidden"><div class="ds" style="height:32px;margin:4px 0"><input style="color:#000;margin:0;padding:5px 8px 0 6px;vertical-align:top" autocomplete="off" class="lst" value="" title="Google 検索" maxlength="2048" name="q" size="57"></div><br style="line-height:0"><span class="ds"><span class="lsbb"><input class="lsb" value="Google 検索" name="btnG" type="submit"></span></span><span class="ds"><span class="lsbb"><input class="lsb" value="I'm Feeling Lucky" name="btnI" onclick="if(this.form.q.value)this.checked=1; else top.location='/doodles/'" type="submit"></span></span></td><td class="fl sblc" align="left" nowrap="" width="25%"><a href="/advanced_search?hl=ja&authuser=0">検索オプション</a><a href="/language_tools?hl=ja&authuser=0">言語ツール</a></td></tr></table><input id="gbv" name="gbv" type="hidden" value="1"></form><div id="gac_scont"></div><div style="font-size:83%;min-height:3.5em"><br></div><span id="footer"><div style="font-size:10pt"><div style="margin:19px auto;text-align:center" id="fll"><a href="/intl/ja/ads/">広告掲載</a><a href="http://www.google.co.jp/intl/ja/services/">ビジネス ソリューション</a><a href="https://plus.google.com/115899767381375908215" rel="publisher">+Google</a><a href="/intl/ja/about.html">Google について</a><a href="https://www.google.co.jp/setprefdomain?prefdom=US&sig=__NSwOcr0nRFmauaxJWrHJmztdkTc%3D" id="fehl">Google.com</a></div></div><p style="color:#767676;font-size:8pt">© 2017 - <a href="/intl/ja/policies/privacy/">プライバシー</a> - <a href="/intl/ja/policies/terms/">規約</a></p></span></center><script>(function(){window.google.cdo={height:0,width:0};(function(){var a=window.innerWidth,b=window.innerHeight;if(!a||!b)var c=window.document,d="CSS1Compat"==c.compatMode?c.documentElement:c.body,a=d.clientWidth,b=d.clientHeight;a&&b&&(a!=google.cdo.width||b!=google.cdo.height)&&google.log("","","/client_204?&atyp=i&biw="+a+"&bih="+b+"&ei="+google.kEI);}).call(this);})();</script><div id="xjsd"></div><div id="xjsi"><script>(function(){function c(b){window.setTimeout(function(){var a=document.createElement("script");a.src=b;document.getElementById("xjsd").appendChild(a)},0)}google.dljp=function(b,a){google.xjsu=b;c(a)};google.dlj=c;}).call(this);(function(){window.google.xjsrm=[];})();if(google.y)google.y.first=[];if(!google.xjs){window._=window._||{};window._._DumpException=function(e){throw e};if(google.timers&&google.timers.load.t){google.timers.load.t.xjsls=new Date().getTime();}google.dljp('/xjs/_/js/k\x3dxjs.hp.en_US.usfcb5N0rIw.O/m\x3dsb_he,d/rt\x3dj/d\x3d1/t\x3dzcms/rs\x3dACT90oH_6o1ZdJ1OdBerX9LppN-xEd11Eg','/xjs/_/js/k\x3dxjs.hp.en_US.usfcb5N0rIw.O/m\x3dsb_he,d/rt\x3dj/d\x3d1/t\x3dzcms/rs\x3dACT90oH_6o1ZdJ1OdBerX9LppN-xEd11Eg');google.xjs=1;}google.pmc={"sb_he":{"agen":true,"cgen":true,"client":"heirloom-hp","dh":true,"dhqt":true,"ds":"","fl":true,"host":"google.co.jp","isbh":28,"jam":0,"jsonp":true,"msgs":{"cibl":"検索をクリア","dym":"もしかして:","lcky":"I\u0026#39;m Feeling Lucky","lml":"詳細","oskt":"入力ツール","psrc":"この検索キーワードは\u003Ca href=\"/history\"\u003Eウェブ履歴\u003C/a\u003Eから削除されました","psrl":"削除","sbit":"画像で検索","srch":"Google 検索"},"nds":true,"ovr":{},"pq":"","refpd":true,"refspre":true,"rfs":[],"scd":10,"sce":5,"stok":"WXDdTX_0YGr0J9JRNcHRvk23BlI"},"d":{}};google.y.first.push(function(){if(google.med){google.med('init');google.initHistory();google.med('history');}});if(google.j&&google.j.en&&google.j.xi){window.setTimeout(google.j.xi,0);}
|
6
|
+
</script></div></body></html>
|
data/spec/grader_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe LinkThumbnailer::Graders::HtmlAttribute do
|
|
12
12
|
context 'when current node does not match attribute' do
|
13
13
|
|
14
14
|
before do
|
15
|
-
instance.
|
15
|
+
allow(instance).to receive(:attribute?).and_return(false)
|
16
16
|
end
|
17
17
|
|
18
18
|
it { expect(action).to eq(1.0) }
|
@@ -22,9 +22,9 @@ describe LinkThumbnailer::Graders::HtmlAttribute do
|
|
22
22
|
context 'when current node has a negative attribute' do
|
23
23
|
|
24
24
|
before do
|
25
|
-
instance.
|
26
|
-
instance.
|
27
|
-
instance.
|
25
|
+
allow(instance).to receive(:attribute?).and_return(true)
|
26
|
+
allow(instance).to receive(:negative?).and_return(true)
|
27
|
+
allow(instance).to receive(:positive?).and_return(false)
|
28
28
|
end
|
29
29
|
|
30
30
|
it { expect(action).to eq(0.0) }
|
@@ -34,9 +34,9 @@ describe LinkThumbnailer::Graders::HtmlAttribute do
|
|
34
34
|
context 'when current node has a positive attribute' do
|
35
35
|
|
36
36
|
before do
|
37
|
-
instance.
|
38
|
-
instance.
|
39
|
-
instance.
|
37
|
+
allow(instance).to receive(:attribute?).and_return(true)
|
38
|
+
allow(instance).to receive(:negative?).and_return(false)
|
39
|
+
allow(instance).to receive(:positive?).and_return(true)
|
40
40
|
end
|
41
41
|
|
42
42
|
it { expect(action).to eq(1.0) }
|
data/spec/graders/length_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe LinkThumbnailer::Graders::Length do
|
|
7
7
|
let(:instance) { described_class.new(description) }
|
8
8
|
|
9
9
|
before do
|
10
|
-
instance.
|
10
|
+
allow(instance).to receive(:config).and_return(config)
|
11
11
|
end
|
12
12
|
|
13
13
|
describe '#call' do
|
@@ -17,7 +17,7 @@ describe LinkThumbnailer::Graders::Length do
|
|
17
17
|
context 'when text is too short' do
|
18
18
|
|
19
19
|
before do
|
20
|
-
instance.
|
20
|
+
allow(instance).to receive(:too_short?).and_return(true)
|
21
21
|
end
|
22
22
|
|
23
23
|
it { expect(action).to eq(0.0) }
|
@@ -27,8 +27,8 @@ describe LinkThumbnailer::Graders::Length do
|
|
27
27
|
context 'when text is not too short' do
|
28
28
|
|
29
29
|
before do
|
30
|
-
instance.
|
31
|
-
instance.
|
30
|
+
allow(instance).to receive(:too_short?).and_return(false)
|
31
|
+
allow(instance).to receive(:text).and_return(text)
|
32
32
|
end
|
33
33
|
|
34
34
|
context 'when text length is 120' do
|
@@ -62,10 +62,12 @@ describe LinkThumbnailer::Graders::Length do
|
|
62
62
|
describe '#too_short?' do
|
63
63
|
|
64
64
|
let(:action) { instance.send(:too_short?) }
|
65
|
+
let(:config) { double }
|
65
66
|
|
66
67
|
before do
|
67
|
-
instance.
|
68
|
-
|
68
|
+
allow(instance).to receive(:config).and_return(config)
|
69
|
+
allow(config).to receive(:description_min_length).and_return(10)
|
70
|
+
allow(instance).to receive(:text).and_return(text)
|
69
71
|
end
|
70
72
|
|
71
73
|
context 'when true' do
|
@@ -10,8 +10,8 @@ describe LinkThumbnailer::Graders::LinkDensity do
|
|
10
10
|
let(:action) { instance.call }
|
11
11
|
|
12
12
|
before do
|
13
|
-
instance.
|
14
|
-
instance.
|
13
|
+
allow(instance).to receive(:text).and_return(text)
|
14
|
+
allow(instance).to receive(:links).and_return(links)
|
15
15
|
end
|
16
16
|
|
17
17
|
context 'when text length is 0' do
|
@@ -12,8 +12,8 @@ describe LinkThumbnailer::Graders::Position do
|
|
12
12
|
context 'when position is 0' do
|
13
13
|
|
14
14
|
before do
|
15
|
-
description.
|
16
|
-
description.
|
15
|
+
allow(description).to receive(:position).and_return(0)
|
16
|
+
allow(description).to receive(:candidates_number).and_return(1)
|
17
17
|
end
|
18
18
|
|
19
19
|
it { expect(action).to eq(1.0) }
|
@@ -23,8 +23,8 @@ describe LinkThumbnailer::Graders::Position do
|
|
23
23
|
context 'when position is 1 over 1 candidates' do
|
24
24
|
|
25
25
|
before do
|
26
|
-
description.
|
27
|
-
description.
|
26
|
+
allow(description).to receive(:position).and_return(1)
|
27
|
+
allow(description).to receive(:candidates_number).and_return(1)
|
28
28
|
end
|
29
29
|
|
30
30
|
it { expect(action).to eq(0.0) }
|
@@ -34,8 +34,8 @@ describe LinkThumbnailer::Graders::Position do
|
|
34
34
|
context 'when position is 1 over more than 1 candidates' do
|
35
35
|
|
36
36
|
before do
|
37
|
-
description.
|
38
|
-
description.
|
37
|
+
allow(description).to receive(:position).and_return(1)
|
38
|
+
allow(description).to receive(:candidates_number).and_return(2)
|
39
39
|
end
|
40
40
|
|
41
41
|
it { expect(action).to eq(0.5) }
|
@@ -11,7 +11,7 @@ describe LinkThumbnailer::ImageValidator do
|
|
11
11
|
let(:action) { instance.call }
|
12
12
|
|
13
13
|
before do
|
14
|
-
instance.
|
14
|
+
allow(instance).to receive(:blacklist_urls).and_return(blacklist_urls)
|
15
15
|
end
|
16
16
|
|
17
17
|
context 'when image url is blacklisted' do
|
@@ -8,7 +8,7 @@ describe LinkThumbnailer::Models::Description do
|
|
8
8
|
let(:instance) { described_class.new(node, text) }
|
9
9
|
|
10
10
|
before do
|
11
|
-
|
11
|
+
expect(LinkThumbnailer::Grader).to receive(:new).at_least(1).times.and_return(grader)
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#to_s' do
|
data/spec/models/image_spec.rb
CHANGED
@@ -23,7 +23,7 @@ describe LinkThumbnailer::Models::Image do
|
|
23
23
|
let(:action) { instance <=> other }
|
24
24
|
|
25
25
|
before do
|
26
|
-
instance.
|
26
|
+
allow(instance).to receive(:size).and_return([20, 20])
|
27
27
|
end
|
28
28
|
|
29
29
|
context 'when other has a smaller image' do
|
@@ -58,7 +58,7 @@ describe LinkThumbnailer::Models::Image do
|
|
58
58
|
let(:action) { instance.valid? }
|
59
59
|
|
60
60
|
before do
|
61
|
-
instance.
|
61
|
+
allow(instance).to receive(:validator).and_return(validator)
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'calls validator public method' do
|
@@ -82,8 +82,8 @@ describe LinkThumbnailer::Models::Image do
|
|
82
82
|
}
|
83
83
|
|
84
84
|
before do
|
85
|
-
instance.
|
86
|
-
instance.
|
85
|
+
allow(instance).to receive(:size).and_return(size)
|
86
|
+
allow(instance).to receive(:type).and_return(type)
|
87
87
|
end
|
88
88
|
|
89
89
|
it { expect(action).to eq(result) }
|
data/spec/models/video_spec.rb
CHANGED
@@ -33,11 +33,11 @@ describe LinkThumbnailer::Models::Video do
|
|
33
33
|
}
|
34
34
|
|
35
35
|
before do
|
36
|
-
instance.
|
37
|
-
instance.
|
38
|
-
instance.
|
39
|
-
instance.
|
40
|
-
instance.
|
36
|
+
allow(instance).to receive(:id).and_return(id)
|
37
|
+
allow(instance).to receive(:size).and_return(size)
|
38
|
+
allow(instance).to receive(:duration).and_return(duration)
|
39
|
+
allow(instance).to receive(:provider).and_return(provider)
|
40
|
+
allow(instance).to receive(:embed_code).and_return(embed_code)
|
41
41
|
end
|
42
42
|
|
43
43
|
it { expect(action).to eq(result) }
|
data/spec/models/website_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe LinkThumbnailer::Models::Website do
|
|
12
12
|
let(:action) { instance.image = image }
|
13
13
|
|
14
14
|
before do
|
15
|
-
image.
|
15
|
+
allow(image).to receive(:valid?).and_return(true)
|
16
16
|
end
|
17
17
|
|
18
18
|
it { expect { action }.to change { instance.images.size }.by(1) }
|
@@ -27,7 +27,7 @@ describe LinkThumbnailer::Models::Website do
|
|
27
27
|
context 'when image is valid' do
|
28
28
|
|
29
29
|
before do
|
30
|
-
image.
|
30
|
+
allow(image).to receive(:valid?).and_return(true)
|
31
31
|
end
|
32
32
|
|
33
33
|
it { expect { action }.to change { instance.images.size }.by(1) }
|
@@ -37,7 +37,7 @@ describe LinkThumbnailer::Models::Website do
|
|
37
37
|
context 'when image is not valid' do
|
38
38
|
|
39
39
|
before do
|
40
|
-
image.
|
40
|
+
allow(image).to receive(:valid?).and_return(false)
|
41
41
|
end
|
42
42
|
|
43
43
|
it { expect { action }.to_not change { instance.images.size } }
|
data/spec/processor_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe LinkThumbnailer::Processor do
|
|
7
7
|
let(:url) { 'http://foo.com' }
|
8
8
|
|
9
9
|
before do
|
10
|
-
LinkThumbnailer.
|
10
|
+
allow(LinkThumbnailer).to receive(:page).and_return(page)
|
11
11
|
end
|
12
12
|
|
13
13
|
describe '#call' do
|
@@ -81,7 +81,7 @@ describe LinkThumbnailer::Processor do
|
|
81
81
|
context 'when valid' do
|
82
82
|
|
83
83
|
before do
|
84
|
-
instance.
|
84
|
+
allow(instance).to receive(:valid_url_format?).and_return(true)
|
85
85
|
end
|
86
86
|
|
87
87
|
it 'yields' do
|
@@ -94,7 +94,7 @@ describe LinkThumbnailer::Processor do
|
|
94
94
|
context 'when not valid' do
|
95
95
|
|
96
96
|
before do
|
97
|
-
instance.
|
97
|
+
allow(instance).to receive(:valid_url_format?).and_return(false)
|
98
98
|
end
|
99
99
|
|
100
100
|
it { expect { instance.send(:with_valid_url) }.to raise_error(LinkThumbnailer::BadUriFormat) }
|
@@ -110,7 +110,7 @@ describe LinkThumbnailer::Processor do
|
|
110
110
|
let(:action) { instance.send(:set_http_headers) }
|
111
111
|
|
112
112
|
before do
|
113
|
-
instance.
|
113
|
+
allow(instance).to receive(:user_agent).and_return(user_agent)
|
114
114
|
action
|
115
115
|
end
|
116
116
|
|
@@ -128,7 +128,7 @@ describe LinkThumbnailer::Processor do
|
|
128
128
|
context 'when verify_ssl is true' do
|
129
129
|
|
130
130
|
before do
|
131
|
-
instance.
|
131
|
+
allow(instance).to receive(:ssl_required?).and_return(true)
|
132
132
|
action
|
133
133
|
end
|
134
134
|
|
@@ -139,7 +139,7 @@ describe LinkThumbnailer::Processor do
|
|
139
139
|
context 'when verify_ssl is not true' do
|
140
140
|
|
141
141
|
before do
|
142
|
-
instance.
|
142
|
+
allow(instance).to receive(:ssl_required?).and_return(false)
|
143
143
|
action
|
144
144
|
end
|
145
145
|
|
@@ -154,7 +154,7 @@ describe LinkThumbnailer::Processor do
|
|
154
154
|
let(:http_open_timeout) { 1 }
|
155
155
|
|
156
156
|
before do
|
157
|
-
instance.
|
157
|
+
allow(instance).to receive(:http_open_timeout).and_return(http_open_timeout)
|
158
158
|
action
|
159
159
|
end
|
160
160
|
|
@@ -167,7 +167,7 @@ describe LinkThumbnailer::Processor do
|
|
167
167
|
let(:http_read_timeout) { 1 }
|
168
168
|
|
169
169
|
before do
|
170
|
-
instance.
|
170
|
+
allow(instance).to receive(:http_read_timeout).and_return(http_read_timeout)
|
171
171
|
action
|
172
172
|
end
|
173
173
|
|
@@ -179,9 +179,11 @@ describe LinkThumbnailer::Processor do
|
|
179
179
|
describe '#perform_request' do
|
180
180
|
|
181
181
|
let(:action) { instance.send(:perform_request) }
|
182
|
+
let(:http) { double }
|
182
183
|
|
183
184
|
before do
|
184
|
-
instance.
|
185
|
+
allow(instance).to receive(:http).and_return(http)
|
186
|
+
allow(http).to receive(:request).and_return(response)
|
185
187
|
end
|
186
188
|
|
187
189
|
context 'when http success' do
|
@@ -191,13 +193,40 @@ describe LinkThumbnailer::Processor do
|
|
191
193
|
let(:response) { ::Net::HTTPSuccess.new('', code, body) }
|
192
194
|
|
193
195
|
before do
|
194
|
-
response.
|
196
|
+
allow(response).to receive(:body).and_return(body)
|
195
197
|
end
|
196
198
|
|
197
199
|
it { expect(action).to eq(body) }
|
198
200
|
|
199
201
|
end
|
200
202
|
|
203
|
+
context 'when access non-utf8-encoding website' do
|
204
|
+
let(:code) { 200 }
|
205
|
+
let(:body_shift_jis) do
|
206
|
+
File.read(File.expand_path('fixtures/google_shift_jis.html', File.dirname(__FILE__)))
|
207
|
+
end
|
208
|
+
let(:body_utf8) do
|
209
|
+
File.read(File.expand_path('fixtures/google_utf8.html', File.dirname(__FILE__)))
|
210
|
+
end
|
211
|
+
let(:response) do
|
212
|
+
r = ::Net::HTTPSuccess.new('', code, body_shift_jis)
|
213
|
+
r['Content-Type'] = 'text/html'
|
214
|
+
r.body = body_shift_jis
|
215
|
+
r.instance_variable_set(:@read, true)
|
216
|
+
r
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'when http success with valid charset provided in Content-Type' do
|
220
|
+
before { response['Content-Type'] = 'text/html; charset=Shift_JIS' }
|
221
|
+
it { expect(action).to eq body_utf8 }
|
222
|
+
end
|
223
|
+
|
224
|
+
context 'when http success with invalid charset provided in Content-Type' do
|
225
|
+
before { response['Content-Type'] = 'text/html; charset=Shift-JIS' }
|
226
|
+
it { expect(action).to eq body_shift_jis }
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
201
230
|
context 'when http redirection' do
|
202
231
|
|
203
232
|
let(:code) { 200 }
|
@@ -206,8 +235,8 @@ describe LinkThumbnailer::Processor do
|
|
206
235
|
let(:new_url) { 'http://foo.com/bar' }
|
207
236
|
|
208
237
|
before do
|
209
|
-
instance.
|
210
|
-
instance.
|
238
|
+
allow(instance).to receive(:redirect_count).and_return(0)
|
239
|
+
allow(instance).to receive(:resolve_relative_url).and_return(new_url)
|
211
240
|
end
|
212
241
|
|
213
242
|
it 'calls call method' do
|
@@ -229,7 +258,7 @@ describe LinkThumbnailer::Processor do
|
|
229
258
|
let(:action) { instance.send(:build_absolute_url_for, relative_url).to_s }
|
230
259
|
|
231
260
|
before do
|
232
|
-
instance.
|
261
|
+
allow(instance).to receive(:url).and_return(url)
|
233
262
|
end
|
234
263
|
|
235
264
|
it { expect(action).to eq("#{scheme}://#{host}#{relative_url}") }
|
@@ -308,7 +337,7 @@ describe LinkThumbnailer::Processor do
|
|
308
337
|
context 'when bad format' do
|
309
338
|
|
310
339
|
before do
|
311
|
-
instance.
|
340
|
+
allow(instance).to receive(:url).and_return("http://foo.com")
|
312
341
|
end
|
313
342
|
|
314
343
|
it { expect(action).to be_falsey }
|
@@ -318,7 +347,7 @@ describe LinkThumbnailer::Processor do
|
|
318
347
|
context 'when valid format' do
|
319
348
|
|
320
349
|
before do
|
321
|
-
instance.
|
350
|
+
allow(instance).to receive(:url).and_return(URI("http://foo.com"))
|
322
351
|
end
|
323
352
|
|
324
353
|
it { expect(action).to be_truthy }
|
@@ -334,8 +363,8 @@ describe LinkThumbnailer::Processor do
|
|
334
363
|
context 'when redirect count is greater than redirect limit' do
|
335
364
|
|
336
365
|
before do
|
337
|
-
instance.
|
338
|
-
instance.
|
366
|
+
allow(instance).to receive(:redirect_count).and_return(5)
|
367
|
+
allow(instance).to receive(:redirect_limit).and_return(4)
|
339
368
|
end
|
340
369
|
|
341
370
|
it { expect(action).to be_truthy }
|
@@ -345,8 +374,8 @@ describe LinkThumbnailer::Processor do
|
|
345
374
|
context 'when redirect count is less than redirect limit' do
|
346
375
|
|
347
376
|
before do
|
348
|
-
instance.
|
349
|
-
instance.
|
377
|
+
allow(instance).to receive(:redirect_count).and_return(4)
|
378
|
+
allow(instance).to receive(:redirect_limit).and_return(5)
|
350
379
|
end
|
351
380
|
|
352
381
|
it { expect(action).to be_falsey }
|
@@ -356,8 +385,8 @@ describe LinkThumbnailer::Processor do
|
|
356
385
|
context 'when redirect count is equal to redirect limit' do
|
357
386
|
|
358
387
|
before do
|
359
|
-
instance.
|
360
|
-
instance.
|
388
|
+
allow(instance).to receive(:redirect_count).and_return(5)
|
389
|
+
allow(instance).to receive(:redirect_limit).and_return(5)
|
361
390
|
end
|
362
391
|
|
363
392
|
it { expect(action).to be_falsey }
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LinkThumbnailer::Response do
|
4
|
+
let(:url) { 'https://www.google.co.jp' }
|
5
|
+
let(:page) { ::LinkThumbnailer::Page.new(url, {}) }
|
6
|
+
|
7
|
+
let(:response) do
|
8
|
+
r = ::Net::HTTPSuccess.new('', 200, body_shift_jis)
|
9
|
+
r['Content-Type'] = 'text/html'
|
10
|
+
r.body = body_shift_jis
|
11
|
+
r.instance_variable_set(:@read, true)
|
12
|
+
r
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:instance) { described_class.new(response) }
|
16
|
+
|
17
|
+
let(:body_shift_jis) do
|
18
|
+
File.read(File.expand_path('fixtures/google_shift_jis.html', File.dirname(__FILE__)))
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:body_utf8) do
|
22
|
+
File.read(File.expand_path('fixtures/google_utf8.html', File.dirname(__FILE__)))
|
23
|
+
end
|
24
|
+
|
25
|
+
before do
|
26
|
+
allow(LinkThumbnailer).to receive(:page).and_return(page)
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#charset' do
|
30
|
+
context 'when charset provided in content-type' do
|
31
|
+
before do
|
32
|
+
response['Content-Type'] = 'text/html; charset=Shift_JIS'
|
33
|
+
end
|
34
|
+
|
35
|
+
it { expect(instance.charset).to eq 'Shift_JIS' }
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when no charset available in content-type' do
|
39
|
+
it { expect(instance.charset).to eq '' }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#body' do
|
44
|
+
context 'when provide valid charset' do
|
45
|
+
before do
|
46
|
+
response['Content-Type'] = 'text/html; charset=Shift_JIS'
|
47
|
+
end
|
48
|
+
|
49
|
+
it { expect(instance.body).to eq body_utf8 }
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when provide invalid charset' do
|
53
|
+
before do
|
54
|
+
response['Content-Type'] = 'text/html; charset=Shift-JIS'
|
55
|
+
end
|
56
|
+
|
57
|
+
it { expect(instance.body).to eq body_shift_jis }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/spec/scraper_spec.rb
CHANGED
@@ -9,8 +9,8 @@ describe LinkThumbnailer::Scraper do
|
|
9
9
|
let(:instance) { described_class.new(source, url) }
|
10
10
|
|
11
11
|
before do
|
12
|
-
instance.
|
13
|
-
instance.
|
12
|
+
allow(instance).to receive(:document).and_return(document)
|
13
|
+
allow(instance).to receive(:website).and_return(website)
|
14
14
|
end
|
15
15
|
|
16
16
|
describe '#call' do
|
@@ -22,10 +22,10 @@ describe LinkThumbnailer::Scraper do
|
|
22
22
|
let(:attributes) { [:bar] }
|
23
23
|
let(:scrapers) { [prefix_1, prefix_2] }
|
24
24
|
let(:action) { instance.call }
|
25
|
+
let(:config) { double(attributes: attributes, scrapers: scrapers) }
|
25
26
|
|
26
27
|
before do
|
27
|
-
instance.
|
28
|
-
instance.stub_chain(:config, :scrapers).and_return(scrapers)
|
28
|
+
allow(instance).to receive(:config).and_return(config)
|
29
29
|
end
|
30
30
|
|
31
31
|
context 'when first one return a result' do
|
data/spec/scrapers/base_spec.rb
CHANGED
@@ -13,7 +13,7 @@ describe LinkThumbnailer::Scrapers::Base do
|
|
13
13
|
let(:action) { instance.call(attr) }
|
14
14
|
|
15
15
|
before do
|
16
|
-
instance.
|
16
|
+
allow(instance).to receive(:value).and_return(value)
|
17
17
|
end
|
18
18
|
|
19
19
|
it { expect { action }.to change { website.title }.from(nil).to(value) }
|
@@ -25,7 +25,7 @@ describe LinkThumbnailer::Scrapers::Base do
|
|
25
25
|
let(:action) { instance.send(:model_class) }
|
26
26
|
|
27
27
|
before do
|
28
|
-
instance.
|
28
|
+
allow(instance).to receive(:attribute_name).and_return(attr)
|
29
29
|
end
|
30
30
|
|
31
31
|
context 'when internal class exists' do
|
@@ -40,7 +40,7 @@ describe LinkThumbnailer::Scrapers::Base do
|
|
40
40
|
|
41
41
|
let(:attr) { :foo }
|
42
42
|
|
43
|
-
it { expect { action }.to
|
43
|
+
it { expect { action }.to raise_error(NameError) }
|
44
44
|
|
45
45
|
end
|
46
46
|
|
@@ -54,7 +54,7 @@ describe LinkThumbnailer::Scrapers::Base do
|
|
54
54
|
let(:action) { instance.send(:modelize, node, text) }
|
55
55
|
|
56
56
|
before do
|
57
|
-
instance.
|
57
|
+
allow(instance).to receive(:model_class).and_return(model_class)
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'instantiates a new model' do
|
@@ -12,13 +12,13 @@ describe LinkThumbnailer::Scrapers::Opengraph::Base do
|
|
12
12
|
let(:action) { instance.applicable? }
|
13
13
|
|
14
14
|
before do
|
15
|
-
instance.
|
15
|
+
allow(instance).to receive(:meta).and_return(meta)
|
16
16
|
end
|
17
17
|
|
18
18
|
context 'when all node is an opengraph' do
|
19
19
|
|
20
20
|
before do
|
21
|
-
instance.
|
21
|
+
allow(instance).to receive(:opengraph_node?).and_return(true, true)
|
22
22
|
end
|
23
23
|
|
24
24
|
it { expect(action).to be_truthy }
|
@@ -28,7 +28,7 @@ describe LinkThumbnailer::Scrapers::Opengraph::Base do
|
|
28
28
|
context 'when any node is an opengraph' do
|
29
29
|
|
30
30
|
before do
|
31
|
-
instance.
|
31
|
+
allow(instance).to receive(:opengraph_node?).and_return(true, false)
|
32
32
|
end
|
33
33
|
|
34
34
|
it { expect(action).to be_truthy }
|
@@ -38,7 +38,7 @@ describe LinkThumbnailer::Scrapers::Opengraph::Base do
|
|
38
38
|
context 'when no node is an opengraph' do
|
39
39
|
|
40
40
|
before do
|
41
|
-
instance.
|
41
|
+
allow(instance).to receive(:opengraph_node?).and_return(false, false)
|
42
42
|
end
|
43
43
|
|
44
44
|
it { expect(action).to be_falsey }
|
@@ -52,7 +52,7 @@ describe LinkThumbnailer::Scrapers::Opengraph::Base do
|
|
52
52
|
let(:action) { instance.send(:opengraph_node?, node) }
|
53
53
|
|
54
54
|
before do
|
55
|
-
node.
|
55
|
+
allow(node).to receive(:attribute).with('name').and_return(attribute_from_name)
|
56
56
|
end
|
57
57
|
|
58
58
|
context 'with attribute from name valid' do
|
@@ -68,7 +68,7 @@ describe LinkThumbnailer::Scrapers::Opengraph::Base do
|
|
68
68
|
let(:attribute_from_name) { 'foo' }
|
69
69
|
|
70
70
|
before do
|
71
|
-
node.
|
71
|
+
allow(node).to receive(:attribute).with('property').and_return(attribute_from_property)
|
72
72
|
end
|
73
73
|
|
74
74
|
context 'and attribute from property valid' do
|
data/spec/uri_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe LinkThumbnailer::URI do
|
|
12
12
|
context 'when bad format' do
|
13
13
|
|
14
14
|
before do
|
15
|
-
instance.
|
15
|
+
allow(instance).to receive(:attribute).and_return("/invalid/path")
|
16
16
|
end
|
17
17
|
|
18
18
|
it { expect(action).to be_falsey }
|
@@ -22,7 +22,7 @@ describe LinkThumbnailer::URI do
|
|
22
22
|
context 'when valid format' do
|
23
23
|
|
24
24
|
before do
|
25
|
-
instance.
|
25
|
+
allow(instance).to receive(:attribute).and_return("http://foo.com")
|
26
26
|
end
|
27
27
|
|
28
28
|
it { expect(action).to be_truthy }
|
data/spec/video_parser_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe LinkThumbnailer::VideoParser do
|
|
8
8
|
let(:instance) { described_class.new(video) }
|
9
9
|
|
10
10
|
before do
|
11
|
-
instance.
|
11
|
+
allow(instance).to receive(:parser).and_return(parser)
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#id' do
|
@@ -18,7 +18,7 @@ describe LinkThumbnailer::VideoParser do
|
|
18
18
|
context 'when respond to video_id' do
|
19
19
|
|
20
20
|
before do
|
21
|
-
parser.
|
21
|
+
allow(parser).to receive(:video_id).and_return(1)
|
22
22
|
end
|
23
23
|
|
24
24
|
it { expect(action).to eq(parser.video_id) }
|
@@ -28,7 +28,7 @@ describe LinkThumbnailer::VideoParser do
|
|
28
28
|
context 'when do not respond to video_id' do
|
29
29
|
|
30
30
|
before do
|
31
|
-
parser.
|
31
|
+
allow(parser).to receive(:video_id).and_raise(NoMethodError)
|
32
32
|
end
|
33
33
|
|
34
34
|
it { expect(action).to be_nil }
|
@@ -44,8 +44,8 @@ describe LinkThumbnailer::VideoParser do
|
|
44
44
|
context 'when respond to width and height' do
|
45
45
|
|
46
46
|
before do
|
47
|
-
parser.
|
48
|
-
parser.
|
47
|
+
allow(parser).to receive(:width).and_return(1)
|
48
|
+
allow(parser).to receive(:height).and_return(1)
|
49
49
|
end
|
50
50
|
|
51
51
|
it { expect(action).to eq([parser.width, parser.height]) }
|
@@ -55,8 +55,8 @@ describe LinkThumbnailer::VideoParser do
|
|
55
55
|
context 'when do not respond to width and height' do
|
56
56
|
|
57
57
|
before do
|
58
|
-
parser.
|
59
|
-
parser.
|
58
|
+
allow(parser).to receive(:width).and_raise(NoMethodError)
|
59
|
+
allow(parser).to receive(:height).and_raise(NoMethodError)
|
60
60
|
end
|
61
61
|
|
62
62
|
it { expect(action).to be_empty }
|
@@ -72,7 +72,7 @@ describe LinkThumbnailer::VideoParser do
|
|
72
72
|
context 'when respond to duration' do
|
73
73
|
|
74
74
|
before do
|
75
|
-
parser.
|
75
|
+
allow(parser).to receive(:duration).and_return(1)
|
76
76
|
end
|
77
77
|
|
78
78
|
it { expect(action).to eq(parser.duration) }
|
@@ -82,7 +82,7 @@ describe LinkThumbnailer::VideoParser do
|
|
82
82
|
context 'when do not respond to duration' do
|
83
83
|
|
84
84
|
before do
|
85
|
-
parser.
|
85
|
+
allow(parser).to receive(:duration).and_raise(NoMethodError)
|
86
86
|
end
|
87
87
|
|
88
88
|
it { expect(action).to be_nil }
|
@@ -98,7 +98,7 @@ describe LinkThumbnailer::VideoParser do
|
|
98
98
|
context 'when respond to provider' do
|
99
99
|
|
100
100
|
before do
|
101
|
-
parser.
|
101
|
+
allow(parser).to receive(:provider).and_return(1)
|
102
102
|
end
|
103
103
|
|
104
104
|
it { expect(action).to eq(parser.provider) }
|
@@ -108,7 +108,7 @@ describe LinkThumbnailer::VideoParser do
|
|
108
108
|
context 'when do not respond to provider' do
|
109
109
|
|
110
110
|
before do
|
111
|
-
parser.
|
111
|
+
allow(parser).to receive(:provider).and_raise(NoMethodError)
|
112
112
|
end
|
113
113
|
|
114
114
|
it { expect(action).to be_nil }
|
@@ -124,7 +124,7 @@ describe LinkThumbnailer::VideoParser do
|
|
124
124
|
context 'when respond to embed_code' do
|
125
125
|
|
126
126
|
before do
|
127
|
-
parser.
|
127
|
+
allow(parser).to receive(:embed_code).and_return('')
|
128
128
|
end
|
129
129
|
|
130
130
|
it { expect(action).to eq(parser.embed_code) }
|
@@ -134,7 +134,7 @@ describe LinkThumbnailer::VideoParser do
|
|
134
134
|
context 'when do not respond to embed_code' do
|
135
135
|
|
136
136
|
before do
|
137
|
-
parser.
|
137
|
+
allow(parser).to receive(:embed_code).and_raise(NoMethodError)
|
138
138
|
end
|
139
139
|
|
140
140
|
it { expect(action).to be_nil }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: link_thumbnailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pierre-Louis Gottfrois
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -28,22 +28,16 @@ dependencies:
|
|
28
28
|
name: json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.7.7
|
34
31
|
- - "~>"
|
35
32
|
- !ruby/object:Gem::Version
|
36
|
-
version: '1
|
33
|
+
version: '2.1'
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: 1.7.7
|
44
38
|
- - "~>"
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version: '1
|
40
|
+
version: '2.1'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: rake
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -64,56 +58,56 @@ dependencies:
|
|
64
58
|
requirements:
|
65
59
|
- - "~>"
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
version: '1.
|
61
|
+
version: '1.7'
|
68
62
|
type: :runtime
|
69
63
|
prerelease: false
|
70
64
|
version_requirements: !ruby/object:Gem::Requirement
|
71
65
|
requirements:
|
72
66
|
- - "~>"
|
73
67
|
- !ruby/object:Gem::Version
|
74
|
-
version: '1.
|
68
|
+
version: '1.7'
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
70
|
name: net-http-persistent
|
77
71
|
requirement: !ruby/object:Gem::Requirement
|
78
72
|
requirements:
|
79
73
|
- - "~>"
|
80
74
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
75
|
+
version: '3.0'
|
82
76
|
type: :runtime
|
83
77
|
prerelease: false
|
84
78
|
version_requirements: !ruby/object:Gem::Requirement
|
85
79
|
requirements:
|
86
80
|
- - "~>"
|
87
81
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
82
|
+
version: '3.0'
|
89
83
|
- !ruby/object:Gem::Dependency
|
90
84
|
name: video_info
|
91
85
|
requirement: !ruby/object:Gem::Requirement
|
92
86
|
requirements:
|
93
87
|
- - "~>"
|
94
88
|
- !ruby/object:Gem::Version
|
95
|
-
version: '2.
|
89
|
+
version: '2.7'
|
96
90
|
type: :runtime
|
97
91
|
prerelease: false
|
98
92
|
version_requirements: !ruby/object:Gem::Requirement
|
99
93
|
requirements:
|
100
94
|
- - "~>"
|
101
95
|
- !ruby/object:Gem::Version
|
102
|
-
version: '2.
|
96
|
+
version: '2.7'
|
103
97
|
- !ruby/object:Gem::Dependency
|
104
98
|
name: image_info
|
105
99
|
requirement: !ruby/object:Gem::Requirement
|
106
100
|
requirements:
|
107
101
|
- - "~>"
|
108
102
|
- !ruby/object:Gem::Version
|
109
|
-
version: '1.
|
103
|
+
version: '1.1'
|
110
104
|
type: :runtime
|
111
105
|
prerelease: false
|
112
106
|
version_requirements: !ruby/object:Gem::Requirement
|
113
107
|
requirements:
|
114
108
|
- - "~>"
|
115
109
|
- !ruby/object:Gem::Version
|
116
|
-
version: '1.
|
110
|
+
version: '1.1'
|
117
111
|
description: Ruby gem generating thumbnail images from a given URL.
|
118
112
|
email:
|
119
113
|
- pierrelouis.gottfrois@gmail.com
|
@@ -123,6 +117,7 @@ extra_rdoc_files: []
|
|
123
117
|
files:
|
124
118
|
- ".gitignore"
|
125
119
|
- ".rspec"
|
120
|
+
- ".ruby-version"
|
126
121
|
- ".travis.yml"
|
127
122
|
- CHANGELOG.md
|
128
123
|
- Gemfile
|
@@ -156,6 +151,7 @@ files:
|
|
156
151
|
- lib/link_thumbnailer/parser.rb
|
157
152
|
- lib/link_thumbnailer/processor.rb
|
158
153
|
- lib/link_thumbnailer/railtie.rb
|
154
|
+
- lib/link_thumbnailer/response.rb
|
159
155
|
- lib/link_thumbnailer/scraper.rb
|
160
156
|
- lib/link_thumbnailer/scrapers/base.rb
|
161
157
|
- lib/link_thumbnailer/scrapers/default/base.rb
|
@@ -182,6 +178,8 @@ files:
|
|
182
178
|
- spec/fixtures/default_from_body.html
|
183
179
|
- spec/fixtures/default_from_meta.html
|
184
180
|
- spec/fixtures/foo.png
|
181
|
+
- spec/fixtures/google_shift_jis.html
|
182
|
+
- spec/fixtures/google_utf8.html
|
185
183
|
- spec/fixtures/og_not_valid_example.html
|
186
184
|
- spec/fixtures/og_valid_example.html
|
187
185
|
- spec/fixtures/og_valid_multi_image_example.html
|
@@ -203,6 +201,7 @@ files:
|
|
203
201
|
- spec/models/website_spec.rb
|
204
202
|
- spec/page_spec.rb
|
205
203
|
- spec/processor_spec.rb
|
204
|
+
- spec/response_spec.rb
|
206
205
|
- spec/scraper_spec.rb
|
207
206
|
- spec/scrapers/base_spec.rb
|
208
207
|
- spec/scrapers/opengraph/base_spec.rb
|
@@ -228,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
228
227
|
version: '0'
|
229
228
|
requirements: []
|
230
229
|
rubyforge_project:
|
231
|
-
rubygems_version: 2.
|
230
|
+
rubygems_version: 2.6.10
|
232
231
|
signing_key:
|
233
232
|
specification_version: 4
|
234
233
|
summary: Ruby gem ranking images from a given URL returning an object containing images
|
@@ -240,6 +239,8 @@ test_files:
|
|
240
239
|
- spec/fixtures/default_from_body.html
|
241
240
|
- spec/fixtures/default_from_meta.html
|
242
241
|
- spec/fixtures/foo.png
|
242
|
+
- spec/fixtures/google_shift_jis.html
|
243
|
+
- spec/fixtures/google_utf8.html
|
243
244
|
- spec/fixtures/og_not_valid_example.html
|
244
245
|
- spec/fixtures/og_valid_example.html
|
245
246
|
- spec/fixtures/og_valid_multi_image_example.html
|
@@ -261,6 +262,7 @@ test_files:
|
|
261
262
|
- spec/models/website_spec.rb
|
262
263
|
- spec/page_spec.rb
|
263
264
|
- spec/processor_spec.rb
|
265
|
+
- spec/response_spec.rb
|
264
266
|
- spec/scraper_spec.rb
|
265
267
|
- spec/scrapers/base_spec.rb
|
266
268
|
- spec/scrapers/opengraph/base_spec.rb
|