ndd-url_checker 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +2 -1
  4. data/Gemfile.lock +57 -44
  5. data/README.md +5 -2
  6. data/VERSION +1 -1
  7. data/lib/ndd/url_checker.rb +2 -0
  8. data/lib/ndd/url_checker/blocking_url_checker.rb +7 -4
  9. data/lib/ndd/url_checker/forked_url_checker.rb +4 -2
  10. data/lib/ndd/url_checker/reporting_url_checker.csv.erb +2 -2
  11. data/lib/ndd/url_checker/reporting_url_checker.html.erb +171 -80
  12. data/lib/ndd/url_checker/reporting_url_checker.json.erb +16 -9
  13. data/lib/ndd/url_checker/reporting_url_checker.rb +22 -11
  14. data/lib/ndd/url_checker/status.rb +1 -1
  15. data/lib/ndd/url_checker/status_decorator.rb +64 -0
  16. data/ndd-url_checker.gemspec +6 -4
  17. data/spec/ndd/url_checker/abstract_url_checker_spec.rb +1 -1
  18. data/spec/ndd/url_checker/blocking_url_checker_spec.rb +1 -1
  19. data/spec/ndd/url_checker/forked_url_checker_spec.rb +1 -1
  20. data/spec/ndd/url_checker/parallel_url_checker_spec.rb +1 -1
  21. data/spec/ndd/url_checker/reporting_url_checker/custom.txt.erb +2 -2
  22. data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.csv +5 -3
  23. data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.html +227 -92
  24. data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.json +29 -10
  25. data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.txt +12 -2
  26. data/spec/ndd/url_checker/reporting_url_checker/single_url.csv +1 -1
  27. data/spec/ndd/url_checker/reporting_url_checker/single_url.html +163 -78
  28. data/spec/ndd/url_checker/reporting_url_checker/single_url.json +14 -7
  29. data/spec/ndd/url_checker/reporting_url_checker_spec.rb +29 -12
  30. data/spec/ndd/url_checker/status_decorator_spec.rb +208 -0
  31. data/spec/ndd/url_checker/status_spec.rb +10 -10
  32. data/spec/ndd/url_checker/threaded_url_checker_spec.rb +1 -1
  33. data/spec/spec_helper.rb +1 -3
  34. data/spec/support/multiple_url_checker_spec.rb +4 -4
  35. data/spec/support/single_url_checker_spec.rb +74 -21
  36. metadata +5 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ddb514dd4940f3ca4e1c12b26d11569a5d14196
4
- data.tar.gz: def79c9bdbfaa493381bcc6bce5e147363afba86
3
+ metadata.gz: 6e878e5f4aff0bed140d52f9e1c888d9c951fc95
4
+ data.tar.gz: 1e5754bb7e356951ab4798083eada1c2b227a2a1
5
5
  SHA512:
6
- metadata.gz: 46cc5e1d3a0442608626e1d86d7e77730b8a5f012781a7711fd7de39f88999e7d776137b9493dcc2117f28db7636b9f439a7c773fcc383c6b5f50e40bdef6e10
7
- data.tar.gz: de7f6677ed2b53345150cbb1eb71cc8ee0608957bb28b31f273e43af58dd5b50a68b8794cfab2a48229bcec4f593f4ad297d82d740d50705d034b3337e5bdaa0
6
+ metadata.gz: 8e93630400c83f45833701355144aee71a907b78852bc2dde095efdc17598e621de1d19d5ffbf8e57cef66f1df289b4674e00e95ab155d7e79874cd8e585edd4
7
+ data.tar.gz: 2c7228f881743e6f8adc6bbd5f2908f1e0d8da0d05c69ffa9d000952c7618b89841e91740d52ffa436af64f39322b6e008250e67604ac6c9a11e28cefca2ead9
@@ -1 +1 @@
1
- ruby-2.1.5
1
+ ruby-2.2.2
@@ -1,7 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.0.0
4
- - 2.1.5
4
+ - 2.1.6
5
+ - 2.2.2
5
6
  before_install:
6
7
  - gem update --system
7
8
  - gem --version
@@ -1,14 +1,14 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- addressable (2.3.6)
4
+ addressable (2.3.8)
5
5
  builder (3.2.2)
6
6
  celluloid (0.16.0)
7
7
  timers (~> 4.0.0)
8
- childprocess (0.5.5)
8
+ childprocess (0.5.6)
9
9
  ffi (~> 1.0, >= 1.0.11)
