ruby-link-checker 0.3.0 → 0.4.0

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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/CONTRIBUTING.md +0 -0
  4. data/Dangerfile +2 -0
  5. data/Gemfile +2 -1
  6. data/Gemfile.lock +202 -83
  7. data/LICENSE.md +0 -0
  8. data/README.md +73 -3
  9. data/RELEASING.md +0 -0
  10. data/Rakefile +0 -0
  11. data/benchmarks/check.rb +27 -20
  12. data/benchmarks/data/opensearch.org/links.txt +0 -0
  13. data/benchmarks/data/opensearch.org/small.txt +0 -0
  14. data/coverage/assets/{0.13.1 → 0.13.2}/DataTables-1.10.20/images/sort_asc.png +0 -0
  15. data/coverage/assets/{0.13.1 → 0.13.2}/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
  16. data/coverage/assets/{0.13.1 → 0.13.2}/DataTables-1.10.20/images/sort_both.png +0 -0
  17. data/coverage/assets/{0.13.1 → 0.13.2}/DataTables-1.10.20/images/sort_desc.png +0 -0
  18. data/coverage/assets/{0.13.1 → 0.13.2}/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
  19. data/coverage/assets/{0.13.1 → 0.13.2}/application.css +0 -0
  20. data/coverage/assets/{0.13.1 → 0.13.2}/application.js +0 -0
  21. data/coverage/assets/{0.13.1 → 0.13.2}/colorbox/border.png +0 -0
  22. data/coverage/assets/{0.13.1 → 0.13.2}/colorbox/controls.png +0 -0
  23. data/coverage/assets/{0.13.1 → 0.13.2}/colorbox/loading.gif +0 -0
  24. data/coverage/assets/{0.13.1 → 0.13.2}/colorbox/loading_background.png +0 -0
  25. data/coverage/assets/{0.13.1 → 0.13.2}/favicon_green.png +0 -0
  26. data/coverage/assets/{0.13.1 → 0.13.2}/favicon_red.png +0 -0
  27. data/coverage/assets/{0.13.1 → 0.13.2}/favicon_yellow.png +0 -0
  28. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  29. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  30. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  31. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  32. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  33. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  34. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  35. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  36. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-icons_222222_256x240.png +0 -0
  37. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-icons_2e83ff_256x240.png +0 -0
  38. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-icons_454545_256x240.png +0 -0
  39. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-icons_888888_256x240.png +0 -0
  40. data/coverage/assets/{0.13.1 → 0.13.2}/images/ui-icons_cd0a0a_256x240.png +0 -0
  41. data/coverage/assets/{0.13.1 → 0.13.2}/loading.gif +0 -0
  42. data/coverage/assets/{0.13.1 → 0.13.2}/magnify.png +0 -0
  43. data/coverage/index.html +2857 -7125
  44. data/lib/ruby-link-checker/async/http/checker.rb +92 -0
  45. data/lib/ruby-link-checker/async/http/config.rb +35 -0
  46. data/lib/ruby-link-checker/async/http/result.rb +81 -0
  47. data/lib/ruby-link-checker/async/http.rb +3 -0
  48. data/lib/ruby-link-checker/callbacks.rb +2 -2
  49. data/lib/ruby-link-checker/checker.rb +0 -0
  50. data/lib/ruby-link-checker/config.rb +2 -0
  51. data/lib/ruby-link-checker/errors/base_error.rb +0 -0
  52. data/lib/ruby-link-checker/errors/redirect_loop_error.rb +0 -0
  53. data/lib/ruby-link-checker/errors.rb +0 -0
  54. data/lib/ruby-link-checker/logger.rb +0 -0
  55. data/lib/ruby-link-checker/net/http/checker.rb +2 -0
  56. data/lib/ruby-link-checker/net/http/config.rb +0 -0
  57. data/lib/ruby-link-checker/net/http/result.rb +0 -0
  58. data/lib/ruby-link-checker/net/http.rb +0 -0
  59. data/lib/ruby-link-checker/result.rb +0 -0
  60. data/lib/ruby-link-checker/task.rb +0 -0
  61. data/lib/ruby-link-checker/tasks.rb +4 -2
  62. data/lib/ruby-link-checker/typhoeus/hydra/checker.rb +2 -1
  63. data/lib/ruby-link-checker/typhoeus/hydra/config.rb +0 -0
  64. data/lib/ruby-link-checker/typhoeus/hydra/result.rb +0 -0
  65. data/lib/ruby-link-checker/typhoeus/hydra.rb +0 -0
  66. data/lib/ruby-link-checker/version.rb +1 -1
  67. data/lib/ruby-link-checker.rb +1 -0
  68. data/lib/ruby_link_checker.rb +0 -0
  69. data/ruby-link-checker.gemspec +2 -1
  70. data/spec/fixtures/200.yml +0 -0
  71. data/spec/fixtures/301_200.yml +0 -0
  72. data/spec/fixtures/301_301.yml +0 -0
  73. data/spec/fixtures/301_400_301_200.yml +0 -0
  74. data/spec/fixtures/301_403.yml +0 -0
  75. data/spec/fixtures/308_429.yml +0 -0
  76. data/spec/fixtures/404.yml +0 -0
  77. data/spec/fixtures/404_200.yml +0 -0
  78. data/spec/fixtures/404_404.yml +0 -0
  79. data/spec/fixtures/429_200.yml +0 -0
  80. data/spec/fixtures/429_429_200.yml +0 -0
  81. data/spec/ruby-link-checker/async/http/checker_spec.rb +99 -0
  82. data/spec/ruby-link-checker/callbacks_spec.rb +33 -0
  83. data/spec/ruby-link-checker/checker_spec.rb +0 -0
  84. data/spec/ruby-link-checker/config_spec.rb +0 -0
  85. data/spec/ruby-link-checker/errors/redirect_loop_error_spec.rb +18 -0
  86. data/spec/ruby-link-checker/net/http/checker_spec.rb +17 -0
  87. data/spec/ruby-link-checker/result_error_spec.rb +17 -0
  88. data/spec/ruby-link-checker/result_spec.rb +41 -0
  89. data/spec/ruby-link-checker/task_spec.rb +20 -0
  90. data/spec/ruby-link-checker/tasks_spec.rb +47 -0
  91. data/spec/ruby-link-checker/typhoeus/hydra/checker_spec.rb +28 -2
  92. data/spec/ruby-link-checker/version_spec.rb +0 -0
  93. data/spec/spec_helper.rb +3 -1
  94. data/spec/support/config.rb +0 -0
  95. data/spec/support/link_checker.rb +24 -0
  96. data/spec/support/vcr.rb +0 -0
  97. data/spec/support/with_result.rb +0 -0
  98. data/spec/support/with_url.rb +0 -0
  99. metadata +57 -37
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe LinkChecker::Tasks do
6
+ describe '#_handle_result' do
7
+ # Reproduces issue #12: SystemStackError when logging causes repeated errors
8
+ # https://github.com/dblock/ruby-link-checker/issues/12
9
+ context 'when logger.info raises an error repeatedly' do
10
+ let(:checker) { LinkChecker::Net::HTTP::Checker.new(methods: ['GET']) }
11
+ let(:task_klass) { LinkChecker::Net::HTTP::Task }
12
+ let(:url) { 'https://www.example.org' }
13
+
14
+ before do
15
+ stub_request(:get, url).to_return(status: 200, body: '', headers: {})
16
+ end
17
+
18
+ it 'does not cause infinite recursion leading to SystemStackError' do
19
+ tasks = described_class.new(checker, task_klass, url, ['GET'])
20
+
21
+ # Stub logger to always raise an error on info, simulating the scenario
22
+ # from issue #12 where logging causes a stack overflow due to the
23
+ # rescue block in _handle_result recursively calling itself
24
+ allow(tasks).to receive(:logger).and_return(
25
+ instance_double(LinkChecker::Logger).tap do |logger|
26
+ allow(logger).to receive(:info).and_raise(StandardError, 'stack level too deep')
27
+ allow(logger).to receive(:error)
28
+ end
29
+ )
30
+
31
+ # Should not raise SystemStackError - the error should be handled gracefully
32
+ expect { tasks.execute! }.not_to raise_error
33
+ end
34
+ end
35
+ end
36
+
37
+ describe '#retries' do
38
+ let(:checker) { LinkChecker::Net::HTTP::Checker.new(methods: ['GET'], retries: 2) }
39
+ let(:task_klass) { LinkChecker::Net::HTTP::Task }
40
+ let(:url) { 'https://www.example.org' }
41
+
42
+ it 'delegates to the checker' do
43
+ tasks = described_class.new(checker, task_klass, url, ['GET'])
44
+ expect(tasks.send(:retries)).to eq 2
45
+ end
46
+ end
47
+ end
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe LinkChecker::Typhoeus::Hydra::Checker do
6
- module TestLinkChecker
6
+ module TyphoeusTestLinkChecker
7
7
  class Task < LinkChecker::Typhoeus::Hydra::Task; end
