site_health 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +3 -0
- data/.rubocop.yml +7 -0
- data/.ruby-style-guide.yml +263 -0
- data/.travis.yml +3 -2
- data/CHANGELOG.md +10 -0
- data/Gemfile +4 -2
- data/LICENSE.txt +1 -1
- data/README.md +165 -21
- data/Rakefile +5 -3
- data/bin/console +4 -10
- data/bin/setup +0 -2
- data/exe/site_health +75 -0
- data/lib/site_health.rb +89 -113
- data/lib/site_health/check_data.rb +35 -0
- data/lib/site_health/checkers/checker.rb +152 -0
- data/lib/site_health/checkers/facebook_share_link.rb +125 -0
- data/lib/site_health/checkers/google_page_speed.rb +55 -0
- data/lib/site_health/checkers/html_proofer.rb +67 -0
- data/lib/site_health/checkers/json_syntax.rb +28 -0
- data/lib/site_health/checkers/missing_description.rb +50 -0
- data/lib/site_health/checkers/missing_title.rb +41 -0
- data/lib/site_health/checkers/page_not_found.rb +30 -0
- data/lib/site_health/checkers/redirect.rb +16 -0
- data/lib/site_health/checkers/w3c_css.rb +37 -0
- data/lib/site_health/checkers/w3c_html.rb +37 -0
- data/lib/site_health/checkers/xml.rb +27 -0
- data/lib/site_health/configuration/configuration.rb +84 -0
- data/lib/site_health/configuration/html_proofer_configuration.rb +88 -0
- data/lib/site_health/configuration/w3c_validators_configuration.rb +23 -0
- data/lib/site_health/event_emitter.rb +70 -0
- data/lib/site_health/issue.rb +125 -0
- data/lib/site_health/issues.rb +43 -0
- data/lib/site_health/issues_report.rb +52 -0
- data/lib/site_health/key_struct.rb +6 -3
- data/lib/site_health/link.rb +32 -0
- data/lib/site_health/null_logger.rb +14 -0
- data/lib/site_health/nurse.rb +167 -0
- data/lib/site_health/summarizers/page_size_summarizer.rb +77 -0
- data/lib/site_health/timer.rb +47 -0
- data/lib/site_health/url_map.rb +41 -0
- data/lib/site_health/version.rb +10 -1
- data/lib/site_health/{journals/w3c_journal.rb → w3c_journal_builder.rb} +5 -1
- data/site_health.gemspec +28 -17
- metadata +144 -21
- data/lib/site_health/checkers/css_page.rb +0 -36
- data/lib/site_health/checkers/html_page.rb +0 -41
- data/lib/site_health/checkers/xml_page.rb +0 -21
- data/lib/site_health/journals/css_journal.rb +0 -12
- data/lib/site_health/journals/html_journal.rb +0 -16
- data/lib/site_health/journals/xml_journal.rb +0 -8
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SiteHealth
|
4
|
+
# Hash-like data structure that holds URI as keys and can be accessed using
|
5
|
+
# an URI instance or the String representation
|
6
|
+
class UrlMap
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@data = if block_given?
|
11
|
+
Hash.new { |hash, key| hash[key] = yield }
|
12
|
+
else
|
13
|
+
{}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# @yieldparam [Object] value for key
|
18
|
+
# @return [Enumerator] data
|
19
|
+
def each
|
20
|
+
@data.each do |key, value|
|
21
|
+
yield(key, value) if block_given?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Object] value for key
|
26
|
+
def [](key)
|
27
|
+
@data[key.to_s]
|
28
|
+
end
|
29
|
+
|
30
|
+
# Sets value for key
|
31
|
+
# @return [Object] value for key
|
32
|
+
def []=(key, value)
|
33
|
+
@data[key.to_s] = value
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [Hash] hash representation of data
|
37
|
+
def to_h
|
38
|
+
@data
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/site_health/version.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SiteHealth
|
4
|
+
# Holds WC3Validator errors/warnings data
|
2
5
|
W3CJournal = KeyStruct.new(
|
3
6
|
:message,
|
4
7
|
:value,
|
@@ -17,8 +20,9 @@ module SiteHealth
|
|
17
20
|
:skipped_string
|
18
21
|
)
|
19
22
|
|
23
|
+
# Build a W3CJournal object
|
20
24
|
module W3CJournalBuilder
|
21
|
-
# @param [W3CValidators::Result]
|
25
|
+
# @param [W3CValidators::Result] result
|
22
26
|
# @return [W3CJournal]
|
23
27
|
def self.build(result)
|
24
28
|
W3CJournal.new(
|
data/site_health.gemspec
CHANGED
@@ -1,31 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
5
|
+
require 'site_health/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'site_health'
|
8
9
|
spec.version = SiteHealth::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
10
|
+
spec.authors = ['Jacob Burenstam']
|
11
|
+
spec.email = ['burenstam@gmail.com']
|
11
12
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
13
|
+
spec.summary = 'Crawl a site and check various health indicators.'
|
14
|
+
spec.description = 'Crawl a site and check various health indicators, such as: HTTP 4XX, 5XX status, valid HTML/XML/JSON. Missing image alt attributes/missing HTML title/description.'
|
15
|
+
spec.homepage = 'https://github.com/buren/site_health'
|
16
|
+
spec.license = 'MIT'
|
16
17
|
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
19
|
f.match(%r{^(test|spec|features)/})
|
19
20
|
end
|
20
|
-
spec.bindir =
|
21
|
+
spec.bindir = 'exe'
|
21
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
-
spec.require_paths = [
|
23
|
+
spec.require_paths = ['lib']
|
23
24
|
|
24
|
-
spec.add_dependency
|
25
|
-
spec.add_dependency "w3c_validators", "~> 1.3"
|
25
|
+
spec.add_dependency 'spidr', '~> 0.6'
|
26
26
|
|
27
|
-
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
27
|
+
# Optional runtime dependencies
|
28
|
+
spec.add_development_dependency 'google-api-client', '~> 0.19'
|
29
|
+
spec.add_development_dependency 'html-proofer', '~> 3.8'
|
30
|
+
spec.add_development_dependency 'w3c_validators', '~> 1.3'
|
31
|
+
|
32
|
+
# Development dependencies
|
33
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
34
|
+
spec.add_development_dependency 'byebug'
|
35
|
+
spec.add_development_dependency 'coveralls', '~> 0.8'
|
36
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
37
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
38
|
+
spec.add_development_dependency 'simplecov', '0.14.1'
|
39
|
+
spec.add_development_dependency 'timecop', '~> 0.9'
|
40
|
+
spec.add_development_dependency 'vcr', '~> 4.0'
|
41
|
+
spec.add_development_dependency 'webmock', '~> 3.3'
|
31
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: site_health
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jacob Burenstam
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spidr
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: google-api-client
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.19'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.19'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: html-proofer
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.8'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.8'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: w3c_validators
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -31,7 +59,7 @@ dependencies:
|
|
31
59
|
- - "~>"
|
32
60
|
- !ruby/object:Gem::Version
|
33
61
|
version: '1.3'
|
34
|
-
type: :
|
62
|
+
type: :development
|
35
63
|
prerelease: false
|
36
64
|
version_requirements: !ruby/object:Gem::Requirement
|
37
65
|
requirements:
|
@@ -44,14 +72,42 @@ dependencies:
|
|
44
72
|
requirements:
|
45
73
|
- - "~>"
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.16
|
75
|
+
version: '1.16'
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.16
|
82
|
+
version: '1.16'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: byebug
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: coveralls
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.8'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.8'
|
55
111
|
- !ruby/object:Gem::Dependency
|
56
112
|
name: rake
|
57
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,46 +137,113 @@ dependencies:
|
|
81
137
|
- !ruby/object:Gem::Version
|
82
138
|
version: '3.0'
|
83
139
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
140
|
+
name: simplecov
|
85
141
|
requirement: !ruby/object:Gem::Requirement
|
86
142
|
requirements:
|
87
|
-
- -
|
143
|
+
- - '='
|
88
144
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
145
|
+
version: 0.14.1
|
90
146
|
type: :development
|
91
147
|
prerelease: false
|
92
148
|
version_requirements: !ruby/object:Gem::Requirement
|
93
149
|
requirements:
|
94
|
-
- -
|
150
|
+
- - '='
|
95
151
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
152
|
+
version: 0.14.1
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: timecop
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.9'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.9'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: vcr
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '4.0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '4.0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: webmock
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '3.3'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '3.3'
|
97
195
|
description: 'Crawl a site and check various health indicators, such as: HTTP 4XX,
|
98
|
-
5XX status
|
196
|
+
5XX status, valid HTML/XML/JSON. Missing image alt attributes/missing HTML title/description.'
|
99
197
|
email:
|
100
198
|
- burenstam@gmail.com
|
101
|
-
executables:
|
199
|
+
executables:
|
200
|
+
- site_health
|
102
201
|
extensions: []
|
103
202
|
extra_rdoc_files: []
|
104
203
|
files:
|
105
204
|
- ".gitignore"
|
106
205
|
- ".rspec"
|
206
|
+
- ".rubocop.yml"
|
207
|
+
- ".ruby-style-guide.yml"
|
107
208
|
- ".travis.yml"
|
209
|
+
- CHANGELOG.md
|
108
210
|
- Gemfile
|
109
211
|
- LICENSE.txt
|
110
212
|
- README.md
|
111
213
|
- Rakefile
|
112
214
|
- bin/console
|
113
215
|
- bin/setup
|
216
|
+
- exe/site_health
|
114
217
|
- lib/site_health.rb
|
115
|
-
- lib/site_health/
|
116
|
-
- lib/site_health/checkers/
|
117
|
-
- lib/site_health/checkers/
|
118
|
-
- lib/site_health/
|
119
|
-
- lib/site_health/
|
120
|
-
- lib/site_health/
|
121
|
-
- lib/site_health/
|
218
|
+
- lib/site_health/check_data.rb
|
219
|
+
- lib/site_health/checkers/checker.rb
|
220
|
+
- lib/site_health/checkers/facebook_share_link.rb
|
221
|
+
- lib/site_health/checkers/google_page_speed.rb
|
222
|
+
- lib/site_health/checkers/html_proofer.rb
|
223
|
+
- lib/site_health/checkers/json_syntax.rb
|
224
|
+
- lib/site_health/checkers/missing_description.rb
|
225
|
+
- lib/site_health/checkers/missing_title.rb
|
226
|
+
- lib/site_health/checkers/page_not_found.rb
|
227
|
+
- lib/site_health/checkers/redirect.rb
|
228
|
+
- lib/site_health/checkers/w3c_css.rb
|
229
|
+
- lib/site_health/checkers/w3c_html.rb
|
230
|
+
- lib/site_health/checkers/xml.rb
|
231
|
+
- lib/site_health/configuration/configuration.rb
|
232
|
+
- lib/site_health/configuration/html_proofer_configuration.rb
|
233
|
+
- lib/site_health/configuration/w3c_validators_configuration.rb
|
234
|
+
- lib/site_health/event_emitter.rb
|
235
|
+
- lib/site_health/issue.rb
|
236
|
+
- lib/site_health/issues.rb
|
237
|
+
- lib/site_health/issues_report.rb
|
122
238
|
- lib/site_health/key_struct.rb
|
239
|
+
- lib/site_health/link.rb
|
240
|
+
- lib/site_health/null_logger.rb
|
241
|
+
- lib/site_health/nurse.rb
|
242
|
+
- lib/site_health/summarizers/page_size_summarizer.rb
|
243
|
+
- lib/site_health/timer.rb
|
244
|
+
- lib/site_health/url_map.rb
|
123
245
|
- lib/site_health/version.rb
|
246
|
+
- lib/site_health/w3c_journal_builder.rb
|
124
247
|
- site_health.gemspec
|
125
248
|
homepage: https://github.com/buren/site_health
|
126
249
|
licenses:
|
@@ -142,8 +265,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
265
|
version: '0'
|
143
266
|
requirements: []
|
144
267
|
rubyforge_project:
|
145
|
-
rubygems_version: 2.6
|
268
|
+
rubygems_version: 2.7.6
|
146
269
|
signing_key:
|
147
270
|
specification_version: 4
|
148
|
-
summary: Crawl a site and check various
|
271
|
+
summary: Crawl a site and check various health indicators.
|
149
272
|
test_files: []
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module SiteHealth
|
2
|
-
module Checkers
|
3
|
-
class CSSPage
|
4
|
-
def self.check(page)
|
5
|
-
new(page).check
|
6
|
-
end
|
7
|
-
|
8
|
-
attr_reader :page, :url
|
9
|
-
|
10
|
-
# @param [Spidr::Page] the crawled page
|
11
|
-
def initialize(page)
|
12
|
-
@page = page
|
13
|
-
@url = page.url
|
14
|
-
end
|
15
|
-
|
16
|
-
def check
|
17
|
-
result = check_content
|
18
|
-
|
19
|
-
CSSJournal.new(
|
20
|
-
url: url,
|
21
|
-
page: page,
|
22
|
-
errors: result.errors.map { |e| W3CJournalBuilder.build(e) },
|
23
|
-
warnings: result.warnings.map { |e| W3CJournalBuilder.build(e) }
|
24
|
-
)
|
25
|
-
end
|
26
|
-
|
27
|
-
# @return [W3CValidators::Results]
|
28
|
-
# @raise [W3CValidators::ValidatorUnavailable] the service is offline or returns 400 Bad Request
|
29
|
-
# @see https://github.com/w3c-validators/w3c_validators/issues/39 we really want to use #validate_text instead of #validate_uri but due to the linked issue thats not possible
|
30
|
-
def check_content
|
31
|
-
validator = W3CValidators::CSSValidator.new
|
32
|
-
validator.validate_uri(url)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module SiteHealth
|
2
|
-
module Checkers
|
3
|
-
class HTMLPage
|
4
|
-
def self.check(page)
|
5
|
-
new(page).check
|
6
|
-
end
|
7
|
-
|
8
|
-
attr_reader :page, :url
|
9
|
-
|
10
|
-
# @param [Spidr::Page] the crawled page
|
11
|
-
def initialize(page)
|
12
|
-
@page = page
|
13
|
-
@url = page.url
|
14
|
-
end
|
15
|
-
|
16
|
-
def check
|
17
|
-
result = check_content
|
18
|
-
|
19
|
-
HTMLJournal.new(
|
20
|
-
url: url,
|
21
|
-
page: page,
|
22
|
-
missing_title: missing_title?,
|
23
|
-
errors: result.errors.map { |e| W3CJournalBuilder.build(e) },
|
24
|
-
warnings: result.warnings.map { |e| W3CJournalBuilder.build(e) }
|
25
|
-
)
|
26
|
-
end
|
27
|
-
|
28
|
-
def missing_title?
|
29
|
-
page.title.to_s.strip.empty?
|
30
|
-
end
|
31
|
-
|
32
|
-
# @return [W3CValidators::Results]
|
33
|
-
# @raise [W3CValidators::ValidatorUnavailable] the service is offline or returns 400 Bad Request
|
34
|
-
# @see https://github.com/w3c-validators/w3c_validators/issues/39 we really want to use #validate_text instead of #validate_uri but due to the linked issue thats not possible
|
35
|
-
def check_content
|
36
|
-
validator = W3CValidators::NuValidator.new
|
37
|
-
validator.validate_uri(url)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|