10
10
  cod (0.6.0)
11
- codeclimate-test-reporter (0.4.3)
11
+ codeclimate-test-reporter (0.4.7)
12
12
  simplecov (>= 0.7.1, < 1.0.0)
13
13
  coderay (1.1.0)
14
14
  crack (0.4.2)
@@ -17,12 +17,12 @@ GEM
17
17
  thread_safe (~> 0.3, >= 0.3.1)
18
18
  diff-lcs (1.2.5)
19
19
  docile (1.1.5)
20
- faraday (0.9.0)
20
+ faraday (0.9.1)
21
21
  multipart-post (>= 1.2, < 3)
22
- ffi (1.9.6)
22
+ ffi (1.9.8)
23
23
  formatador (0.2.5)
24
- git (1.2.8)
25
- github_api (0.12.2)
24
+ git (1.2.9.1)
25
+ github_api (0.12.3)
26
26
  addressable (~> 2.3)
27
27
  descendants_tracker (~> 0.0.4)
28
28
  faraday (~> 0.8, < 0.10)
@@ -30,26 +30,31 @@ GEM
30
30
  multi_json (>= 1.7.5, < 2.0)
31
31
  nokogiri (~> 1.6.3)
32
32
  oauth2
33
- guard (2.8.2)
33
+ guard (2.12.6)
34
34
  formatador (>= 0.2.4)
35
35
  listen (~> 2.7)
36
36
  lumberjack (~> 1.0)
37
+ nenv (~> 0.1)
38
+ notiffany (~> 0.0)
37
39
  pry (>= 0.9.12)
40
+ shellany (~> 0.0)
38
41
  thor (>= 0.18.1)
39
- guard-bundler (2.0.0)
42
+ guard-bundler (2.1.0)
40
43
  bundler (~> 1.0)
41
44
  guard (~> 2.2)
42
- guard-compat (0.3.0)
43
- guard-rspec (4.4.2)
45
+ guard-compat (~> 1.1)
46
+ guard-compat (1.2.1)
47
+ guard-rspec (4.5.2)
44
48
  guard (~> 2.1)
45
- guard-compat (~> 0.1)
49
+ guard-compat (~> 1.1)
46
50
  rspec (>= 2.99.0, < 4.0)
47
- guard-spork (2.0.1)
51
+ guard-spork (2.1.0)
48
52
  childprocess (>= 0.2.3)
49
- guard (~> 2.8.2)
53
+ guard (~> 2.0)
54
+ guard-compat (~> 1.0)
50
55
  spork (>= 0.8.4)
51
- hashie (3.3.2)
52
- highline (1.6.21)
56
+ hashie (3.4.2)
57
+ highline (1.7.2)
53
58
  hitimes (1.2.2)
54
59
  jeweler (2.0.1)
55
60
  builder
@@ -60,12 +65,12 @@ GEM
60
65
  nokogiri (>= 1.5.10)
61
66
  rake
62
67
  rdoc
63
- json (1.8.1)
64
- jwt (1.2.0)
65
- libnotify (0.8.4)
68
+ json (1.8.3)
69
+ jwt (1.5.0)
70
+ libnotify (0.9.1)
66
71
  ffi (>= 1.0.11)
67
- listen (2.8.3)
68
- celluloid (>= 0.15.2)
72
+ listen (2.10.0)
73
+ celluloid (~> 0.16.0)
69
74
  rb-fsevent (>= 0.9.3)
70
75
  rb-inotify (>= 0.9)
71
76
  little-plugger (1.1.3)
@@ -74,12 +79,16 @@ GEM
74
79
  multi_json (>= 1.8.4)
75
80
  lumberjack (1.0.9)
76
81
  method_source (0.8.2)
77
- mini_portile (0.6.1)
78
- multi_json (1.10.1)
82
+ mini_portile (0.6.2)
83
+ multi_json (1.11.0)
79
84
  multi_xml (0.5.5)
80
85
  multipart-post (2.0.0)
81
- nokogiri (1.6.5)
86
+ nenv (0.2.0)
87
+ nokogiri (1.6.6.2)
82
88
  mini_portile (~> 0.6.0)
89
+ notiffany (0.0.6)
90
+ nenv (~> 0.1)
91
+ shellany (~> 0.0)
83
92
  oauth2 (1.0.0)
84
93
  faraday (>= 0.8, < 0.10)
