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
@@ -1,30 +1,49 @@
1
1
  {
2
2
  "benchmark": {
3
- "utime": "XXX",
4
- "stime": "XXX",
5
- "total": "XXX",
6
- "real": "XXX",
7
- "size": "3",
8
- "throughput": "XXX"
3
+ "total_duration": 123.456,
4
+ "average_duration": 123.456,
5
+ "average_throughput": 123.456
6
+ },
7
+ "statistics": {
8
+ "count": 5,
9
+ "valid_count": 2,
10
+ "direct_count": 1,
11
+ "redirected_count": 1,
12
+ "invalid_count": 3,
13
+ "failed_count": 1,
14
+ "too_many_redirects_count": 1,
15
+ "unknown_host_count": 1
9
16
  },
10
17
  "results": [
11
18
  {
12
19
  "index": 1,
13
20
  "url": "http://www.google.com",
14
- "code": "direct",
15
- "comment": ""
21
+ "code": "redirected",
22
+ "details": ""
16
23
  },
17
24
  {
18
25
  "index": 2,
19
26
  "url": "http://www.google.de",
20
27
  "code": "failed",
21
- "comment": "some error"
28
+ "details": "some error"
22
29
  },
23
30
  {
24
31
  "index": 3,
32
+ "url": "http://www.google.es",
33
+ "code": "too_many_redirects",
34
+ "details": ""
35
+ },
36
+ {
37
+ "index": 4,
25
38
  "url": "http://www.google.fr",
26
39
  "code": "direct",
27
- "comment": ""
40
+ "details": ""
41
+ },
42
+ {
43
+ "index": 5,
44
+ "url": "http://www.google.it",
45
+ "code": "unknown_host",
46
+ "details": ""
28
47
  }
29
48
  ]
30
49
  }
@@ -1,9 +1,9 @@
1
- count = 3
1
+ count = 5
2
2
 
3
3
  - index = 1
4
4
  - uri = http://www.google.com
5
5
  - valid = true
6
- - code = direct
6
+ - code = redirected
7
7
 
8
8
  - index = 2
9
9
  - uri = http://www.google.de
@@ -11,6 +11,16 @@ count = 3
11
11
  - code = failed
12
12
 
13
13
  - index = 3
14
+ - uri = http://www.google.es
15
+ - valid = false
16
+ - code = too_many_redirects
17
+
18
+ - index = 4
14
19
  - uri = http://www.google.fr
15
20
  - valid = true
16
21
  - code = direct
22
+
23
+ - index = 5
24
+ - uri = http://www.google.it
25
+ - valid = false
26
+ - code = unknown_host
@@ -1,2 +1,2 @@
1
- Index,URL,Result,Code,Comment
1
+ Index,URL,Result,Code,Details
2
2
  1,http://www.google.fr,valid,direct,
