jakewendt-html_test 0.2.3 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 381eba33dcd5526ed109a48740e5729f6e273013
4
+ data.tar.gz: ddcda1e319cd7f54b0a51c60e053617aa140cc67
5
+ SHA512:
6
+ metadata.gz: 0df2dfc51a4aa429ce69624b784a52dc682d9db6da72b13b920d8fda91a20dc7f71f05b3850b72a0358dc3d4f81a445dde3734c4b4092a0485bd76398ee0d3d2
7
+ data.tar.gz: 3124f0b840e5f1dc1ecfeba3b07eac4da04781fcf18759e6dfe42aa4531fc0f8314741f72eb36f1f18ff9220f46289dd0988b5557c6f8a82062a35872251677e
data/README.rdoc CHANGED
@@ -103,3 +103,40 @@ Peter Marklund (http://marklunds.com)
103
103
 
104
104
  == License
105
105
  Licensed under the same terms as Ruby on Rails.
106
+
107
+
108
+
109
+
110
+
111
+
112
+ == Gemified with Jeweler
113
+
114
+ vi Rakefile
115
+ rake version:write
116
+
117
+ rake version:bump:patch
118
+ rake version:bump:minor
119
+ rake version:bump:major
120
+
121
+ rake gemspec
122
+
123
+ rake install
124
+ rake release
125
+
126
+ == Testing
127
+
128
+ Since upgrading some apps to rails 3, I found that this gem has some issues.
129
+ So, I'm wrapping the repo code in a rails 3 app solely for testing.
130
+ During gem creation/installation only the necessary code will be included.
131
+
132
+ Features untested in rails 3 due to me not using them ...
133
+
134
+ * the tidy validator
135
+ * the check_urls option
136
+ * ActionController::Routing::Routes doesn't exist in Rails 3
137
+ * also note, Test::Unit::AssertionFailedError doesn't exist in Ruby 1.9
138
+ * replaced all with "MiniTest::Assertion"
139
+ * these assert_raises are wrapped around assertion that don't have a negative
140
+ * also, the gem now adds the Gemfile dependencies to it which isn't really true
141
+
142
+
data/Rakefile CHANGED
@@ -1,25 +1,35 @@
1
- require 'rake'
2
- require 'rake/testtask'
3
- require 'rake/rdoctask'
4
-
5
- desc 'Default: run unit tests.'
6
- task :default => :test
7
-
8
- desc 'Test the html_test plugin.'
9
- Rake::TestTask.new(:test) do |t|
10
- t.libs << 'lib'
11
- t.pattern = 'test/**/*_test.rb'
12
- t.verbose = true
13
- end
1
+ #!/usr/bin/env rake
2
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
3
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
14
4
 
15
- desc 'Generate documentation for the html_test plugin.'
16
- Rake::RDocTask.new(:rdoc) do |rdoc|
17
- rdoc.rdoc_dir = 'rdoc'
18
- rdoc.title = 'HtmlTest'
19
- rdoc.options << '--line-numbers' << '--inline-source'
20
- rdoc.rdoc_files.include('README')
21
- rdoc.rdoc_files.include('lib/**/*.rb')
22
- end
5
+ require File.expand_path('../config/application', __FILE__)
6
+
7
+ HtmlTest::Application.load_tasks
8
+
9
+ #require 'rake'
10
+ #require 'rake/testtask'
11
+ ##require 'rake/rdoctask'
12
+ #require 'rdoc/task'
13
+ #
14
+ #desc 'Default: run unit tests.'
15
+ #task :default => :test
16
+
17
+ #desc 'Test the html_test plugin.'
18
+ #Rake::TestTask.new(:test) do |t|
19
+ # t.libs << 'test'
20
+ # t.libs << 'lib'
21
+ # t.pattern = 'test/**/*_test.rb'
22
+ # t.verbose = true
23
+ #end
24
+
25
+ #desc 'Generate documentation for the html_test plugin.'
26
+ #Rake::RDocTask.new(:rdoc) do |rdoc|
27
+ # rdoc.rdoc_dir = 'rdoc'
28
+ # rdoc.title = 'HtmlTest'
29
+ # rdoc.options << '--line-numbers' << '--inline-source'
30
+ # rdoc.rdoc_files.include('README')
31
+ # rdoc.rdoc_files.include('lib/**/*.rb')
32
+ #end
23
33
 
24
34
  begin
25
35
  require 'jeweler'
@@ -27,12 +37,25 @@ begin
27
37
  gem.name = "jakewendt-html_test"
28
38
  gem.summary = %Q{Ruby on Rails plugin for HTML validation and link checking}
29
39
  gem.description = %Q{Ruby on Rails plugin for HTML validation and link checking}
30
- gem.email = "github@jake.otherinbox.com"
40
+ gem.email = "github@jakewendt.com"
31
41
  gem.homepage = "http://github.com/jakewendt/html_test"
32
42
  gem.authors = ["Peter Marklund", "George 'Jake' Wendt"]
33
43
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
44
+
45
+ gem.files = FileList['**/*']
46
+ gem.files -= FileList['app/**/*']
47
+ gem.files -= FileList['config/**/*']
48
+ gem.files -= FileList['test/**/*']
49
+ gem.files -= FileList['log/**/*']
50
+ gem.files -= FileList['pkg/**/*']
51
+ gem.files -= FileList['**/versions/**/*']
52
+ gem.files -= FileList['*Gemfile*']
53
+ gem.files -= FileList['rails/init.rb*']
54
+ gem.files -= FileList['coverage/**/*']
34
55
  end
35
56
  Jeweler::GemcutterTasks.new
36
57
  rescue LoadError
37
58
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
38
59
  end
60
+
61
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.3
1
+ 0.3.5
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{jakewendt-html_test}
8
- s.version = "0.2.3"
7
+ s.name = "jakewendt-html_test"
8
+ s.version = "0.3.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Peter Marklund", "George 'Jake' Wendt"]
12
- s.date = %q{2011-08-10}
13
- s.description = %q{Ruby on Rails plugin for HTML validation and link checking}
14
- s.email = %q{github@jake.otherinbox.com}
12
+ s.date = "2013-12-04"
13
+ s.description = "Ruby on Rails plugin for HTML validation and link checking"
14
+ s.email = "github@jakewendt.com"
15
15
  s.extra_rdoc_files = [
16
16
  "README.rdoc"
17
17
  ]