85
94
  jwt (~> 1.0)
@@ -90,40 +99,41 @@ GEM
90
99
  coderay (~> 1.1.0)
91
100
  method_source (~> 0.8.1)
92
101
  slop (~> 3.4)
93
- rack (1.5.2)
102
+ rack (1.6.1)
94
103
  rake (10.4.2)
95
- rb-fsevent (0.9.4)
104
+ rb-fsevent (0.9.5)
96
105
  rb-inotify (0.9.5)
97
106
  ffi (>= 0.5.0)
98
107
  rdoc (4.2.0)
99
- json (~> 1.4)
100
- rspec (3.1.0)
101
- rspec-core (~> 3.1.0)
102
- rspec-expectations (~> 3.1.0)
103
- rspec-mocks (~> 3.1.0)
108
+ rspec (3.2.0)
109
+ rspec-core (~> 3.2.0)
110
+ rspec-expectations (~> 3.2.0)
111
+ rspec-mocks (~> 3.2.0)
104
112
  rspec-collection_matchers (1.1.2)
105
113
  rspec-expectations (>= 2.99.0.beta1)
106
- rspec-core (3.1.7)
107
- rspec-support (~> 3.1.0)
108
- rspec-expectations (3.1.2)
114
+ rspec-core (3.2.3)
115
+ rspec-support (~> 3.2.0)
116
+ rspec-expectations (3.2.1)
109
117
  diff-lcs (>= 1.2.0, < 2.0)
110
- rspec-support (~> 3.1.0)
111
- rspec-mocks (3.1.3)
112
- rspec-support (~> 3.1.0)
113
- rspec-support (3.1.2)
118
+ rspec-support (~> 3.2.0)
119
+ rspec-mocks (3.2.1)
120
+ diff-lcs (>= 1.2.0, < 2.0)
121
+ rspec-support (~> 3.2.0)
122
+ rspec-support (3.2.2)
114
123
  safe_yaml (1.0.4)
115
- simplecov (0.9.1)
124
+ shellany (0.0.1)
125
+ simplecov (0.10.0)
116
126
  docile (~> 1.1.0)
117
- multi_json (~> 1.0)
118
- simplecov-html (~> 0.8.0)
119
- simplecov-html (0.8.0)
127
+ json (~> 1.8)
128
+ simplecov-html (~> 0.10.0)
129
+ simplecov-html (0.10.0)
120
130
  slop (3.6.0)
121
131
  spork (0.9.2)
122
132
  thor (0.19.1)
123
- thread_safe (0.3.4)
133
+ thread_safe (0.3.5)
124
134
  timers (4.0.1)
125
135
  hitimes
126
- webmock (1.20.4)
136
+ webmock (1.21.0)
127
137
  addressable (>= 2.3.6)
128
138
  crack (>= 0.3.2)
129
139
  yard (0.8.7.6)
@@ -150,3 +160,6 @@ DEPENDENCIES
150
160
  spork (~> 0.9)
151
161
  webmock (~> 1.20)
152
162
  yard (~> 0.8)
