validate-website 0.7.0 → 0.7.1
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/README.rdoc +7 -0
- data/Rakefile +5 -7
- data/bin/validate-website +0 -8
- data/bin/validate-website-static +0 -8
- data/data/schemas/frameset.dtd +2 -2
- data/data/schemas/loose.dtd +9 -9
- data/data/schemas/strict.dtd +10 -10
- data/data/schemas/xhtml-rdfa-1.dtd +4 -4
- data/data/schemas/xhtml-special.ent +1 -1
- data/data/schemas/xhtml-symbol.ent +4 -4
- data/data/schemas/xhtml1-frameset.dtd +8 -8
- data/data/schemas/xhtml1-strict.dtd +4 -4
- data/data/schemas/xhtml1-transitional.dtd +8 -8
- data/lib/validate_website/core.rb +20 -2
- data/lib/validate_website/validator.rb +8 -0
- data/spec/core_spec.rb +51 -42
- data/spec/example/ruby smalltalk/blockcamp-paris-le-28-novembre.html +22 -0
- data/spec/spec_helper.rb +1 -3
- data/spec/validator_spec.rb +52 -54
- metadata +77 -127
data/README.rdoc
CHANGED
@@ -62,6 +62,13 @@ HTML5 support with Validator.nu Web Service.
|
|
62
62
|
66::
|
63
63
|
There are not valid markup and pages not found.
|
64
64
|
|
65
|
+
== On your application ==
|
66
|
+
|
67
|
+
require 'validate_website/validator'
|
68
|
+
body = '<!DOCTYPE html><html></html>'
|
69
|
+
v = ValidateWebsite::Validator.new(Nokogiri::HTML(body), body)
|
70
|
+
v.valid? # => false
|
71
|
+
|
65
72
|
== REQUIREMENTS
|
66
73
|
|
67
74
|
See validate-website.gemspec file.
|
data/Rakefile
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require '
|
2
|
-
require
|
1
|
+
require 'rdoc/task'
|
2
|
+
require 'rake/testtask'
|
3
3
|
|
4
4
|
task :default => [:test]
|
5
5
|
|
6
|
-
|
6
|
+
RDoc::Task.new do |rd|
|
7
7
|
rd.main = "README.rdoc"
|
8
8
|
rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
|
9
9
|
end
|
@@ -13,9 +13,7 @@ task :manpage do
|
|
13
13
|
system('find doc/ -type f -exec a2x -f manpage -D man/man1 {} \;')
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
spec.pattern = 'spec/*_spec.rb'
|
19
|
-
spec.rspec_opts = ['--backtrace']
|
16
|
+
Rake::TestTask.new do |t|
|
17
|
+
t.pattern = "spec/*_spec.rb"
|
20
18
|
end
|
21
19
|
task :spec => :test
|
data/bin/validate-website
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
developer_mode = false
|
5
|
-
developer_mode = true if __FILE__ == $0
|
6
|
-
if developer_mode
|
7
|
-
lib_dir = File.join(File.dirname(__FILE__), '..', 'lib')
|
8
|
-
$:.unshift(File.expand_path(lib_dir))
|
9
|
-
require 'rubygems'
|
10
|
-
end
|
11
|
-
|
12
4
|
require 'validate_website/runner'
|
13
5
|
exit_status = ValidateWebsite::Runner.run_crawl(ARGV)
|
14
6
|
exit(exit_status)
|
data/bin/validate-website-static
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
developer_mode = false
|
5
|
-
developer_mode = true if __FILE__ == $0
|
6
|
-
if developer_mode
|
7
|
-
lib_dir = File.join(File.dirname(__FILE__), '..', 'lib')
|
8
|
-
$:.unshift(File.expand_path(lib_dir))
|
9
|
-
require 'rubygems'
|
10
|
-
end
|
11
|
-
|
12
4
|
require 'validate_website/runner'
|
13
5
|
exit_status = ValidateWebsite::Runner.run_static(ARGV)
|
14
6
|
exit(exit_status)
|
data/data/schemas/frameset.dtd
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
This is the HTML 4.01 Frameset DTD, which should be
|
3
3
|
used for documents with frames. This DTD is identical
|
4
4
|
to the HTML 4.01 Transitional DTD except for the
|
5
|
-
content model of the "HTML" element: in frameset
|
6
|
-
documents, the "FRAMESET" element replaces the "BODY"
|
5
|
+
content model of the "HTML" element: in frameset
|
6
|
+
documents, the "FRAMESET" element replaces the "BODY"
|
7
7
|
element.
|
8
8
|
|
9
9
|
Draft: $Date: 1999/12/24 23:37:45 $
|
data/data/schemas/loose.dtd
CHANGED
@@ -56,7 +56,7 @@
|
|
56
56
|
presentation control for user agents that don't (adequately)
|
57
57
|
support style sheets.
|
58
58
|
|
59
|
-
If you are writing a document that includes frames, use
|
59
|
+
If you are writing a document that includes frames, use
|
60
60
|
the following FPI:
|
61
61
|
|
62
62
|
"-//W3C//DTD HTML 4.01 Frameset//EN"
|
@@ -65,7 +65,7 @@
|
|
65
65
|
|
66
66
|
http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd
|
67
67
|
|
68
|
-
Use the following (relative) URIs to refer to
|
68
|
+
Use the following (relative) URIs to refer to
|
69
69
|
the DTDs and entity definitions of this specification:
|
70
70
|
|
71
71
|
"strict.dtd"
|
@@ -102,7 +102,7 @@
|
|
102
102
|
-->
|
103
103
|
|
104
104
|
<!ENTITY % Character "CDATA"
|
105
|
-
-- a single character from [ISO10646]
|
105
|
+
-- a single character from [ISO10646]
|
106
106
|
-->
|
107
107
|
|
108
108
|
<!ENTITY % LinkTypes "CDATA"
|
@@ -427,8 +427,8 @@
|
|
427
427
|
|
428
428
|
<!ENTITY % IAlign "(top|middle|bottom|left|right)" -- center? -->
|
429
429
|
|
430
|
-
<!-- To avoid problems with text-only UAs as well as
|
431
|
-
to make image content understandable and navigable
|
430
|
+
<!-- To avoid problems with text-only UAs as well as
|
431
|
+
to make image content understandable and navigable
|
432
432
|
to users of non-visual UAs, you need to provide
|
433
433
|
a description with ALT, and avoid server-side image maps -->
|
434
434
|
<!ELEMENT IMG - O EMPTY -- Embedded image -->
|
@@ -454,7 +454,7 @@
|
|
454
454
|
|
455
455
|
<!--==================== OBJECT ======================================-->
|
456
456
|
<!--
|
457
|
-
OBJECT is used to embed objects as part of HTML pages
|
457
|
+
OBJECT is used to embed objects as part of HTML pages
|
458
458
|
PARAM elements should precede other content. SGML mixed content
|
459
459
|
model technicality precludes specifying this formally ...
|
460
460
|
-->
|
@@ -820,7 +820,7 @@
|
|
820
820
|
-->
|
821
821
|
|
822
822
|
<!ENTITY % TRules "(none | groups | rows | cols | all)">
|
823
|
-
|
823
|
+
|
824
824
|
<!-- horizontal placement of table relative to document -->
|
825
825
|
<!ENTITY % TAlign "(left|center|right)">
|
826
826
|
|
@@ -964,8 +964,8 @@ several semantically related columns together.
|
|
964
964
|
default: 100% (1 row) --
|
965
965
|
cols %MultiLengths; #IMPLIED -- list of lengths,
|
966
966
|
default: 100% (1 col) --
|
967
|
-
onload %Script; #IMPLIED -- all the frames have been loaded --
|
968
|
-
onunload %Script; #IMPLIED -- all the frames have been removed --
|
967
|
+
onload %Script; #IMPLIED -- all the frames have been loaded --
|
968
|
+
onunload %Script; #IMPLIED -- all the frames have been removed --
|
969
969
|
>
|
970
970
|
]]>
|
971
971
|
|
data/data/schemas/strict.dtd
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
<!--
|
2
|
-
This is HTML 4.01 Strict DTD, which excludes the presentation
|
3
|
-
attributes and elements that W3C expects to phase out as
|
2
|
+
This is HTML 4.01 Strict DTD, which excludes the presentation
|
3
|
+
attributes and elements that W3C expects to phase out as
|
4
4
|
support for style sheets matures. Authors should use the Strict
|
5
5
|
DTD when possible, but may use the Transitional DTD when support
|
6
6
|
for presentation attribute and elements is required.
|
7
|
-
|
7
|
+
|
8
8
|
HTML 4 includes mechanisms for style sheets, scripting,
|
9
9
|
embedding objects, improved support for right to left and mixed
|
10
10
|
direction text, and enhancements to forms for improved
|
@@ -52,7 +52,7 @@
|
|
52
52
|
|
53
53
|
http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd
|
54
54
|
|
55
|
-
If you are writing a document that includes frames, use
|
55
|
+
If you are writing a document that includes frames, use
|
56
56
|
the following FPI:
|
57
57
|
|
58
58
|
"-//W3C//DTD HTML 4.01 Frameset//EN"
|
@@ -61,7 +61,7 @@
|
|
61
61
|
|
62
62
|
http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd
|
63
63
|
|
64
|
-
Use the following (relative) URIs to refer to
|
64
|
+
Use the following (relative) URIs to refer to
|
65
65
|
the DTDs and entity definitions of this specification:
|
66
66
|
|
67
67
|
"strict.dtd"
|
@@ -98,7 +98,7 @@
|
|
98
98
|
-->
|
99
99
|
|
100
100
|
<!ENTITY % Character "CDATA"
|
101
|
-
-- a single character from [ISO10646]
|
101
|
+
-- a single character from [ISO10646]
|
102
102
|
-->
|
103
103
|
|
104
104
|
<!ENTITY % LinkTypes "CDATA"
|
@@ -367,8 +367,8 @@
|
|
367
367
|
<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
|
368
368
|
|
369
369
|
|
370
|
-
<!-- To avoid problems with text-only UAs as well as
|
371
|
-
to make image content understandable and navigable
|
370
|
+
<!-- To avoid problems with text-only UAs as well as
|
371
|
+
to make image content understandable and navigable
|
372
372
|
to users of non-visual UAs, you need to provide
|
373
373
|
a description with ALT, and avoid server-side image maps -->
|
374
374
|
<!ELEMENT IMG - O EMPTY -- Embedded image -->
|
@@ -390,7 +390,7 @@
|
|
390
390
|
|
391
391
|
<!--==================== OBJECT ======================================-->
|
392
392
|
<!--
|
393
|
-
OBJECT is used to embed objects as part of HTML pages
|
393
|
+
OBJECT is used to embed objects as part of HTML pages
|
394
394
|
PARAM elements should precede other content. SGML mixed content
|
395
395
|
model technicality precludes specifying this formally ...
|
396
396
|
-->
|
@@ -686,7 +686,7 @@
|
|
686
686
|
-->
|
687
687
|
|
688
688
|
<!ENTITY % TRules "(none | groups | rows | cols | all)">
|
689
|
-
|
689
|
+
|
690
690
|
<!-- horizontal placement of table relative to document -->
|
691
691
|
<!ENTITY % TAlign "(left|center|right)">
|
692
692
|
|
@@ -14,10 +14,10 @@
|
|
14
14
|
for Informatics and Mathematics, Keio University).
|
15
15
|
All Rights Reserved.
|
16
16
|
|
17
|
-
Permission to use, copy, modify and distribute the XHTML DTD and its
|
18
|
-
accompanying documentation for any purpose and without fee is hereby
|
19
|
-
granted in perpetuity, provided that the above copyright notice and
|
20
|
-
this paragraph appear in all copies. The copyright holders make no
|
17
|
+
Permission to use, copy, modify and distribute the XHTML DTD and its
|
18
|
+
accompanying documentation for any purpose and without fee is hereby
|
19
|
+
granted in perpetuity, provided that the above copyright notice and
|
20
|
+
this paragraph appear in all copies. The copyright holders make no
|
21
21
|
representation about the suitability of the DTD for any purpose.
|
22
22
|
|
23
23
|
It is provided "as is" without expressed or implied warranty.
|
@@ -18,7 +18,7 @@
|
|
18
18
|
existing ISO 8879 entity names. ISO 10646 character numbers
|
19
19
|
are given for each character, in hex. values are decimal
|
20
20
|
conversions of the ISO 10646 values and refer to the document
|
21
|
-
character set. Names are Unicode names.
|
21
|
+
character set. Names are Unicode names.
|
22
22
|
-->
|
23
23
|
|
24
24
|
<!-- C0 Controls and Basic Latin -->
|
@@ -18,7 +18,7 @@
|
|
18
18
|
existing ISO 8879 entity names. ISO 10646 character numbers
|
19
19
|
are given for each character, in hex. values are decimal
|
20
20
|
conversions of the ISO 10646 values and refer to the document
|
21
|
-
character set. Names are Unicode names.
|
21
|
+
character set. Names are Unicode names.
|
22
22
|
-->
|
23
23
|
|
24
24
|
<!-- Latin Extended-B -->
|
@@ -144,7 +144,7 @@
|
|
144
144
|
<!ENTITY uArr "⇑"> <!-- upwards double arrow, U+21D1 ISOamsa -->
|
145
145
|
<!ENTITY rArr "⇒"> <!-- rightwards double arrow,
|
146
146
|
U+21D2 ISOtech -->
|
147
|
-
<!-- Unicode does not say this is the 'implies' character but does not have
|
147
|
+
<!-- Unicode does not say this is the 'implies' character but does not have
|
148
148
|
another character with this function so rArr can be used for 'implies'
|
149
149
|
as ISOtech suggests -->
|
150
150
|
<!ENTITY dArr "⇓"> <!-- downwards double arrow, U+21D3 ISOamsa -->
|
@@ -217,11 +217,11 @@
|
|
217
217
|
<!ENTITY rfloor "⌋"> <!-- right floor, U+230B ISOamsc -->
|
218
218
|
<!ENTITY lang "〈"> <!-- left-pointing angle bracket = bra,
|
219
219
|
U+2329 ISOtech -->
|
220
|
-
<!-- lang is NOT the same character as U+003C 'less than sign'
|
220
|
+
<!-- lang is NOT the same character as U+003C 'less than sign'
|
221
221
|
or U+2039 'single left-pointing angle quotation mark' -->
|
222
222
|
<!ENTITY rang "〉"> <!-- right-pointing angle bracket = ket,
|
223
223
|
U+232A ISOtech -->
|
224
|
-
<!-- rang is NOT the same character as U+003E 'greater than sign'
|
224
|
+
<!-- rang is NOT the same character as U+003E 'greater than sign'
|
225
225
|
or U+203A 'single right-pointing angle quotation mark' -->
|
226
226
|
|
227
227
|
<!-- Geometric Shapes -->
|
@@ -9,7 +9,7 @@
|
|
9
9
|
For further information, see: http://www.w3.org/TR/xhtml1
|
10
10
|
|
11
11
|
Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
|
12
|
-
All Rights Reserved.
|
12
|
+
All Rights Reserved.
|
13
13
|
|
14
14
|
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
|
15
15
|
|
@@ -199,7 +199,7 @@
|
|
199
199
|
|
200
200
|
<!ENTITY % special.extra
|
201
201
|
"object | applet | img | map | iframe">
|
202
|
-
|
202
|
+
|
203
203
|
<!ENTITY % special.basic
|
204
204
|
"br | span | bdo">
|
205
205
|
|
@@ -304,7 +304,7 @@
|
|
304
304
|
window title. Exactly one title is required per document.
|
305
305
|
-->
|
306
306
|
<!ELEMENT title (#PCDATA)>
|
307
|
-
<!ATTLIST title
|
307
|
+
<!ATTLIST title
|
308
308
|
%i18n;
|
309
309
|
id ID #IMPLIED
|
310
310
|
>
|
@@ -550,14 +550,14 @@
|
|
550
550
|
start %Number; #IMPLIED
|
551
551
|
>
|
552
552
|
|
553
|
-
<!-- single column list (DEPRECATED) -->
|
553
|
+
<!-- single column list (DEPRECATED) -->
|
554
554
|
<!ELEMENT menu (li)+>
|
555
555
|
<!ATTLIST menu
|
556
556
|
%attrs;
|
557
557
|
compact (compact) #IMPLIED
|
558
558
|
>
|
559
559
|
|
560
|
-
<!-- multiple column list (DEPRECATED) -->
|
560
|
+
<!-- multiple column list (DEPRECATED) -->
|
561
561
|
<!ELEMENT dir (li)+>
|
562
562
|
<!ATTLIST dir
|
563
563
|
%attrs;
|
@@ -616,7 +616,7 @@
|
|
616
616
|
|
617
617
|
<!--=================== Preformatted Text ================================-->
|
618
618
|
|
619
|
-
<!-- content is %Inline; excluding
|
619
|
+
<!-- content is %Inline; excluding
|
620
620
|
"img|object|applet|big|small|sub|sup|font|basefont" -->
|
621
621
|
|
622
622
|
<!ELEMENT pre %pre.content;>
|
@@ -1034,7 +1034,7 @@
|
|
1034
1034
|
|
1035
1035
|
<!--
|
1036
1036
|
Content is %Flow; excluding a, form, form controls, iframe
|
1037
|
-
-->
|
1037
|
+
-->
|
1038
1038
|
<!ELEMENT button %button.content;> <!-- push button -->
|
1039
1039
|
<!ATTLIST button
|
1040
1040
|
%attrs;
|
@@ -1075,7 +1075,7 @@
|
|
1075
1075
|
-->
|
1076
1076
|
|
1077
1077
|
<!ENTITY % TRules "(none | groups | rows | cols | all)">
|
1078
|
-
|
1078
|
+
|
1079
1079
|
<!-- horizontal placement of table relative to document -->
|
1080
1080
|
<!ENTITY % TAlign "(left|center|right)">
|
1081
1081
|
|
@@ -9,7 +9,7 @@
|
|
9
9
|
For further information, see: http://www.w3.org/TR/xhtml1
|
10
10
|
|
11
11
|
Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
|
12
|
-
All Rights Reserved.
|
12
|
+
All Rights Reserved.
|
13
13
|
|
14
14
|
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
|
15
15
|
|
@@ -263,7 +263,7 @@
|
|
263
263
|
window title. Exactly one title is required per document.
|
264
264
|
-->
|
265
265
|
<!ELEMENT title (#PCDATA)>
|
266
|
-
<!ATTLIST title
|
266
|
+
<!ATTLIST title
|
267
267
|
%i18n;
|
268
268
|
id ID #IMPLIED
|
269
269
|
>
|
@@ -801,7 +801,7 @@
|
|
801
801
|
|
802
802
|
<!--
|
803
803
|
Content is %Flow; excluding a, form and form controls
|
804
|
-
-->
|
804
|
+
-->
|
805
805
|
<!ELEMENT button %button.content;> <!-- push button -->
|
806
806
|
<!ATTLIST button
|
807
807
|
%attrs;
|
@@ -834,7 +834,7 @@
|
|
834
834
|
-->
|
835
835
|
|
836
836
|
<!ENTITY % TRules "(none | groups | rows | cols | all)">
|
837
|
-
|
837
|
+
|
838
838
|
<!-- horizontal alignment attributes for cell contents
|
839
839
|
|
840
840
|
char alignment char, e.g. char=':'
|
@@ -9,7 +9,7 @@
|
|
9
9
|
For further information, see: http://www.w3.org/TR/xhtml1
|
10
10
|
|
11
11
|
Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
|
12
|
-
All Rights Reserved.
|
12
|
+
All Rights Reserved.
|
13
13
|
|
14
14
|
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
|
15
15
|
|
@@ -196,7 +196,7 @@
|
|
196
196
|
|
197
197
|
<!ENTITY % special.extra
|
198
198
|
"object | applet | img | map | iframe">
|
199
|
-
|
199
|
+
|
200
200
|
<!ENTITY % special.basic
|
201
201
|
"br | span | bdo">
|
202
202
|
|
@@ -299,7 +299,7 @@
|
|
299
299
|
window title. Exactly one title is required per document.
|
300
300
|
-->
|
301
301
|
<!ELEMENT title (#PCDATA)>
|
302
|
-
<!ATTLIST title
|
302
|
+
<!ATTLIST title
|
303
303
|
%i18n;
|
304
304
|
id ID #IMPLIED
|
305
305
|
>
|
@@ -517,14 +517,14 @@
|
|
517
517
|
start %Number; #IMPLIED
|
518
518
|
>
|
519
519
|
|
520
|
-
<!-- single column list (DEPRECATED) -->
|
520
|
+
<!-- single column list (DEPRECATED) -->
|
521
521
|
<!ELEMENT menu (li)+>
|
522
522
|
<!ATTLIST menu
|
523
523
|
%attrs;
|
524
524
|
compact (compact) #IMPLIED
|
525
525
|
>
|
526
526
|
|
527
|
-
<!-- multiple column list (DEPRECATED) -->
|
527
|
+
<!-- multiple column list (DEPRECATED) -->
|
528
528
|
<!ELEMENT dir (li)+>
|
529
529
|
<!ATTLIST dir
|
530
530
|
%attrs;
|
@@ -583,7 +583,7 @@
|
|
583
583
|
|
584
584
|
<!--=================== Preformatted Text ================================-->
|
585
585
|
|
586
|
-
<!-- content is %Inline; excluding
|
586
|
+
<!-- content is %Inline; excluding
|
587
587
|
"img|object|applet|big|small|sub|sup|font|basefont" -->
|
588
588
|
|
589
589
|
<!ELEMENT pre %pre.content;>
|
@@ -1000,7 +1000,7 @@
|
|
1000
1000
|
|
1001
1001
|
<!--
|
1002
1002
|
Content is %Flow; excluding a, form, form controls, iframe
|
1003
|
-
-->
|
1003
|
+
-->
|
1004
1004
|
<!ELEMENT button %button.content;> <!-- push button -->
|
1005
1005
|
<!ATTLIST button
|
1006
1006
|
%attrs;
|
@@ -1041,7 +1041,7 @@
|
|
1041
1041
|
-->
|
1042
1042
|
|
1043
1043
|
<!ENTITY % TRules "(none | groups | rows | cols | all)">
|
1044
|
-
|
1044
|
+
|
1045
1045
|
<!-- horizontal placement of table relative to document -->
|
1046
1046
|
<!ENTITY % TAlign "(left|center|right)">
|
1047
1047
|
|
@@ -37,9 +37,18 @@ module ValidateWebsite
|
|
37
37
|
@site = @options[:site]
|
38
38
|
end
|
39
39
|
|
40
|
+
##
|
41
|
+
#
|
42
|
+
# @param [Hash] options
|
43
|
+
# :quiet [Boolean] no output (true, false)
|
44
|
+
# :color [Boolean] color output (true, false)
|
45
|
+
# :exclude [String] a String used by Regexp.new
|
46
|
+
# :markup_validation [Boolean] Check the markup validity
|
47
|
+
# :not_found [Boolean] Check for not found page (404)
|
48
|
+
#
|
40
49
|
def crawl(opts={})
|
41
50
|
opts = @options.merge(opts)
|
42
|
-
puts color(:note, "validating #{@site}", opts[:color])
|
51
|
+
puts color(:note, "validating #{@site}", opts[:color]) unless opts[:quiet]
|
43
52
|
|
44
53
|
@anemone = Anemone.crawl(@site, opts) do |anemone|
|
45
54
|
anemone.skip_links_like Regexp.new(opts[:exclude]) if opts[:exclude]
|
@@ -87,7 +96,8 @@ module ValidateWebsite
|
|
87
96
|
files.each do |f|
|
88
97
|
next unless File.file?(f)
|
89
98
|
|
90
|
-
page = Anemone::Page.new(URI.parse(opts[:site] +
|
99
|
+
page = Anemone::Page.new(URI.parse(opts[:site] + URI.encode(f)),
|
100
|
+
:body => open(f).read,
|
91
101
|
:headers => {'content-type' => ['text/html', 'application/xhtml+xml']})
|
92
102
|
|
93
103
|
if opts[:markup_validation]
|
@@ -180,6 +190,14 @@ module ValidateWebsite
|
|
180
190
|
end
|
181
191
|
end
|
182
192
|
|
193
|
+
##
|
194
|
+
# @param [Nokogiri::HTML::Document] original_doc
|
195
|
+
# @param [String] The raw HTTP response body of the page
|
196
|
+
# @param [String] url
|
197
|
+
# @param [Hash] options
|
198
|
+
# :quiet no output (true, false)
|
199
|
+
# :color color output (true, false)
|
200
|
+
#
|
183
201
|
def validate(doc, body, url, opts={})
|
184
202
|
opts = @options.merge(opts)
|
185
203
|
validator = Validator.new(doc, body)
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'uri'
|
3
|
+
require 'nokogiri'
|
2
4
|
|
3
5
|
module ValidateWebsite
|
4
6
|
class Validator
|
@@ -6,6 +8,9 @@ module ValidateWebsite
|
|
6
8
|
|
7
9
|
attr_reader :original_doc, :body, :dtd, :doc, :namespace, :xsd, :errors
|
8
10
|
|
11
|
+
##
|
12
|
+
# @param [Nokogiri::HTML::Document] original_doc
|
13
|
+
# @param [String] The raw HTTP response body of the page
|
9
14
|
def initialize(original_doc, body)
|
10
15
|
@original_doc = original_doc
|
11
16
|
@body = body
|
@@ -37,6 +42,7 @@ module ValidateWebsite
|
|
37
42
|
@errors = @xsd.validate(@doc)
|
38
43
|
elsif document =~ /^\<!DOCTYPE html\>/i
|
39
44
|
# TODO: use a local Java, Python parser... write a Ruby HTML5 parser ?
|
45
|
+
require 'net/http'
|
40
46
|
require 'multipart_body'
|
41
47
|
url = URI.parse('http://validator.nu/')
|
42
48
|
multipart = MultipartBody.new(:content => document)
|
@@ -63,6 +69,8 @@ module ValidateWebsite
|
|
63
69
|
@errors << e
|
64
70
|
end
|
65
71
|
|
72
|
+
##
|
73
|
+
# @return [Boolean]
|
66
74
|
def valid?
|
67
75
|
@errors.length == 0
|
68
76
|
end
|
data/spec/core_spec.rb
CHANGED
@@ -1,56 +1,65 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
2
|
|
3
|
-
|
4
|
-
describe Core do
|
3
|
+
describe ValidateWebsite::Core do
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
before do
|
6
|
+
FakeWeb.clean_registry
|
7
|
+
@validate_website = ValidateWebsite::Core.new(:color => false)
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
10
|
+
describe('html') do
|
11
|
+
it "extract url" do
|
12
|
+
name = 'xhtml1-strict'
|
13
|
+
file = File.join('spec', 'data', "#{name}.html")
|
14
|
+
page = FakePage.new(name,
|
15
|
+
:body => open(file).read,
|
16
|
+
:content_type => 'text/html')
|
17
|
+
@validate_website.site = page.url
|
18
|
+
@validate_website.crawl(:quiet => true)
|
19
|
+
@validate_website.anemone.pages.size.must_equal 5
|
22
20
|
end
|
21
|
+
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
describe('css') do
|
24
|
+
it "crawl css and extract url" do
|
25
|
+
page = FakePage.new('test.css',
|
26
|
+
:body => ".test {background-image: url(pouet);}
|
28
27
|
.tests {background-image: url(/image/pouet.png)}
|
29
28
|
.tests {background-image: url(/image/pouet_42.png)}
|
30
29
|
.tests {background-image: url(/image/pouet)}",
|
31
30
|
:content_type => 'text/css')
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
@validate_website.site = page.url
|
32
|
+
@validate_website.crawl(:quiet => true)
|
33
|
+
@validate_website.anemone.pages.size.must_equal 5
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
36
|
+
it "should extract url with single quote" do
|
37
|
+
page = FakePage.new('test.css',
|
38
|
+
:body => ".test {background-image: url('pouet');}",
|
39
|
+
:content_type => 'text/css')
|
40
|
+
@validate_website.site = page.url
|
41
|
+
@validate_website.crawl(:quiet => true)
|
42
|
+
@validate_website.anemone.pages.size.must_equal 2
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should extract url with double quote" do
|
46
|
+
page = FakePage.new('test.css',
|
47
|
+
:body => ".test {background-image: url(\"pouet\");}",
|
48
|
+
:content_type => 'text/css')
|
49
|
+
@validate_website.site = page.url
|
50
|
+
@validate_website.crawl(:quiet => true)
|
51
|
+
@validate_website.anemone.pages.size.must_equal 2
|
52
|
+
end
|
53
|
+
end
|
45
54
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
55
|
+
describe('static') do
|
56
|
+
it 'no space in directory name' do
|
57
|
+
pattern = File.join(File.dirname(__FILE__), 'example/**/*.html')
|
58
|
+
@validate_website.crawl_static(:pattern => pattern,
|
59
|
+
:site => 'http://dev.af83.com/',
|
60
|
+
:markup_validation => false,
|
61
|
+
:not_found => false,
|
62
|
+
:quiet => true)
|
54
63
|
end
|
55
64
|
end
|
56
65
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
5
|
+
<head>
|
6
|
+
<title>title</title>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<h1>Title 1</h1>
|
10
|
+
<p>Paragraphe.</p>
|
11
|
+
|
12
|
+
<h2>Title 2</h2>
|
13
|
+
<ul>
|
14
|
+
<li><a href="/my-url1" title="title">my url</a></li>
|
15
|
+
<li><a href="/my-url2" title="title">my url</a></li>
|
16
|
+
<li><a href="/my-url1" title="title">my url</a></li>
|
17
|
+
</ul>
|
18
|
+
<p><img src="http://test.com/img.png" alt="non local img" /></p>
|
19
|
+
<p><img src="http://www.example.com/img1.png" alt="local img with absolute uri" /></p>
|
20
|
+
<p><img src="/img2.png" alt="local img with non absolute uri" /></p>
|
21
|
+
</body>
|
22
|
+
</html>
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
+
require 'minitest/autorun'
|
1
2
|
require File.expand_path(File.join(File.dirname(__FILE__), 'fakeweb_helper'))
|
2
3
|
require 'anemone'
|
3
4
|
|
4
|
-
lib_dir = File.join(File.dirname(__FILE__), '..', 'lib')
|
5
|
-
$:.unshift(File.expand_path(lib_dir))
|
6
|
-
|
7
5
|
require 'validate_website/core'
|
8
6
|
|
9
7
|
SPEC_DOMAIN = 'http://www.example.com/'
|
data/spec/validator_spec.rb
CHANGED
@@ -1,69 +1,67 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
describe ValidateWebsite::Validator do
|
4
|
+
before do
|
5
|
+
FakeWeb.clean_registry
|
6
|
+
@http = Anemone::HTTP.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe("xhtml1") do
|
10
|
+
it "xhtml1-strict should be valid" do
|
11
|
+
name = 'xhtml1-strict'
|
12
|
+
dtd_uri = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
|
13
|
+
file = File.join('spec', 'data', "#{name}.html")
|
14
|
+
page = FakePage.new(name,
|
15
|
+
:body => open(file).read,
|
16
|
+
:content_type => 'text/html')
|
17
|
+
@xhtml1_page = @http.fetch_page(page.url)
|
18
|
+
validator = ValidateWebsite::Validator.new(@xhtml1_page.doc, @xhtml1_page.body)
|
19
|
+
validator.dtd.system_id.must_equal dtd_uri
|
20
|
+
validator.namespace.must_equal name
|
21
|
+
validator.valid?.must_equal true
|
8
22
|
end
|
23
|
+
end
|
9
24
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
25
|
+
describe('html5') do
|
26
|
+
describe('when valid') do
|
27
|
+
before do
|
28
|
+
validator_res = File.join('spec', 'data', 'validator.nu-success.html')
|
29
|
+
FakeWeb.register_uri(:any, 'http://validator.nu/',
|
30
|
+
:body => open(validator_res).read)
|
31
|
+
end
|
32
|
+
it "html5 should be valid" do
|
33
|
+
name = 'html5'
|
14
34
|
file = File.join('spec', 'data', "#{name}.html")
|
15
35
|
page = FakePage.new(name,
|
16
36
|
:body => open(file).read,
|
17
37
|
:content_type => 'text/html')
|
18
|
-
@
|
19
|
-
validator = Validator.new(@
|
20
|
-
validator.
|
21
|
-
validator.namespace.should == name
|
22
|
-
validator.should be_valid
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe('html5') do
|
27
|
-
context('when valid') do
|
28
|
-
before do
|
29
|
-
validator_res = File.join('spec', 'data', 'validator.nu-success.html')
|
30
|
-
FakeWeb.register_uri(:any, 'http://validator.nu/',
|
31
|
-
:body => open(validator_res).read)
|
32
|
-
end
|
33
|
-
it "html5 should be valid" do
|
34
|
-
name = 'html5'
|
35
|
-
file = File.join('spec', 'data', "#{name}.html")
|
36
|
-
page = FakePage.new(name,
|
37
|
-
:body => open(file).read,
|
38
|
-
:content_type => 'text/html')
|
39
|
-
@html5_page = @http.fetch_page(page.url)
|
40
|
-
validator = Validator.new(@html5_page.doc, @html5_page.body)
|
41
|
-
validator.should be_valid
|
42
|
-
end
|
43
|
-
it "with DLFP" do
|
44
|
-
name = 'html5'
|
45
|
-
file = File.join('spec', 'data', "#{name}-linuxfr.html")
|
46
|
-
page = FakePage.new(name,
|
47
|
-
:body => open(file).read,
|
48
|
-
:content_type => 'text/html')
|
49
|
-
@html5_page = @http.fetch_page(page.url)
|
50
|
-
validator = Validator.new(@html5_page.doc, @html5_page.body)
|
51
|
-
validator.should be_valid
|
52
|
-
end
|
38
|
+
@html5_page = @http.fetch_page(page.url)
|
39
|
+
validator = ValidateWebsite::Validator.new(@html5_page.doc, @html5_page.body)
|
40
|
+
validator.valid?.must_equal true
|
53
41
|
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
it 'should validate html4' do
|
58
|
-
name = 'html4-strict'
|
59
|
-
file = File.join('spec', 'data', "#{name}.html")
|
42
|
+
it "with DLFP" do
|
43
|
+
name = 'html5'
|
44
|
+
file = File.join('spec', 'data', "#{name}-linuxfr.html")
|
60
45
|
page = FakePage.new(name,
|
61
46
|
:body => open(file).read,
|
62
47
|
:content_type => 'text/html')
|
63
|
-
@
|
64
|
-
validator = Validator.new(@
|
65
|
-
validator.
|
48
|
+
@html5_page = @http.fetch_page(page.url)
|
49
|
+
validator = ValidateWebsite::Validator.new(@html5_page.doc, @html5_page.body)
|
50
|
+
validator.valid?.must_equal true
|
66
51
|
end
|
67
52
|
end
|
68
53
|
end
|
54
|
+
|
55
|
+
describe('html4') do
|
56
|
+
it 'should validate html4' do
|
57
|
+
name = 'html4-strict'
|
58
|
+
file = File.join('spec', 'data', "#{name}.html")
|
59
|
+
page = FakePage.new(name,
|
60
|
+
:body => open(file).read,
|
61
|
+
:content_type => 'text/html')
|
62
|
+
@html4_strict_page = @http.fetch_page(page.url)
|
63
|
+
validator = ValidateWebsite::Validator.new(@html4_strict_page.doc, @html4_strict_page.body)
|
64
|
+
validator.valid?.must_equal true
|
65
|
+
end
|
66
|
+
end
|
69
67
|
end
|
metadata
CHANGED
@@ -1,128 +1,91 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: validate-website
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.1
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 7
|
9
|
-
- 0
|
10
|
-
version: 0.7.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Laurent Arnoud
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-12-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: anemone
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &14219840 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 5
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
- 6
|
32
|
-
- 1
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
33
21
|
version: 0.6.1
|
34
22
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: rainbow
|
38
23
|
prerelease: false
|
39
|
-
|
24
|
+
version_requirements: *14219840
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rainbow
|
27
|
+
requirement: &14218980 !ruby/object:Gem::Requirement
|
40
28
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
hash: 17
|
45
|
-
segments:
|
46
|
-
- 1
|
47
|
-
- 1
|
48
|
-
- 1
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
49
32
|
version: 1.1.1
|
50
33
|
type: :runtime
|
51
|
-
version_requirements: *id002
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
|
-
name: multipart_body
|
54
34
|
prerelease: false
|
55
|
-
|
35
|
+
version_requirements: *14218980
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: multipart_body
|
38
|
+
requirement: &14218400 !ruby/object:Gem::Requirement
|
56
39
|
none: false
|
57
|
-
requirements:
|
58
|
-
- -
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
hash: 21
|
61
|
-
segments:
|
62
|
-
- 0
|
63
|
-
- 2
|
64
|
-
- 1
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
65
43
|
version: 0.2.1
|
66
44
|
type: :runtime
|
67
|
-
version_requirements: *id003
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
|
-
name: rake
|
70
45
|
prerelease: false
|
71
|
-
|
46
|
+
version_requirements: *14218400
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: &14217660 !ruby/object:Gem::Requirement
|
72
50
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
hash: 49
|
77
|
-
segments:
|
78
|
-
- 0
|
79
|
-
- 8
|
80
|
-
- 7
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
81
54
|
version: 0.8.7
|
82
55
|
type: :development
|
83
|
-
version_requirements: *id004
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: rspec
|
86
56
|
prerelease: false
|
87
|
-
|
57
|
+
version_requirements: *14217660
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: minitest
|
60
|
+
requirement: &14232420 !ruby/object:Gem::Requirement
|
88
61
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
93
|
-
segments:
|
94
|
-
- 2
|
95
|
-
- 6
|
96
|
-
- 0
|
97
|
-
version: 2.6.0
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 2.1.0
|
98
66
|
type: :development
|
99
|
-
version_requirements: *id005
|
100
|
-
- !ruby/object:Gem::Dependency
|
101
|
-
name: fakeweb
|
102
67
|
prerelease: false
|
103
|
-
|
68
|
+
version_requirements: *14232420
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: fakeweb
|
71
|
+
requirement: &14230680 !ruby/object:Gem::Requirement
|
104
72
|
none: false
|
105
|
-
requirements:
|
106
|
-
- -
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
hash: 27
|
109
|
-
segments:
|
110
|
-
- 1
|
111
|
-
- 3
|
112
|
-
- 0
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
113
76
|
version: 1.3.0
|
114
77
|
type: :development
|
115
|
-
|
116
|
-
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *14230680
|
80
|
+
description: validate-website is a web crawler for checking the markup validity with
|
81
|
+
XML Schema / DTD and not found urls.
|
117
82
|
email: laurent@spkdev.net
|
118
|
-
executables:
|
83
|
+
executables:
|
119
84
|
- validate-website
|
120
85
|
- validate-website-static
|
121
86
|
extensions: []
|
122
|
-
|
123
87
|
extra_rdoc_files: []
|
124
|
-
|
125
|
-
files:
|
88
|
+
files:
|
126
89
|
- README.rdoc
|
127
90
|
- Rakefile
|
128
91
|
- LICENSE
|
@@ -134,6 +97,16 @@ files:
|
|
134
97
|
- lib/validate_website.rb
|
135
98
|
- man/man1/validate-website.1
|
136
99
|
- man/man1/validate-website-static.1
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
- spec/data/html5.html
|
102
|
+
- spec/data/html4-strict.html
|
103
|
+
- spec/data/validator.nu-success.html
|
104
|
+
- spec/data/html5-linuxfr.html
|
105
|
+
- spec/data/xhtml1-strict.html
|
106
|
+
- spec/example/ruby smalltalk/blockcamp-paris-le-28-novembre.html
|
107
|
+
- spec/core_spec.rb
|
108
|
+
- spec/fakeweb_helper.rb
|
109
|
+
- spec/validator_spec.rb
|
137
110
|
- data/schemas/xhtml-basic10-module-redefines-1.xsd
|
138
111
|
- data/schemas/xhtml-frames-1.xsd
|
139
112
|
- data/schemas/xhtml-basic11.xsd
|
@@ -224,44 +197,28 @@ files:
|
|
224
197
|
- data/schemas/xhtml-ssismap-1.xsd
|
225
198
|
- data/schemas/xhtml-list-1.xsd
|
226
199
|
- data/schemas/xhtml-charent-1.xsd
|
227
|
-
- spec/spec_helper.rb
|
228
|
-
- spec/data/html5.html
|
229
|
-
- spec/data/html4-strict.html
|
230
|
-
- spec/data/validator.nu-success.html
|
231
|
-
- spec/data/html5-linuxfr.html
|
232
|
-
- spec/data/xhtml1-strict.html
|
233
|
-
- spec/core_spec.rb
|
234
|
-
- spec/fakeweb_helper.rb
|
235
|
-
- spec/validator_spec.rb
|
236
200
|
- bin/validate-website
|
237
201
|
- bin/validate-website-static
|
238
202
|
homepage: http://github.com/spk/validate-website
|
239
|
-
licenses:
|
203
|
+
licenses:
|
240
204
|
- MIT
|
241
205
|
post_install_message:
|
242
206
|
rdoc_options: []
|
243
|
-
|
244
|
-
require_paths:
|
207
|
+
require_paths:
|
245
208
|
- lib
|
246
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
209
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
247
210
|
none: false
|
248
|
-
requirements:
|
249
|
-
- -
|
250
|
-
- !ruby/object:Gem::Version
|
251
|
-
|
252
|
-
|
253
|
-
- 0
|
254
|
-
version: "0"
|
255
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - ! '>='
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '0'
|
215
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
256
216
|
none: false
|
257
|
-
requirements:
|
258
|
-
- -
|
259
|
-
- !ruby/object:Gem::Version
|
260
|
-
|
261
|
-
|
262
|
-
- 0
|
263
|
-
version: "0"
|
264
|
-
requirements:
|
217
|
+
requirements:
|
218
|
+
- - ! '>='
|
219
|
+
- !ruby/object:Gem::Version
|
220
|
+
version: '0'
|
221
|
+
requirements:
|
265
222
|
- anemone
|
266
223
|
- rainbow
|
267
224
|
- multipart_body
|
@@ -270,14 +227,7 @@ rubygems_version: 1.7.2
|
|
270
227
|
signing_key:
|
271
228
|
specification_version: 3
|
272
229
|
summary: Web crawler for checking the validity of your documents
|
273
|
-
test_files:
|
274
|
-
- spec/spec_helper.rb
|
275
|
-
- spec/data/html5.html
|
276
|
-
- spec/data/html4-strict.html
|
277
|
-
- spec/data/validator.nu-success.html
|
278
|
-
- spec/data/html5-linuxfr.html
|
279
|
-
- spec/data/xhtml1-strict.html
|
230
|
+
test_files:
|
280
231
|
- spec/core_spec.rb
|
281
|
-
- spec/fakeweb_helper.rb
|
282
232
|
- spec/validator_spec.rb
|
283
233
|
has_rdoc:
|