8
8
 
9
9
  class LinkChecker < LinkChecker::Typhoeus::Hydra::Checker
@@ -19,9 +19,15 @@ describe LinkChecker::Typhoeus::Hydra::Checker do
19
19
  end
20
20
  end
21
21
 
22
- describe TestLinkChecker::LinkChecker do
22
+ describe TyphoeusTestLinkChecker::LinkChecker do
23
23
  it_behaves_like 'a link checker'
24
24
 
25
+ describe '.config' do
26
+ it 'returns the Config module' do
27
+ expect(LinkChecker::Typhoeus::Hydra.config).to eq LinkChecker::Typhoeus::Hydra::Config
28
+ end
29
+ end
30
+
25
31
  context 'with timeout options', vcr: { cassette_name: '200' } do
26
32
  before do
27
33
  LinkChecker::Typhoeus::Hydra.configure do |config|
@@ -64,4 +70,24 @@ describe LinkChecker::Typhoeus::Hydra::Checker do
64
70
  end
65
71
  end
66
72
  end
73
+
74
+ describe LinkChecker::Typhoeus::Hydra::Result do
75
+ describe '#code' do
76
+ it 'returns -1 when the response raises' do
77
+ request = instance_double(Typhoeus::Request)
78
+ response = instance_double(Typhoeus::Response)
79
+ allow(response).to receive(:code).and_raise(StandardError)
80
+ result = described_class.new(URI('https://www.example.org'), 'GET', nil, request, response, {})
81
+ expect(result.code).to eq(-1)
82
+ end
83
+ end
84
+ end
85
+
86
+ describe '#run' do
87
+ it 'delegates to the hydra' do
88
+ checker = described_class.new
89
+ expect(checker.instance_variable_get(:@hydra)).to receive(:run)
90
+ checker.run
91
+ end
92
+ end
67
93
  end