163
+
164
+ BUNDLED WITH
165
+ 1.10.3
data/README.md CHANGED
@@ -14,7 +14,8 @@ The API documentation can be find at [RubyDoc](http://www.rubydoc.info/github/dd
14
14
  This gem requires Ruby 2.x and is tested with:
15
15
 
16
16
  - Ruby 2.0.0
17
- - Ruby 2.1.x
17
+ - Ruby 2.1.6
18
+ - Ruby 2.2.2
18
19
 
19
20
  ## Usage
20
21
 
@@ -64,12 +65,14 @@ checker.check('http://www.google.com/')
64
65
 
65
66
  ### ReportingUrlChecker
66
67
 
67
- For a nice looking report, use [`NDD::UrlChecker::ReportingUrlChecker`](http://www.rubydoc.info/github/ddidier/ndd-url_checker/NDD/UrlChecker/ReportingUrlChecker) which enables reporting capabilities using ERB templates. Several built-in templates are provided: CSV (planed), HTML and JSON (planed).
68
+ For a nice looking report, use [`NDD::UrlChecker::ReportingUrlChecker`](http://www.rubydoc.info/github/ddidier/ndd-url_checker/NDD/UrlChecker/ReportingUrlChecker) which enables reporting capabilities using ERB templates. Several built-in templates are provided: CSV, HTML and JSON.
68
69
 
69
70
  ```ruby
70
71
  checker = NDD::UrlChecker:: ReportingUrlChecker.new(delegate_checker)
71
72
  statuses = checker.check('http://www.invalid123456789.com/', 'http://www.google.com/')
73
+ report_as_text = checker.report(:csv, '/some/report.csv')
72
74
  report_as_text = checker.report(:html, '/some/report.html')
75
+ report_as_text = checker.report(:json, '/some/report.json')
73
76
  report_as_text = checker.report('/some/template.erb', '/some/report.html')
74
77
  ```
75
78
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2a
@@ -2,5 +2,7 @@ require 'ndd/url_checker/abstract_url_checker'
2
2
  require 'ndd/url_checker/blocking_url_checker'
3
3
  require 'ndd/url_checker/forked_url_checker'
4
4
  require 'ndd/url_checker/parallel_url_checker'
5
+ require 'ndd/url_checker/reporting_url_checker'
5
6
  require 'ndd/url_checker/status'
7
+ require 'ndd/url_checker/status_decorator'
6
8
  require 'ndd/url_checker/threaded_url_checker'
@@ -25,7 +25,7 @@ module NDD
25
25
  # @return [NDD::UrlChecker::Status, Array<NDD::UrlChecker::Status>] a single status for a single URL, an array
26
26
  # of status for multiple parameters
27
27
  def check(*urls)
28
- @logger.info "Checking #{urls.size} URL(s)"
28
+ @logger.debug "Checking #{urls.size} URL(s)"
29
29
  return check_single(urls.first) if urls.size < 2
30
30
  urls.map { |url| check_single(url) }
31
31
  end
@@ -40,12 +40,13 @@ module NDD
40
40
  def check_single(url)
41
41
  begin
42
42
  @logger.debug "Checking: #{url}"
43
- status = check_uri(URI.parse(url), Status.new(url))
43
+ status = Status.new(url)
44
+ status = check_uri(URI.parse(url), status)
44
45
  rescue => error
45
46
  status = if unknown_host?(error)
46
- Status.new(url).unknown_host
47
+ status.unknown_host
47
48
  else
48
- Status.new(url).failed(error)
49
+ status.failed(error)
49
50
  end
50
51
  end
51
52
  @logger.debug "Checked: #{url} -> #{status.code.upcase}"
@@ -91,6 +92,8 @@ module NDD
91
92
  end
92
93
 
93
94
  def on_error(uri, response, status)
95
+ # read the body while the socket is still open
96
+ response.body if response.kind_of?(Net::HTTPResponse)
94
97
  status.failed(response)
95
98
  end
96
99
 
@@ -42,9 +42,11 @@ module NDD
42
42
  end
43
43
 
44
44
  # read back the results
45
- results = urls.map do |_|
45
+ results = urls.each_with_index.map do |_, index|
46
46
  result = result_pipe.get
47
- @logger.debug("Processed URLs #{hash.size}/#{urls.size}")
47
+ processed_number = index + 1
48
+ processed_percentage = processed_number.to_f / urls.size.to_f * 100.0
49
+ @logger.debug("Processed URLs #{processed_number}/#{urls.size} (#{processed_percentage.round(2)} %)")
48
50
  result
49
51
  end
50
52
 
@@ -1,4 +1,4 @@
1
- Index,URL,Result,Code,Comment
2
- <% results.each_with_index do |status, index| %>
1
+ Index,URL,Result,Code,Details
2
+ <% statuses.each_with_index do |status, index| %>
3
3
  <%= index+1 %>,<%= status.uri %>,<%= status.valid? ? 'valid' : 'invalid' %>,<%= status.code %>,<% if status.invalid? %><%= status.error %><% end %>
4
4
  <% end %>
@@ -2,96 +2,187 @@
2
2
  <html lang="en">
3
3
 
4
4
  <head>
5
- <meta charset="UTF-8">
6
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
7
- <style>
8
- body {
9
- padding: 1em;
10
- }
5
+ <meta charset="UTF-8" />
6
+
7
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" />
8
+ <style type="text/css">
9
+ .popover-title {
10
+ font-weight: bold;
11
+ }
12
+
13
+ .popover-content em {
14
+ font-style: normal;
15
+ font-weight: bold;
16
+ }
17
+
18
+ .popover-content ol {
19
+ margin-left: -20px;
20
+ }
11
21
  </style>
12
22
 
13
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
14
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
23
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
24
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
15
25
  <script language="JavaScript">
16
- $(document).ready(function() {
17
- $('input[type=radio][name=urlsFilter]').change(function() {
18
- if (this.value == 'all') {
19
- $('tr').show();
20
- }
21
- else if (this.value == 'invalid') {
22
- $('tr').not('.danger').hide();
23
- }
26
+ if (!window.ndd_url_checker) {
27
+ window.ndd_url_checker = {};
28
+ }
29
+
30
+ ndd_url_checker.STATES = ['direct', 'redirected', 'failed', 'too-many-redirects', 'unknown-host'];
31
+
32
+ ndd_url_checker.displayStates = function () {
33
+ var displayStates = {};
34
+ $.each(ndd_url_checker.STATES, function (_, state) {
35
+ var checked = $('.display-' + state).is(':checked');
36
+ displayStates[state] = checked;
37
+ });
38
+ return displayStates;
39
+ }
40
+
41
+ ndd_url_checker.filter = function () {
42
+ var displayStates = ndd_url_checker.displayStates();
43
+
44
+ $.each(displayStates, function (state, display) {
45
+ $('.result-' + state).toggle(display);
46
+ });
47
+ }
48
+
49
+ $(document).ready(function () {
50
+ // show or hide results depending on their state
51
+ $.each(ndd_url_checker.STATES, function (_, state) {
52
+ $('.display-' + state).change(function () {
53
+ ndd_url_checker.filter();
54
+ });
55
+ });
56
+
57
+ // activate all tooltips
58
+ $('[data-toggle="popover"]')
59
+ .popover()
60
+ .click(function (e) {
61
+ e.preventDefault();
62
+ });
24
63
  });
25
- });
26
64
  </script>
27
65
  </head>
28
66
 
67
+
29
68
  <body>
30
69
 
31
- <h1>URL Checker Report</h1>
32
-
33
- <table class="table table-condensed table-hover" style="width: auto">
34
- <tbody>
35
- <tr>
36
- <td>User CPU time</td>
37
- <td><%= benchmark.utime %> second(s)</td>
38
- </tr>
39
- <tr>
40
- <td>System CPU time</td>
41
- <td><%= benchmark.stime %> second(s)</td>
42
- </tr>
43
- <tr>
44
- <td>Total time</td>
45
- <td><%= benchmark.total %> second(s)</td>
46
- </tr>
47
- <tr>
48
- <td>Elapsed real time</td>
49
- <td><%= benchmark.real %> second(s)</td>
50
- </tr>
51
- <tr>
52
- <td>Number of URLs</td>
53
- <td><%= results.size %></td>
54
- </tr>
55
- <tr>
56
- <td>Average time for 1 URL</td>
57
- <td><%= benchmark.real/results.size %> second(s)</td>
58
- </tr>
59
- </tbody>
60
- </table>
61
-
62
- <div class="radio">
63
- <label>
64
- <input type="radio" name="urlsFilter" id="showAllUrls" value="all" checked="true" />
65
- Show all URLs
66
- </label>
67
- </div>
68
- <div class="radio">
69
- <label>
70
- <input type="radio" name="urlsFilter" id="showInvalidUrls" value="invalid" />
71
- Show invalid URLs
72
- </label>
73
- </div>
70
+ <div class="container">
71
+
72
+ <div class="page-header">
73
+ <h1>
74
+ <span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span>
75
+ URL Checker Report
76
+ </h1>
77
+ </div>
78
+
79
+
80
+ <div class="row">
81
+ <div class="col-md-4">
82
+ <dl class="page-info dl-horizontal">
83
+ <dt>Number of URLs</dt>
84
+ <dd><%= urls.count %></dd>
85
+ <dt>Duration</dt>
86
+ <dd><%= benchmark.total_duration.round(3) %> s</dd>
87
+ <dt>Average duration</dt>
88
+ <dd><%= benchmark.average_duration.round(3) %> s/URL</dd>
89
+ <dt>Average throughput</dt>
90
+ <dd><%= benchmark.average_throughput.round(3) %> URL/s</dd>
91
+ </dl>
92
+ </div>
93
+ <div class="col-md-4">
94
+ <dl class="page-info dl-horizontal">
95
+ <dt>Valid URLS</dt>
96
+ <dd><%= urls.valid_count %></dd>
97
+ <dt>direct</dt>
98
+ <dd><%= urls.direct_count %></dd>
99
+ <dt>redirected</dt>
100
+ <dd><%= urls.redirected_count %></dd>
101
+ </dl>
102
+ </div>
103
+ <div class="col-md-4">
104
+ <dl class="page-info dl-horizontal">
105
+ <dt>Invalid URLS</dt>
106
+ <dd><%= urls.invalid_count %></dd>
107
+ <dt>failed</dt>
108
+ <dd><%= urls.failed_count %></dd>
109
+ <dt>too many redirects</dt>
110
+ <dd><%= urls.too_many_redirects_count %></dd>
111
+ <dt>unknown host</dt>
112
+ <dd><%= urls.unknown_host_count %></dd>
113
+ </dl>
114
+ </div>
115
+ </div>
116
+ <hr />
117
+
118
+
119
+ <div class="row page-controls hidden-print">
120
+ <div class="col-md-6">
121
+ <span>Valid URLs:</span>
74
122
 
75
- <table class="table table-condensed table-hover" style="width: auto">
76
- <thead>
77
- <tr>
78
- <th>#</th>
79
- <th>URL</th>
80
- <th>Code</th>
81
- <th>Comment</th>
82
- </tr>
83
- </thead>
84
- <tbody>
85
- <% results.each_with_index do |status, index| %>
86
- <tr class="<%= status.invalid? ? 'danger' : '' %>">
87
- <td><%= index+1 %></td>
88
- <td><a href="<%= status.uri %>" target="_blank"><%= status.uri %></a></td>
89
- <td><%= status.code %></td>
90
- <td><% if status.invalid? %><%= status.error %><% end %></td>
91
- </tr>
92
- <% end %>
93
- </tbody>
94
- </table>
123
+ <div class="btn-group page-display" data-toggle="buttons">
124
+ <label class="btn btn-default active">
125
+ <input type="checkbox" autocomplete="off" class="display-direct" checked="true" />
126
+ Direct (<%= urls.direct_count %>)
127
+ </label>
128
+ <label class="btn btn-default active">
129
+ <input type="checkbox" autocomplete="off" class="display-redirected" checked="true" />
130
+ Redirected (<%= urls.redirected_count %>)
131
+ </label>
132
+ </div>
133
+ </div>
134
+ <div class="col-md-6">
135
+ <span>Invalid URLs:</span>
136
+
137
+ <div class="btn-group page-display" data-toggle="buttons">
138
+ <label class="btn btn-default active">
139
+ <input type="checkbox" autocomplete="off" class="display-failed" checked="true" />
140
+ Failed (<%= urls.failed_count %>)
141
+ </label>
142
+ <label class="btn btn-default active">
143
+ <input type="checkbox" autocomplete="off" class="display-too-many-redirects" checked="true" />
144
+ Too many redirects (<%= urls.too_many_redirects_count %>)
145
+ </label>
146
+ <label class="btn btn-default active">
147
+ <input type="checkbox" autocomplete="off" class="display-unknown-host" checked="true" />
148
+ Unknown host (<%= urls.unknown_host_count %>)
149
+ </label>
150
+ </div>
151
+ </div>
152
+ </div>
153
+ <hr />
154
+
155
+
156
+ <table id="results" class="table table-condensed table-hover">
157
+ <thead>
158
+ <tr>
159
+ <th>#</th>
160
+ <th>URL</th>
161
+ <th>Code</th>
162
+ <th>Details</th>
163
+ </tr>
164
+ </thead>
165
+ <tbody>
166
+ <% statuses.each_with_index do |status, index| %>
167
+ <tr class="result result-<%= status.code_as_css %> <%= status.invalid? ? 'danger' : '' %>">
168
+ <td><%= index+1 %></td>
169
+ <td><a href="<%= status.uri %>" target="_blank"><%= status.uri %></a></td>
170
+ <td><%= status.code %></td>
171
+ <td><%= status.details_title %></td>
172
+ <td>
173
+ <% if status.details_body %>
174
+ <a href="#" data-toggle="popover" data-placement="left" data-trigger="focus"
175
+ data-html="true" title="<%= status.uri %>" data-content="<%= status.details_body_as_html %>">
176
+ <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
177
+ </a>
178
+ <% end %>
179
+ </td>
180
+ </tr>
181
+ <% end %>
182
+ </tbody>
183
+ </table>
184
+
185
+ </div>
95
186
 
96
187
  </body>
97
188
  </html>