@@ -36,33 +36,12 @@ Gem::Specification.new do |s|
36
36
  "lib/url_selector.rb",
37
37
  "lib/validate_filter.rb",
38
38
  "lib/validator.rb",
39
- "rails/init.rb",
40
- "script/validate",
41
- "test/controller_test.rb",
42
- "test/integration_test.rb",
43
- "test/invalid.html",
44
- "test/link_validator_test.rb",
45
- "test/public/image.jpg",
46
- "test/rhtml_template.rhtml",
47
- "test/rxml_template.rxml",
48
- "test/test_helper.rb",
49
- "test/untidy.html",
50
- "test/valid.html",
51
- "test/valid_links.html",
52
- "test/validate_all_test.rb"
39
+ "script/rails",
40
+ "script/validate"
53
41
  ]
54
- s.homepage = %q{http://github.com/jakewendt/html_test}
42
+ s.homepage = "http://github.com/jakewendt/html_test"
55
43
  s.require_paths = ["lib"]
56
- s.rubygems_version = %q{1.6.2}
57
- s.summary = %q{Ruby on Rails plugin for HTML validation and link checking}
58
-
59
- if s.respond_to? :specification_version then
60
- s.specification_version = 3
61
-
62
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
63
- else
64
- end
65
- else
66
- end
44
+ s.rubygems_version = "2.0.14"
45
+ s.summary = "Ruby on Rails plugin for HTML validation and link checking"
67
46
  end
68
47
 
data/lib/assertions.rb CHANGED
@@ -28,7 +28,9 @@ module Html
28
28
  assert_message = "Validator #{t} failed"
29
29
  assert_message << " for url #{url}" if url
30
30
  assert_message << " with message '#{error}'"
31
- Rails.logger.error(assert_message + " for response body:\n #{with_line_counts(body)}")
31
+
32
+ # Why would I want to print this in the log file???
33
+ # Rails.logger.error(assert_message + " for response body:\n #{with_line_counts(body)}")
32
34
  assert(error.nil?, assert_message)
33
35
  end
34
36
  end
@@ -42,7 +44,9 @@ module Html
42
44
  def with_line_counts(body)
43
45
  separator = ("-" * 40) + $/
44
46
  body_counts = separator.dup
45
- body.each_with_index do |line, i|
47
+ # string no longer responds to each_with_index in ruby 1.9.3
48
+ # body.each_with_index do |line, i|
49
+ body.split(/\n/).each_with_index do |line, i|
46
50
  body_counts << sprintf("%4u %s", i+1, line) # Right align line numbers
47
51
  end
48
52
  body_counts << separator
data/lib/html_test.rb CHANGED
@@ -1,4 +1,5 @@
1
- if !defined?(RAILS_ENV) || RAILS_ENV == 'test'
1
+ #if !defined?(RAILS_ENV) || RAILS_ENV == 'test'
2
+ if !defined?(RAILS_ENV) || RAILS_ENV == 'test' || Rails.env == 'test'
2
3
 
3
4
  %w(validator assertions url_selector url_checker link_validator validate_filter).each do |file|
4
5
  require File.join(File.dirname(__FILE__), file)
@@ -74,11 +75,15 @@ validators.each do |validator|
74
75
  end
75
76
 
76
77
  if validate
77
- ApplicationController.validate_all = true
78
+ # In Rails 3, ApplicationController not defined yet
79
+ # ApplicationController.validate_all = true
80
+ ActionController::Base.validate_all = true
78
81
  # default is :tidy, but it doesn't really validate.
79
82
  # I've purposely not closed tags and it doesn't complain.
80
83
  # :w3c is ridiculously slow! even when used locally
81
- ApplicationController.validators = [:w3c]
84
+ # ApplicationController.validators = [:w3c]
85
+ # In Rails 3, ApplicationController not defined yet
86
+ ActionController::Base.validators = [:w3c]
82
87
  #ApplicationController.validators = [:tidy, :w3c]
83
88
  Html::Test::Validator.verbose = false
84
89
  Html::Test::Validator.revalidate_all = true
@@ -90,7 +95,4 @@ else
90
95
  puts "NOT validating html at all"
91
96
  end
92
97
 
93
-
94
-
95
-
96
98
  end #if !defined?(RAILS_ENV) || RAILS_ENV == 'test'
data/lib/url_checker.rb CHANGED
@@ -1,142 +1,147 @@
1
1
  module Html
2
- module Test
3
- class InvalidUrl < RuntimeError; end
4
-
5
- class UrlChecker
6
- attr_accessor :request, :response, :params
7
-
8
- include Html::Test::UrlSelector
9
-
10
- def initialize(controller)
11
- self.request = controller.request
12
- self.response = controller.response
13
- self.params = controller.params
14
- end
15
-
16
- def check_urls_resolve
17
- urls_to_check.each do |url|
18
- check_url_resolves(url)
19
- end
20
- end
21
-
22
- def check_redirects_resolve
23
- redirect_url = response.headers['Location']
24
- if response.status =~ /302/ && redirect_url.present?
25
- check_url_resolves(redirect_url)
26
- end
27
- end
28
-
29
- private
30
- def urls_to_check
31
- anchor_urls + image_urls + form_urls
32
- end
33
-
34
- def check_url_resolves(url)
35
- return if skip_url?(url, root_url) || external_http?(url, root_url)
36
- url = strip_anchor(remove_query(make_absolute(url)))
37
- return if public_file_exists?(url)
38
- check_action_exists(url)
39
- end
40
-
41
- def root_url
42
- request.protocol + request.host_with_port
43
- end
44
-
45
- def public_file_exists?(url)
46
- public_path = File.join(rails_public_path, url)
47
- File.exists?(public_path) || File.exists?(public_path + ".html")
48
- end
49
-
50
- def rails_public_path
51
- File.join(RAILS_ROOT, "public")
52
- end
53
-
54
- # Make URLs absolute paths, i.e. relative to the site root
55
- def make_absolute(url)
56
- url = remove_host(url) if has_protocol?(url)
57
- return url if url =~ %r{^/}
58
- current_url = request.request_uri || url_from_params
59
- current_url = File.dirname(current_url) if current_url !~ %r{/$}
60
- url = File.join(current_url, url)
61
- end
62
-
63
- def remove_host(url)
64
- url_no_host = url[%r{^[a-z]+://[^/]+(/.+)$}, 1]
65
- url_no_host.blank? ? "/" : url_no_host
66
- end
67
-
68
- def remove_query(url)
69
- url =~ /\?/ ? url[/^(.+?)\?/, 1] : url
70
- end
71
-
72
- def strip_anchor(url)
73
- url =~ /\#/ ? url[/^(.+?)\#/, 1] : url
74
- end
75
-
76
- # Each URL is required to have at least one HTTP method for which there is a route with an action
77
- def check_action_exists(url)
78
- unless routes_from_url(url).any? { |route| route_has_action?(route) }
79
- raise_invalid_url(url, "No action or template")
80
- end
81
- end
82
-
83
- def route_has_action?(route)
84
- controller = "#{route[:controller].camelize}Controller".constantize
85
- controller.public_instance_methods.include?(route[:action]) || template_file_exists?(route, controller)
86
- end
87
-
88
- def template_file_exists?(route, controller)
89
- # Workaround for Rails 1.2 that doesn't have the view_paths method
90
- template_dirs = controller.respond_to?(:view_paths) ?
91
- controller.view_paths : [controller.view_root]
92
- template_dirs.each do |template_dir|
93
- template_file = File.join(template_dir, controller.controller_path, "#{route[:action]}.*")
94
- return true if !Dir.glob(template_file).empty?
95
- end
96
- false
97
- end
98
-
99
- # This is a special case where on my site I had a catch all route for 404s. If you have
100
- # such a route, you can override this method and check for it, i.e. you could do something
101
- # like this:
102
- #
103
- # if params[:action] == "rescue_404"
104
- # raise Html::Test::InvalidUrl.new("Action rescue_404 invoked for url '#{url}'")
105
- # end
106
- def check_not_404(url, params)
107
- # This method is unimplemented by default
108
- end
109
-
110
- def routes_from_url(url)
111
- routes = [:get, :post, :put, :delete].map do |method|
112
- begin
113
- # Need to specify the method here for RESTful resource routes to work, i.e.
114
- # for /posts/1 to be recognized as the show action etc.
115
- params = ::ActionController::Routing::Routes.recognize_path(url, {:method => method})
116
- check_not_404(url, params)
117
- params
118
- rescue
119
- # Could not find a route with that method
120
- nil
121
- end
122
- end.compact
123
- routes.present? ? routes : raise_invalid_url(url, "Cannot find a route")
124
- end
125
-
126
- def url_from_params(options = params)
127
- return "/" if params.empty?
128
- options[:controller] ||= params[:controller]
129
- ::ActionController::Routing::Routes.generate_extras(symbolize_hash(options))[0]
130
- end
131
-
132
- # Convert all keys in the hash to symbols. Not sure why this is needed.
133
- def symbolize_hash(hash)
134
- hash.keys.inject({}) { |h, k| h[k.to_sym] = hash[k]; h }
135
- end
136
-
137
- def raise_invalid_url(url, message)
138
- raise(Html::Test::InvalidUrl.new("#{message} for url '#{url}' request_uri='#{request.request_uri}' body='#{response.body}'"))
139
- end
140
- end
141
- end
142
- end
2
+ module Test
3
+ class InvalidUrl < RuntimeError; end
4
+
5
+ class UrlChecker
6
+ attr_accessor :request, :response, :params
7
+
8
+ include Html::Test::UrlSelector
9
+
10
+ def initialize(controller)
11
+ self.request = controller.request
12
+ self.response = controller.response
13
+ self.params = controller.params
14
+ end
15
+
16
+ def check_urls_resolve
17
+ urls_to_check.each do |url|
18
+ check_url_resolves(url)
19
+ end
20
+ end
21
+
22
+ def check_redirects_resolve
23
+ redirect_url = response.headers['Location']
24
+ if response.status =~ /302/ && redirect_url.present?
25
+ check_url_resolves(redirect_url)
26
+ end
27
+ end
28
+
29
+ private
30
+ def urls_to_check
31
+ anchor_urls + image_urls + form_urls
32
+ end
33
+
34
+ def check_url_resolves(url)
35
+ return if skip_url?(url, root_url) || external_http?(url, root_url)
36
+ url = strip_anchor(remove_query(make_absolute(url)))
37
+ return if public_file_exists?(url)
38
+ check_action_exists(url)
39
+ end
40
+
41
+ def root_url
42
+ request.protocol + request.host_with_port
43
+ end
44
+
45
+ def public_file_exists?(url)
46
+ public_path = File.join(rails_public_path, url)
47
+ File.exists?(public_path) || File.exists?(public_path + ".html")
48
+ end
49
+
50
+ def rails_public_path
51
+ File.join(Rails.root, "public")
52
+ end
53
+
54
+ # Make URLs absolute paths, i.e. relative to the site root
55
+ def make_absolute(url)
56
+ url = remove_host(url) if has_protocol?(url)
57
+ return url if url =~ %r{^/}
58
+ current_url = request.url || url_from_params
59
+ current_url = File.dirname(current_url) if current_url !~ %r{/$}
60
+ url = File.join(current_url, url)
61
+ end
62
+
63
+ def remove_host(url)
64
+ url_no_host = url[%r{^[a-z]+://[^/]+(/.+)$}, 1]
65
+ url_no_host.blank? ? "/" : url_no_host
66
+ end
67
+
68
+ def remove_query(url)
69
+ url =~ /\?/ ? url[/^(.+?)\?/, 1] : url
70
+ end
71
+
72
+ def strip_anchor(url)
73
+ url =~ /\#/ ? url[/^(.+?)\#/, 1] : url
74
+ end
75
+
76
+ # Each URL is required to have at least one HTTP method for which there is a route with an action
77
+ def check_action_exists(url)
78
+ unless routes_from_url(url).any? { |route| route_has_action?(route) }
79
+ raise_invalid_url(url, "No action or template")
80
+ end
81
+ end
82
+
83
+ def route_has_action?(route)
84
+ controller = "#{route[:controller].camelize}Controller".constantize
85
+ controller.public_instance_methods.include?(route[:action]) || template_file_exists?(route, controller)
86
+ end
87
+
88
+ def template_file_exists?(route, controller)
89
+ # Workaround for Rails 1.2 that doesn't have the view_paths method
90
+ template_dirs = controller.respond_to?(:view_paths) ?
91
+ controller.view_paths : [controller.view_root]
92
+ template_dirs.each do |template_dir|
93
+ template_file = File.join(template_dir, controller.controller_path, "#{route[:action]}.*")
94
+ return true if !Dir.glob(template_file).empty?
95
+ end
96
+ false
97
+ end
98
+
99
+ # This is a special case where on my site I had a catch all route for 404s. If you have
100
+ # such a route, you can override this method and check for it, i.e. you could do something
101
+ # like this:
102
+ #
103
+ # if params[:action] == "rescue_404"
104
+ # raise Html::Test::InvalidUrl.new("Action rescue_404 invoked for url '#{url}'")
105
+ # end
106
+ def check_not_404(url, params)
107
+ # This method is unimplemented by default
108
+ end
109
+
110
+ def routes_from_url(url)
111
+ routes = [:get, :post, :put, :delete].map do |method|
112
+ begin
113
+ # Need to specify the method here for RESTful resource routes to work, i.e.
114
+ # for /posts/1 to be recognized as the show action etc.
115
+
116
+
117
+ # ActionController::Routing::Routes does not exist in Rails 3!
118
+ # fortunately, I don't use "check_urls" so not an issue right now.
119
+
120
+ params = ::ActionController::Routing::Routes.recognize_path(url, {:method => method})
121
+ check_not_404(url, params)
122
+ params
123
+ rescue
124
+ # Could not find a route with that method
125
+ nil
126
+ end
127
+ end.compact
128
+ routes.present? ? routes : raise_invalid_url(url, "Cannot find a route")
129
+ end
130
+
131
+ def url_from_params(options = params)
132
+ return "/" if params.empty?
133
+ options[:controller] ||= params[:controller]
134
+ ::ActionController::Routing::Routes.generate_extras(symbolize_hash(options))[0]
135
+ end
136
+
137
+ # Convert all keys in the hash to symbols. Not sure why this is needed.
138
+ def symbolize_hash(hash)
139
+ hash.keys.inject({}) { |h, k| h[k.to_sym] = hash[k]; h }
140
+ end
141
+
142
+ def raise_invalid_url(url, message)
143
+ raise(Html::Test::InvalidUrl.new("#{message} for url '#{url}' request_uri='#{request.url}' body='#{response.body}'"))
144
+ end
145
+ end
146
+ end
147
+ end
@@ -14,7 +14,9 @@ module Html
14
14
  end
15
15
 
16
16
  def validate_page
17
- url = request.request_uri
17
+ # url = request.request_uri
18
+ # no more request_uri in Rails 3
19
+ url = request.url
18
20
  return if (!should_validate? || ValidateFilter.already_validated?(url))
19
21
  # assert_validates(validators, response.body.strip, url, :verbose => true)
20
22
  assert_validates(validators, response.body.strip, url )
@@ -39,8 +41,13 @@ module Html
39
41
 
40
42
  # Override this method if you only want to validate a subset of pages
41
43
  def should_validate?
42
- response.status =~ /200/ &&
43
- (response.headers['Content-Type'] =~ /text\/html/i || response.body =~ /<html/)
44
+ # response.status =~ /200/ &&
45
+ # (response.headers['Content-Type'] =~ /text\/html/i || response.body =~ /<html/)
46
+ # In rails 3,
47
+ # response.status is a Fixnum which would return nil in this match
48
+ # and response.headers['Content-Type'] is blank
49
+ response.status.to_s =~ /200/ &&
50
+ (response.content_type =~ /text\/html/i || response.body =~ /<html/)
44
51
  end
45
52
 
46
53
  # Used in testing (of html_test_extension plugin)
data/lib/validator.rb CHANGED
@@ -57,7 +57,13 @@ module Html
57
57
  # Reference in the stylesheets
58
58
  response.body.sub!(%r{@import "./base.css"}, %Q{@import "#{File.dirname(w3c_url)}/base.css"})
59
59
  response_file = find_unique_path(File.join(tmp_dir, "w3c_response.html"))
60
- open(response_file, "w") { |f| f.puts(response.body) }
60
+
61
+ # open(response_file, "w" ) { |f| f.puts(response.body) }
62
+ # I was getting many errors like ... (in ruby 1.9.3 and rails 3)
63
+ # Encoding::UndefinedConversionError: "\xE2" from ASCII-8BIT to UTF-8
64
+ # adding force_encoding('UTF-8') seems to fix this.
65
+ open(response_file, "w" ) { |f| f.puts(response.body.force_encoding('UTF-8')) }
66
+
61
67
  "W3C status #{status}. Response from W3C was written to the file #{response_file}"
62
68
  else
63
69
  nil
data/script/rails ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
metadata CHANGED
@@ -1,34 +1,23 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: jakewendt-html_test
3
- version: !ruby/object:Gem::Version
4
- hash: 17
5
- prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 3
10
- version: 0.2.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.5
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Peter Marklund
14
8
  - George 'Jake' Wendt
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2011-08-10 00:00:00 -07:00
20
- default_executable:
12
+ date: 2013-12-04 00:00:00.000000000 Z
21
13
  dependencies: []
22
-
23
14
  description: Ruby on Rails plugin for HTML validation and link checking
24
- email: github@jake.otherinbox.com
15
+ email: github@jakewendt.com
25
16
  executables: []
26
-
27
17
  extensions: []
28
-
29
- extra_rdoc_files:
18
+ extra_rdoc_files:
30
19
  - README.rdoc
31
- files:
20
+ files:
32
21
  - README.rdoc
33
22
  - Rakefile
34
23
  - VERSION
@@ -49,53 +38,29 @@ files:
49
38
  - lib/url_selector.rb
50
39
  - lib/validate_filter.rb
51
40
  - lib/validator.rb
52
- - rails/init.rb
41
+ - script/rails
53
42
  - script/validate
54
- - test/controller_test.rb
55
- - test/integration_test.rb
56
- - test/invalid.html
57
- - test/link_validator_test.rb
58
- - test/public/image.jpg
59
- - test/rhtml_template.rhtml
60
- - test/rxml_template.rxml
61
- - test/test_helper.rb
62
- - test/untidy.html
63
- - test/valid.html
64
- - test/valid_links.html
65
- - test/validate_all_test.rb
66
- has_rdoc: true
67
43
  homepage: http://github.com/jakewendt/html_test
68
44
  licenses: []
69
-
45
+ metadata: {}
70
46
  post_install_message:
71
47
  rdoc_options: []
72
-
73
- require_paths:
48
+ require_paths:
74
49
  - lib
75
- required_ruby_version: !ruby/object:Gem::Requirement
76
- none: false
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- hash: 3
81
- segments:
82
- - 0
83
- version: "0"
84
- required_rubygems_version: !ruby/object:Gem::Requirement
85
- none: false
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- hash: 3
90
- segments:
91
- - 0
92
- version: "0"
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
93
60
  requirements: []
94
-
95
61
  rubyforge_project:
96
- rubygems_version: 1.6.2
62
+ rubygems_version: 2.0.14
97
63
  signing_key:
98
- specification_version: 3
64
+ specification_version: 4
99
65
  summary: Ruby on Rails plugin for HTML validation and link checking
100
66
  test_files: []
101
-
data/rails/init.rb DELETED
@@ -1 +0,0 @@
1
- require 'jakewendt-html_test' if RAILS_ENV == 'test'
@@ -1,120 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "..", "..", "..", "..", "test", "test_helper")
2
- require File.join(File.dirname(__FILE__), "test_helper")
3
-
4
- ActionController::Routing::Routes.draw do |map|
5
- map.connect 'test/:action', :controller => 'test'
6
- end
7
-
8
- class Html::Test::ControllerTest < ActionController::TestCase
9
- def setup
10
- @controller = TestController.new
11
- @request = ActionController::TestRequest.new
12
- @response = ActionController::TestResponse.new
13
-
14
- ActionController::Base.validate_all = false
15
- ActionController::Base.check_urls = true
16
- ActionController::Base.check_redirects = true
17
- Html::Test::Validator.tidy_ignore_list = []
18
- Html::Test::UrlChecker.any_instance.stubs(:rails_public_path).returns(File.join(File.dirname(__FILE__), "public"))
19
- end
20
-
21
- def test_assert_validates_success
22
- get :valid
23
- assert_response :success
24
- assert_validates # Should validate tidy, w3c, and xmllint
25
- end
26
-
27
- def test_assert_tidy_failure
28
- get :untidy
29
- assert_response :success
30
- assert_raise(Test::Unit::AssertionFailedError) do
31
- assert_tidy
32
- end
33
- assert_w3c
34
- assert_xmllint
35
- end
36
-
37
- def test_assert_w3c_failure
38
- get :invalid
39
- assert_response :success
40
- assert_raise(Test::Unit::AssertionFailedError) do
41
- assert_w3c
42
- end
43
- assert_raise(Test::Unit::AssertionFailedError) do
44
- assert_xmllint
45
- end
46
- assert_tidy
47
- end
48
-
49
- def test_url_no_route
50
- assert_raise(Html::Test::InvalidUrl) do
51
- get :url_no_route
52
- end
53
- end
54
-
55
- def test_url_no_action
56
- assert_raise(Html::Test::InvalidUrl) do
57
- get :url_no_action
58
- end
59
- end
60
-
61
- # TODO: figure out why those tests don't work
62
- # def test_url_rhtml_template_exists
63
- # get :rhtml_template
64
- # end
65
-
66
- # def test_url_rxml_template_exists
67
- # get :rxml_template
68
- # end
69
-
70
- def test_url_action_no_template
71
- get :action_no_template
72
- end
73
-
74
- def test_redirect_no_action
75
- assert_raise(Html::Test::InvalidUrl) do
76
- get :redirect_no_action
77
- end
78
- end
79
-
80
- def test_redirect_valid_action
81
- get :redirect_valid_action
82
- assert_response :redirect
83
- end
84
-
85
- def test_redirect_external
86
- get :redirect_external
87
- assert_response :redirect
88
- end
89
-
90
- def test_redirect_valid_with_host
91
- get :redirect_valid_with_host
92
- assert_response :redirect
93
- end
94
-
95
- def test_image_file_exists
96
- get :image_file_exists
97
- assert_response :success
98
- end
99
-
100
- def test_image_does_not_exist
101
- assert_raise(Html::Test::InvalidUrl) do
102
- get :image_file_does_not_exist
103
- end
104
- end
105
-
106
- def test_urls_to_resolve
107
- checker = Html::Test::UrlChecker.new(@controller)
108
- checker.stubs(:response_body).returns(<<-HTML
109
- <a href="anchor_url">hej</a>
110
- Some text and <div>markup</div>
111
- <img src="image_url"/>
112
- Some more text
113
- <form action="form_url">
114
- Some text
115
- </form>
116
- HTML
117
- )
118
- assert_equal(%w(anchor_url form_url image_url), checker.send(:urls_to_check).sort)
119
- end
120
- end
@@ -1,73 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "..", "..", "..", "..", "test", "test_helper")
2
- require File.join(File.dirname(__FILE__), "test_helper")
3
-
4
- ActionController::Routing::Routes.draw do |map|
5
- map.connect 'test/:action', :controller => 'test'
6
- end
7
- ApplicationController.validate_all = false
8
- ApplicationController.check_urls = true
9
- ApplicationController.check_redirects = true
10
-
11
- class Html::Test::IntegrationTest < ActionController::IntegrationTest
12
- def test_assert_valides_invokes_all
13
- get('/test/valid')
14
- assert_response :success
15
-
16
- [:tidy_errors, :w3c_errors, :xmllint_errors].each do |method|
17
- Html::Test::Validator.expects(method).with(@response.body)
18
- end
19
- assert_validates
20
- end
21
-
22
- def test_assert_tidy_invoked
23
- get('/test/valid')
24
- assert_response :success
25
- Html::Test::Validator.expects(:tidy_errors).with(@response.body)
26
- assert_tidy
27
- end
28
-
29
- def test_assert_valid_success
30
- get('/test/valid')
31
- assert_response :success
32
- assert_validates
33
- end
34
-
35
- def test_assert_tidy_failure
36
- file_string = TestController.test_file_string(:untidy)
37
- assert_raise(Test::Unit::AssertionFailedError) do
38
- assert_tidy(file_string)
39
- end
40
- assert_w3c(file_string)
41
- assert_xmllint(file_string)
42
- end
43
-
44
- def test_assert_w3c_failure
45
- file_string = TestController.test_file_string(:invalid)
46
- assert_raise(Test::Unit::AssertionFailedError) do
47
- assert_w3c(file_string)
48
- end
49
- assert_raise(Test::Unit::AssertionFailedError) do
50
- assert_xmllint(file_string)
51
- end
52
- assert_raise(Test::Unit::AssertionFailedError) do
53
- Html::Test::Validator.expects(:dtd).returns("doctype")
54
- assert_xmllint(file_string)
55
- end
56
- assert_tidy(file_string)
57
- end
58
-
59
- def test_url_no_route
60
- TestController.any_instance.expects(:rescue_action).with() { |e| e.class == Html::Test::InvalidUrl }
61
- get '/test/url_no_route'
62
- end
63
-
64
- def test_url_no_route_relative
65
- TestController.any_instance.expects(:rescue_action).with() { |e| e.class == Html::Test::InvalidUrl }
66
- get '/test/url_no_route_relative'
67
- end
68
-
69
- def test_redirect_valid_action
70
- get '/test/redirect_valid_action'
71
- assert_response :redirect
72
- end
73
- end
data/test/invalid.html DELETED
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <html>
4
- <head>
5
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6
- <title>A perfectly invalid document</title>
7
- </head>
8
- <body>
9
- <h1>This is a perfectly invalid XHTML 1 document</h1>
10
-
11
- Here are some unquoted chars: <>
12
-
13
- Tidy may not complain about this document, but that's just crazy.
14
- </body>
15
- </html>
@@ -1,141 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "..", "..", "..", "..", "test", "test_helper")
2
- require File.join(File.dirname(__FILE__), "test_helper")
3
- require 'ostruct'
4
-
5
- # Stub out the HTTP requests
6
- module Net
7
- class HTTP
8
- @@test_requests = []
9
- cattr_accessor :test_requests
10
-
11
- @@test_with_links = false
12
- cattr_accessor :test_with_links
13
-
14
- def self.get_response(uri)
15
- self.test_requests << uri.to_s
16
-
17
- if uri.path =~ /valid_links/ or test_with_links
18
- file = :valid_links
19
- else
20
- file = :valid
21
- end
22
- test_with_links = false
23
- return OpenStruct.new({
24
- :body => TestController.test_file_string(file),
25
- :code => "200",
26
- :header => {'content-type' => 'text/html'}
27
- })
28
- end
29
- end
30
- end
31
-
32
- class Html::Test::LinkValidatorTest < Test::Unit::TestCase
33
- def setup
34
- Net::HTTP.test_requests = []
35
- end
36
-
37
- def test_parse_command_line
38
- # Missing URL
39
- assert_raise(RuntimeError) { Html::Test::LinkValidator.parse_command_line(["--no-follow"]) }
40
-
41
- # Missing skip patterns
42
- options_no_skip = ["http://my.url.com", "--no-follow", "--validators", "w3c,tidy,xmllint",
43
- "--no-external", "--dtd", "some.dtd", "--only", "some/url", "--skip"]
44
- assert_raise(OptionParser::MissingArgument) do
45
- Html::Test::LinkValidator.parse_command_line(options_no_skip.dup)
46
- end
47
-
48
- # All options - valid
49
- assert_equal({
50
- :follow_links => false,
51
- :validators => ["w3c", "tidy", "xmllint"],
52
- :follow_external => false,
53
- :dtd => "some.dtd",
54
- :only_pattern => Regexp.new("some/url"),
55
- :skip_patterns => [/pattern1/, /pattern2/]
56
- }, Html::Test::LinkValidator.parse_command_line(options_no_skip << "pattern1,pattern2"))
57
- end
58
-
59
- def test_default_options
60
- url = "http://localhost:3000"
61
- validator = Html::Test::LinkValidator.new(url)
62
-
63
- assert_equal url, Net::HTTP.test_requests.first
64
- assert_equal 1, Net::HTTP.test_requests.size
65
-
66
- assert validator.options[:follow_links]
67
- assert_equal ['tidy'], validator.options[:validators]
68
- assert_equal [], validator.options[:skip_patterns]
69
- assert_nil validator.options[:only_pattern]
70
- assert validator.options[:follow_external]
71
- end
72
-
73
- def test_quiet
74
- validator = Html::Test::LinkValidator.new("http://my.cool.site", {:quiet => true})
75
- # Even in quiet mode the log should be populated
76
- assert_match /my\.cool\.site/, validator.log
77
- end
78
-
79
- def test_link_follow_page
80
- validator = Html::Test::LinkValidator.new("http://site.com/dir/valid_links")
81
- # All links visited
82
- assert_equal(["http://site.com/dir/valid_links",
83
- "http://site.com/link1",
84
- "http://site.com/dir/link2",
85
- "http://site.com/dir/foobar/link3",
86
- "http://foobar.com/external"].sort,
87
- Net::HTTP.test_requests.sort)
88
- end
89
-
90
- def test_link_follow_root
91
- %w(http://site.com http://site.com/).each do |url|
92
- Net::HTTP.test_requests = []
93
- Net::HTTP.test_with_links = true
94
- validator = Html::Test::LinkValidator.new(url)
95
- # All links visited
96
- assert_equal([url,
97
- "http://site.com/link1",
98
- "http://site.com/link2",
99
- "http://site.com/foobar/link3",
100
- "http://foobar.com/external"].sort,
101
- Net::HTTP.test_requests.sort)
102
- end
103
- end
104
-
105
- def test_link_follow_dir
106
- Net::HTTP.test_with_links = true
107
- validator = Html::Test::LinkValidator.new("http://site.com/dir/")
108
- # All links visited
109
- assert_equal(["http://site.com/dir/",
110
- "http://site.com/link1",
111
- "http://site.com/dir/link2",
112
- "http://site.com/dir/foobar/link3",
113
- "http://foobar.com/external"].sort,
114
- Net::HTTP.test_requests.sort)
115
- end
116
-
117
- def test_skip_patterns
118
- url = "http://my.cool.site/valid_links"
119
- validator = Html::Test::LinkValidator.new(url,
120
- {:skip_patterns => [/link[12]/, /http/]})
121
- assert_equal [url, "http://my.cool.site/foobar/link3"].sort,
122
- Net::HTTP.test_requests.sort
123
- end
124
-
125
- def test_only_pattern
126
- url = "http://my.cool.site/dir/valid_links"
127
- validator = Html::Test::LinkValidator.new(url, {:only_pattern => /link[12]/})
128
- assert_equal [url, "http://my.cool.site/link1", "http://my.cool.site/dir/link2"].sort,
129
- Net::HTTP.test_requests.sort
130
- end
131
-
132
- def test_follow_external_false
133
- Net::HTTP.test_with_links = true
134
- validator = Html::Test::LinkValidator.new("http://site.com/dir/", {:follow_external => false})
135
- assert_equal(["http://site.com/dir/",
136
- "http://site.com/link1",
137
- "http://site.com/dir/link2",
138
- "http://site.com/dir/foobar/link3"].sort,
139
- Net::HTTP.test_requests.sort)
140
- end
141
- end
File without changes
@@ -1 +0,0 @@
1
- Some contents
@@ -1,2 +0,0 @@
1
- xml.foo do
2
- end
data/test/test_helper.rb DELETED
@@ -1,61 +0,0 @@
1
- class TestController < ActionController::Base
2
- prepend_view_path(File.dirname(__FILE__))
3
-
4
- layout nil
5
- def valid; render :file => TestController.test_file(:valid) end
6
- def untidy; render :file => TestController.test_file(:untidy) end
7
- def invalid; render :file => TestController.test_file(:invalid) end
8
-
9
- def url_no_route
10
- render :text => %Q{<a href="/norouteforthisurl">No route</a>}
11
- end
12
-
13
- def url_no_route_relative
14
- render :text => %Q{<a href="norouteforthisurl">No route</a>}
15
- end
16
-
17
- def url_no_action
18
- render :text => %Q{<a href="/test/thisactiondoesnotexist">no action</a>}
19
- end
20
-
21
- def action_no_template
22
- render :text => %Q{<a href="/test/valid">valid</a>}
23
- end
24
-
25
- def redirect_no_action
26
- redirect_to :action => 'thisactiondoesnotexist'
27
- end
28
-
29
- def redirect_valid_action
30
- redirect_to :action => 'valid'
31
- end
32
-
33
- def redirect_external
34
- redirect_to "http://google.com/foobar"
35
- end
36
-
37
- def redirect_valid_with_host
38
- redirect_to "http://test.host/test/valid"
39
- end
40
-
41
- def image_file_exists
42
- render :text => %Q{<img src="/image.jpg?23049829034"/>}
43
- end
44
-
45
- def image_file_does_not_exist
46
- render :text => %Q{<img src="/image2.jpg?23049829034"/>}
47
- end
48
-
49
- def self.test_file(action)
50
- File.join(File.dirname(__FILE__), "#{action}.html")
51
- end
52
-
53
- def self.test_file_string(action)
54
- IO.read(test_file(action))
55
- end
56
-
57
- # Re-raise errors caught by the controller.
58
- def rescue_action(e)
59
- raise e
60
- end
61
- end
data/test/untidy.html DELETED
@@ -1,19 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
- <head>
5
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6
- <title>A perfectly valid untidy document</title>
7
- </head>
8
- <body>
9
- <h1>This is a perfectly valid but untidy XHTML 1 document</h1>
10
-
11
- <table>
12
- <tr>
13
- <td>
14
- A table with no summary attribute. Tidy will kill us for this.
15
- </td>
16
- </tr>
17
- </table>
18
- </body>
19
- </html>
data/test/valid.html DELETED
@@ -1,14 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
- <head>
5
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6
- <title>A perfectly valid document</title>
7
- </head>
8
- <body>
9
- <h1>This is a perfectly valid XHTML 1 document</h1>
10
- <p>
11
- Here is some text.
12
- </p>
13
- </body>
14
- </html>
@@ -1,22 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
- <head>
5
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6
- <title>A perfectly valid document</title>
7
- </head>
8
- <body>
9
- <h1>This is a perfectly valid XHTML 1 document</h1>
10
- <p>
11
- Here is some text.
12
- </p>
13
- <ul>
14
- <li><a href="/link1">Link 1</a></li>
15
- <li><a href="link2">Link 2</a></li>
16
- <li><a href="link2">Link 2</a></li>
17
- <li><a href="link2#comments">Link 2</a></li>
18
- <li><a href="foobar/link3">Link 3</a></li>
19
- <li><a href="http://foobar.com/external">External Link</a></li>
20
- </ul>
21
- </body>
22
- </html>
@@ -1,16 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "..", "..", "..", "..", "test", "test_helper")
2
- require File.join(File.dirname(__FILE__), "test_helper")
3
-
4
- class Html::Test::ValidateAllTest < ActionController::TestCase
5
- def setup
6
- @controller = TestController.new
7
- @request = ActionController::TestRequest.new
8
- @response = ActionController::TestResponse.new
9
- ApplicationController.validate_all = true
10
- ApplicationController.validators = [:tidy]
11
- end
12
-
13
- def test_validate_all
14
- assert_raise(Test::Unit::AssertionFailedError) { get :untidy }
15
- end
16
- end