@@ -2,96 +2,181 @@
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;
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;
10
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;
24
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
+ });
25
63
  });
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>XXX second(s)</td>
38
- </tr>
39
- <tr>
40
- <td>System CPU time</td>
41
- <td>XXX second(s)</td>
42
- </tr>
43
- <tr>
44
- <td>Total time</td>
45
- <td>XXX second(s)</td>
46
- </tr>
47
- <tr>
48
- <td>Elapsed real time</td>
49
- <td>XXX second(s)</td>
50
- </tr>
51
- <tr>
52
- <td>Number of URLs</td>
53
- <td>1</td>
54
- </tr>
55
- <tr>
56
- <td>Average time for 1 URL</td>
57
- <td>XXX 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>1</dd>
85
+ <dt>Duration</dt>
86
+ <dd>123.456 s</dd>
87
+ <dt>Average duration</dt>
88
+ <dd>123.456 s/URL</dd>
89
+ <dt>Average throughput</dt>
90
+ <dd>123.456 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>1</dd>
97
+ <dt>direct</dt>
98
+ <dd>1</dd>
99
+ <dt>redirected</dt>
100
+ <dd>0</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>0</dd>
107
+ <dt>failed</dt>
108
+ <dd>0</dd>
109
+ <dt>too many redirects</dt>
110
+ <dd>0</dd>
111
+ <dt>unknown host</dt>
112
+ <dd>0</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
-
86
- <tr class="">
87
- <td>1</td>
88
- <td><a href="http://www.google.fr" target="_blank">http://www.google.fr</a></td>
89
- <td>direct</td>
90
- <td></td>
91
- </tr>
92
-
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 (1)
127
+ </label>
128
+ <label class="btn btn-default active">
129
+ <input type="checkbox" autocomplete="off" class="display-redirected" checked="true" />
130
+ Redirected (0)
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 (0)
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 (0)
145
+ </label>
146
+ <label class="btn btn-default active">
147
+ <input type="checkbox" autocomplete="off" class="display-unknown-host" checked="true" />
148
+ Unknown host (0)
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
+
167
+ <tr class="result result-direct ">
168
+ <td>1</td>
169
+ <td><a href="http://www.google.fr" target="_blank">http://www.google.fr</a></td>
170
+ <td>direct</td>
171
+ <td></td>
172
+ <td>
173
+ </td>
174
+ </tr>
175
+
176
+ </tbody>
177
+ </table>
178
+
179
+ </div>
95
180
 
96
181
  </body>
97
182
  </html>
@@ -1,18 +1,25 @@
1
1
  {
2
2
  "benchmark": {
3
- "utime": "XXX",
4
- "stime": "XXX",
5
- "total": "XXX",
6
- "real": "XXX",
7
- "size": "1",
8
- "throughput": "XXX"
3
+ "total_duration": 123.456,
4
+ "average_duration": 123.456,
5
+ "average_throughput": 123.456
6
+ },
7
+ "statistics": {
8
+ "count": 1,
9
+ "valid_count": 1,
10
+ "direct_count": 1,
11
+ "redirected_count": 0,
12
+ "invalid_count": 0,
13
+ "failed_count": 0,
14
+ "too_many_redirects_count": 0,
15
+ "unknown_host_count": 0
9
16
  },
10
17
  "results": [
11
18
  {
12
19
  "index": 1,
13
20
  "url": "http://www.google.fr",
14
21
  "code": "direct",
15
- "comment": ""
22
+ "details": ""
16
23
  }
17
24
  ]
18
25
  }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe NDD::UrlChecker::ReportingUrlChecker do
3
+ RSpec.describe NDD::UrlChecker::ReportingUrlChecker do
4
4
 
5
5
  before(:all) do
6
6
  # Logging.logger.root.level = :debug
@@ -26,19 +26,19 @@ describe NDD::UrlChecker::ReportingUrlChecker do
26
26
  end
27
27
 
28
28
  it 'creates an CSV report' do
29
- actual_report = actual_report(@report_checker, :csv, 'single_url.csv')
29
+ actual_report = actual_report_csv(@report_checker, :csv, 'single_url.csv')
30
30
  expected_report = expected_report('single_url.csv')
31
31
  expect(actual_report).to eq expected_report
32
32
  end
33
33
 
34
34
  it 'creates an HTML report' do
35
- actual_report = actual_report(@report_checker, :html, 'single_url.html')
35
+ actual_report = actual_report_html(@report_checker, :html, 'single_url.html')
36
36
  expected_report = expected_report('single_url.html')
37
37
  expect(actual_report).to eq expected_report
38
38
  end
39
39
 
40
40
  it 'creates an JSON report' do
41
- actual_report = actual_report(@report_checker, :json, 'single_url.json')
41
+ actual_report = actual_report_json(@report_checker, :json, 'single_url.json')
42
42
  expected_report = expected_report('single_url.json')
43
43
  expect(actual_report).to eq expected_report
44
44
  end
@@ -55,8 +55,10 @@ describe NDD::UrlChecker::ReportingUrlChecker do
55
55
  before(:each) do