File without changes
data/spec/spec_helper.rb CHANGED
@@ -5,7 +5,9 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
5
  require 'rubygems'
6
6
 
7
7
  require 'simplecov'
8
- SimpleCov.start
8
+ SimpleCov.start do
9
+ add_filter '/spec/'
10
+ end
9
11
 
10
12
  require 'rspec'
11
13
  require 'ruby-link-checker'
File without changes
@@ -7,6 +7,10 @@ shared_context 'a link checker' do
7
7
  it 'has a default user-agent' do
8
8
  expect(subject.user_agent).to eq "Ruby Link Checker/#{LinkChecker::VERSION}"
9
9
  end
10
+
11
+ it 'has no default headers' do
12
+ expect(subject.headers).to eq({})
13
+ end
10
14
  end
11
15
 
12
16
  context 'user-agent' do
@@ -19,6 +23,16 @@ shared_context 'a link checker' do
19
23
  end
20
24
  end
21
25
 
26
+ context 'headers' do
27
+ subject do
28
+ described_class.new(headers: { 'DNT' => '1' })
29
+ end
30
+
31
+ it 'updates headers' do
32
+ expect(subject.headers).to eq('DNT' => '1')
33
+ end
34
+ end
35
+
22
36
  context 'check' do
23
37
  let(:url) { 'https://www.example.org' }
24
38
 
@@ -104,6 +118,16 @@ shared_context 'a link checker' do
104
118
  expect(result.options).to eq({})
105
119
  end
106
120
 
