validate-website 1.6.0 → 1.7.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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +8 -0
  3. data/LICENSE +1 -1
  4. data/README.md +1 -1
  5. data/lib/validate_website/core.rb +1 -0
  6. data/lib/validate_website/static.rb +4 -63
  7. data/lib/validate_website/static_link.rb +65 -0
  8. data/lib/validate_website/validator.rb +43 -39
  9. data/lib/validate_website/version.rb +1 -1
  10. data/man/man1/validate-website-static.1 +3 -3
  11. data/man/man1/validate-website.1 +3 -3
  12. data/test/crawler_test.rb +9 -5
  13. data/test/data/validator.nu-failure.json +1 -0
  14. data/test/data/validator.nu-success.json +1 -0
  15. data/test/static_test.rb +1 -1
  16. data/test/validator_test.rb +14 -41
  17. metadata +14 -68
  18. data/data/schemas/xhtml-access-1.xsd +0 -43
  19. data/data/schemas/xhtml-applet-1.xsd +0 -66
  20. data/data/schemas/xhtml-attribs-1.xsd +0 -67
  21. data/data/schemas/xhtml-basic-form-1.xsd +0 -195
  22. data/data/schemas/xhtml-basic-table-1.xsd +0 -169
  23. data/data/schemas/xhtml-basic10-model-1.xsd +0 -385
  24. data/data/schemas/xhtml-basic10-module-redefines-1.xsd +0 -61
  25. data/data/schemas/xhtml-basic10-modules-1.xsd +0 -233
  26. data/data/schemas/xhtml-basic10.xsd +0 -99
  27. data/data/schemas/xhtml-basic11-model-1.xsd +0 -622
  28. data/data/schemas/xhtml-basic11-modules-1.xsd +0 -508
  29. data/data/schemas/xhtml-basic11.xsd +0 -105
  30. data/data/schemas/xhtml-bdo-1.xsd +0 -72
  31. data/data/schemas/xhtml-blkphras-1.xsd +0 -155
  32. data/data/schemas/xhtml-blkpres-1.xsd +0 -32
  33. data/data/schemas/xhtml-blkstruct-1.xsd +0 -44
  34. data/data/schemas/xhtml-csismap-1.xsd +0 -91
  35. data/data/schemas/xhtml-edit-1.xsd +0 -34
  36. data/data/schemas/xhtml-form-1.xsd +0 -321
  37. data/data/schemas/xhtml-frames-1.xsd +0 -113
  38. data/data/schemas/xhtml-framework-1.xsd +0 -62
  39. data/data/schemas/xhtml-hypertext-1.xsd +0 -47
  40. data/data/schemas/xhtml-iframe-1.xsd +0 -68
  41. data/data/schemas/xhtml-image-1.xsd +0 -40
  42. data/data/schemas/xhtml-inlphras-1.xsd +0 -158
  43. data/data/schemas/xhtml-inlpres-1.xsd +0 -34
  44. data/data/schemas/xhtml-inlstruct-1.xsd +0 -45
  45. data/data/schemas/xhtml-legacy-1.xsd +0 -97
  46. data/data/schemas/xhtml-link-1.xsd +0 -45
  47. data/data/schemas/xhtml-list-1.xsd +0 -94
  48. data/data/schemas/xhtml-meta-1.xsd +0 -54
  49. data/data/schemas/xhtml-misc-1.xsd +0 -441
  50. data/data/schemas/xhtml-object-1.xsd +0 -71
  51. data/data/schemas/xhtml-param-1.xsd +0 -46
  52. data/data/schemas/xhtml-pres-1.xsd +0 -46
  53. data/data/schemas/xhtml-print-1.xsd +0 -85
  54. data/data/schemas/xhtml-print-model-1.xsd +0 -604
  55. data/data/schemas/xhtml-print-modules-1.xsd +0 -422
  56. data/data/schemas/xhtml-rdfa-1.xsd +0 -116
  57. data/data/schemas/xhtml-rdfa-model-1.xsd +0 -461
  58. data/data/schemas/xhtml-rdfa-modules-1.xsd +0 -548
  59. data/data/schemas/xhtml-ruby-1.xsd +0 -170
  60. data/data/schemas/xhtml-script-1.xsd +0 -65
  61. data/data/schemas/xhtml-struct-1.xsd +0 -85
  62. data/data/schemas/xhtml-style-1.xsd +0 -47
  63. data/data/schemas/xhtml-table-1.xsd +0 -267
  64. data/data/schemas/xhtml-text-1.xsd +0 -62
  65. data/data/schemas/xhtml11-model-1.xsd +0 -715
  66. data/data/schemas/xhtml11-module-redefines-1.xsd +0 -335
  67. data/data/schemas/xhtml11-modules-1.xsd +0 -605
  68. data/data/schemas/xhtml11.xsd +0 -107
  69. data/data/schemas/xml-handlers-2.xsd +0 -98
  70. data/data/schemas/xml-script-1.xsd +0 -38
  71. data/test/data/html5-linuxfr.html +0 -1286
  72. data/test/data/validator.nu-excessive.html +0 -118
  73. data/test/data/validator.nu-failure.html +0 -10
  74. data/test/data/validator.nu-success.html +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc00f175061211e02bfbc9e52efab65576ed699e
