ruby-link-checker 0.1.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 (89) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/CONTRIBUTING.md +125 -0
  4. data/Dangerfile +4 -0
  5. data/Gemfile +23 -0
  6. data/Gemfile.lock +162 -0
  7. data/LICENSE.md +22 -0
  8. data/README.md +279 -0
  9. data/RELEASING.md +60 -0
  10. data/Rakefile +18 -0
  11. data/benchmarks/check.rb +31 -0
  12. data/benchmarks/data/opensearch.org/links.txt +4270 -0
  13. data/benchmarks/data/opensearch.org/small.txt +100 -0
  14. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png +0 -0
  15. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
  16. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png +0 -0
  17. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png +0 -0
  18. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
  19. data/coverage/assets/0.12.3/application.css +1 -0
  20. data/coverage/assets/0.12.3/application.js +7 -0
  21. data/coverage/assets/0.12.3/colorbox/border.png +0 -0
  22. data/coverage/assets/0.12.3/colorbox/controls.png +0 -0
  23. data/coverage/assets/0.12.3/colorbox/loading.gif +0 -0
  24. data/coverage/assets/0.12.3/colorbox/loading_background.png +0 -0
  25. data/coverage/assets/0.12.3/favicon_green.png +0 -0
  26. data/coverage/assets/0.12.3/favicon_red.png +0 -0
  27. data/coverage/assets/0.12.3/favicon_yellow.png +0 -0
  28. data/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  29. data/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  30. data/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  31. data/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  32. data/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  33. data/coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  34. data/coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  35. data/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  36. data/coverage/assets/0.12.3/images/ui-icons_222222_256x240.png +0 -0
  37. data/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png +0 -0
  38. data/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png +0 -0
  39. data/coverage/assets/0.12.3/images/ui-icons_888888_256x240.png +0 -0
  40. data/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png +0 -0
  41. data/coverage/assets/0.12.3/loading.gif +0 -0
  42. data/coverage/assets/0.12.3/magnify.png +0 -0
  43. data/coverage/index.html +14555 -0
  44. data/lib/ruby-link-checker/callbacks.rb +50 -0
  45. data/lib/ruby-link-checker/checker.rb +42 -0
  46. data/lib/ruby-link-checker/config.rb +41 -0
  47. data/lib/ruby-link-checker/errors/base_error.rb +8 -0
  48. data/lib/ruby-link-checker/errors/redirect_loop_error.rb +18 -0
  49. data/lib/ruby-link-checker/errors.rb +2 -0
  50. data/lib/ruby-link-checker/logger.rb +14 -0
  51. data/lib/ruby-link-checker/net/http/checker.rb +31 -0
  52. data/lib/ruby-link-checker/net/http/config.rb +35 -0
  53. data/lib/ruby-link-checker/net/http/result.rb +53 -0
  54. data/lib/ruby-link-checker/net/http.rb +3 -0
  55. data/lib/ruby-link-checker/result.rb +74 -0
  56. data/lib/ruby-link-checker/task.rb +20 -0
  57. data/lib/ruby-link-checker/tasks.rb +99 -0
  58. data/lib/ruby-link-checker/typhoeus/hydra/checker.rb +52 -0
  59. data/lib/ruby-link-checker/typhoeus/hydra/config.rb +35 -0
  60. data/lib/ruby-link-checker/typhoeus/hydra/result.rb +53 -0
  61. data/lib/ruby-link-checker/typhoeus/hydra.rb +3 -0
  62. data/lib/ruby-link-checker/version.rb +5 -0
  63. data/lib/ruby-link-checker.rb +13 -0
  64. data/lib/ruby_link_checker.rb +3 -0
  65. data/pkg/ruby-link-checker-0.1.0.gem +0 -0
  66. data/ruby-link-checker.gemspec +21 -0
  67. data/spec/fixtures/200.yml +65 -0
  68. data/spec/fixtures/301_200.yml +102 -0
  69. data/spec/fixtures/301_301.yml +114 -0
  70. data/spec/fixtures/301_400_301_200.yml +185 -0
  71. data/spec/fixtures/301_403.yml +78 -0
  72. data/spec/fixtures/404.yml +57 -0
  73. data/spec/fixtures/404_200.yml +89 -0
  74. data/spec/fixtures/404_404.yml +81 -0
  75. data/spec/fixtures/429_200.yml +135 -0
  76. data/spec/fixtures/429_429_200.yml +201 -0
  77. data/spec/ruby-link-checker/callbacks_spec.rb +43 -0
  78. data/spec/ruby-link-checker/checker_spec.rb +10 -0
  79. data/spec/ruby-link-checker/config_spec.rb +39 -0
  80. data/spec/ruby-link-checker/net/http/checker_spec.rb +61 -0
  81. data/spec/ruby-link-checker/typhoeus/hydra/checker_spec.rb +67 -0
  82. data/spec/ruby-link-checker/version_spec.rb +9 -0
  83. data/spec/spec_helper.rb +17 -0
  84. data/spec/support/config.rb +8 -0
  85. data/spec/support/link_checker.rb +322 -0
  86. data/spec/support/vcr.rb +13 -0
  87. data/spec/support/with_result.rb +15 -0
  88. data/spec/support/with_url.rb +14 -0
  89. metadata +144 -0
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkChecker
4
+ module Callbacks
5
+ def callbacks
6
+ @callbacks ||= Hash.new { |h, k| h[k] = [] }
7
+ end
8
+
9
+ def delegates
10
+ @delegates ||= []
11
+ end
12
+
13
+ def on(*events, &block)
14
+ if events && Array(events).any?
15
+ Array(events).each do |event|
16
+ callbacks[event.to_s] << block
17
+ end
18
+ else
19
+ delegates << block
20
+ end
21
+ end
22
+
23
+ def method_missing(m, *args, &block)
24
+ if m.to_s[-1] == '!'
25
+ callback(m.to_s[...-1].to_sym, *args)
26
+ else
27
+ super
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def callback(event, *data)
34
+ delegates.each do |c|
35
+ c.call(event, *data)
36
+ end
37
+
38
+ callbacks = self.callbacks[event.to_s]
39
+ return false unless callbacks
40
+
41
+ callbacks.each do |c|
42
+ c.call(*data)
43
+ end
44
+ true
45
+ rescue StandardError => e
46
+ logger.error("#{self}##{__method__}") { e }
47
+ false
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkChecker
4
+ class Checker
5
+ include LinkChecker::Config
6
+ include LinkChecker::Callbacks
7
+
8
+ attr_reader :results
9
+ attr_accessor(*Config::ATTRIBUTES)
10
+
11
+ def initialize(options = {})
12
+ LinkChecker::Config::ATTRIBUTES.each do |key|
13
+ send("#{key}=", options[key] || LinkChecker.config.send(key))
14
+ end
15
+ raise ArgumentError, "Missing methods." if methods&.none?
16
+ @logger ||= options[:logger] || LinkChecker::Config.logger || LinkChecker::Logger.default
17
+ @results = { error: [], failure: [], success: [] } unless options.key?(:results) && !options[:results]
18
+ end
19
+
20
+ def task_klass
21
+ @task_klass ||= begin
22
+ module_name = self.class.name.split("::")[...-1].join('::')
23
+ Object.const_get("#{module_name}::Task")
24
+ end
25
+ end
26
+
27
+ def check(uri, options = {})
28
+ tasks = Tasks.new(
29
+ self,
30
+ task_klass,
31
+ uri,
32
+ methods,
33
+ options
34
+ )
35
+ tasks.on do |event, *args|
36
+ results[event] << args.first if @results && %i[error failure success].include?(event)
37
+ callback event, *args
38
+ end
39
+ tasks.execute!
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkChecker
4
+ module Config
5
+ extend self
6
+
7
+ ATTRIBUTES = %i[
8
+ methods
9
+ user_agent
10
+ logger
11
+ retries
12
+ ].freeze
13
+
14
+ attr_accessor(*Config::ATTRIBUTES)
15
+
16
+ def reset
17
+ self.methods = %w[HEAD GET]
18
+ self.user_agent = "Ruby Link Checker/#{LinkChecker::VERSION}"
19
+ self.logger = nil
20
+ self.retries = 0
21
+ end
22
+
23
+ def retries=(value)
24
+ raise ArgumentError, "Invalid number of retries: #{value}" unless value.is_a?(Integer) && value >= 0
25
+
26
+ @retries = value
27
+ end
28
+ end
29
+
30
+ class << self
31
+ def configure
32
+ block_given? ? yield(Config) : Config
33
+ end
34
+
35
+ def config
36
+ Config
37
+ end
38
+ end
39
+ end
40
+
41
+ LinkChecker::Config.reset
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkChecker
4
+ module Errors
5
+ class BaseError < StandardError
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkChecker
4
+ module Errors
5
+ class RedirectLoopError < BaseError
6
+ attr_accessor :urls
7
+
8
+ def initialize(urls)
9
+ @urls = urls
10
+ super "Redirect loop: #{urls.join(' -> ')}."
11
+ end
12
+
13
+ def url
14
+ @urls.last
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'errors/base_error'
2
+ require_relative 'errors/redirect_loop_error'
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ require 'logger'
3
+
4
+ module LinkChecker
5
+ class Logger < ::Logger
6
+ def self.default
7
+ return @default if @default
8
+
9
+ logger = Logger.new(STDOUT)
10
+ logger.level = Logger::WARN
11
+ @default = logger
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ module LinkChecker
2
+ module Net
3
+ module HTTP
4
+ class Task < ::LinkChecker::Task
5
+ def run!
6
+ ::Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
7
+ http.read_timeout = checker.read_timeout if checker.read_timeout
8
+ http.open_timeout = checker.open_timeout if checker.open_timeout
9
+ request = ::Net::HTTPGenericRequest.new(method, false, true, uri)
10
+ request['User-Agent'] = checker.user_agent
11
+ response = http.request(request)
12
+ logger.debug "#{method} #{uri}: #{response.code}"
13
+ result! Result.new(uri, method, original_uri, request, response, options)
14
+ end
15
+ end
16
+ end
17
+
18
+ class Checker < LinkChecker::Checker
19
+ extend ::LinkChecker::Net::HTTP::Config
20
+ attr_accessor(*LinkChecker::Net::HTTP::Config::ATTRIBUTES)
21
+
22
+ def initialize(options = {})
23
+ LinkChecker::Net::HTTP::Config::ATTRIBUTES.each do |key|
24
+ send("#{key}=", options[key] || LinkChecker::Net::HTTP::Config.send(key))
25
+ end
26
+ super options
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkChecker
4
+ module Net
5
+ module HTTP
6
+ module Config
7
+ extend self
8
+
9
+ ATTRIBUTES = %i[
10
+ read_timeout
11
+ open_timeout
12
+ ].freeze
13
+
14
+ attr_accessor(*Config::ATTRIBUTES)
15
+
16
+ def reset
17
+ self.read_timeout = nil
18
+ self.open_timeout = nil
19
+ end
20
+ end
21
+
22
+ class << self
23
+ def configure
24
+ block_given? ? yield(Config) : Config
25
+ end
26
+
27
+ def config
28
+ Config
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ LinkChecker::Net::HTTP::Config.reset
@@ -0,0 +1,53 @@
1
+ module LinkChecker
2
+ module Net
3
+ module HTTP
4
+ class Result < ::LinkChecker::Result
5
+ attr_accessor :request, :response
6
+
7
+ def initialize(uri, method, original_uri, request, response, options)
8
+ @request = request
9
+ @response = response
10
+ super uri, method, original_uri, options
11
+ end
12
+
13
+ def error?
14
+ false
15
+ end
16
+
17
+ def failure?
18
+ !success? && !redirect?
19
+ end
20
+
21
+ def code
22
+ @code ||= begin
23
+ response.code.to_i
24
+ rescue StandardError
25
+ -1
26
+ end
27
+ end
28
+
29
+ def request_headers
30
+ request
31
+ end
32
+
33
+ def redirect_to
34
+ return nil unless response
35
+
36
+ response['Location']
37
+ end
38
+
39
+ def redirect?
40
+ return false unless response
41
+
42
+ [301, 302, 303, 307, 308].include?(code)
43
+ end
44
+
45
+ def success?
46
+ return false unless response
47
+
48
+ code >= 200 && code <= 299
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'http/config'
2
+ require_relative 'http/result'
3
+ require_relative 'http/checker'
@@ -0,0 +1,74 @@
1
+ module LinkChecker
2
+ class Result
3
+ attr_accessor :uri, :result_uri, :method, :options, :checker
4
+
5
+ def initialize(current_uri, method, original_uri, options = {})
6
+ @uri = original_uri
7
+ @result_uri = current_uri
8
+ @method = method
9
+ @options = options
10
+ end
11
+
12
+ def success?
13
+ false
14
+ end
15
+
16
+ def failure?
17
+ false
18
+ end
19
+
20
+ def error?
21
+ false
22
+ end
23
+
24
+ def redirect?
25
+ false
26
+ end
27
+
28
+ def redirect_to
29
+ nil
30
+ end
31
+
32
+ def request_headers
33
+ {}
34
+ end
35
+
36
+ def code
37
+ nil
38
+ end
39
+
40
+ def error
41
+ nil
42
+ end
43
+
44
+ def to_s
45
+ status_s = if success?
46
+ 'OK'
47
+ elsif failure?
48
+ 'FAIL'
49
+ elsif redirect?
50
+ 'REDIRECT'
51
+ else
52
+ 'ERROR'
53
+ end
54
+ "#{method} #{uri}#{result_uri == uri ? nil : ' (' + result_uri.to_s + ')'}: #{status_s} (#{code})"
55
+ end
56
+ end
57
+
58
+ class ResultError < Result
59
+ attr_accessor :error
60
+
61
+ def initialize(uri, method, original_uri, error, options = {})
62
+ @error = error
63
+ super uri, method, original_uri, options
64
+ end
65
+
66
+ def error?
67
+ true
68
+ end
69
+
70
+ def code
71
+ error.class.name
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,20 @@
1
+ module LinkChecker
2
+ class Task
3
+ include LinkChecker::Callbacks
4
+
5
+ attr_reader :uri, :original_uri, :method, :logger, :options, :checker
6
+
7
+ def initialize(checker, uri, method, original_uri, options = {})
8
+ @checker = checker
9
+ @logger = checker.logger
10
+ @uri = uri
11
+ @original_uri = original_uri || @uri
12
+ @method = method
13
+ @options = options
14
+ end
15
+
16
+ def run!
17
+ raise NotImplementedError
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,99 @@
1
+ module LinkChecker
2
+ class Tasks
3
+ include LinkChecker::Callbacks
4
+
5
+ attr_reader :result, :uri, :original_uri
6
+
7
+ def initialize(checker, task_klass, uri, methods, options = {})
8
+ @uri = uri
9
+ @retries_left = checker.retries
10
+ @methods_left = methods.dup
11
+ @methods = methods.dup
12
+ @task_klass = task_klass
13
+ @checker = checker
14
+ @logger = checker.logger
15
+ @redirects = [uri]
16
+ @options = options
17
+ raise ArgumentError, :tasks_klass unless @task_klass && @task_klass < ::LinkChecker::Task
18
+ end
19
+
20
+ def new_task(uri, method, original_uri, options)
21
+ task_klass.new(checker, uri, method, original_uri, options)
22
+ end
23
+
24
+ def execute!
25
+ if retry?
26
+ @retries_left -= 1
27
+ retry! @result
28
+ _queue_task(uri, method, original_uri || uri, options)
29
+ elsif methods_left.any?
30
+ @method = methods_left.shift
31
+ @redirects = [uri]
32
+ @uri = URI(@uri) unless @uri.is_a?(URI)
33
+ _queue_task(uri, method, original_uri || uri, options)
34
+ elsif @result && result.error?
35
+ error! @result
36
+ else
37
+ failure! @result
38
+ end
39
+ rescue StandardError => e
40
+ logger.error("#{self}##{__method__}") { e }
41
+ _handle_result ResultError.new(uri, method, original_uri || uri, e, options)
42
+ end
43
+
44
+ private
45
+
46
+ attr_reader :logger, :methods_left, :options, :task_klass, :redirects, :checker, :method
47
+
48
+ def retries
49
+ checker.retries
50
+ end
51
+
52
+ def first_time?
53
+ !!method.nil?
54
+ end
55
+
56
+ def retries_left
57
+ @retries_left ||= retries
58
+ end
59
+
60
+ def retry?
61
+ !first_time? && retries_left > 0
62
+ end
63
+
64
+ def _queue_task(uri, method, original_uri, options = {})
65
+ task = new_task(uri, method, original_uri, options)
66
+ task.on :result do |result|
67
+ _handle_result result
68
+ end
69
+ task.run!
70
+ rescue StandardError => e
71
+ logger.error("#{self}##{__method__}") { e }
72
+ _handle_result ResultError.new(uri, method, original_uri, e, options)
73
+ end
74
+
75
+ def _handle_result(result)
76
+ @result = result
77
+ logger.info "#{' ' * (redirects.count - 1)}#{result}"
78
+ result! result
79
+ if result.redirect?
80
+ redirect! result
81
+ redirected_to_uri = URI.join(uri, result.redirect_to)
82
+ if redirects.include?(redirected_to_uri)
83
+ raise LinkChecker::Errors::RedirectLoopError,
84
+ redirects.push(redirected_to_uri)
85
+ end
86
+
87
+ redirects << redirected_to_uri
88
+ _queue_task(redirected_to_uri, result.method, uri, options)
89
+ elsif result.success?
90
+ success! result
91
+ else
92
+ execute!
93
+ end
94
+ rescue StandardError => e
95
+ logger.error("#{self}##{__method__}") { e }
96
+ _handle_result ResultError.new(result.uri, result.method, result.result_uri, e, options)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,52 @@
1
+ module LinkChecker
2
+ module Typhoeus
3
+ module Hydra
4
+ class Task < ::LinkChecker::Task
5
+ def run!
6
+ request = ::Typhoeus::Request.new(
7
+ uri, {
8
+ method: method,
9
+ followlocation: false,
10
+ timeout: checker.timeout,
11
+ connecttimeout: checker.connecttimeout,
12
+ headers: {
13
+ 'User-Agent' => checker.user_agent
14
+ }
15
+ }
16
+ )
17
+ request.on_complete do |response|
18
+ if response.timed_out?
19
+ logger.debug "#{method} #{uri}: #{response.return_code}"
20
+ result! ResultError.new(uri, method, original_uri, Timeout::Error.new, options)
21
+ else
22
+ logger.debug "#{method} #{uri}: #{response.code}"
23
+ result! Result.new(uri, method, original_uri, request, response, options)
24
+ end
25
+ end
26
+ checker._queue(request)
27
+ end
28
+ end
29
+
30
+ class Checker < LinkChecker::Checker
31
+ extend ::LinkChecker::Typhoeus::Hydra::Config
32
+ attr_accessor(*LinkChecker::Typhoeus::Hydra::Config::ATTRIBUTES)
33
+
34
+ def initialize(options = {})
35
+ LinkChecker::Typhoeus::Hydra::Config::ATTRIBUTES.each do |key|
36
+ send("#{key}=", options[key] || LinkChecker::Typhoeus::Hydra::Config.send(key))
37
+ end
38
+ @hydra = ::Typhoeus::Hydra.new(options[:hydra] || { max_concurrency: 10 })
39
+ super options
40
+ end
41
+
42
+ def run
43
+ @hydra.run
44
+ end
45
+
46
+ def _queue(request)
47
+ @hydra.queue(request)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkChecker
4
+ module Typhoeus
5
+ module Hydra
6
+ module Config
7
+ extend self
8
+
9
+ ATTRIBUTES = %i[
10
+ timeout
11
+ connecttimeout
12
+ ].freeze
13
+
14
+ attr_accessor(*Config::ATTRIBUTES)
15
+
16
+ def reset
17
+ self.timeout = 60
18
+ self.connecttimeout = 10
19
+ end
20
+ end
21
+
22
+ class << self
23
+ def configure
24
+ block_given? ? yield(Config) : Config
25
+ end
26
+
27
+ def config
28
+ Config
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ LinkChecker::Typhoeus::Hydra::Config.reset
@@ -0,0 +1,53 @@
1
+ module LinkChecker
2
+ module Typhoeus
3
+ module Hydra
4
+ class Result < ::LinkChecker::Result
5
+ attr_accessor :request, :response
6
+
7
+ def initialize(uri, method, original_uri, request, response, options)
8
+ @request = request
9
+ @response = response
10
+ super uri, method, original_uri, options
11
+ end
12
+
13
+ def error?
14
+ false
15
+ end
16
+
17
+ def failure?
18
+ !success? && !redirect? && !error?
19
+ end
20
+
21
+ def code
22
+ @code ||= begin
23
+ response.code.to_i
24
+ rescue StandardError
25
+ -1
26
+ end
27
+ end
28
+
29
+ def request_headers
30
+ request.options[:headers]
31
+ end
32
+
33
+ def redirect_to
34
+ return nil unless response
35
+
36
+ response.headers['Location']
37
+ end
38
+
39
+ def redirect?
40
+ return false unless response
41
+
42
+ [301, 302, 303, 307, 308].include?(code)
43
+ end
44
+
45
+ def success?
46
+ return false unless response
47
+
48
+ code >= 200 && code <= 299
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'hydra/config'
2
+ require_relative 'hydra/checker'
3
+ require_relative 'hydra/result'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkChecker
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ruby-link-checker/version'
4
+ require_relative 'ruby-link-checker/errors'
5
+ require_relative 'ruby-link-checker/config'
6
+ require_relative 'ruby-link-checker/callbacks'
7
+ require_relative 'ruby-link-checker/logger'
8
+ require_relative 'ruby-link-checker/task'
9
+ require_relative 'ruby-link-checker/tasks'
10
+ require_relative 'ruby-link-checker/checker'
11
+ require_relative 'ruby-link-checker/result'
12
+ require_relative 'ruby-link-checker/net/http'
13
+ require_relative 'ruby-link-checker/typhoeus/hydra'
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ruby-link-checker'
Binary file