CodeMonkeySteve-assert_valid_content 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -41,7 +41,6 @@ where +type+ is a MIME type constant (e.g. "Mime::HTML").
41
41
 
42
42
  == Examples
43
43
  require 'rubygems'
44
- require 'test/unit'
45
44
  require 'assert_valid_content'
46
45
 
47
46
  class ContentTest < Test::Unit::TestCase
@@ -1,28 +1,28 @@
1
- require 'tmpdir'
1
+ require 'assert_valid_content/validator'
2
2
 
3
+ require 'tmpdir'
3
4
  module AssertValidContent
4
5
  TempDir = if defined? RAILS_ROOT
5
6
  File.join RAILS_ROOT, 'tmp/validate'
6
7
  else
7
8
  File.join Dir.tmpdir, 'assert_valid_content'
8
9
  end
9
- end
10
10
 
11
- require 'assert_valid_content/libxml.rb'
12
- if AssertValidContent::LibXML::Installed
13
- AssertValidContent::LibXML::HTML.validates Mime::HTML
14
- AssertValidContent::LibXML::XML. validates Mime::XML
15
- end
11
+ module Assertions
12
+ require 'assert_valid_content/libxml.rb'
13
+ include AssertValidContent::LibXML::Assertions if AssertValidContent::LibXML::Installed
16
14
 
17
- require 'assert_valid_content/w3c-net.rb'
18
- if AssertValidContent::W3C::Installed
19
- AssertValidContent::W3C::CSS.validates Mime::CSS
15
+ require 'assert_valid_content/w3c-net.rb'
16
+ include AssertValidContent::W3C::Assertions if AssertValidContent::W3C::Installed
17
+ end
20
18
  end
21
19
 
22
- require 'assert_valid_content/assertions.rb'
20
+ require 'test/unit'
23
21
  if defined? Test::Unit::TestCase
24
- module Test # :nodoc:all
25
- class Test::Unit::TestCase ; include AssertValidContent::Assertions ; end
22
+ module Test::Unit # :nodoc:all
23
+ class TestCase
24
+ include AssertValidContent::Assertions
25
+ end
26
26
  end
27
27
  end
28
28
 
@@ -1,24 +1,18 @@
1
- require 'assert_valid_content/validator'
1
+ require 'libxml'
2
2
 
3
- # Validates using LibXML via the libxml-ruby[http://libxml.rubyforge.org/] gem.
3
+ # Validates using LibXML via the libxml-ruby[http://libxml.rubyforge.org/] gem.
4
4
  module AssertValidContent::LibXML
5
5
 
6
- # +true+ if required dependencies are installed
7
- Installed = begin
8
- gem( 'libxml-ruby', '~> 1.1' )
9
- require 'libxml'
10
- true
11
- rescue Gem::LoadError
12
- false
13
- end
6
+ Installed = true
14
7
 
15
8
  # Validates HTML and XHTML
16
- class AssertValidContent::LibXML::HTML < AssertValidContent::Validator
17
- def validate( content ) #:nodoc:
9
+ class HTMLValidator < AssertValidContent::Validator
10
+ def validate!( content ) #:nodoc:
18
11
  ::LibXML::XML::Error.set_handler { |err| @errors << err }
19
12
  begin
20
13
  doc = self.parser( content ).parse
21
14
  rescue ::LibXML::XML::Error ; end
15
+ @errors.empty?
22
16
  end
23
17
 
24
18
  protected
@@ -27,12 +21,24 @@ protected
27
21
  end
28
22
  end
29
23
 
24
+ module Assertions
25
+ def assert_valid_html( *srcs, &blk )
26
+ assert_valid_content ::AssertValidContent::LibXML::HTMLValidator, *srcs, &blk
27
+ end
28
+ end
29
+
30
30
  # Validates XML
31
- class AssertValidContent::LibXML::XML < HTML
31
+ class XMLValidator < HTMLValidator
32
32
  protected
33
33
  def parser( content ) #:nodoc:
34
34
  ::LibXML::XML::Parser.string content
35
35
  end
36
36
  end
37
37
 
38
+ module Assertions
39
+ def assert_valid_xml( *srcs, &blk )
40
+ assert_valid_content ::AssertValidContent::LibXML::XMLValidator, *srcs, &blk
41
+ end
42
+ end
43
+
38
44
  end
@@ -3,53 +3,53 @@ require 'pathname'
3
3
 
4
4
  module AssertValidContent # :nodoc
5
5
 