121
+ context 'with custom headers' do
122
+ subject do
123
+ described_class.new(methods: ['GET'], headers: { 'DNT' => '1' })
124
+ end
125
+
126
+ it 'sends custom headers' do
127
+ expect(result.request_headers['DNT']).to eq '1'
128
+ end
129
+ end
130
+
107
131
  it 'returns results' do
108
132
  expect(subject.results).to eq(
109
133
  error: [],
data/spec/support/vcr.rb CHANGED
File without changes
File without changes
File without changes
metadata CHANGED
@@ -1,15 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-link-checker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Doubrovkine
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-07-05 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: async-http
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
13
26
  - !ruby/object:Gem::Dependency
14
27
  name: typhoeus
15
28
  requirement: !ruby/object:Gem::Requirement
@@ -24,7 +37,6 @@ dependencies:
24
37
  - - ">="
25
38
  - !ruby/object:Gem::Version
26
39
  version: '0'
27
- description:
28
40
  email: dblock@dblock.org
29
41
  executables: []
30
42
  extensions: []
@@ -42,37 +54,41 @@ files:
42
54
  - benchmarks/check.rb
43
55
  - benchmarks/data/opensearch.org/links.txt
44
56
  - benchmarks/data/opensearch.org/small.txt
45
- - coverage/assets/0.13.1/DataTables-1.10.20/images/sort_asc.png
46
- - coverage/assets/0.13.1/DataTables-1.10.20/images/sort_asc_disabled.png
47
- - coverage/assets/0.13.1/DataTables-1.10.20/images/sort_both.png
48
- - coverage/assets/0.13.1/DataTables-1.10.20/images/sort_desc.png
49
- - coverage/assets/0.13.1/DataTables-1.10.20/images/sort_desc_disabled.png
50
- - coverage/assets/0.13.1/application.css
51
- - coverage/assets/0.13.1/application.js
52
- - coverage/assets/0.13.1/colorbox/border.png
53
- - coverage/assets/0.13.1/colorbox/controls.png
54
- - coverage/assets/0.13.1/colorbox/loading.gif
55
- - coverage/assets/0.13.1/colorbox/loading_background.png
56
- - coverage/assets/0.13.1/favicon_green.png
57
- - coverage/assets/0.13.1/favicon_red.png
58
- - coverage/assets/0.13.1/favicon_yellow.png
59
- - coverage/assets/0.13.1/images/ui-bg_flat_0_aaaaaa_40x100.png
60
- - coverage/assets/0.13.1/images/ui-bg_flat_75_ffffff_40x100.png
61
- - coverage/assets/0.13.1/images/ui-bg_glass_55_fbf9ee_1x400.png
62
- - coverage/assets/0.13.1/images/ui-bg_glass_65_ffffff_1x400.png
63
- - coverage/assets/0.13.1/images/ui-bg_glass_75_dadada_1x400.png
64
- - coverage/assets/0.13.1/images/ui-bg_glass_75_e6e6e6_1x400.png
65
- - coverage/assets/0.13.1/images/ui-bg_glass_95_fef1ec_1x400.png
66
- - coverage/assets/0.13.1/images/ui-bg_highlight-soft_75_cccccc_1x100.png
67
- - coverage/assets/0.13.1/images/ui-icons_222222_256x240.png
68
- - coverage/assets/0.13.1/images/ui-icons_2e83ff_256x240.png
69
- - coverage/assets/0.13.1/images/ui-icons_454545_256x240.png
70
- - coverage/assets/0.13.1/images/ui-icons_888888_256x240.png
71
- - coverage/assets/0.13.1/images/ui-icons_cd0a0a_256x240.png
72
- - coverage/assets/0.13.1/loading.gif
73
- - coverage/assets/0.13.1/magnify.png
57
+ - coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc.png
58
+ - coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc_disabled.png
59
+ - coverage/assets/0.13.2/DataTables-1.10.20/images/sort_both.png
60
+ - coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc.png
61
+ - coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc_disabled.png
62
+ - coverage/assets/0.13.2/application.css
63
+ - coverage/assets/0.13.2/application.js
64
+ - coverage/assets/0.13.2/colorbox/border.png
65
+ - coverage/assets/0.13.2/colorbox/controls.png
66
+ - coverage/assets/0.13.2/colorbox/loading.gif
67
+ - coverage/assets/0.13.2/colorbox/loading_background.png
68
+ - coverage/assets/0.13.2/favicon_green.png
69
+ - coverage/assets/0.13.2/favicon_red.png
70
+ - coverage/assets/0.13.2/favicon_yellow.png
71
+ - coverage/assets/0.13.2/images/ui-bg_flat_0_aaaaaa_40x100.png
72
+ - coverage/assets/0.13.2/images/ui-bg_flat_75_ffffff_40x100.png
73
+ - coverage/assets/0.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png
74
+ - coverage/assets/0.13.2/images/ui-bg_glass_65_ffffff_1x400.png
75
+ - coverage/assets/0.13.2/images/ui-bg_glass_75_dadada_1x400.png
76
+ - coverage/assets/0.13.2/images/ui-bg_glass_75_e6e6e6_1x400.png
77
+ - coverage/assets/0.13.2/images/ui-bg_glass_95_fef1ec_1x400.png
78
+ - coverage/assets/0.13.2/images/ui-bg_highlight-soft_75_cccccc_1x100.png
79
+ - coverage/assets/0.13.2/images/ui-icons_222222_256x240.png
80
+ - coverage/assets/0.13.2/images/ui-icons_2e83ff_256x240.png
81
+ - coverage/assets/0.13.2/images/ui-icons_454545_256x240.png
82
+ - coverage/assets/0.13.2/images/ui-icons_888888_256x240.png
83
+ - coverage/assets/0.13.2/images/ui-icons_cd0a0a_256x240.png
84
+ - coverage/assets/0.13.2/loading.gif
85
+ - coverage/assets/0.13.2/magnify.png
74
86
  - coverage/index.html
75
87
  - lib/ruby-link-checker.rb
88
+ - lib/ruby-link-checker/async/http.rb
89
+ - lib/ruby-link-checker/async/http/checker.rb
90
+ - lib/ruby-link-checker/async/http/config.rb
91
+ - lib/ruby-link-checker/async/http/result.rb
76
92
  - lib/ruby-link-checker/callbacks.rb
77
93
  - lib/ruby-link-checker/checker.rb
78
94
  - lib/ruby-link-checker/config.rb
@@ -105,10 +121,16 @@ files:
105
121
  - spec/fixtures/404_404.yml
106
122
  - spec/fixtures/429_200.yml
107
123
  - spec/fixtures/429_429_200.yml
124
+ - spec/ruby-link-checker/async/http/checker_spec.rb
108
125
  - spec/ruby-link-checker/callbacks_spec.rb
109
126
  - spec/ruby-link-checker/checker_spec.rb
110
127
  - spec/ruby-link-checker/config_spec.rb
128
+ - spec/ruby-link-checker/errors/redirect_loop_error_spec.rb
111
129
  - spec/ruby-link-checker/net/http/checker_spec.rb
130
+ - spec/ruby-link-checker/result_error_spec.rb
131
+ - spec/ruby-link-checker/result_spec.rb
132
+ - spec/ruby-link-checker/task_spec.rb
133
+ - spec/ruby-link-checker/tasks_spec.rb
112
134
  - spec/ruby-link-checker/typhoeus/hydra/checker_spec.rb
113
135
  - spec/ruby-link-checker/version_spec.rb
114
136
  - spec/spec_helper.rb
@@ -122,7 +144,6 @@ licenses:
122
144
  - MIT
123
145
  metadata:
124
146
  rubygems_mfa_required: 'true'
125
- post_install_message:
126
147
  rdoc_options: []
127
148
  require_paths:
128
149
  - lib
@@ -130,15 +151,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
151
  requirements:
131
152
  - - ">="
132
153
  - !ruby/object:Gem::Version
133
- version: '2.7'
154
+ version: '3.3'
134
155
  required_rubygems_version: !ruby/object:Gem::Requirement
135
156
  requirements:
136
157
  - - ">="
137
158
  - !ruby/object:Gem::Version
138
159
  version: 1.3.6
139
160
  requirements: []
140
- rubygems_version: 3.5.16
141
- signing_key:
161
+ rubygems_version: 3.6.9
142
162
  specification_version: 4
143
163
  summary: Fast ruby link checker.
144
164
  test_files: []