meta_hari 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/meta_hari/helpers/microdata.rb +42 -0
- data/lib/meta_hari/helpers.rb +1 -0
- data/lib/meta_hari/spyglass/base.rb +7 -1
- data/lib/meta_hari/version.rb +1 -1
- data/lib/meta_hari.rb +1 -0
- data/meta_hari.gemspec +1 -0
- data/spec/lib/meta_hari/helpers/microdata_spec.rb +73 -0
- data/spec/lib/meta_hari/spyglass/base_spec.rb +39 -0
- data/spec/resources/baby_markt_de.html +1486 -0
- metadata +20 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ca6a8f17d9a5f3c73f162378b707d4acdc2aebe
|
4
|
+
data.tar.gz: b22862f8ea3b987d2953b4a1d3e457f91d107e9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dc4fecc168a0d788f247db9c5fc8dab2f46099aad3a2c13bad90ac3cff321972b7a1af8c517f0623c96bd51009d1bedbb9081771b3be8feaad2e86a205ffe19
|
7
|
+
data.tar.gz: 3c09350683a98c691cc5b58b1c546ea6596223462c0ef5ff95b9bf867b1cf80c56526ea41557590629f3ef8f0506719c762de48afdf355c98bf0c3ab75443f5e
|
data/README.md
CHANGED
@@ -42,6 +42,7 @@ custom shops which can not be spyed by the generic spyglass
|
|
42
42
|
* Amazon DE
|
43
43
|
* Generic
|
44
44
|
* Shops using [JSON-LD](https://developers.google.com/structured-data/rich-snippets/products)
|
45
|
+
* Shops using [Microdata](https://developers.google.com/structured-data/rich-snippets/products)
|
45
46
|
|
46
47
|
### Creating a spyglass
|
47
48
|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module MetaHari
|
2
|
+
module Helpers
|
3
|
+
class Microdata
|
4
|
+
attr_reader :document
|
5
|
+
attr_reader :url
|
6
|
+
|
7
|
+
def initialize(document, url)
|
8
|
+
@document = document
|
9
|
+
@url = url
|
10
|
+
end
|
11
|
+
|
12
|
+
def data(type = 'http://schema.org/Product')
|
13
|
+
result = array.find { |hash| hash[:type].include? type }
|
14
|
+
result && format(result) || {}
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def format(result)
|
20
|
+
data = result[:properties]
|
21
|
+
{
|
22
|
+
'@type' => result[:type] && result[:type].first,
|
23
|
+
'name' => data['name'] && data['name'].first,
|
24
|
+
'image' => data['image'] && data['image'].first,
|
25
|
+
'description' => data['description'] && data['description'].first
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def array
|
30
|
+
@hash ||= items.map(&:to_hash)
|
31
|
+
end
|
32
|
+
|
33
|
+
def items
|
34
|
+
itemscopes = document.search('//*[@itemscope and not(@itemprop)]')
|
35
|
+
return [] unless itemscopes
|
36
|
+
itemscopes.collect do |itemscope|
|
37
|
+
::Microdata::Item.new(itemscope, url)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/meta_hari/helpers.rb
CHANGED
@@ -15,7 +15,8 @@ module MetaHari
|
|
15
15
|
|
16
16
|
def spy
|
17
17
|
OpenStruct.new [
|
18
|
-
spy_json_ld
|
18
|
+
spy_json_ld,
|
19
|
+
spy_microdata
|
19
20
|
].inject({}) { |a, e| a.merge e }
|
20
21
|
end
|
21
22
|
|
@@ -58,6 +59,11 @@ module MetaHari
|
|
58
59
|
json_ld = MetaHari::Helpers::JsonLd.new(document)
|
59
60
|
json_ld.data
|
60
61
|
end
|
62
|
+
|
63
|
+
def spy_microdata
|
64
|
+
microdata = MetaHari::Helpers::Microdata.new(document, uri.to_s)
|
65
|
+
microdata.data
|
66
|
+
end
|
61
67
|
end
|
62
68
|
end
|
63
69
|
end
|
data/lib/meta_hari/version.rb
CHANGED
data/lib/meta_hari.rb
CHANGED
data/meta_hari.gemspec
CHANGED
@@ -26,4 +26,5 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency 'guard-rubocop', '~> 1.2.0'
|
27
27
|
spec.add_development_dependency 'pry', '~> 0.10.1'
|
28
28
|
spec.add_development_dependency 'nokogiri', '~> 1.6.6'
|
29
|
+
spec.add_development_dependency 'microdata', '~> 0.0.3'
|
29
30
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MetaHari::Helpers::Microdata do
|
4
|
+
let(:url) do
|
5
|
+
[
|
6
|
+
'http://www.baby-markt.de/markenshop-big',
|
7
|
+
'big-bobby-car/big-bobby-car-classic-rot-a006497.html'
|
8
|
+
].join('/')
|
9
|
+
end
|
10
|
+
let(:html) { resource_content('baby_markt_de.html') }
|
11
|
+
let(:document) { Nokogiri::HTML html }
|
12
|
+
let(:instance) { described_class.new document, url }
|
13
|
+
subject { instance }
|
14
|
+
|
15
|
+
describe '#initialize' do
|
16
|
+
it 'assigns the document to the reader' do
|
17
|
+
expect(subject.document).to be document
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when containing Microdata' do
|
22
|
+
describe '#hash' do
|
23
|
+
subject { instance.send :array }
|
24
|
+
|
25
|
+
it { should be_an Array }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#data' do
|
29
|
+
it 'uses #array' do
|
30
|
+
expect(subject).to receive(:array).and_return([])
|
31
|
+
subject.data
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when type matches' do
|
35
|
+
subject { instance.data }
|
36
|
+
|
37
|
+
it { should be_a Hash }
|
38
|
+
it { should have_key '@type' }
|
39
|
+
it { should have_key 'name' }
|
40
|
+
it { should have_key 'image' }
|
41
|
+
it { should have_key 'description' }
|
42
|
+
|
43
|
+
it 'is a product' do
|
44
|
+
expect(subject['@type']).to eql 'http://schema.org/Product'
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'has matching name' do
|
48
|
+
expect(subject['name']).to eql 'BIG Bobby Car Classic rot'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when type does not match' do
|
53
|
+
subject { instance.data('http://schema.org/Foo') }
|
54
|
+
|
55
|
+
it { should be_a Hash }
|
56
|
+
it { should_not have_key '@type' }
|
57
|
+
it { should_not have_key 'name' }
|
58
|
+
it { should_not have_key 'image' }
|
59
|
+
it { should_not have_key 'description' }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when not containing Microdata' do
|
65
|
+
let(:html) { '' }
|
66
|
+
|
67
|
+
describe '#array' do
|
68
|
+
subject { instance.send :array }
|
69
|
+
|
70
|
+
it { should be_an Array }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -77,5 +77,44 @@ describe MetaHari::Spyglass::Base do
|
|
77
77
|
expect(subject.description).to eql expected_value
|
78
78
|
end
|
79
79
|
end
|
80
|
+
|
81
|
+
context 'with Microdata document' do
|
82
|
+
let(:uri) { URI.parse 'http://baby-markt.de/' }
|
83
|
+
let(:instance) { described_class.new(uri) }
|
84
|
+
let(:html) { resource_content 'baby_markt_de.html' }
|
85
|
+
subject { instance.spy }
|
86
|
+
|
87
|
+
before :each do
|
88
|
+
allow(instance).to receive(:fetch_data).and_return(html)
|
89
|
+
end
|
90
|
+
|
91
|
+
it { should be_an OpenStruct }
|
92
|
+
it { should respond_to :name }
|
93
|
+
it { should respond_to :image }
|
94
|
+
it { should respond_to :description }
|
95
|
+
|
96
|
+
it 'has the correct name' do
|
97
|
+
expect(subject.name).to eql 'BIG Bobby Car Classic rot'
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'has the correct image url' do
|
101
|
+
expected_value = [
|
102
|
+
'http://www.baby-markt.de/out/pictures/generated/product/1',
|
103
|
+
'390_390_80/n_a006497_001.jpg?20150511132615'
|
104
|
+
].join('/')
|
105
|
+
expect(subject.image).to eql expected_value
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'has the correct description' do
|
109
|
+
expected_value = [
|
110
|
+
'BIG Bobby Car ClassicArtikelnummer: 800001303 Dank des',
|
111
|
+
'kindgerechten Designs, der unverwüstlichen Konstruktion und der',
|
112
|
+
'vielseitigen Funktionalität iist das BIG Bobby Car Classic das',
|
113
|
+
'meistgekaufte Kinderrutsch-fahrzeug der Welt. Und dabei macht BIG',
|
114
|
+
'Bobby...'
|
115
|
+
].join(' ')
|
116
|
+
expect(subject.description).to eql expected_value
|
117
|
+
end
|
118
|
+
end
|
80
119
|
end
|
81
120
|
end
|