html-proofer 0.0.16 → 0.1.0
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/Gemfile.lock +1 -1
- data/lib/html/proofer.rb +8 -3
- data/lib/html/proofer/check.rb +5 -21
- data/lib/html/proofer/checkable.rb +106 -0
- data/lib/html/proofer/checks/images.rb +36 -16
- data/lib/html/proofer/checks/links.rb +35 -49
- data/lib/html/proofer/version.rb +1 -1
- data/spec/html/proofer/fixtures/brokenInternalLink.html +0 -0
- data/spec/html/proofer/fixtures/brokenLinkWithNumber.html +2 -2
- data/spec/html/proofer/fixtures/folder/anchorLink.html +0 -0
- data/spec/html/proofer/fixtures/index.html +1 -1
- data/spec/html/proofer/fixtures/notarealhash.html +0 -0
- data/spec/html/proofer/fixtures/relativeLinks.html +4 -0
- data/spec/html/proofer/fixtures/rootLink.html +1 -0
- data/spec/html/proofer/images_spec.rb +7 -14
- data/spec/html/proofer/links_spec.rb +20 -13
- metadata +11 -4
- data/spec/html/proofer/fixtures/missingImageDirPrefix.html +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb18390b6e8107e566191736a04b0bd6209ca1fe
|
4
|
+
data.tar.gz: b82303dfc0e7972ffd8145e6465cfa03a03d3397
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fff02cdf9e240950924f36ce0eef6333e82c58075dbaf17e83f52a7314fe2a18d42ce619a5b887d338312699a24df83eb5853142e4d7ed91c0fef00213005c2
|
7
|
+
data.tar.gz: 125e1869d4ca0b448f36a0c36da4e4f601e9c8a7c959d8b44fa8532a491b52815b7e941db7d7c9623ce7f6106f7ba2b6d19125510a4d773f8a7d883e0d7b4965
|
data/Gemfile.lock
CHANGED
data/lib/html/proofer.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'nokogiri'
|
2
|
+
require 'find'
|
3
|
+
require 'html/proofer/checkable'
|
2
4
|
require 'html/proofer/checks'
|
3
5
|
|
4
6
|
module HTML
|
@@ -16,7 +18,7 @@ module HTML
|
|
16
18
|
Find.find(@srcDir) do |path|
|
17
19
|
if File.extname(path) == @options[:ext]
|
18
20
|
html = HTML::Proofer.create_nokogiri(path)
|
19
|
-
check = klass.new(path, html, @options)
|
21
|
+
check = klass.new(@srcDir, path, html, @options)
|
20
22
|
check.run
|
21
23
|
check.hydra.run
|
22
24
|
self.print_issues(klass, check.issues)
|
@@ -24,7 +26,10 @@ module HTML
|
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
|
-
if
|
29
|
+
if @failedTests.empty?
|
30
|
+
puts "Tests executed sucesfully.".green
|
31
|
+
exit 0
|
32
|
+
else
|
28
33
|
# make the hash default to 0 so that += will work correctly
|
29
34
|
count = Hash.new(0)
|
30
35
|
|
@@ -41,7 +46,7 @@ module HTML
|
|
41
46
|
end
|
42
47
|
|
43
48
|
def self.create_nokogiri(path)
|
44
|
-
path << "index.html" if File.directory? path #support for Jekyll-style links
|
49
|
+
path << "/index.html" if File.directory? path #support for Jekyll-style links
|
45
50
|
Nokogiri::HTML(File.read(path))
|
46
51
|
end
|
47
52
|
|
data/lib/html/proofer/check.rb
CHANGED
@@ -10,9 +10,10 @@ class HTML::Proofer::Checks
|
|
10
10
|
|
11
11
|
class Check
|
12
12
|
|
13
|
-
attr_reader :issues, :hydra
|
13
|
+
attr_reader :issues, :hydra, :src, :path, :options, :additional_href_ignores
|
14
14
|
|
15
|
-
def initialize(path, html, opts={})
|
15
|
+
def initialize(src, path, html, opts={})
|
16
|
+
@src = src
|
16
17
|
@path = path
|
17
18
|
@html = html
|
18
19
|
@options = opts
|
@@ -27,31 +28,13 @@ class HTML::Proofer::Checks
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def add_issue(desc)
|
30
|
-
@issues << desc
|
31
|
+
@issues << "#{@path.blue}: #{desc}"
|
31
32
|
end
|
32
33
|
|
33
34
|
def output_filenames
|
34
35
|
Dir[@site.config[:output_dir] + '/**/*'].select{ |f| File.file?(f) }
|
35
36
|
end
|
36
37
|
|
37
|
-
def external_href?(href)
|
38
|
-
uri = URI.parse(href)
|
39
|
-
%w( http https ).include?(uri.scheme)
|
40
|
-
rescue URI::BadURIError
|
41
|
-
false
|
42
|
-
rescue URI::InvalidURIError
|
43
|
-
false
|
44
|
-
end
|
45
|
-
|
46
|
-
def ignore_href?(href)
|
47
|
-
uri = URI.parse(href)
|
48
|
-
%w( mailto ).include?(uri.scheme) || @additional_href_ignores.include?(href)
|
49
|
-
rescue URI::BadURIError
|
50
|
-
false
|
51
|
-
rescue URI::InvalidURIError
|
52
|
-
false
|
53
|
-
end
|
54
|
-
|
55
38
|
def validate_url(href, issue_text)
|
56
39
|
request = Typhoeus::Request.new(href, {:followlocation => true})
|
57
40
|
request.on_complete do |response|
|
@@ -91,5 +74,6 @@ class HTML::Proofer::Checks
|
|
91
74
|
|
92
75
|
classes
|
93
76
|
end
|
77
|
+
|
94
78
|
end
|
95
79
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module HTML
|
2
|
+
class Proofer
|
3
|
+
class Checkable
|
4
|
+
|
5
|
+
def initialize(obj, check)
|
6
|
+
@src = obj['src']
|
7
|
+
@href = obj['href']
|
8
|
+
@alt = obj['alt']
|
9
|
+
@name = obj['name']
|
10
|
+
@id = obj['id']
|
11
|
+
@check = check
|
12
|
+
|
13
|
+
if @href && @check.options[:href_swap]
|
14
|
+
@options[:href_swap].each do |link, replace|
|
15
|
+
@href = @href.gsub(link, replace)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
def url
|
22
|
+
@src || @href || ""
|
23
|
+
end
|
24
|
+
|
25
|
+
def valid?
|
26
|
+
begin
|
27
|
+
URI.parse url
|
28
|
+
rescue
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def parts
|
34
|
+
URI.parse url
|
35
|
+
end
|
36
|
+
|
37
|
+
def path
|
38
|
+
parts.path
|
39
|
+
end
|
40
|
+
|
41
|
+
def hash
|
42
|
+
parts.fragment
|
43
|
+
end
|
44
|
+
|
45
|
+
# path is to an external server
|
46
|
+
def remote?
|
47
|
+
uri = URI.parse url
|
48
|
+
%w( http https ).include?(uri.scheme)
|
49
|
+
rescue URI::BadURIError
|
50
|
+
false
|
51
|
+
rescue URI::InvalidURIError
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
55
|
+
def ignore?
|
56
|
+
uri = URI.parse url
|
57
|
+
%w( mailto ).include?(uri.scheme) || @check.additional_href_ignores.include?(href)
|
58
|
+
rescue URI::BadURIError
|
59
|
+
false
|
60
|
+
rescue URI::InvalidURIError
|
61
|
+
false
|
62
|
+
end
|
63
|
+
|
64
|
+
# path is external to the file
|
65
|
+
def external?
|
66
|
+
!internal?
|
67
|
+
end
|
68
|
+
|
69
|
+
# path is an anchor
|
70
|
+
def internal?
|
71
|
+
url[0] == "#"
|
72
|
+
end
|
73
|
+
|
74
|
+
def file_path
|
75
|
+
|
76
|
+
return if path.nil?
|
77
|
+
|
78
|
+
if path =~ /^\// #path relative to root
|
79
|
+
base = @check.src
|
80
|
+
elsif File.exist? File.expand_path path, @check.src #relative links, path is a file
|
81
|
+
base = File.dirname @check.path
|
82
|
+
else #relative link, path is a directory
|
83
|
+
base = @check.path
|
84
|
+
end
|
85
|
+
|
86
|
+
file = File.join base, path
|
87
|
+
|
88
|
+
# implicit /index.html support, with support for tailing slashes
|
89
|
+
file = File.join path, "index.html" if File.directory? File.expand_path file, @check.src
|
90
|
+
|
91
|
+
file
|
92
|
+
end
|
93
|
+
|
94
|
+
# checks if a file exists relative to the current pwd
|
95
|
+
def exists?
|
96
|
+
File.exist? absolute_path
|
97
|
+
end
|
98
|
+
|
99
|
+
def absolute_path
|
100
|
+
path = file_path || @check.path
|
101
|
+
File.expand_path path, Dir.pwd
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -1,30 +1,50 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
class Image < ::HTML::Proofer::Checkable
|
4
|
+
|
5
|
+
SCREEN_SHOT_REGEX = /Screen(?: |%20)Shot(?: |%20)\d+-\d+-\d+(?: |%20)at(?: |%20)\d+.\d+.\d+/
|
6
|
+
|
7
|
+
def valid_alt_tag?
|
8
|
+
@alt and !@alt.empty?
|
9
|
+
end
|
10
|
+
|
11
|
+
def terrible_filename?
|
12
|
+
@src =~ SCREEN_SHOT_REGEX
|
13
|
+
end
|
14
|
+
|
15
|
+
def src
|
16
|
+
@src unless @src.nil? || @src.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
def missing_src?
|
20
|
+
!src
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
3
25
|
class Images < ::HTML::Proofer::Checks::Check
|
4
26
|
|
5
27
|
def run
|
6
28
|
@html.css('img').each do |img|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
29
|
+
|
30
|
+
img = Image.new img, self
|
31
|
+
|
32
|
+
# screenshot filenames, return because invalid URL
|
33
|
+
return self.add_issue "image has a terrible filename (#{img.src})" if img.terrible_filename?
|
34
|
+
|
35
|
+
# does the image exist?
|
36
|
+
if img.missing_src?
|
37
|
+
self.add_issue "image has no src attribute"
|
38
|
+
elsif img.remote?
|
39
|
+
validate_url img.src, "external image #{img.src} does not exist"
|
16
40
|
else
|
17
|
-
self.add_issue("#{
|
41
|
+
self.add_issue("internal image #{img.src} does not exist") unless img.exists?
|
18
42
|
end
|
19
43
|
|
20
44
|
# check alt tag
|
21
|
-
self.add_issue
|
22
|
-
|
23
|
-
screenShotRegExp = /Screen(?: |%20)Shot(?: |%20)\d+-\d+-\d+(?: |%20)at(?: |%20)\d+.\d+.\d+/
|
45
|
+
self.add_issue "image #{img.src} does not have an alt attribute" unless img.valid_alt_tag?
|
46
|
+
|
24
47
|
|
25
|
-
if src =~ screenShotRegExp
|
26
|
-
self.add_issue("#{@path}".blue + ": image has a terrible filename (#{src})")
|
27
|
-
end
|
28
48
|
end
|
29
49
|
end
|
30
50
|
end
|
@@ -1,57 +1,48 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
class Link < ::HTML::Proofer::Checkable
|
4
|
+
|
5
|
+
def href
|
6
|
+
@href unless @href.nil? || @href.empty?
|
7
|
+
end
|
8
|
+
|
9
|
+
def missing_href?
|
10
|
+
href.nil? and @name.nil? and @id.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
3
15
|
class Links < ::HTML::Proofer::Checks::Check
|
4
16
|
|
5
17
|
def run
|
6
|
-
@html.css('a').each do |
|
7
|
-
href = a['href']
|
18
|
+
@html.css('a').each do |link|
|
8
19
|
|
9
|
-
|
10
|
-
|
11
|
-
@options[:href_swap].each do |link, replace|
|
12
|
-
href = href.gsub(link, replace)
|
13
|
-
end
|
14
|
-
end
|
20
|
+
link = Link.new link, self
|
21
|
+
return if link.ignore?
|
15
22
|
|
16
|
-
|
23
|
+
# is there even a href?
|
24
|
+
return self.add_issue("link has no href attribute") if link.missing_href?
|
17
25
|
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
if !external_href?(href)
|
22
|
-
# an internal link, with a hash
|
23
|
-
if href_split && !href_split.empty?
|
24
|
-
href_file = href_split[0]
|
25
|
-
href_hash = href_split[1]
|
26
|
+
# is it even a valid URL?
|
27
|
+
return self.add_issue "#{link.href} is an invalid URL" unless link.valid?
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
if !File.exist?(href_location)
|
31
|
-
self.add_issue("#{@path}".blue + ": internal link #{href_location} does not exist")
|
32
|
-
else
|
33
|
-
href_html = HTML::Proofer.create_nokogiri(href_location)
|
34
|
-
found_hash_match = false
|
35
|
-
unless hash_check(href_html, href_hash)
|
36
|
-
self.add_issue("#{@path}".blue + ": linking to #{href}, but #{href_hash} does not exist")
|
37
|
-
end
|
38
|
-
end
|
39
|
-
# it is an internal link, with an internal hash
|
40
|
-
else
|
41
|
-
unless hash_check(@html, href_hash)
|
42
|
-
self.add_issue("#{@path}".blue + ": linking to an internal hash called #{href_hash} that does not exist")
|
43
|
-
end
|
44
|
-
end
|
45
|
-
# internal link, no hash
|
46
|
-
else
|
47
|
-
href_location = resolve_path File.join(File.dirname(@path), href)
|
48
|
-
self.add_issue("#{@path}".blue + ": internally linking to #{href_location}, which does not exist") unless File.exist?(href_location)
|
49
|
-
end
|
50
|
-
else
|
51
|
-
validate_url(href, "#{@path}".blue + ": externally linking to #{href}, which does not exist")
|
52
|
-
end
|
29
|
+
# does the file even exist?
|
30
|
+
if link.remote?
|
31
|
+
validate_url link.href, "externally linking to #{link.href}, which does not exist"
|
53
32
|
else
|
54
|
-
self.add_issue
|
33
|
+
self.add_issue "internally linking to #{link.href}, which does not exist" unless link.exists?
|
34
|
+
end
|
35
|
+
|
36
|
+
# verify the target hash
|
37
|
+
if link.hash
|
38
|
+
if link.remote?
|
39
|
+
#not yet checked
|
40
|
+
elsif link.internal?
|
41
|
+
self.add_issue "linking to internal hash ##{link.hash} that does not exist" unless hash_check @html, link.hash
|
42
|
+
elsif link.external?
|
43
|
+
target_html = HTML::Proofer.create_nokogiri link.absolute_path
|
44
|
+
self.add_issue "linking to #{link.href}, but #{link.hash} does not exist" unless hash_check target_html, link.hash
|
45
|
+
end
|
55
46
|
end
|
56
47
|
end
|
57
48
|
end
|
@@ -60,9 +51,4 @@ class Links < ::HTML::Proofer::Checks::Check
|
|
60
51
|
html.xpath("//*[@id='#{href_hash}']", "//*[@name='#{href_hash}']").length > 0
|
61
52
|
end
|
62
53
|
|
63
|
-
#support for implicit /index.html in URLs
|
64
|
-
def resolve_path(path)
|
65
|
-
path << "index.html" if File.directory? path
|
66
|
-
path
|
67
|
-
end
|
68
54
|
end
|
data/lib/html/proofer/version.rb
CHANGED
File without changes
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<body>
|
4
4
|
|
5
|
-
<p>Blah blah blah. <a
|
5
|
+
<p>Blah blah blah. <a class="anchor" href="#25-method-not-allowed"><span class="mini-icon mini-icon-link"></span></a>25 Method not allowed</h4></p>
|
6
6
|
</body>
|
7
7
|
|
8
|
-
</html>
|
8
|
+
</html>
|
File without changes
|
@@ -1 +1 @@
|
|
1
|
-
root
|
1
|
+
<h1 id="anchor">root.</a>
|
File without changes
|
@@ -3,35 +3,28 @@ require "spec_helper"
|
|
3
3
|
describe "Image tests" do
|
4
4
|
it "passes for existing external images" do
|
5
5
|
externalImageFilepath = "#{FIXTURES_DIR}/existingImageExternal.html"
|
6
|
-
@imageCheck = Images.new(externalImageFilepath, HTML::Proofer.create_nokogiri(externalImageFilepath))
|
6
|
+
@imageCheck = Images.new("#{FIXTURES_DIR}", externalImageFilepath, HTML::Proofer.create_nokogiri(externalImageFilepath))
|
7
7
|
@imageCheck.run
|
8
8
|
@imageCheck.issues[0].should eq(nil)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "fails for image without alt attribute" do
|
12
12
|
missingAltFilepath = "#{FIXTURES_DIR}/missingImageAlt.html"
|
13
|
-
@imageCheck = Images.new(missingAltFilepath, HTML::Proofer.create_nokogiri(missingAltFilepath))
|
13
|
+
@imageCheck = Images.new("#{FIXTURES_DIR}", missingAltFilepath, HTML::Proofer.create_nokogiri(missingAltFilepath))
|
14
14
|
@imageCheck.run
|
15
15
|
@imageCheck.issues[0].should eq("spec/html/proofer/fixtures/missingImageAlt.html".blue + ": image ./gpl.png does not have an alt attribute")
|
16
16
|
end
|
17
17
|
|
18
18
|
it "fails for image with an empty alt attribute" do
|
19
19
|
missingAltFilepath = "#{FIXTURES_DIR}/missingImageAltText.html"
|
20
|
-
@imageCheck = Images.new(missingAltFilepath, HTML::Proofer.create_nokogiri(missingAltFilepath))
|
20
|
+
@imageCheck = Images.new("#{FIXTURES_DIR}", missingAltFilepath, HTML::Proofer.create_nokogiri(missingAltFilepath))
|
21
21
|
@imageCheck.run
|
22
22
|
@imageCheck.issues[0].should eq("spec/html/proofer/fixtures/missingImageAltText.html".blue + ": image ./gpl.png does not have an alt attribute")
|
23
23
|
end
|
24
24
|
|
25
|
-
it "fails for image without a dir prefix" do
|
26
|
-
missingImageDirPrefixFilepath = "#{FIXTURES_DIR}/missingImageDirPrefix.html"
|
27
|
-
@imageCheck = Images.new(missingImageDirPrefixFilepath, HTML::Proofer.create_nokogiri(missingImageDirPrefixFilepath))
|
28
|
-
@imageCheck.run
|
29
|
-
@imageCheck.issues[0].should eq("spec/html/proofer/fixtures/missingImageDirPrefix.html".blue + ": internal image /gpl.png does not exist")
|
30
|
-
end
|
31
|
-
|
32
25
|
it "fails for missing external images" do
|
33
26
|
externalImageFilepath = "#{FIXTURES_DIR}/missingImageExternal.html"
|
34
|
-
@imageCheck = Images.new(externalImageFilepath, HTML::Proofer.create_nokogiri(externalImageFilepath))
|
27
|
+
@imageCheck = Images.new("#{FIXTURES_DIR}", externalImageFilepath, HTML::Proofer.create_nokogiri(externalImageFilepath))
|
35
28
|
@imageCheck.run
|
36
29
|
@imageCheck.hydra.run
|
37
30
|
@imageCheck.issues[0].sub!(/ #<Typhoeus::Response:[\w]+>/, "")
|
@@ -40,21 +33,21 @@ describe "Image tests" do
|
|
40
33
|
|
41
34
|
it "fails for missing internal images" do
|
42
35
|
internalImageFilepath = "#{FIXTURES_DIR}/missingImageInternal.html"
|
43
|
-
@imageCheck = Images.new(internalImageFilepath, HTML::Proofer.create_nokogiri(internalImageFilepath))
|
36
|
+
@imageCheck = Images.new("#{FIXTURES_DIR}", internalImageFilepath, HTML::Proofer.create_nokogiri(internalImageFilepath))
|
44
37
|
@imageCheck.run
|
45
38
|
@imageCheck.issues[0].should eq("spec/html/proofer/fixtures/missingImageInternal.html".blue + ": internal image ./doesnotexist.png does not exist")
|
46
39
|
end
|
47
40
|
|
48
41
|
it "fails for image with no src" do
|
49
42
|
imageSrcFilepath = "#{FIXTURES_DIR}/missingImageSrc.html"
|
50
|
-
@imageCheck = Images.new(imageSrcFilepath, HTML::Proofer.create_nokogiri(imageSrcFilepath))
|
43
|
+
@imageCheck = Images.new("#{FIXTURES_DIR}", imageSrcFilepath, HTML::Proofer.create_nokogiri(imageSrcFilepath))
|
51
44
|
@imageCheck.run
|
52
45
|
@imageCheck.issues[0].should eq("spec/html/proofer/fixtures/missingImageSrc.html".blue + ": image has no src attribute")
|
53
46
|
end
|
54
47
|
|
55
48
|
it "fails for image with default mac filename" do
|
56
49
|
terribleImageName = "#{FIXTURES_DIR}/terribleImageName.html"
|
57
|
-
@imageCheck = Images.new(terribleImageName, HTML::Proofer.create_nokogiri(terribleImageName))
|
50
|
+
@imageCheck = Images.new("#{FIXTURES_DIR}", terribleImageName, HTML::Proofer.create_nokogiri(terribleImageName))
|
58
51
|
@imageCheck.run
|
59
52
|
@imageCheck.issues[0].should eq("spec/html/proofer/fixtures/terribleImageName.html".blue + ": image has a terrible filename (./Screen Shot 2012-08-09 at 7.51.18 AM.png)")
|
60
53
|
end
|
@@ -4,21 +4,21 @@ describe "Links tests" do
|
|
4
4
|
|
5
5
|
it "fails for broken external hash (even if the file exists)" do
|
6
6
|
brokenHashExternalFilepath = "#{FIXTURES_DIR}/brokenHashExternal.html"
|
7
|
-
@linkCheck = Links.new(brokenHashExternalFilepath, HTML::Proofer.create_nokogiri(brokenHashExternalFilepath))
|
7
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", brokenHashExternalFilepath, HTML::Proofer.create_nokogiri(brokenHashExternalFilepath))
|
8
8
|
@linkCheck.run
|
9
9
|
@linkCheck.issues[1].should eq("spec/html/proofer/fixtures/brokenHashExternal.html".blue + ": linking to ./missingImageAlt.html#asdfasfdkafl, but asdfasfdkafl does not exist")
|
10
10
|
end
|
11
11
|
|
12
12
|
it "fails for broken internal hash" do
|
13
13
|
brokenHashInternalFilepath = "#{FIXTURES_DIR}/brokenHashInternal.html"
|
14
|
-
@linkCheck = Links.new(brokenHashInternalFilepath, HTML::Proofer.create_nokogiri(brokenHashInternalFilepath))
|
14
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", brokenHashInternalFilepath, HTML::Proofer.create_nokogiri(brokenHashInternalFilepath))
|
15
15
|
@linkCheck.run
|
16
|
-
@linkCheck.issues[0].should eq("spec/html/proofer/fixtures/brokenHashInternal.html".blue + ": linking to
|
16
|
+
@linkCheck.issues[0].should eq("spec/html/proofer/fixtures/brokenHashInternal.html".blue + ": linking to internal hash #noHash that does not exist")
|
17
17
|
end
|
18
18
|
|
19
19
|
it "fails for broken external links" do
|
20
20
|
brokenLinkExternalFilepath = "#{FIXTURES_DIR}/brokenLinkExternal.html"
|
21
|
-
@linkCheck = Links.new(brokenLinkExternalFilepath, HTML::Proofer.create_nokogiri(brokenLinkExternalFilepath))
|
21
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", brokenLinkExternalFilepath, HTML::Proofer.create_nokogiri(brokenLinkExternalFilepath))
|
22
22
|
@linkCheck.run
|
23
23
|
@linkCheck.hydra.run
|
24
24
|
@linkCheck.issues[0].sub!(/ #<Typhoeus::Response:[\w]+>/, "")
|
@@ -27,49 +27,56 @@ describe "Links tests" do
|
|
27
27
|
|
28
28
|
it "fails for broken internal links" do
|
29
29
|
brokenLinkInternalFilepath = "#{FIXTURES_DIR}/brokenLinkInternal.html"
|
30
|
-
@linkCheck = Links.new(brokenLinkInternalFilepath, HTML::Proofer.create_nokogiri(brokenLinkInternalFilepath))
|
30
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", brokenLinkInternalFilepath, HTML::Proofer.create_nokogiri(brokenLinkInternalFilepath))
|
31
31
|
@linkCheck.run
|
32
|
-
@linkCheck.issues[0].should eq("spec/html/proofer/fixtures/brokenLinkInternal.html".blue + ": internally linking to
|
32
|
+
@linkCheck.issues[0].should eq("spec/html/proofer/fixtures/brokenLinkInternal.html".blue + ": internally linking to ./notreal.html, which does not exist")
|
33
33
|
end
|
34
34
|
|
35
35
|
it "fails for link with no href" do
|
36
36
|
missingLinkHrefFilepath = "#{FIXTURES_DIR}/missingLinkHref.html"
|
37
|
-
@linkCheck = Links.new(missingLinkHrefFilepath, HTML::Proofer.create_nokogiri(missingLinkHrefFilepath))
|
37
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", missingLinkHrefFilepath, HTML::Proofer.create_nokogiri(missingLinkHrefFilepath))
|
38
38
|
@linkCheck.run
|
39
39
|
@linkCheck.issues[0].should eq("spec/html/proofer/fixtures/missingLinkHref.html".blue + ": link has no href attribute")
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should follow redirects" do
|
43
43
|
linkWithRedirectFilepath = "#{FIXTURES_DIR}/linkWithRedirect.html"
|
44
|
-
@linkCheck = Links.new(linkWithRedirectFilepath, HTML::Proofer.create_nokogiri(linkWithRedirectFilepath))
|
44
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", linkWithRedirectFilepath, HTML::Proofer.create_nokogiri(linkWithRedirectFilepath))
|
45
45
|
@linkCheck.run
|
46
46
|
@linkCheck.issues[0].should eq(nil)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should understand https" do
|
50
50
|
linkWithHttpsFilepath = "#{FIXTURES_DIR}/linkWithHttps.html"
|
51
|
-
@linkCheck = Links.new(linkWithHttpsFilepath, HTML::Proofer.create_nokogiri(linkWithHttpsFilepath))
|
51
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", linkWithHttpsFilepath, HTML::Proofer.create_nokogiri(linkWithHttpsFilepath))
|
52
52
|
@linkCheck.run
|
53
53
|
@linkCheck.issues[0].should eq(nil)
|
54
54
|
end
|
55
55
|
|
56
56
|
it "fails for broken hash links with status code numbers" do
|
57
57
|
brokenLinkWithNumberFilepath = "#{FIXTURES_DIR}/brokenLinkWithNumber.html"
|
58
|
-
@linkCheck = Links.new(brokenLinkWithNumberFilepath, HTML::Proofer.create_nokogiri(brokenLinkWithNumberFilepath))
|
58
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", brokenLinkWithNumberFilepath, HTML::Proofer.create_nokogiri(brokenLinkWithNumberFilepath))
|
59
59
|
@linkCheck.run
|
60
|
-
@linkCheck.issues[0].should eq(
|
60
|
+
@linkCheck.issues[0].should eq("\e[34mspec/html/proofer/fixtures/brokenLinkWithNumber.html\e[0m: linking to internal hash #25-method-not-allowed that does not exist")
|
61
61
|
end
|
62
62
|
|
63
63
|
it 'properly resolves implicit /index.html in link paths' do
|
64
64
|
linkToFolder = "#{FIXTURES_DIR}/linkToFolder.html"
|
65
|
-
@linkCheck = Links.new(linkToFolder, HTML::Proofer.create_nokogiri(linkToFolder))
|
65
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", linkToFolder, HTML::Proofer.create_nokogiri(linkToFolder))
|
66
66
|
@linkCheck.run
|
67
67
|
@linkCheck.issues[0].should eq(nil)
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'properly checks links to root' do
|
71
71
|
rootLink = "#{FIXTURES_DIR}/rootLink.html"
|
72
|
-
@linkCheck = Links.new(rootLink, HTML::Proofer.create_nokogiri(rootLink))
|
72
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", rootLink, HTML::Proofer.create_nokogiri(rootLink))
|
73
|
+
@linkCheck.run
|
74
|
+
@linkCheck.issues[0].should eq(nil)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'properly checks relative links' do
|
78
|
+
relativeLinks = "#{FIXTURES_DIR}/relativeLinks.html"
|
79
|
+
@linkCheck = Links.new("#{FIXTURES_DIR}", relativeLinks, HTML::Proofer.create_nokogiri(relativeLinks))
|
73
80
|
@linkCheck.run
|
74
81
|
@linkCheck.issues[0].should eq(nil)
|
75
82
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: html-proofer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Garen Torikian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- lib/html-proofer.rb
|
113
113
|
- lib/html/proofer.rb
|
114
114
|
- lib/html/proofer/check.rb
|
115
|
+
- lib/html/proofer/checkable.rb
|
115
116
|
- lib/html/proofer/checks.rb
|
116
117
|
- lib/html/proofer/checks/images.rb
|
117
118
|
- lib/html/proofer/checks/links.rb
|
@@ -119,10 +120,12 @@ files:
|
|
119
120
|
- spec/html/proofer/fixtures/Screen Shot 2012-08-09 at 7.51.18 AM.png
|
120
121
|
- spec/html/proofer/fixtures/brokenHashExternal.html
|
121
122
|
- spec/html/proofer/fixtures/brokenHashInternal.html
|
123
|
+
- spec/html/proofer/fixtures/brokenInternalLink.html
|
122
124
|
- spec/html/proofer/fixtures/brokenLinkExternal.html
|
123
125
|
- spec/html/proofer/fixtures/brokenLinkInternal.html
|
124
126
|
- spec/html/proofer/fixtures/brokenLinkWithNumber.html
|
125
127
|
- spec/html/proofer/fixtures/existingImageExternal.html
|
128
|
+
- spec/html/proofer/fixtures/folder/anchorLink.html
|
126
129
|
- spec/html/proofer/fixtures/folder/index.html
|
127
130
|
- spec/html/proofer/fixtures/gpl.png
|
128
131
|
- spec/html/proofer/fixtures/index.html
|
@@ -131,11 +134,12 @@ files:
|
|
131
134
|
- spec/html/proofer/fixtures/linkWithRedirect.html
|
132
135
|
- spec/html/proofer/fixtures/missingImageAlt.html
|
133
136
|
- spec/html/proofer/fixtures/missingImageAltText.html
|
134
|
-
- spec/html/proofer/fixtures/missingImageDirPrefix.html
|
135
137
|
- spec/html/proofer/fixtures/missingImageExternal.html
|
136
138
|
- spec/html/proofer/fixtures/missingImageInternal.html
|
137
139
|
- spec/html/proofer/fixtures/missingImageSrc.html
|
138
140
|
- spec/html/proofer/fixtures/missingLinkHref.html
|
141
|
+
- spec/html/proofer/fixtures/notarealhash.html
|
142
|
+
- spec/html/proofer/fixtures/relativeLinks.html
|
139
143
|
- spec/html/proofer/fixtures/rootLink.html
|
140
144
|
- spec/html/proofer/fixtures/terribleImageName.html
|
141
145
|
- spec/html/proofer/images_spec.rb
|
@@ -172,10 +176,12 @@ test_files:
|
|
172
176
|
- spec/html/proofer/fixtures/Screen Shot 2012-08-09 at 7.51.18 AM.png
|
173
177
|
- spec/html/proofer/fixtures/brokenHashExternal.html
|
174
178
|
- spec/html/proofer/fixtures/brokenHashInternal.html
|
179
|
+
- spec/html/proofer/fixtures/brokenInternalLink.html
|
175
180
|
- spec/html/proofer/fixtures/brokenLinkExternal.html
|
176
181
|
- spec/html/proofer/fixtures/brokenLinkInternal.html
|
177
182
|
- spec/html/proofer/fixtures/brokenLinkWithNumber.html
|
178
183
|
- spec/html/proofer/fixtures/existingImageExternal.html
|
184
|
+
- spec/html/proofer/fixtures/folder/anchorLink.html
|
179
185
|
- spec/html/proofer/fixtures/folder/index.html
|
180
186
|
- spec/html/proofer/fixtures/gpl.png
|
181
187
|
- spec/html/proofer/fixtures/index.html
|
@@ -184,11 +190,12 @@ test_files:
|
|
184
190
|
- spec/html/proofer/fixtures/linkWithRedirect.html
|
185
191
|
- spec/html/proofer/fixtures/missingImageAlt.html
|
186
192
|
- spec/html/proofer/fixtures/missingImageAltText.html
|
187
|
-
- spec/html/proofer/fixtures/missingImageDirPrefix.html
|
188
193
|
- spec/html/proofer/fixtures/missingImageExternal.html
|
189
194
|
- spec/html/proofer/fixtures/missingImageInternal.html
|
190
195
|
- spec/html/proofer/fixtures/missingImageSrc.html
|
191
196
|
- spec/html/proofer/fixtures/missingLinkHref.html
|
197
|
+
- spec/html/proofer/fixtures/notarealhash.html
|
198
|
+
- spec/html/proofer/fixtures/relativeLinks.html
|
192
199
|
- spec/html/proofer/fixtures/rootLink.html
|
193
200
|
- spec/html/proofer/fixtures/terribleImageName.html
|
194
201
|
- spec/html/proofer/images_spec.rb
|