4
- data.tar.gz: 7f5580e8e11c11922e43cf293e4900fde67ac28f
3
+ metadata.gz: ba01cfb0d05bb3670aecfb1afcc94bc72dd02088
4
+ data.tar.gz: 8f8259c854e992e72c18e48141509475378e3a91
5
5
  SHA512:
6
- metadata.gz: f14177d2cf4c192575cbe5d6435842ced3c2b84c7057b212e86d74f14dfafb5f704bb0d4043fd2ece596007a67c96858cdcf6c423f31e7e718e42945e4d63027
7
- data.tar.gz: 27901ac698b0b29739bb5ab1f7bfa710ca56cec65a26f2fca4533800e2cb1187c3a914f45e963afa4306a36c6962eb97817cce12a9c698b695136684db2e2ad2
6
+ metadata.gz: 8585f39f42b34a667c34f760c96b6c1dbeba03ab4d1adefc1bb26aa8a846038e26fba3e48f657007fb1973f10b4173e86e84e16b8b13f7bd20809adbd40e7f2e
7
+ data.tar.gz: 620cf747186ef3518b9bec8f248cf8d78d4c73510ff745117fbbecdad66f24816124a26287485b77396043574e48aa5878bcc61c123f8a2c9b0d00502b83761f
data/History.md CHANGED
@@ -1,4 +1,12 @@
1
1
 
2
+ v1.7.0 / 2017-04-08
3
+ ===================
4
+
5
+ * Use w3c_validators and remove multipart_body gem
6
+ * Drop Ruby 2.0.0
7
+ * Update webmock to 2.3
8
+ * Load xsd on init to avoid conflicting chdir
9
+
2
10
  v1.6.0 / 2016-09-24
3
11
  ===================