6
- # Hash of +type+ to sets of Validator objects for that type.
7
- def self.validators ; @@validators ; end
8
- @@validators = Hash.new { |h, k| h[k] = Set.new }
9
-
10
- # Returns +true+ if the content from +src+ is valid for type +type+. Yields on failure.
11
- # +src+ is one of +String+, +Pathname+, or +IO+ object
12
- def self.valid_content?( type, src ) # :yields: validator
13
- validators = AssertValidContent.validators[type]
14
- raise "No validators for type: #{type}" if validators.empty?
15
-
16
- content = case src
17
- when String then src
18
- when Pathname then IO.read src
19
- when IO then src.read
20
- else raise "Unknown content src type: #{src.class}"
21
- end
22
-
23
- val = nil
24
- valid = validators.all? do |cl|
25
- val = cl.new
26
- val.validate content
27
- val.errors.empty?
28
- end
29
-
30
- yield(val) if block_given? and not valid
31
- valid
32
- end
33
-
34
6
  # Base class for all content validators
35
7
  class Validator
36
8
  # Validation errors
37
9
  attr_reader :errors
38
10
 
39
- def initialize #:nodoc:
40
- @errors = []
11
+ def initialize( opts = {} ) #:nodoc:
12
+ @src, @errors = nil, []
41
13
  end
42
14
 
43
15
  # Returns an error message listing validation errors (or +nil+ if there were none).
44
16
  def to_s
45
17
  return nil unless @errors
46
- "#{self.class.name} validation failed:\n" + @errors.map { |e| " #{e.to_s}" }.join("\n")
18
+ "#{self.class.name} validation failed:\n" +
19
+ @errors.map { |e| " #{e.to_s}" }.join("\n")
20
+ end
21
+
22
+ def validate( src, &blk )
23
+ @src = src
24
+ content = case src
25
+ when Pathname then IO.read src
26
+ when IO then src.read
27
+ else src
28
+ end
29
+ validate! content, &blk
47
30
  end
48
31
 
49
32
  protected
50
- # Register a derived class as a validator for content of type +type+
51
- def self.validates( type )
52
- AssertValidContent.validators[type] << self
33
+ def validate!( content, &blk )
34
+ raise NotImplementedError
35
+ end
36
+ end
37
+
38
+ module Assertions
39
+ def assert_valid_content ( vclass, *args, &blk )
40
+ opts = (Hash === args.last) ? args.pop : {}
41
+ if args.empty?
42
+ if defined? RAILS_ROOT
43
+ args = [ @controller.response.body ]
44
+ else
45
+ raise ArgumentError, 'wrong number of arguments (0 for 1 or more)'
46
+ end
47
+ end
48
+
49
+ validator = vclass.new opts
50
+ args.each do |src|
51
+ assert validator.validate( *args, &blk )
52
+ end
53
53
  end
54
54
  end
55
55
 
@@ -1,8 +1,8 @@
1
- require 'assert_valid_content/validator'
2
1
  require 'md5'
3
2
  require 'fileutils'
4
3
  require 'cgi'
5
4
  require 'net/http'
5
+ require 'libxml'
6
6
 
7
7
  # Validates using W3C Web Service(s)
8
8
  module AssertValidContent::W3C
@@ -12,13 +12,12 @@ Installed = ENV['NONET'].to_i.zero?
12
12
 
13
13
  # Validates via the W3C CSS validator service[http://jigsaw.w3.org/css-validator/]
14
14
  # (taken from assert-valid-asset[http://github.com/CodeMonkeySteve/assert-valid-asset]).
15
- class CSS < AssertValidContent::Validator
16
-
15
+ class CSSValidator < AssertValidContent::Validator
17
16
  SrvHost = ENV['CSS_VALIDATOR_HOST'] || 'jigsaw.w3.org'
18
17
  SrvPath = ENV['CSS_VALIDATOR_PATH'] || '/css-validator/validator'
19
18
  TempDir = File.join AssertValidContent::TempDir, 'w3c-net'
20
19
 
21
- def validate( content ) #:nodoc:
20
+ def validate!( content ) #:nodoc:
22
21
  FileUtils.mkdir_p TempDir
23
22
 
24
23
  md5 = MD5.md5( content ).to_s
@@ -42,13 +41,13 @@ class CSS < AssertValidContent::Validator
42
41
  File.open( resp_path, 'w+' ) { |f| f.write resp }
43
42
  end
44
43
 
