w3c_validators 0.9.3 → 1.0.2
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.
- data/CHANGELOG +28 -0
- data/{README → README.rdoc} +19 -6
- data/lib/w3c_validators.rb +1 -0
- data/lib/w3c_validators/constants.rb +12 -10
- data/lib/w3c_validators/css_validator.rb +2 -0
- data/lib/w3c_validators/feed_validator.rb +2 -0
- data/lib/w3c_validators/markup_validator.rb +4 -2
- data/lib/w3c_validators/nu_validator.rb +146 -0
- data/lib/w3c_validators/results.rb +7 -3
- data/lib/w3c_validators/validator.rb +37 -11
- data/test/test_css_validator.rb +4 -4
- data/test/test_feed_validator.rb +4 -4
- data/test/test_helper.rb +34 -0
- data/test/test_html5_validator.rb +64 -0
- data/test/test_markup_validator.rb +9 -10
- data/test/test_proxy.rb +28 -0
- metadata +14 -7
data/CHANGELOG
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
= CHANGELOG
|
2
|
+
|
3
|
+
== Version 0.9.0
|
4
|
+
* initial version
|
5
|
+
|
6
|
+
== Version 0.9.1
|
7
|
+
* fixed include path bug
|
8
|
+
|
9
|
+
== Version 0.9.2 (the Ryan King edition)
|
10
|
+
* added check for HTML validator being unable to parse a file
|
11
|
+
|
12
|
+
== Version 0.9.3 (the Ryan King/Jonathan Julian/Sylvain LaFleur edition)
|
13
|
+
* MarkupValidator::validate_file now returns file path as Results.uri
|
14
|
+
* All validate_file methods now allow a file path or an IO object (e.g. File)
|
15
|
+
|
16
|
+
== Version 1.0.0 (the GitHub edition)
|
17
|
+
* Gemspec is now generated by a rake task to allow dynamic file lists
|
18
|
+
* Updated docs
|
19
|
+
|
20
|
+
== Version 1.0.1 (the Roman Shterenzon and James Rosen edition)
|
21
|
+
* Fixed CSS profile constants
|
22
|
+
* DRY unit tests
|
23
|
+
* GET should be used only for queries with URI
|
24
|
+
* Bugfix - file doesn't need to be writeable
|
25
|
+
|
26
|
+
== Version 1.0.2
|
27
|
+
* Added support for proxy servers
|
28
|
+
* Fixed to minor unit test errors
|
data/{README → README.rdoc}
RENAMED
@@ -7,7 +7,8 @@ It supports the markup validator, the feed validator and the CSS validator.
|
|
7
7
|
|
8
8
|
=== Installation
|
9
9
|
|
10
|
-
gem
|
10
|
+
gem sources -a http://gems.github.com
|
11
|
+
gem install alexdunae-w3c_validators
|
11
12
|
|
12
13
|
=== Usage
|
13
14
|
|
@@ -32,6 +33,15 @@ validator. You can set your own validator like this:
|
|
32
33
|
|
33
34
|
validator = MarkupValidator.new(:validator_uri => 'http://localhost/check')
|
34
35
|
|
36
|
+
==== Using a proxy server
|
37
|
+
|
38
|
+
You can use a proxy server by passing in its information in the contructor.
|
39
|
+
|
40
|
+
validator = MarkupValidator.new(:proxy_server => 'proxy.example.com',
|
41
|
+
:proxy_port => 80,
|
42
|
+
:proxy_user => 'optional',
|
43
|
+
:proxy_pass => 'optional')
|
44
|
+
|
35
45
|
=== Examples
|
36
46
|
|
37
47
|
==== Example #1: Markup validator, local file
|
@@ -110,11 +120,14 @@ between each call to the W3C's validators per their request.
|
|
110
120
|
|
111
121
|
=== Credits and code
|
112
122
|
|
113
|
-
Documentation
|
123
|
+
Documentation is available at {http://code.dunae.ca/w3c_validators}[http://code.dunae.ca/w3c_validators].
|
124
|
+
|
125
|
+
Source is available on {GitHub}[https://github.com/alexdunae/w3c-validators]
|
126
|
+
|
127
|
+
Written by Alex Dunae ({dunae.ca}[http://dunae.ca/], e-mail 'code' at the same domain), 2007.
|
114
128
|
|
115
|
-
|
129
|
+
Thanks to {Ryan King}[http://theryanking.com/] for creating the 0.9.2 update.
|
116
130
|
|
117
|
-
Thanks to Ryan King
|
131
|
+
Thanks to {Ryan King}[http://theryanking.com/], {Jonathan Julian}[http://jonathanjulian.org/] and Sylvain LaFleur for creating the 0.9.3 update.
|
118
132
|
|
119
|
-
Thanks to
|
120
|
-
|
133
|
+
Thanks to {James Rosen}[http://github.com/jamesarosen] and {Roman Shterenzon}[http://github.com/romanbsd] for creating the 1.0.1 update.
|
data/lib/w3c_validators.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
module W3CValidators
|
2
|
-
|
3
|
-
|
4
|
-
:
|
5
|
-
:
|
6
|
-
:
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
2
|
+
|
3
|
+
CSS_PROFILES = { :css1 => 'css1',
|
4
|
+
:css2 => 'css2',
|
5
|
+
:css21 => 'css21',
|
6
|
+
:css3 => 'css3',
|
7
|
+
:svg => 'svg',
|
8
|
+
:svgbasic => 'svgbasic',
|
9
|
+
:svgtiny => 'svgtiny',
|
10
|
+
:mobile => 'mobile',
|
11
|
+
:atsc_tv => 'atsc-tv',
|
12
|
+
:tv => 'tv'
|
12
13
|
}
|
13
14
|
|
14
15
|
DOCTYPES = { :xhtml10_strict => 'XHTML 1.0 Strict',
|
@@ -17,6 +18,7 @@ module W3CValidators
|
|
17
18
|
:xhtml401_strict => 'HTML 4.01 Strict',
|
18
19
|
:xhtml401_transitional => 'HTML 4.01 Transitional',
|
19
20
|
:xhtml401_framest => 'HTML 4.01 Frameset',
|
21
|
+
:html5 => 'HTML 5',
|
20
22
|
:html32 => 'HTML 3.2',
|
21
23
|
:html20 => 'HTML 2.0',
|
22
24
|
:iso_html => 'ISO/IEC 15445:2000 ("ISO HTML")',
|
@@ -7,6 +7,8 @@ module W3CValidators
|
|
7
7
|
# ==== Options
|
8
8
|
# You can pass in your own validator's URI (i.e.
|
9
9
|
# <tt>CSSValidator.new(:validator_uri => 'http://localhost/check')</tt>).
|
10
|
+
#
|
11
|
+
# See Validator#new for proxy server options.
|
10
12
|
def initialize(options = {})
|
11
13
|
if options[:validator_uri]
|
12
14
|
@validator_uri = URI.parse(options[:validator_uri])
|
@@ -7,6 +7,8 @@ module W3CValidators
|
|
7
7
|
# ==== Options
|
8
8
|
# You can pass in your own validator's URI (i.e.
|
9
9
|
# <tt>FeedValidator.new(:validator_uri => 'http://localhost/check')</tt>).
|
10
|
+
#
|
11
|
+
# See Validator#new for proxy server options.
|
10
12
|
def initialize(options = {})
|
11
13
|
if options[:validator_uri]
|
12
14
|
@validator_uri = URI.parse(options[:validator_uri])
|
@@ -11,6 +11,8 @@ module W3CValidators
|
|
11
11
|
#
|
12
12
|
# You can pass in your own validator's URI (i.e.
|
13
13
|
# <tt>MarkupValidator.new(:validator_uri => 'http://localhost/check')</tt>).
|
14
|
+
#
|
15
|
+
# See Validator#new for proxy server options.
|
14
16
|
def initialize(options = {})
|
15
17
|
if options[:validator_uri]
|
16
18
|
@validator_uri = URI.parse(options[:validator_uri])
|
@@ -123,7 +125,7 @@ protected
|
|
123
125
|
response = send_request(options, :head)
|
124
126
|
@results = parse_head_response(response, options[:uri])
|
125
127
|
else
|
126
|
-
if options.has_key?(:uri)
|
128
|
+
if options.has_key?(:uri)
|
127
129
|
response = send_request(options, :get)
|
128
130
|
else
|
129
131
|
response = send_request(options, :post)
|
@@ -224,4 +226,4 @@ protected
|
|
224
226
|
|
225
227
|
|
226
228
|
end
|
227
|
-
end
|
229
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module W3CValidators
|
4
|
+
class NuValidator < Validator
|
5
|
+
MARKUP_VALIDATOR_URI = 'http://validator.nu/'
|
6
|
+
|
7
|
+
# Create a new instance of the NuValidator.
|
8
|
+
#
|
9
|
+
# ==== Options
|
10
|
+
# The +options+ hash allows you to set request parameters (see
|
11
|
+
# http://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters) quickly. Request
|
12
|
+
# parameters can also be set using set_charset! and set_doctype!.
|
13
|
+
#
|
14
|
+
# You can pass in your own validator's URI (i.e.
|
15
|
+
# <tt>NuValidator.new(:validator_uri => 'http://localhost/check')</tt>).
|
16
|
+
#
|
17
|
+
# See Validator#new for proxy server options.
|
18
|
+
def initialize(options = {})
|
19
|
+
if options[:validator_uri]
|
20
|
+
@validator_uri = URI.parse(options[:validator_uri])
|
21
|
+
options.delete(options[:validator_uri])
|
22
|
+
else
|
23
|
+
@validator_uri = URI.parse(MARKUP_VALIDATOR_URI)
|
24
|
+
end
|
25
|
+
super(options)
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Validate the markup of an URI.
|
30
|
+
#
|
31
|
+
# Returns W3CValidators::Results.
|
32
|
+
def validate_uri(uri)
|
33
|
+
return validate({:doc => uri})
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# Validate the markup of a string.
|
38
|
+
#
|
39
|
+
# Returns W3CValidators::Results.
|
40
|
+
def validate_text(text)
|
41
|
+
return validate({:content => text})
|
42
|
+
end
|
43
|
+
|
44
|
+
# Validate the markup of a local file.
|
45
|
+
#
|
46
|
+
# +file_path+ may be either the fully-expanded path to the file or
|
47
|
+
# an IO object (like File).
|
48
|
+
#
|
49
|
+
# Returns W3CValidators::Results.
|
50
|
+
def validate_file(file)
|
51
|
+
if file.respond_to? :read
|
52
|
+
src = file.read
|
53
|
+
file_path = file.path ||= nil
|
54
|
+
else
|
55
|
+
src = read_local_file(file)
|
56
|
+
file_path = file
|
57
|
+
end
|
58
|
+
|
59
|
+
return validate({:file => src, :file_path => file_path})
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
def validate(options) # :nodoc:
|
64
|
+
options = get_request_options(options)
|
65
|
+
|
66
|
+
if options.has_key?(:doc)
|
67
|
+
response = send_request(options, :get)
|
68
|
+
else
|
69
|
+
response = send_request(options, :post)
|
70
|
+
end
|
71
|
+
|
72
|
+
@results = parse_json_response(response.body)
|
73
|
+
@results
|
74
|
+
end
|
75
|
+
|
76
|
+
# Perform sanity checks on request params
|
77
|
+
def get_request_options(options) # :nodoc:
|
78
|
+
options = @options.merge(options)
|
79
|
+
|
80
|
+
options[:out] = 'json'
|
81
|
+
|
82
|
+
# only option that is currently supported
|
83
|
+
options[:showsource] = 'yes'
|
84
|
+
|
85
|
+
unless options[:doc] or options[:file] or options[:content]
|
86
|
+
raise ArgumentError, "an uri, file or block of text is required."
|
87
|
+
end
|
88
|
+
|
89
|
+
# URI should be a string. If it is a URI object, .to_s will
|
90
|
+
# be seamless; if it is not an exception will be raised.
|
91
|
+
if options[:doc] and not options[:doc].kind_of?(String)
|
92
|
+
options[:doc] = options[:doc].to_s
|
93
|
+
end
|
94
|
+
options
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
# Parse the JSON response.
|
99
|
+
#
|
100
|
+
# +response+ must be a Net::HTTPResponse.
|
101
|
+
#
|
102
|
+
# Returns W3CValidators::Results.
|
103
|
+
def parse_json_response(response) # :nodoc:
|
104
|
+
doc = JSON.parse(response)
|
105
|
+
|
106
|
+
result_params = {
|
107
|
+
:doctype => :html5,
|
108
|
+
:checked_by => MARKUP_VALIDATOR_URI
|
109
|
+
}
|
110
|
+
|
111
|
+
result_params[:uri] = doc['url'] ||= nil
|
112
|
+
if doc['source']
|
113
|
+
result_params[:charset] = doc['source']['encoding'] ||= nil
|
114
|
+
end
|
115
|
+
|
116
|
+
result_params[:validity] = !doc['messages'].any? { |msg| msg['type'] =~ /^error$/i }
|
117
|
+
|
118
|
+
results = Results.new(result_params)
|
119
|
+
|
120
|
+
doc['messages'].each do |msg|
|
121
|
+
if msg['type'] =~ /^error$/i
|
122
|
+
msg_type = :error
|
123
|
+
elsif msg['subType'] =~ /^warning$/
|
124
|
+
msg_type = :warning
|
125
|
+
else
|
126
|
+
next
|
127
|
+
# TODO: should throw exceptions here
|
128
|
+
end
|
129
|
+
|
130
|
+
message_params = {
|
131
|
+
:line => msg['firstLine'],
|
132
|
+
:col => msg['firstColumn'],
|
133
|
+
:message => msg['message'],
|
134
|
+
:source => msg['extract']
|
135
|
+
}
|
136
|
+
|
137
|
+
results.add_message(msg_type, message_params)
|
138
|
+
end
|
139
|
+
|
140
|
+
return results
|
141
|
+
|
142
|
+
rescue Exception => e
|
143
|
+
handle_exception e
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -9,7 +9,11 @@ module W3CValidators
|
|
9
9
|
@doctype = options[:doctype]
|
10
10
|
@css_level = options[:css_level]
|
11
11
|
@charset = options[:charset]
|
12
|
-
|
12
|
+
if options[:validity].kind_of?(String)
|
13
|
+
@validity = options[:validity].downcase.strip == 'true'
|
14
|
+
else
|
15
|
+
@validity = options[:validity]
|
16
|
+
end
|
13
17
|
@debug_messages = {}
|
14
18
|
end
|
15
19
|
|
@@ -23,7 +27,7 @@ module W3CValidators
|
|
23
27
|
end
|
24
28
|
|
25
29
|
def add_warning(params = {})
|
26
|
-
add_message(:
|
30
|
+
add_message(:warning, params)
|
27
31
|
end
|
28
32
|
|
29
33
|
def add_debug_message(key, val)
|
@@ -38,7 +42,7 @@ module W3CValidators
|
|
38
42
|
end
|
39
43
|
|
40
44
|
def is_valid?
|
41
|
-
@validity
|
45
|
+
@validity
|
42
46
|
end
|
43
47
|
|
44
48
|
# Returns an array of Message objects.
|
@@ -11,8 +11,8 @@ require 'w3c_validators/message'
|
|
11
11
|
module W3CValidators
|
12
12
|
# Base class for MarkupValidator and FeedValidator.
|
13
13
|
class Validator
|
14
|
-
|
15
|
-
|
14
|
+
VERSION = '1.0.2'
|
15
|
+
USER_AGENT = "Ruby W3C Validators/#{Validator::VERSION} (http://code.dunae.ca/w3c_validators/)"
|
16
16
|
HEAD_STATUS_HEADER = 'X-W3C-Validator-Status'
|
17
17
|
HEAD_ERROR_COUNT_HEADER = 'X-W3C-Validator-Errors'
|
18
18
|
SOAP_OUTPUT_PARAM = 'soap12'
|
@@ -20,8 +20,17 @@ module W3CValidators
|
|
20
20
|
attr_reader :results, :validator_uri
|
21
21
|
|
22
22
|
# Create a new instance of the Validator.
|
23
|
+
#
|
24
|
+
# +options+ Hash can optionally include
|
25
|
+
# - +proxy_host+
|
26
|
+
# - +proxy_port+
|
27
|
+
# - +proxy_user+
|
28
|
+
# - +proxy_pass+
|
23
29
|
def initialize(options = {})
|
24
|
-
@options =
|
30
|
+
@options = {:proxy_host => nil,
|
31
|
+
:proxy_port => nil,
|
32
|
+
:proxy_user => nil,
|
33
|
+
:proxy_pass => nil}.merge(options)
|
25
34
|
end
|
26
35
|
|
27
36
|
protected
|
@@ -34,7 +43,11 @@ module W3CValidators
|
|
34
43
|
response = nil
|
35
44
|
results = nil
|
36
45
|
|
37
|
-
Net::HTTP
|
46
|
+
r = Net::HTTP::Proxy(@options[:proxy_host],
|
47
|
+
@options[:proxy_port],
|
48
|
+
@options[:proxy_user],
|
49
|
+
@options[:proxy_pass]).start(@validator_uri.host, @validator_uri.port) do |http|
|
50
|
+
|
38
51
|
case request_mode
|
39
52
|
when :head
|
40
53
|
# perform a HEAD request
|
@@ -63,21 +76,37 @@ module W3CValidators
|
|
63
76
|
|
64
77
|
def create_multipart_data(options) # :nodoc:
|
65
78
|
boundary = '349832898984244898448024464570528145'
|
66
|
-
|
79
|
+
|
80
|
+
# added 2008-03-12: HTML5 validator expects 'file' and 'content' to be the last fields so
|
81
|
+
# we process those params separately
|
82
|
+
last_params = []
|
83
|
+
|
84
|
+
# added 2008-03-12: HTML5 validator expects 'file' instead of 'uploaded_file'
|
85
|
+
if options[:file] and !options[:uploaded_file]
|
86
|
+
options[:uploaded_file] = options[:file]
|
87
|
+
end
|
88
|
+
|
67
89
|
if options[:uploaded_file]
|
68
90
|
filename = options[:file_path] ||= 'temp.html'
|
69
91
|
content = options[:uploaded_file]
|
70
|
-
|
92
|
+
last_params << "Content-Disposition: form-data; name=\"uploaded_file\"; filename=\"#{filename}\"\r\n" + "Content-Type: text/html\r\n" + "\r\n" + "#{content}\r\n"
|
71
93
|
options.delete(:uploaded_file)
|
72
94
|
options.delete(:file_path)
|
73
95
|
end
|
96
|
+
|
97
|
+
if options[:content]
|
98
|
+
last_params << "Content-Disposition: form-data; name=\"#{CGI::escape('content')}\"\r\n" + "\r\n" + "#{options[:content]}\r\n"
|
99
|
+
end
|
74
100
|
|
101
|
+
misc_params = []
|
75
102
|
options.each do |key, value|
|
76
103
|
if value
|
77
|
-
|
104
|
+
misc_params << "Content-Disposition: form-data; name=\"#{CGI::escape(key.to_s)}\"\r\n" + "\r\n" + "#{value}\r\n"
|
78
105
|
end
|
79
106
|
end
|
80
107
|
|
108
|
+
params = misc_params + last_params
|
109
|
+
|
81
110
|
multipart_query = params.collect {|p| '--' + boundary + "\r\n" + p}.join('') + "--" + boundary + "--\r\n"
|
82
111
|
|
83
112
|
[multipart_query, boundary]
|
@@ -94,10 +123,7 @@ module W3CValidators
|
|
94
123
|
end
|
95
124
|
|
96
125
|
def read_local_file(file_path) # :nodoc:
|
97
|
-
|
98
|
-
src = fh.read
|
99
|
-
fh.close
|
100
|
-
src
|
126
|
+
IO.read(file_path)
|
101
127
|
end
|
102
128
|
|
103
129
|
private
|
data/test/test_css_validator.rb
CHANGED
@@ -24,18 +24,18 @@ class CSSValidatorTests < Test::Unit::TestCase
|
|
24
24
|
def test_validating_file
|
25
25
|
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/invalid_css.css')
|
26
26
|
r = @v.validate_file(file_path)
|
27
|
-
|
27
|
+
assert_errors r, 1
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_validating_uri
|
31
31
|
@v.set_profile!(:svgbasic)
|
32
32
|
r = @v.validate_text(@invalid_fragment)
|
33
|
-
|
33
|
+
assert_errors r, 1
|
34
34
|
end
|
35
35
|
|
36
36
|
def test_validating_text
|
37
37
|
r = @v.validate_text(@invalid_fragment)
|
38
|
-
|
38
|
+
assert_errors r, 1
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_validating_text_via_file
|
@@ -43,7 +43,7 @@ class CSSValidatorTests < Test::Unit::TestCase
|
|
43
43
|
fh = File.new(file_path, 'r+')
|
44
44
|
r = @v.validate_file(fh)
|
45
45
|
fh.close
|
46
|
-
|
46
|
+
assert_errors r, 1
|
47
47
|
end
|
48
48
|
|
49
49
|
|
data/test/test_feed_validator.rb
CHANGED
@@ -10,14 +10,14 @@ class FeedValidatorTests < Test::Unit::TestCase
|
|
10
10
|
|
11
11
|
def test_validating_uri_with_soap
|
12
12
|
r = @v.validate_uri('http://code.dunae.ca/w3c_validators/test/invalid_feed.xml')
|
13
|
-
|
14
|
-
|
13
|
+
assert_errors r, 1
|
14
|
+
assert_warnings r, 1
|
15
15
|
end
|
16
16
|
|
17
17
|
def test_validating_file
|
18
18
|
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/invalid_feed.xml')
|
19
19
|
r = @v.validate_file(file_path)
|
20
|
-
|
20
|
+
assert_errors r, 1
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_validating_text
|
@@ -53,7 +53,7 @@ class FeedValidatorTests < Test::Unit::TestCase
|
|
53
53
|
fh = File.new(file_path, 'r+')
|
54
54
|
r = @v.validate_file(fh)
|
55
55
|
fh.close
|
56
|
-
|
56
|
+
assert_errors r, 1
|
57
57
|
end
|
58
58
|
|
59
59
|
|
data/test/test_helper.rb
CHANGED
@@ -4,3 +4,37 @@ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__), '../lib/'))
|
|
4
4
|
require 'rubygems'
|
5
5
|
require 'test/unit'
|
6
6
|
require 'w3c_validators'
|
7
|
+
|
8
|
+
class Test::Unit::TestCase
|
9
|
+
|
10
|
+
def assert_no_errors(response)
|
11
|
+
assert response.errors.empty?, response.errors.map { |e| e.to_s }.join('. ')
|
12
|
+
end
|
13
|
+
|
14
|
+
def assert_no_warnings(response)
|
15
|
+
assert response.warnings.empty?, response.warnings.map { |w| w.to_s }.join('. ')
|
16
|
+
end
|
17
|
+
|
18
|
+
def assert_errors(response, quantity = nil)
|
19
|
+
case quantity
|
20
|
+
when 0
|
21
|
+
assert_no_errors response
|
22
|
+
when nil
|
23
|
+
assert response.errors.any?
|
24
|
+
else
|
25
|
+
assert_equal quantity, response.errors.length
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def assert_warnings(response, quantity = nil)
|
30
|
+
case quantity
|
31
|
+
when 0
|
32
|
+
assert_no_warnings response
|
33
|
+
when nil
|
34
|
+
assert response.warnings.any?
|
35
|
+
else
|
36
|
+
assert_equal quantity, response.warnings.length
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
# Test cases for the HTML5Validator.
|
4
|
+
class HTML5ValidatorTests < Test::Unit::TestCase
|
5
|
+
include W3CValidators
|
6
|
+
def setup
|
7
|
+
@v = NuValidator.new
|
8
|
+
sleep 1
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_getting_request_data
|
12
|
+
r = @v.validate_uri('http://code.dunae.ca/w3c_validators/test/valid_html5.html')
|
13
|
+
assert_equal :html5, r.doctype
|
14
|
+
assert_equal 'http://code.dunae.ca/w3c_validators/test/valid_html5.html', r.uri
|
15
|
+
assert_no_errors r
|
16
|
+
assert_no_warnings r
|
17
|
+
assert r.is_valid?
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_validating_uri
|
21
|
+
r = @v.validate_uri('http://code.dunae.ca/w3c_validators/test/invalid_html5.html')
|
22
|
+
assert_errors r, 1
|
23
|
+
assert_warnings r, 1
|
24
|
+
assert !r.is_valid?
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_validating_file
|
28
|
+
file = File.dirname(__FILE__) + '/fixtures/invalid_html5.html'
|
29
|
+
r = @v.validate_file(file)
|
30
|
+
assert_errors r, 1
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_validating_text
|
34
|
+
valid_fragment = <<-EOV
|
35
|
+
<!DOCTYPE html>
|
36
|
+
<html lang="en-ca">
|
37
|
+
<head>
|
38
|
+
<title>HTML 5 Example</title>
|
39
|
+
</head>
|
40
|
+
<body>
|
41
|
+
<!-- should have one error (missing </section>) -->
|
42
|
+
<p>This is a sample HTML 5 document.</p>
|
43
|
+
<section>
|
44
|
+
<h1>Example of paragraphs</h1>
|
45
|
+
This is the <em>first</em> paragraph in this example.
|
46
|
+
<p>This is the second.</p>
|
47
|
+
<p>Test<br>test</p>
|
48
|
+
</body>
|
49
|
+
</html>
|
50
|
+
EOV
|
51
|
+
|
52
|
+
r = @v.validate_text(valid_fragment)
|
53
|
+
assert_errors r, 1
|
54
|
+
end
|
55
|
+
|
56
|
+
#def test_validating_text_via_file
|
57
|
+
# fh = File.new(File.dirname(__FILE__) + '/fixtures/invalid_html5.html', 'r+')
|
58
|
+
# r = @v.validate_file(fh)
|
59
|
+
# fh.close
|
60
|
+
# assert_equal 1, r.errors.length
|
61
|
+
#end
|
62
|
+
|
63
|
+
|
64
|
+
end
|
@@ -34,14 +34,13 @@ class MarkupValidatorTests < Test::Unit::TestCase
|
|
34
34
|
|
35
35
|
def test_validating_uri_with_head_request
|
36
36
|
r = @v.validate_uri_quickly('http://code.dunae.ca/w3c_validators/test/invalid_markup.html')
|
37
|
-
|
38
|
-
assert_equal 0, r.warnings.length
|
37
|
+
assert_errors r, 1
|
39
38
|
end
|
40
39
|
|
41
40
|
def test_validating_uri_with_soap
|
42
41
|
r = @v.validate_uri('http://code.dunae.ca/w3c_validators/test/invalid_markup.html')
|
43
|
-
|
44
|
-
|
42
|
+
assert_errors r, 1
|
43
|
+
assert_no_warnings r
|
45
44
|
end
|
46
45
|
|
47
46
|
def test_debugging_uri
|
@@ -53,7 +52,7 @@ class MarkupValidatorTests < Test::Unit::TestCase
|
|
53
52
|
def test_validating_file
|
54
53
|
file = File.dirname(__FILE__) + '/fixtures/invalid_markup.html'
|
55
54
|
r = @v.validate_file(file)
|
56
|
-
|
55
|
+
assert_errors r, 1
|
57
56
|
|
58
57
|
assert r.uri =~ /fixtures\/invalid_markup\.html$/
|
59
58
|
end
|
@@ -68,15 +67,15 @@ class MarkupValidatorTests < Test::Unit::TestCase
|
|
68
67
|
EOV
|
69
68
|
|
70
69
|
r = @v.validate_text(valid_fragment)
|
71
|
-
|
72
|
-
|
70
|
+
assert_no_errors r
|
71
|
+
assert_no_warnings r
|
73
72
|
end
|
74
73
|
|
75
74
|
def test_validating_text_via_file
|
76
75
|
fh = File.new(File.dirname(__FILE__) + '/fixtures/invalid_markup.html', 'r+')
|
77
76
|
r = @v.validate_file(fh)
|
78
77
|
fh.close
|
79
|
-
|
78
|
+
assert_errors r, 1
|
80
79
|
end
|
81
80
|
|
82
81
|
|
@@ -85,8 +84,8 @@ class MarkupValidatorTests < Test::Unit::TestCase
|
|
85
84
|
assert_nothing_raised do
|
86
85
|
r = @v.validate_uri('http://code.dunae.ca/w3c_validators/test/invalid_encoding.html')
|
87
86
|
assert !r.is_valid?
|
88
|
-
|
89
|
-
|
87
|
+
assert_errors r, 1
|
88
|
+
assert_no_warnings r
|
90
89
|
end
|
91
90
|
end
|
92
91
|
|
data/test/test_proxy.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
require 'webrick'
|
4
|
+
require 'webrick/httpproxy'
|
5
|
+
|
6
|
+
# Test cases for the ProxyTests.
|
7
|
+
class ProxyTests < Test::Unit::TestCase
|
8
|
+
include W3CValidators
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@ps = WEBrick::HTTPProxyServer.new(:Port => 9999, :ServerType => Thread, :RequestCallback => Proc.new{|req,res| puts req.request_line, req.raw_header})
|
12
|
+
|
13
|
+
['TERM', 'INT'].each do |signal|
|
14
|
+
trap(signal){ @ps.shutdown }
|
15
|
+
end
|
16
|
+
|
17
|
+
@ps.start
|
18
|
+
|
19
|
+
@v = MarkupValidator.new({:proxy_server => 'localhost', :proxy_port => 9999})
|
20
|
+
sleep 1
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def test_validating_uri_with_head_request
|
25
|
+
r = @v.validate_uri_quickly('http://code.dunae.ca/w3c_validators/test/invalid_markup.html')
|
26
|
+
assert_errors r, 1
|
27
|
+
end
|
28
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.0
|
3
3
|
specification_version: 1
|
4
4
|
name: w3c_validators
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date:
|
6
|
+
version: 1.0.2
|
7
|
+
date: 2009-11-20 00:00:00 -08:00
|
8
8
|
summary: Wrapper for the World Wide Web Consortium's online validation services.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
|
-
email:
|
11
|
+
email: code@dunae.ca
|
12
12
|
homepage: http://code.dunae.ca/w3c_validators
|
13
13
|
rubyforge_project:
|
14
14
|
description: W3C Validators is a Ruby wrapper for the World Wide Web Consortium's online validation services.
|
@@ -30,29 +30,36 @@ authors:
|
|
30
30
|
- Alex Dunae
|
31
31
|
files:
|
32
32
|
- lib/w3c_validators
|
33
|
+
- lib/w3c_validators.rb
|
33
34
|
- lib/w3c_validators/constants.rb
|
34
35
|
- lib/w3c_validators/css_validator.rb
|
35
36
|
- lib/w3c_validators/exceptions.rb
|
36
37
|
- lib/w3c_validators/feed_validator.rb
|
37
38
|
- lib/w3c_validators/markup_validator.rb
|
38
39
|
- lib/w3c_validators/message.rb
|
40
|
+
- lib/w3c_validators/nu_validator.rb
|
39
41
|
- lib/w3c_validators/results.rb
|
40
42
|
- lib/w3c_validators/validator.rb
|
41
|
-
-
|
42
|
-
-
|
43
|
+
- README.rdoc
|
44
|
+
- CHANGELOG
|
43
45
|
- LICENSE
|
44
46
|
test_files:
|
45
47
|
- test/test_css_validator.rb
|
46
48
|
- test/test_exceptions.rb
|
47
49
|
- test/test_feed_validator.rb
|
48
50
|
- test/test_helper.rb
|
51
|
+
- test/test_html5_validator.rb
|
49
52
|
- test/test_markup_validator.rb
|
53
|
+
- test/test_proxy.rb
|
50
54
|
rdoc_options:
|
51
55
|
- --all
|
52
56
|
- --inline-source
|
53
57
|
- --line-numbers
|
58
|
+
- --charset
|
59
|
+
- utf-8
|
54
60
|
extra_rdoc_files:
|
55
|
-
- README
|
61
|
+
- README.rdoc
|
62
|
+
- CHANGELOG
|
56
63
|
- LICENSE
|
57
64
|
executables: []
|
58
65
|
|