4
12
 
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (c) 2009-2016 Laurent Arnoud <laurent@spkdev.net>
3
+ Copyright (c) 2009-2017 Laurent Arnoud <laurent@spkdev.net>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -122,7 +122,7 @@ See [GitHub](https://github.com/spk/validate-website/graphs/contributors).
122
122
 
123
123
  The MIT License
124
124
 
125
- Copyright (c) 2009-2016 Laurent Arnoud <laurent@spkdev.net>
125
+ Copyright (c) 2009-2017 Laurent Arnoud <laurent@spkdev.net>
126
126
 
127
127
  ---
128
128
  [![Build](https://img.shields.io/travis-ci/spk/validate-website.svg)](https://travis-ci.org/spk/validate-website)
@@ -13,6 +13,7 @@ require 'crass'
13
13
  module ValidateWebsite
14
14
  autoload :Crawl, 'validate_website/crawl'
15
15
  autoload :Static, 'validate_website/static'
16
+ autoload :StaticLink, 'validate_website/static_link'
16
17
 
17
18
  # Core class for static or website validation
18
19
  class Core
@@ -60,75 +60,16 @@ module ValidateWebsite
60
60
  check_static_not_found(page.links) if options[:not_found]
61
61
  end
62
62
 
63
- StaticLink = Struct.new(:link, :site) do
64
- def link_uri
65
- @link_uri = URI.parse(URI.encode(link))
66
- @link_uri = URI.join(site, @link_uri) if @link_uri.host.nil?
67
- @link_uri
68
- end
69
-
70
- def in_static_domain?
71
- URI.parse(site).host == link_uri.host
72
- end
73
-
74
- def content_types
75
- if css?
76
- ['text/css']
77
- else
78
- CONTENT_TYPES
79
- end
80
- end
81
-
82
- def body
83
- if File.exist?(link)
84
- open(link).read
85
- else
86
- open(file_path).read
87
- end
88
- end
89
-
90
- def response
91
- @response ||= ValidateWebsite::Static.fake_httpresponse(
92
- body,
93
- content_types
94
- )
95
- end
96
-
97
- def page
98
- @page ||= Spidr::Page.new(link_uri, response)
99
- end
100
-
101
- def extract_urls_from_fake_css_response
102
- ValidateWebsite::Utils.extract_urls_from_css(page)
103
- end
104
-
105
- def file_path
106
- @file_path ||= URI.parse(
107
- File.join(Dir.getwd, link_uri.path || '/')
108
- ).path
109
- end
110
-
111
- def extname
112
- @extname ||= File.extname(file_path)
113
- end
114
-
115
- def css?
116
- extname == '.css'
117
- end
118
-
119
- def check?
120
- !link.include?('#') && in_static_domain?
121
- end
122
- end
123
-
124
63
  # check files linked on static document
125
64
  # see lib/validate_website/runner.rb
126
65
  def check_static_not_found(links)
127
66
  static_links = links.map { |l| StaticLink.new(l, @site) }
128
67
  static_links.each do |static_link|
129
68
  next unless static_link.check?
130
- not_found_error(static_link.file_path) &&
131
- next unless File.exist?(static_link.file_path)
69
+ unless File.exist?(static_link.file_path)
70
+ not_found_error(static_link.file_path)
71
+ next
72
+ end
132
73
  next unless static_link.css?
133
74
  check_static_not_found static_link.extract_urls_from_fake_css_response
134
75
  end
@@ -0,0 +1,65 @@
1
+ require 'uri'
2
+ require 'validate_website/utils'
3
+ require 'validate_website/static'
4
+ require 'spidr'
5
+
6
+ StaticLink = Struct.new(:link, :site) do
7
+ def link_uri
8
+ @link_uri = URI.parse(URI.encode(link))
9
+ @link_uri = URI.join(site, @link_uri) if @link_uri.host.nil?
10
+ @link_uri
11
+ end
12
+
13
+ def in_static_domain?
14
+ URI.parse(site).host == link_uri.host
15
+ end
16
+
17
+ def content_types
18
+ if css?
19
+ ['text/css']
20
+ else
21
+ ValidateWebsite::Static::CONTENT_TYPES
22
+ end
23
+ end
24
+
25
+ def body
26
+ if File.exist?(link)
27
+ open(link).read
28
+ else
29
+ open(file_path).read
30
+ end
31
+ end
32
+
33
+ def response
34
+ @response ||= ValidateWebsite::Static.fake_httpresponse(
35
+ body,
36
+ content_types
37
+ )
38
+ end
39
+
40
+ def page
41
+ @page ||= Spidr::Page.new(link_uri, response)
42
+ end
43
+
44
+ def extract_urls_from_fake_css_response
45
+ ValidateWebsite::Utils.extract_urls_from_css(page)
46
+ end
47
+
48
+ def file_path
49
+ @file_path ||= URI.parse(
50
+ File.join(Dir.getwd, link_uri.path || '/')
51
+ ).path
52
+ end
53
+
54
+ def extname
55
+ @extname ||= File.extname(file_path)
56
+ end
57
+
58
+ def css?
59
+ extname == '.css'
60
+ end
61
+
62
+ def check?
63
+ !link.include?('#') && in_static_domain?
64
+ end
65
+ end
@@ -1,17 +1,39 @@
1
- # encoding: utf-8
2
1
  require 'uri'
3
2
  require 'nokogiri'
4
- require 'net/http'
5
- require 'multipart_body'
3
+ require 'w3c_validators'
6
4
 
7
5
  module ValidateWebsite
8
6
  # Document validation from DTD or XSD (webservice for html5)
9
7
  class Validator
10
- XHTML_PATH = File.expand_path('../../../data/schemas', __FILE__)
8
+ @html5_validator_service_url = 'https://checker.html5.org/'
11
9
 
12
- @html5_validator_service_url = 'http://checker.html5.org:443/'
13
10
  class << self
14
11
  attr_accessor :html5_validator_service_url
12
+
13
+ def validator_uri
14
+ @validator_uri ||=
15
+ ENV['VALIDATOR_NU_URL'] || @html5_validator_service_url
16
+ end
17
+ end
18
+
19
+ XHTML_PATH = File.expand_path('../../../data/schemas', __FILE__)
20
+
21
+ @xsd_schemas = {}
22
+ class << self
23
+ attr_reader :xsd_schemas
24
+ end
25
+ # `Dir.chdir` is needed by `Nokogiri::XML::Schema` to validate with local
26
+ # files and cannot use file absolute path.
27
+ Dir.glob(File.join(XHTML_PATH, '*.xsd')).each do |schema|
28
+ Dir.chdir(XHTML_PATH) do
29
+ schema_name = File.basename(schema, '.xsd')
30
+ schema_content = File.read(File.basename(schema))
31
+ begin
32
+ @xsd_schemas[schema_name] = Nokogiri::XML::Schema(schema_content)
33
+ rescue Nokogiri::XML::SyntaxError
34
+ STDERR.puts "XSD SCHEMA: #{schema} cannot be loaded"
35
+ end
36
+ end
15
37
  end
16
38
 
17
39
  attr_reader :original_doc, :body, :dtd, :doc, :namespace
@@ -28,7 +50,7 @@ module ValidateWebsite
28
50
  @body = body
29
51
  @ignore = ignore
30
52
  @dtd = @original_doc.internal_subset
31
- @namespace = init_namespace(@dtd)
53
+ @namespace = find_namespace(@dtd)
32
54
  end
33
55
 
34
56
  ##
@@ -44,14 +66,20 @@ module ValidateWebsite
44
66
  @ignore ? @errors.reject { |e| @ignore =~ e } : @errors
45
67
  end
46
68
 
69
+ # http://www.w3.org/TR/xhtml1-schema/
70
+ def self.xsd(namespace)
71
+ return unless namespace
72
+ @xsd_schemas[namespace] if @xsd_schemas.key? namespace
73
+ end
74
+
47
75
  private
48
76
 
49
- def init_namespace(dtd)
77
+ # http://www.w3.org/TR/xhtml1/#dtds
78
+ def find_namespace(dtd)
50
79
  return unless dtd.system_id
51
80
  dtd_uri = URI.parse(dtd.system_id)
52
81
  return unless dtd_uri.path
53
82
  @dtd_uri = dtd_uri
54
- # http://www.w3.org/TR/xhtml1/#dtds
55
83
  File.basename(@dtd_uri.path, '.dtd')
56
84
  end
57
85
 
@@ -64,19 +92,10 @@ module ValidateWebsite
64
92
  end
65
93
  end
66
94
 
67
- # http://www.w3.org/TR/xhtml1-schema/
68
- def xsd
69
- @xsd ||= Dir.chdir(XHTML_PATH) do
70
- if @namespace && File.exist?(@namespace + '.xsd')
71
- Nokogiri::XML::Schema(File.read(@namespace + '.xsd'))
72
- end
73
- end
74
- end
75
-
76
95
  # @return [Array] contain result errors
77
96
  def validate(xml_doc, document_body)
78
- if !xsd.nil?
79
- xsd.validate(xml_doc)
97
+ if self.class.xsd(@namespace)
98
+ self.class.xsd(@namespace).validate(xml_doc)
80
99
  elsif document_body =~ /^\<!DOCTYPE html\>/i
81
100
  html5_validate(document_body)
82
101
  else
@@ -97,27 +116,12 @@ module ValidateWebsite
97
116
  @errors << e
98
117
  end
99
118
 
100
- def html5_headers(multipart)
101
- {
102
- 'Content-Type' => "multipart/form-data; boundary=#{multipart.boundary}",
103
- 'Content-Length' => multipart.to_s.bytesize.to_s
104
- }
105
- end
106
-
107
- def html5_body(document)
108
- url = ENV['VALIDATOR_NU_URL'] || self.class.html5_validator_service_url
109
- uri = URI.parse(url)
110
- multipart = MultipartBody.new(content: document)
111
- http = Net::HTTP.new(uri.host, uri.port)
112
- http.start do |con|
113
- con.post(uri.path, multipart.to_s, html5_headers(multipart))
114
- end.body
115
- end
116
-
117
119
  def html5_validate(document)
118
- validator_document = Nokogiri::HTML(html5_body(document))
119
- errors = validator_document.css('h2.invalid').map(&:content)
120
- errors.concat validator_document.css('ol li.error').map(&:content)
120
+ validator = W3CValidators::NuValidator.new(
121
+ validator_uri: self.class.validator_uri
122
+ )
123
+ results = validator.validate_text(document)
124
+ errors.concat results.errors
121
125
  end
122
126
  end
123
127
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Version file for ValidateWebsite
4
4
  module ValidateWebsite
5
- VERSION = '1.6.0'.freeze
5
+ VERSION = '1.7.0'.freeze
6
6
  end
@@ -2,12 +2,12 @@
2
2
  .\" Title: validate-website-static
3
3
  .\" Author: [see the "AUTHOR" section]
4
4
  .\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
5
- .\" Date: 06/19/2016
5
+ .\" Date: 01/04/2017
6
6
  .\" Manual: \ \&
7
7
  .\" Source: \ \&
8
8
  .\" Language: English
9
9
  .\"
10
- .TH "VALIDATE\-WEBSITE\-S" "1" "06/19/2016" "\ \&" "\ \&"
10
+ .TH "VALIDATE\-WEBSITE\-S" "1" "01/04/2017" "\ \&" "\ \&"
11
11
  .\" -----------------------------------------------------------------
12
12
  .\" * Define some portability stuff
13
13
  .\" -----------------------------------------------------------------
@@ -122,4 +122,4 @@ Laurent Arnoud <laurent@spkdev\&.net>
122
122
  .sp
123
123
  The MIT License
124
124
  .sp
125
- Copyright (c) 2009\-2015 Laurent Arnoud <laurent@spkdev\&.net>
125
+ Copyright (c) 2009\-2017 Laurent Arnoud <laurent@spkdev\&.net>
@@ -2,12 +2,12 @@
2
2
  .\" Title: validate-website
3
3
  .\" Author: [see the "AUTHOR" section]
4
4
  .\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
5
- .\" Date: 06/19/2016
5
+ .\" Date: 01/04/2017
6
6
  .\" Manual: \ \&
7
7
  .\" Source: \ \&
8
8
  .\" Language: English
9
9
  .\"
10
- .TH "VALIDATE\-WEBSITE" "1" "06/19/2016" "\ \&" "\ \&"
10
+ .TH "VALIDATE\-WEBSITE" "1" "01/04/2017" "\ \&" "\ \&"
11
11
  .\" -----------------------------------------------------------------
12
12
  .\" * Define some portability stuff
13
13
  .\" -----------------------------------------------------------------
@@ -127,4 +127,4 @@ Laurent Arnoud <laurent@spkdev\&.net>
127
127
  .sp
128
128
  The MIT License
129
129
  .sp
130
- Copyright (c) 2009\-2015 Laurent Arnoud <laurent@spkdev\&.net>
130
+ Copyright (c) 2009\-2017 Laurent Arnoud <laurent@spkdev\&.net>
@@ -9,6 +9,10 @@ describe ValidateWebsite::Crawl do
9
9
  end
10
10
  end
11
11
 
12
+ def validator
13
+ ValidateWebsite::Validator
14
+ end
15
+
12
16
  describe 'options' do
13
17
  it 'can change user-agent' do
14
18
  ua = %{Linux / Firefox 29: Mozilla/5.0 (X11; Linux x86_64; rv:29.0) \
@@ -21,13 +25,13 @@ describe ValidateWebsite::Crawl do
21
25
  end
22
26
 
23
27
  it 'can change html5 validator service url' do
24
- original = ValidateWebsite::Validator.html5_validator_service_url
28
+ original = validator.html5_validator_service_url
25
29
  new = 'http://localhost:8888/'
26
30
  _out, _err = capture_io do
27
31
  ValidateWebsite::Crawl.new(site: TEST_DOMAIN,
28
32
  html5_validator_service_url: new)
29
- ValidateWebsite::Validator.html5_validator_service_url.must_equal new
30
- ValidateWebsite::Validator.html5_validator_service_url = original
33
+ validator.html5_validator_service_url.must_equal new
34
+ validator.html5_validator_service_url = original
31
35
  end
32
36
  end
33
37
  end
@@ -76,8 +80,8 @@ describe ValidateWebsite::Crawl do
76
80
  page = FakePage.new(name,
77
81
  body: open(file).read,
78
82
  content_type: 'text/html')
79
- validator_res = File.join('test', 'data', 'validator.nu-success.html')
80
- stub_request(:any, ValidateWebsite::Validator.html5_validator_service_url)
83
+ validator_res = File.join('test', 'data', 'validator.nu-failure.json')
84
+ stub_request(:any, /#{validator.html5_validator_service_url}/)
81
85
  .to_return(body: open(validator_res).read)
82
86
  @validate_website.site = page.url
83
87
  _out, _err = capture_io do
@@ -0,0 +1 @@
1
+ {"url":"https://linuxfr.org/","messages":[{"type":"info","lastLine":198,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":195,"lastColumn":20,"firstColumn":1,"subType":"warning","message":"Section lacks heading. Consider using “h2”-“h6” elements to add identifying headings to all sections.","extract":"eil\"</h1>\n<section id=\"phare\">\n<arti","hiliteStart":10,"hiliteLength":20},{"type":"info","lastLine":313,"lastColumn":38,"firstColumn":7,"subType":"warning","message":"The “main” role is unnecessary for element “main”.","extract":"av>\n</nav><main id=\"contents\" role=\"main\">\n<arti","hiliteStart":10,"hiliteLength":32},{"type":"info","lastLine":316,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":374,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":429,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":488,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":546,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":624,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":663,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":739,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":781,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":845,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":908,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":967,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":1015,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"info","lastLine":1079,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40},{"type":"error","lastLine":1098,"lastColumn":18,"firstColumn":1,"message":"Duplicate ID “sommaire”.","extract":"ibre.</p>\n<h2 id=\"sommaire\">Sommai","hiliteStart":10,"hiliteLength":18},{"type":"info","lastLine":507,"lastColumn":18,"firstColumn":1,"subType":"warning","message":"The first occurrence of ID “sommaire” was here.","extract":"ibre.</p>\n<h2 id=\"sommaire\">Sommai","hiliteStart":10,"hiliteLength":18},{"type":"info","lastLine":1138,"lastColumn":40,"firstColumn":1,"subType":"warning","message":"Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).","extract":"\n<header>\n<h1 class=\"entry-title\" itemprop=\"name\"><a hre","hiliteStart":10,"hiliteLength":40}],"language":"fr"}
@@ -0,0 +1 @@
1
+ {"url":"https://example.org/","messages":[],"language":"fr"}
@@ -39,7 +39,7 @@ describe ValidateWebsite::Static do
39
39
  markup: false,
40
40
  not_found: true)
41
41
  end
42
- @validate_website.not_founds_count.must_equal 518
42
+ @validate_website.not_founds_count.must_equal 193
43
43
  end
44
44
  end
45
45
 
@@ -21,7 +21,7 @@ describe ValidateWebsite::Validator do
21
21
  @xhtml1_page.body,
22
22
  ignore)
23
23
  validator.valid?.must_equal true
24
- validator.errors.size.must_equal 0
24
+ validator.errors.must_equal []
25
25
  end
26
26
 
27
27
  it 'xhtml1-strict should be valid' do
@@ -32,19 +32,22 @@ describe ValidateWebsite::Validator do
32
32
  body: open(file).read,
33
33
  content_type: 'text/html')
34
34
  @xhtml1_page = @http.get_page(page.url)
35
+ ignore = /width|height|Length/
35
36
  validator = subject.new(@xhtml1_page.doc,
36
- @xhtml1_page.body)
37
+ @xhtml1_page.body,
38
+ ignore)
37
39
  validator.dtd.system_id.must_equal dtd_uri
38
40
  validator.namespace.must_equal name
39
41
  validator.valid?.must_equal true
42
+ validator.errors.must_equal []
40
43
  end
41
44
  end
42
45
 
43
46
  describe('html5') do
44
47
  describe('when valid') do
45
48
  before do
46
- validator_res = File.join('test', 'data', 'validator.nu-success.html')
47
- stub_request(:any, subject.html5_validator_service_url)
49
+ validator_res = File.join('test', 'data', 'validator.nu-success.json')
50
+ stub_request(:any, /#{subject.html5_validator_service_url}/)
48
51
  .to_return(body: open(validator_res).read)
49
52
  end
50
53
  it 'html5 should be valid' do
@@ -58,25 +61,14 @@ describe ValidateWebsite::Validator do
58
61
  @html5_page.body)
59
62
  validator.valid?.must_equal true
60
63
  end
61
- it 'with DLFP' do
62
- name = 'html5'
63
- file = File.join('test', 'data', "#{name}-linuxfr.html")
64
- page = FakePage.new(name,
65
- body: open(file).read,
66
- content_type: 'text/html')
67
- @html5_page = @http.get_page(page.url)
68
- validator = subject.new(@html5_page.doc,
69
- @html5_page.body)
70
- validator.valid?.must_equal true
71
- end
72
64
  end
73
65
  describe('when not valid') do
74
66
  before do
75
- validator_res = File.join('test', 'data', 'validator.nu-failure.html')
76
- stub_request(:any, subject.html5_validator_service_url)
67
+ validator_res = File.join('test', 'data', 'validator.nu-failure.json')
68
+ stub_request(:any, /#{subject.html5_validator_service_url}/)
77
69
  .to_return(body: open(validator_res).read)
78
70
  name = 'html5'
79
- file = File.join('test', 'data', "#{name}-linuxfr.html")
71
+ file = File.join('test', 'data', "#{name}.html")
80
72
  page = FakePage.new(name,
81
73
  body: open(file).read,
82
74
  content_type: 'text/html')
@@ -87,35 +79,16 @@ describe ValidateWebsite::Validator do
87
79
  validator = subject.new(@html5_page.doc,
88
80
  @html5_page.body)
89
81
  validator.valid?.must_equal false
90
- validator.errors.size.must_equal 38
82
+ validator.errors.size.must_equal 1
91
83
  end
92
84
 
93
85
  it 'should exclude errors ignored by :ignore option' do
94
- ignore = /The nowrap attribute on the td element is obsolete/
86
+ ignore = /Duplicate ID/
95
87
  validator = subject.new(@html5_page.doc,
96
88
  @html5_page.body,
97
89
  ignore)
98
- validator.valid?.must_equal false
99
- validator.errors.size.must_equal 36
100
- end
101
- end
102
-
103
- describe('excessive') do
104
- before do
105
- validator_res = File.join('test', 'data', 'validator.nu-excessive.html')
106
- stub_request(:any, subject.html5_validator_service_url)
107
- .to_return(body: open(validator_res).read)
108
- end
109
- it 'html5 should have errors' do
110
- name = 'html5'
111
- file = File.join('test', 'data', "#{name}.html")
112
- page = FakePage.new(name,
113
- body: open(file).read,
114
- content_type: 'text/html')
115
- @html5_page = @http.get_page(page.url)
116
- validator = subject.new(@html5_page.doc,
117
- @html5_page.body)
118
- validator.valid?.must_equal false
90
+ validator.valid?.must_equal true
91
+ validator.errors.size.must_equal 0
119
92
  end
120
93
  end
121
94
  end