56
56
  expected_results = [
57
57
  NDD::UrlChecker::Status.new('http://www.google.fr').direct,
58
- NDD::UrlChecker::Status.new('http://www.google.com').direct,
59
- NDD::UrlChecker::Status.new('http://www.google.de').failed('some error')
58
+ NDD::UrlChecker::Status.new('http://www.google.com').redirected('http://www.google.fr'),
59
+ NDD::UrlChecker::Status.new('http://www.google.de').failed(StandardError.new('some error')),
60
+ NDD::UrlChecker::Status.new('http://www.google.es').redirected('http://www.google.fr').too_many_redirects,
61
+ NDD::UrlChecker::Status.new('http://www.google.it').unknown_host
60
62
  ]
61
63
  checker = double
62
64
  expect(checker).to receive(:check).and_return(expected_results)
@@ -66,19 +68,19 @@ describe NDD::UrlChecker::ReportingUrlChecker do
66
68
  end
67
69
 
68
70
  it 'creates an CSV report' do
69
- actual_report = actual_report(@report_checker, :csv, 'multiple_urls.csv')
71
+ actual_report = actual_report_csv(@report_checker, :csv, 'multiple_urls.csv')
70
72
  expected_report = expected_report('multiple_urls.csv')
71
73
  expect(actual_report).to eq expected_report
72
74
  end
73
75
 
74
76
  it 'creates an HTML report' do
75
- actual_report = actual_report(@report_checker, :html, 'multiple_urls.html')
77
+ actual_report = actual_report_html(@report_checker, :html, 'multiple_urls.html')
76
78
  expected_report = expected_report('multiple_urls.html')
77
79
  expect(actual_report).to eq expected_report
78
80
  end
79
81
 
80
82
  it 'creates an JSON report' do
81
- actual_report = actual_report(@report_checker, :json, 'multiple_urls.json')
83
+ actual_report = actual_report_json(@report_checker, :json, 'multiple_urls.json')
82
84
  expected_report = expected_report('multiple_urls.json')
83
85
  expect(actual_report).to eq expected_report
84
86
  end
@@ -97,13 +99,28 @@ describe NDD::UrlChecker::ReportingUrlChecker do
97
99
  private
98
100
 
99
101
  def actual_report(report_checker, report_type, output_file_name)
100
- # actual_file = '/tmp/multiple_urls.html'
102
+ # actual_file = File.new('/tmp/report.html', 'w+')
101
103
  actual_file = Tempfile.new(output_file_name)
102
104
  actual_report = report_checker.report(report_type, actual_file)
103
105
  expect(actual_report).to eq actual_file.read
104
106
  actual_report.gsub(/^\s+/, '')
105
- .gsub(/<td>[\d\.e-]+ second\(s\)<\/td>/, '<td>XXX second(s)</td>') # HTML
106
- .gsub(/"\d+\.\d+"/, '"XXX"').gsub(/"\d+\.\d+e-\d+"/, '"XXX"') # JSON
107
+ end
108
+
109
+ def actual_report_csv(report_checker, report_type, output_file_name)
110
+ actual_report(report_checker, report_type, output_file_name)
111
+ end
112
+
113
+ def actual_report_html(report_checker, report_type, output_file_name)
114
+ actual_report = actual_report(report_checker, report_type, output_file_name)
115
+ actual_report
116
+ .gsub(/<dd>[\d\.e-]+ s<\/dd>/, '<dd>123.456 s</dd>')
117
+ .gsub(/<dd>[\d\.e-]+ URL\/s<\/dd>/, '<dd>123.456 URL/s</dd>')
118
+ .gsub(/<dd>[\d\.e-]+ s\/URL<\/dd>/, '<dd>123.456 s/URL</dd>')
119
+ end
120
+
121
+ def actual_report_json(report_checker, report_type, output_file_name)
122
+ actual_report = actual_report(report_checker, report_type, output_file_name)
123
+ actual_report.gsub(/\d+\.\d+(e-?\d*)?/, '123.456')
107
124
  end
108
125
 
109
126
  def expected_report(expected_file_name)