seo_report 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +46 -0
- data/README.md +7 -0
- data/lib/seo_report/extractions/head.rb +1 -0
- data/lib/seo_report/extractions/microdata.rb +47 -18
- data/lib/seo_report/report.rb +11 -5
- data/lib/seo_report/representation/base.rb +7 -0
- data/lib/seo_report/version.rb +1 -1
- data/seo_report.gemspec +3 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c93527848fb421a0afa93d0a2776433d5fac964d
|
4
|
+
data.tar.gz: 1eb31dc4447df2f7502f57208999ec0bc408c759
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0813918a25958b5d67c16cd0ffef4b3274bfcf9f6ad61e97ac520a96aedb6b322be2fdcfcc51b4c2cc0e277867c43f1ea7f4a51a5865d3ac89a5b4cd88d4edec
|
7
|
+
data.tar.gz: e7240e062955eeb06985cf93bca25c9c87e30805eae910ba358ff3c403ed457f3303e17d01e0bd865d4f9b392fc0602cba59fe6620a5dbb94bab071f00c94709
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
This change log contains information about the changes introduced as part of
|
4
|
+
specific releases. It adheres to the guidelines outlined by
|
5
|
+
[keepachangelog](http://keepachangelog.com/en/0.3.0/).
|
6
|
+
|
7
|
+
## [unreleased]
|
8
|
+
|
9
|
+
## [0.1.3] — 2016-08-14
|
10
|
+
### Added
|
11
|
+
- Provide error message, without internal stacktrace information when the
|
12
|
+
command fails for unrecoverable reasons. Also introduces the
|
13
|
+
`SEO_REPORT_DEBUG` environment variable in order to show the stacktrace if
|
14
|
+
failure occurs, for... well debugging.
|
15
|
+
- Add error-integration to json/internal-struct for microdata. This allows the
|
16
|
+
recognition and handling of errors regarding microdata in the document.
|
17
|
+
- Specify minimum required ruby-version of **2.0.0**. It wouldn't really have
|
18
|
+
worked with anything less than /1.9.3/ before, but specifying it exactly makes
|
19
|
+
it easier to test for and to adhere to.
|
20
|
+
- The starts of a real test-suite. Currrently there are only specs for the main
|
21
|
+
extractions, meaning SEO (canonical and robots meta) and HEAD (title and meta
|
22
|
+
description). But the start has been made and the test suite will grow over
|
23
|
+
the next releases up to 0.2.0, at which point there should be at least an 85%
|
24
|
+
coverage.
|
25
|
+
### Fixed
|
26
|
+
- Don't fail as easily when parsing microdata information. Seeing as this a
|
27
|
+
reporting-tool, that should also display information whether something is
|
28
|
+
valid (or *ok*) or not, we need to handle most errors in the html-document
|
29
|
+
gracefully in order to live to report about it.
|
30
|
+
|
31
|
+
## [0.1.2] — 2016-08-10
|
32
|
+
### Added
|
33
|
+
- Always send an appropriate User-Agent: `seo-report/0.1.2 Net::HTTP`.
|
34
|
+
`Net::HTTP` is used as the underlying library to perform http-requests, which
|
35
|
+
is why it is listed. However the actual user-agent is seo-report itself. The
|
36
|
+
number specifies the version of seo-report that was used to perform the
|
37
|
+
request.
|
38
|
+
|
39
|
+
### Changed
|
40
|
+
- Handle path-only redirects and mark them as warnings.
|
41
|
+
While they are supported they don't represent a full URL, which
|
42
|
+
is what is supposed to be present in the `LOCATION` header.
|
43
|
+
|
44
|
+
## [0.1.1] — 2016-08-07
|
45
|
+
This marks the first release of the seo_report gem, which provides the
|
46
|
+
`seo-report` binary. This software is licensed under LGPL-3.0.
|
data/README.md
CHANGED
@@ -44,6 +44,13 @@ Or install it yourself as:
|
|
44
44
|
example [jq](https://stedolan.github.io/jq/)). Be aware that the json
|
45
45
|
format is currently not set in stone. It is most likely to change until
|
46
46
|
at least version *0.2.0* is reached.
|
47
|
+
|
48
|
+
### environment variables
|
49
|
+
|
50
|
+
Usually `seo-report` will in the case of an unrecoverable error, just provide
|
51
|
+
a message and bug out. If you are a developer, or want to file an issue, you
|
52
|
+
can run the command with `SEO_REPORT_DEBUG=1` set, which will provide
|
53
|
+
backtrace information instead.
|
47
54
|
|
48
55
|
## development
|
49
56
|
|
@@ -12,10 +12,22 @@ module SeoReport::Extractions
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def extract!
|
15
|
-
|
16
|
-
|
15
|
+
elements.each { |child| process(child) }
|
16
|
+
{
|
17
|
+
microdata: {
|
18
|
+
elements: result_set,
|
19
|
+
errors: errors,
|
20
|
+
}
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def elements
|
25
|
+
body = document.at_xpath('/html/body')
|
26
|
+
if body
|
27
|
+
body.children
|
28
|
+
else
|
29
|
+
[]
|
17
30
|
end
|
18
|
-
{microdata: result_set}
|
19
31
|
end
|
20
32
|
|
21
33
|
protected
|
@@ -50,21 +62,18 @@ module SeoReport::Extractions
|
|
50
62
|
end
|
51
63
|
|
52
64
|
def provide_data_for_itemprop(element)
|
53
|
-
data =
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
element["
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
element.text
|
66
|
-
end
|
67
|
-
current_scope[element["itemprop"]] = data
|
65
|
+
data = microdata_itemprop_value(element)
|
66
|
+
if current_scope
|
67
|
+
current_scope[element["itemprop"]] = data
|
68
|
+
else
|
69
|
+
error = {
|
70
|
+
tag: element.name,
|
71
|
+
itemprop: element["itemprop"],
|
72
|
+
value: data,
|
73
|
+
}
|
74
|
+
error.merge!(id: element["id"]) if element["id"]
|
75
|
+
(errors[:scopeless_elements] ||= []) << error
|
76
|
+
end
|
68
77
|
end
|
69
78
|
|
70
79
|
def push_scope(element)
|
@@ -93,6 +102,10 @@ module SeoReport::Extractions
|
|
93
102
|
@result_set ||= []
|
94
103
|
end
|
95
104
|
|
105
|
+
def errors
|
106
|
+
@errors ||= {}
|
107
|
+
end
|
108
|
+
|
96
109
|
def microdata_element?(element)
|
97
110
|
%w(itemscope itemtype itemprop).
|
98
111
|
any? { |attr| element.has_attribute?(attr) }
|
@@ -105,6 +118,22 @@ module SeoReport::Extractions
|
|
105
118
|
def microdata_prop?(element)
|
106
119
|
element.has_attribute?("itemprop")
|
107
120
|
end
|
121
|
+
|
122
|
+
def microdata_itemprop_value(element)
|
123
|
+
if element.name == "meta"
|
124
|
+
element["content"]
|
125
|
+
elsif %w(audio embed iframe img source track video).include?(element.name)
|
126
|
+
element["src"]
|
127
|
+
elsif %w(a area link).include?(element.name)
|
128
|
+
element["href"]
|
129
|
+
elsif element.name == "object"
|
130
|
+
element["data"]
|
131
|
+
elsif %w(data meter).include?(element.name)
|
132
|
+
element["value"]
|
133
|
+
else
|
134
|
+
element.text
|
135
|
+
end
|
136
|
+
end
|
108
137
|
end
|
109
138
|
|
110
139
|
SeoReport::Report.register_extraction(:html, Microdata, :extract_microdata)
|
data/lib/seo_report/report.rb
CHANGED
@@ -11,7 +11,7 @@ module SeoReport
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.extractions
|
14
|
-
@extractions ||=
|
14
|
+
@extractions ||= {}
|
15
15
|
end
|
16
16
|
|
17
17
|
def initialize(start_url)
|
@@ -24,10 +24,8 @@ module SeoReport
|
|
24
24
|
|
25
25
|
protected
|
26
26
|
def generate_report
|
27
|
-
chain = RequestChain.new(start_url)
|
28
|
-
chain.perform
|
29
27
|
{
|
30
|
-
requests:
|
28
|
+
requests: request_chain.request_chain.map do |request|
|
31
29
|
{
|
32
30
|
request_url: request.url.to_s,
|
33
31
|
response_code: request.response.code.to_i
|
@@ -36,6 +34,14 @@ module SeoReport
|
|
36
34
|
}
|
37
35
|
end
|
38
36
|
|
37
|
+
def request_chain
|
38
|
+
@request_chain ||= build_request_chain
|
39
|
+
end
|
40
|
+
|
41
|
+
def build_request_chain
|
42
|
+
RequestChain.new(start_url).tap(&:perform)
|
43
|
+
end
|
44
|
+
|
39
45
|
def generate_html_report(request)
|
40
46
|
if request.response.is_a?(Net::HTTPOK)
|
41
47
|
doc = Nokogiri::HTML(request.response.body)
|
@@ -50,7 +56,7 @@ module SeoReport
|
|
50
56
|
end
|
51
57
|
|
52
58
|
def content_through_extractions(base, document, type: :html)
|
53
|
-
self.class.extractions[
|
59
|
+
self.class.extractions.fetch(type, []).reduce(base) do |current, method_name|
|
54
60
|
current.merge(send(method_name, document))
|
55
61
|
end
|
56
62
|
end
|
@@ -11,6 +11,13 @@ module SeoReport::Representation
|
|
11
11
|
report = SeoReport::Report.new(url)
|
12
12
|
report.produce
|
13
13
|
new(report).represent
|
14
|
+
rescue StandardError => _error
|
15
|
+
debug = ENV["SEO_REPORT_DEBUG"]
|
16
|
+
if debug.to_i > 0
|
17
|
+
raise
|
18
|
+
else
|
19
|
+
abort("-- Sorry, something went wrong when creating the report.")
|
20
|
+
end
|
14
21
|
end
|
15
22
|
|
16
23
|
def initialize(report)
|
data/lib/seo_report/version.rb
CHANGED
data/seo_report.gemspec
CHANGED
@@ -19,11 +19,14 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
+
spec.required_ruby_version = '>= 2.0.0'
|
23
|
+
|
22
24
|
spec.add_dependency "nokogiri", "~> 1.6", ">= 1.6.8"
|
23
25
|
spec.add_dependency "json", "~> 2.0", ">= 2.0.1"
|
24
26
|
|
25
27
|
spec.add_development_dependency "bundler", "~> 1.10"
|
26
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
29
|
spec.add_development_dependency "rspec", "~> 3.5"
|
30
|
+
spec.add_development_dependency "webmock", "~> 2.1"
|
28
31
|
spec.add_development_dependency "pry", "~> 0.10"
|
29
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seo_report
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Reddehase
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -92,6 +92,20 @@ dependencies:
|
|
92
92
|
- - "~>"
|
93
93
|
- !ruby/object:Gem::Version
|
94
94
|
version: '3.5'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: webmock
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '2.1'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '2.1'
|
95
109
|
- !ruby/object:Gem::Dependency
|
96
110
|
name: pry
|
97
111
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,6 +132,7 @@ files:
|
|
118
132
|
- ".gitignore"
|
119
133
|
- ".rspec"
|
120
134
|
- ".travis.yml"
|
135
|
+
- CHANGELOG.md
|
121
136
|
- Gemfile
|
122
137
|
- LICENSE
|
123
138
|
- README.md
|
@@ -153,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
168
|
requirements:
|
154
169
|
- - ">="
|
155
170
|
- !ruby/object:Gem::Version
|
156
|
-
version:
|
171
|
+
version: 2.0.0
|
157
172
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
173
|
requirements:
|
159
174
|
- - ">="
|