45
- begin
46
- root = REXML::Document.new( resp ).root
47
- REXML::XPath.each( root, "//x:tr[@class='error']", { "x"=>"http://www.w3.org/1999/xhtml" } ) do |el|
48
- @errors << "Invalid CSS: line" + el.to_s.gsub(/<[^>]+>/,' ').gsub(/\n/,' ').gsub(/\s+/, ' ')
49
- end
50
- rescue REXML::ParseException
44
+ doc = LibXML::XML::HTMLParser.string(resp).parse
45
+ doc.find("//tr[@class='error']").each do |err|
46
+ lineno = err.find_first("td[@class='linenumber']/text()").content.to_i
47
+ msg = err.find_first("td[@class='parse-error']/text()").content.strip
48
+ @errors << "Invalid CSS (#{@src.inspect} line #{lineno}: #{msg}"
51
49
  end
50
+ @errors.empty?
52
51
  end
53
52
 
54
53
  def text_to_multipart(key,value) #:nodoc:
@@ -67,7 +66,12 @@ class CSS < AssertValidContent::Validator
67
66
  Net::HTTP
68
67
  end
69
68
  end
69
+ end
70
70
 
71
+ module Assertions
72
+ def assert_valid_css( *srcs, &blk )
73
+ assert_valid_content ::AssertValidContent::W3C::CSSValidator, *srcs, &blk
74
+ end
71
75
  end
72
76
 
73
77
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: CodeMonkeySteve-assert_valid_content
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.1"
4
+ version: "0.2"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Sloan
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-01 00:00:00 -07:00
12
+ date: 2009-06-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -22,6 +22,16 @@ dependencies:
22
22
  - !ruby/object:Gem::Version
23
23
  version: "0"
24
24
  version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: ruby-libxml
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
25
35
  description: Provides test assertions for the validity of various content types (i.e. HTML, XML CSS, etc).
26
36
  email: steve@finagle.org
27
37
  executables: []
@@ -35,7 +45,6 @@ files:
35
45
  - MIT-LICENSE
36
46
  - lib/assert_valid_content.rb
37
47
  - lib/assert_valid_content/validator.rb
38
- - lib/assert_valid_content/assertions.rb
39
48
  - lib/assert_valid_content/libxml.rb
40
49
  - lib/assert_valid_content/w3c-net.rb
41
50
  has_rdoc: true
@@ -1,64 +0,0 @@
1
- require 'assert_valid_content/validator'
2
-
3
- module AssertValidContent
4
-
5
- # Test case assertions
6
- module Assertions
7
-
8
- # Asserts that the content (from one ore more +srcs+) is valid for type +type+.
9
- # Each of +srcs+ is one of +String+, +Pathname+, or +IO+ object.
10
- def assert_valid_content( type, *srcs )
11
- msg = nil
12
- for src in srcs
13
- res = AssertValidContent.valid_content?(type, src) { |val| msg = val.to_s }
14
- assert_block( msg ) { res }
15
- end
16
- end
17
-
18
- alias_method :orig_method_missing, :method_missing #:nodoc:
19
-
20
- # Implements the +assert_valid_TYPE+(*+srcs+) dynamic assertions, where +TYPE+ is a MIME type name
21
- # (e.g. +html+, +css+, etc.) and each of +srcs+ one of +String+, +Pathname+, or +IO+ object.
22
- def method_missing( name, *args )
23
- n = name.to_s
24
- return orig_method_missing( name, *args ) unless
25
- (n[0..12] == 'assert_valid_') and (type = Mime::Type.lookup_by_extension n[13..-1])
26
-
27
- if args.empty? and self.respond_to?(:response) and self.response.respond_to(:body)
28
- args = [ self.response.body ]
29
- end
30
-
31
- assert_valid_content type, *args
32
- end
33
-
34
- module ClassMethods
35
- alias_method :orig_method_missing, :method_missing #:nodoc:
36
-
37
- # Implements the class-level +assert_valid_TYPE+(*+srcs+) dynamic assertions. See Assertions.method_missing.
38
- def method_missing( name, *args )
39
- n = name.to_s
40
- return orig_method_missing( name, *args ) unless
41
- (n[0..12] == 'assert_valid_') and (type = Mime::Type.lookup_by_extension n[13..-1])
42
-
43
- self.assert_valid_static_content << [ type, *args ]
44
- end
45
-
46
- def assert_valid_static_content #:nodoc:
47
- @assert_valid_static_content ||= []
48
- end
49
- end
50
-
51
- def self.included( base ) #:nodoc:
52
- base.extend Assertions::ClassMethods
53
- end
54
-
55
- # Executes class-level assertions (i.e. static content).
56
- def test__assert_valid_static_content #:nodoc:
57
- for args in self.class.assert_valid_static_content
58
- assert_valid_content *args
59
- end
60
- end
61
-
62
- end
63
-
64
- end