ndd-url_checker 0.1.1 → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -2
- data/Guardfile +1 -1
- data/README.md +63 -3
- data/VERSION +1 -1
- data/lib/ndd/url_checker/abstract_url_checker.rb +5 -14
- data/lib/ndd/url_checker/blocking_url_checker.rb +18 -37
- data/lib/ndd/url_checker/forked_url_checker.rb +25 -29
- data/lib/ndd/url_checker/parallel_url_checker.rb +12 -11
- data/lib/ndd/url_checker/reporting_url_checker.html.erb +97 -0
- data/lib/ndd/url_checker/reporting_url_checker.rb +83 -0
- data/lib/ndd/url_checker/status.rb +20 -20
- data/lib/ndd/url_checker/threaded_url_checker.rb +10 -8
- data/ndd-url_checker.gemspec +123 -0
- data/spec/ndd/url_checker/abstract_url_checker_spec.rb +0 -6
- data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.html +111 -0
- data/spec/ndd/url_checker/reporting_url_checker/single_url.html +97 -0
- data/spec/ndd/url_checker/reporting_url_checker_spec.rb +70 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/multiple_url_checker_spec.rb +3 -11
- data/spec/support/single_url_checker_spec.rb +0 -36
- metadata +8 -2
| @@ -4,7 +4,7 @@ module NDD | |
| 4 4 | 
             
                # The result of a URI test.
         | 
| 5 5 | 
             
                # @author David DIDIER
         | 
| 6 6 | 
             
                # @attr_reader code [String] the state
         | 
| 7 | 
            -
                # @attr_reader error [String | 
| 7 | 
            +
                # @attr_reader error [String, StandardError] the last error if any
         | 
| 8 8 | 
             
                # @attr_reader uris [Array<String>] the list of requested URI
         | 
| 9 9 | 
             
                class Status
         | 
| 10 10 |  | 
| @@ -12,46 +12,45 @@ module NDD | |
| 12 12 | 
             
                  attr_reader :error
         | 
| 13 13 | 
             
                  attr_reader :uris
         | 
| 14 14 |  | 
| 15 | 
            -
                  #  | 
| 16 | 
            -
                  # @param uri [String | 
| 15 | 
            +
                  # Creates a new instance in the :unknown state.
         | 
| 16 | 
            +
                  # @param uri [String, URI::HTTP] the requested URI.
         | 
| 17 17 | 
             
                  def initialize(uri)
         | 
| 18 18 | 
             
                    @uris = [uri.to_s]
         | 
| 19 19 | 
             
                    @code = :unknown
         | 
| 20 20 | 
             
                  end
         | 
| 21 21 |  | 
| 22 | 
            -
                  # | 
| 23 | 
            -
                  # @return [String] the first requested URI.
         | 
| 22 | 
            +
                  # @return [String] the first requested URI.
         | 
| 24 23 | 
             
                  def uri
         | 
| 25 24 | 
             
                    uris.first
         | 
| 26 25 | 
             
                  end
         | 
| 27 26 |  | 
| 28 | 
            -
                  # | 
| 29 | 
            -
                  # | 
| 27 | 
            +
                  # Note that the :unknown code is neither valid nor invalid.
         | 
| 28 | 
            +
                  # @return [Boolean] true if valid, false otherwise.
         | 
| 30 29 | 
             
                  def valid?
         | 
| 31 30 | 
             
                    VALID_CODES.include? @code
         | 
| 32 31 | 
             
                  end
         | 
| 33 32 |  | 
| 34 | 
            -
                  # | 
| 35 | 
            -
                  # | 
| 33 | 
            +
                  # Note that the :unknown code is neither valid nor invalid.
         | 
| 34 | 
            +
                  # @return [Boolean] true if invalid, false otherwise.
         | 
| 36 35 | 
             
                  def invalid?
         | 
| 37 36 | 
             
                    INVALID_CODES.include? @code
         | 
| 38 37 | 
             
                  end
         | 
| 39 38 |  | 
| 40 | 
            -
                  # | 
| 39 | 
            +
                  # @return [Boolean] true if redirected, false otherwise.
         | 
| 41 40 | 
             
                  def redirected?
         | 
| 42 41 | 
             
                    @code == :redirected
         | 
| 43 42 | 
             
                  end
         | 
| 44 43 |  | 
| 45 44 |  | 
| 46 45 | 
             
                  # When the URI is valid without any redirect.
         | 
| 47 | 
            -
                  # | 
| 46 | 
            +
                  # @return [self]
         | 
| 48 47 | 
             
                  def direct
         | 
| 49 48 | 
             
                    update_code(:direct, %i(unknown))
         | 
| 50 49 | 
             
                  end
         | 
| 51 50 |  | 
| 52 | 
            -
                  # | 
| 51 | 
            +
                  # When a generic error is raised.
         | 
| 53 52 | 
             
                  # @param error [StandardError|String] the generic error.
         | 
| 54 | 
            -
                  # | 
| 53 | 
            +
                  # @return [self]
         | 
| 55 54 | 
             
                  def failed(error)
         | 
| 56 55 | 
             
                    @error = error
         | 
| 57 56 | 
             
                    update_code(:failed, %i(unknown redirected))
         | 
| @@ -59,20 +58,20 @@ module NDD | |
| 59 58 |  | 
| 60 59 | 
             
                  # Adds a new URI to the redirected URI list.
         | 
| 61 60 | 
             
                  # @param uri [String|URI::HTTP] the redirection URI.
         | 
| 62 | 
            -
                  # | 
| 61 | 
            +
                  # @return [self]
         | 
| 63 62 | 
             
                  def redirected(uri)
         | 
| 64 63 | 
             
                    @uris << uri.to_s
         | 
| 65 64 | 
             
                    update_code(:redirected, %i(unknown redirected))
         | 
| 66 65 | 
             
                  end
         | 
| 67 66 |  | 
| 68 | 
            -
                  # | 
| 69 | 
            -
                  # | 
| 67 | 
            +
                  # When there are too many redirects.
         | 
| 68 | 
            +
                  # @return [self]
         | 
| 70 69 | 
             
                  def too_many_redirects
         | 
| 71 70 | 
             
                    update_code(:too_many_redirects, %i(unknown redirected))
         | 
| 72 71 | 
             
                  end
         | 
| 73 72 |  | 
| 74 | 
            -
                  # | 
| 75 | 
            -
                  # | 
| 73 | 
            +
                  # When the host cannot be resolved.
         | 
| 74 | 
            +
                  # @return [self]
         | 
| 76 75 | 
             
                  def unknown_host
         | 
| 77 76 | 
             
                    update_code(:unknown_host, %i(unknown redirected))
         | 
| 78 77 | 
             
                  end
         | 
| @@ -82,15 +81,16 @@ module NDD | |
| 82 81 | 
             
                  end
         | 
| 83 82 |  | 
| 84 83 |  | 
| 84 | 
            +
                  # -------------------------------------------------------------------------------------------------- private -----
         | 
| 85 85 | 
             
                  private
         | 
| 86 86 |  | 
| 87 87 | 
             
                  VALID_CODES = %i(direct redirected).freeze
         | 
| 88 88 | 
             
                  INVALID_CODES = %i(failed too_many_redirects unknown_host).freeze
         | 
| 89 89 |  | 
| 90 | 
            -
                  # | 
| 90 | 
            +
                  # Updates the code if the transition is valid.
         | 
| 91 91 | 
             
                  # @param code [Symbol] the new code.
         | 
| 92 92 | 
             
                  # @param valid_source_codes [Array<Symbol>] the codes from which the transition can happen.
         | 
| 93 | 
            -
                  # | 
| 93 | 
            +
                  # @return [NDD::UrlChecker::Status] self.
         | 
| 94 94 | 
             
                  def update_code(code, valid_source_codes)
         | 
| 95 95 | 
             
                    unless valid_source_codes.include?(@code)
         | 
| 96 96 | 
             
                      raise "Changing the status code from :#{@code} to :#{code} is forbidden"
         | 
| @@ -8,29 +8,31 @@ module NDD | |
| 8 8 |  | 
| 9 9 | 
             
                # An URL checker using threads to parallelize processing. Does not work on MRI.
         | 
| 10 10 | 
             
                # @author David DIDIER
         | 
| 11 | 
            +
                # @attr_reader delegate [#check] the delegate URL checker.
         | 
| 12 | 
            +
                # @attr_reader parallelism [Fixnum] the number of threads.
         | 
| 11 13 | 
             
                class ThreadedUrlChecker < AbstractUrlChecker
         | 
| 12 14 |  | 
| 13 15 | 
             
                  attr_reader :delegate
         | 
| 16 | 
            +
                  attr_reader :parallelism
         | 
| 14 17 |  | 
| 15 18 | 
             
                  # Create a new instance.
         | 
| 16 | 
            -
                  # @param [AbstractUrlChecker]  | 
| 17 | 
            -
                  # @param [Fixnum]  | 
| 18 | 
            -
                  def initialize(delegate_checker | 
| 19 | 
            +
                  # @param delegate_checker [AbstractUrlChecker] defaults to {NDD::UrlChecker::BlockingUrlChecker}.
         | 
| 20 | 
            +
                  # @param parallelism [Fixnum] the number of threads.
         | 
| 21 | 
            +
                  def initialize(delegate_checker: nil, parallelism: 10)
         | 
| 19 22 | 
             
                    @logger = Logging.logger[self]
         | 
| 20 23 | 
             
                    @delegate = delegate_checker || BlockingUrlChecker.new
         | 
| 21 24 | 
             
                    @parallelism = parallelism
         | 
| 22 25 | 
             
                  end
         | 
| 23 26 |  | 
| 27 | 
            +
                  # Checks that the given URLs are valid.
         | 
| 28 | 
            +
                  # @param urls [String, Array<String>] the URLs to check
         | 
| 29 | 
            +
                  # @return [NDD::UrlChecker::Status, Array<NDD::UrlChecker::Status>] a single status for a single URL, an array
         | 
| 30 | 
            +
                  #         of status for multiple parameters
         | 
| 24 31 | 
             
                  def check(*urls)
         | 
| 25 32 | 
             
                    # delegate.check(*urls)
         | 
| 26 33 | 
             
                    raise 'TODO'
         | 
| 27 34 | 
             
                  end
         | 
| 28 35 |  | 
| 29 | 
            -
                  def validate(*urls)
         | 
| 30 | 
            -
                    # delegate.validate(*urls)
         | 
| 31 | 
            -
                    raise 'TODO'
         | 
| 32 | 
            -
                  end
         | 
| 33 | 
            -
             | 
| 34 36 | 
             
                end
         | 
| 35 37 | 
             
              end
         | 
| 36 38 | 
             
            end
         | 
| @@ -0,0 +1,123 @@ | |
| 1 | 
            +
            # Generated by jeweler
         | 
| 2 | 
            +
            # DO NOT EDIT THIS FILE DIRECTLY
         | 
| 3 | 
            +
            # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
         | 
| 4 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 5 | 
            +
            # stub: ndd-url_checker 0.2.0 ruby lib
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Gem::Specification.new do |s|
         | 
| 8 | 
            +
              s.name = "ndd-url_checker"
         | 
| 9 | 
            +
              s.version = "0.2.0"
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 12 | 
            +
              s.require_paths = ["lib"]
         | 
| 13 | 
            +
              s.authors = ["David DIDIER"]
         | 
| 14 | 
            +
              s.date = "2014-12-15"
         | 
| 15 | 
            +
              s.description = "Validate URLs"
         | 
| 16 | 
            +
              s.email = "c_inconnu2@yahoo.fr"
         | 
| 17 | 
            +
              s.extra_rdoc_files = [
         | 
| 18 | 
            +
                "LICENSE.txt",
         | 
| 19 | 
            +
                "README.md"
         | 
| 20 | 
            +
              ]
         | 
| 21 | 
            +
              s.files = [
         | 
| 22 | 
            +
                ".document",
         | 
| 23 | 
            +
                ".rspec",
         | 
| 24 | 
            +
                ".ruby-gemset",
         | 
| 25 | 
            +
                ".ruby-version",
         | 
| 26 | 
            +
                ".travis.yml",
         | 
| 27 | 
            +
                "CHANGELOG.md",
         | 
| 28 | 
            +
                "Gemfile",
         | 
| 29 | 
            +
                "Gemfile.lock",
         | 
| 30 | 
            +
                "Guardfile",
         | 
| 31 | 
            +
                "LICENSE.txt",
         | 
| 32 | 
            +
                "README.md",
         | 
| 33 | 
            +
                "Rakefile",
         | 
| 34 | 
            +
                "VERSION",
         | 
| 35 | 
            +
                "lib/ndd/url_checker.rb",
         | 
| 36 | 
            +
                "lib/ndd/url_checker/abstract_url_checker.rb",
         | 
| 37 | 
            +
                "lib/ndd/url_checker/blocking_url_checker.rb",
         | 
| 38 | 
            +
                "lib/ndd/url_checker/forked_url_checker.rb",
         | 
| 39 | 
            +
                "lib/ndd/url_checker/parallel_url_checker.rb",
         | 
| 40 | 
            +
                "lib/ndd/url_checker/reporting_url_checker.html.erb",
         | 
| 41 | 
            +
                "lib/ndd/url_checker/reporting_url_checker.rb",
         | 
| 42 | 
            +
                "lib/ndd/url_checker/status.rb",
         | 
| 43 | 
            +
                "lib/ndd/url_checker/threaded_url_checker.rb",
         | 
| 44 | 
            +
                "ndd-url_checker.gemspec",
         | 
| 45 | 
            +
                "spec/ndd/url_checker/abstract_url_checker_spec.rb",
         | 
| 46 | 
            +
                "spec/ndd/url_checker/blocking_url_checker_spec.rb",
         | 
| 47 | 
            +
                "spec/ndd/url_checker/forked_url_checker_spec.rb",
         | 
| 48 | 
            +
                "spec/ndd/url_checker/parallel_url_checker_spec.rb",
         | 
| 49 | 
            +
                "spec/ndd/url_checker/reporting_url_checker/multiple_urls.html",
         | 
| 50 | 
            +
                "spec/ndd/url_checker/reporting_url_checker/single_url.html",
         | 
| 51 | 
            +
                "spec/ndd/url_checker/reporting_url_checker_spec.rb",
         | 
| 52 | 
            +
                "spec/ndd/url_checker/status_spec.rb",
         | 
| 53 | 
            +
                "spec/ndd/url_checker/threaded_url_checker_spec.rb",
         | 
| 54 | 
            +
                "spec/spec_helper.rb",
         | 
| 55 | 
            +
                "spec/support/multiple_url_checker_spec.rb",
         | 
| 56 | 
            +
                "spec/support/single_url_checker_spec.rb"
         | 
| 57 | 
            +
              ]
         | 
| 58 | 
            +
              s.homepage = "http://github.com/ddidier/ndd-url_checker"
         | 
| 59 | 
            +
              s.licenses = ["MIT"]
         | 
| 60 | 
            +
              s.rubygems_version = "2.4.4"
         | 
| 61 | 
            +
              s.summary = "Validate URLs"
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              if s.respond_to? :specification_version then
         | 
| 64 | 
            +
                s.specification_version = 4
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
         | 
| 67 | 
            +
                  s.add_runtime_dependency(%q<cod>, ["~> 0.6"])
         | 
| 68 | 
            +
                  s.add_runtime_dependency(%q<logging>, ["~> 1.8"])
         | 
| 69 | 
            +
                  s.add_development_dependency(%q<bundler>, ["~> 1.7"])
         | 
| 70 | 
            +
                  s.add_development_dependency(%q<guard>, ["~> 2.8"])
         | 
| 71 | 
            +
                  s.add_development_dependency(%q<guard-bundler>, ["~> 2.0"])
         | 
| 72 | 
            +
                  s.add_development_dependency(%q<guard-rspec>, ["~> 4.3"])
         | 
| 73 | 
            +
                  s.add_development_dependency(%q<guard-spork>, ["~> 2.0"])
         | 
| 74 | 
            +
                  s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
         | 
| 75 | 
            +
                  s.add_development_dependency(%q<rdoc>, ["~> 4.1"])
         | 
| 76 | 
            +
                  s.add_development_dependency(%q<rspec>, ["~> 3.1"])
         | 
| 77 | 
            +
                  s.add_development_dependency(%q<rspec-collection_matchers>, ["~> 1.1"])
         | 
| 78 | 
            +
                  s.add_development_dependency(%q<simplecov>, ["~> 0.9"])
         | 
| 79 | 
            +
                  s.add_development_dependency(%q<spork>, ["~> 0.9"])
         | 
| 80 | 
            +
                  s.add_development_dependency(%q<webmock>, ["~> 1.20"])
         | 
| 81 | 
            +
                  s.add_development_dependency(%q<yard>, ["~> 0.8"])
         | 
| 82 | 
            +
                  s.add_development_dependency(%q<libnotify>, [">= 0"])
         | 
| 83 | 
            +
                  s.add_development_dependency(%q<rb-inotify>, [">= 0"])
         | 
| 84 | 
            +
                else
         | 
| 85 | 
            +
                  s.add_dependency(%q<cod>, ["~> 0.6"])
         | 
| 86 | 
            +
                  s.add_dependency(%q<logging>, ["~> 1.8"])
         | 
| 87 | 
            +
                  s.add_dependency(%q<bundler>, ["~> 1.7"])
         | 
| 88 | 
            +
                  s.add_dependency(%q<guard>, ["~> 2.8"])
         | 
| 89 | 
            +
                  s.add_dependency(%q<guard-bundler>, ["~> 2.0"])
         | 
| 90 | 
            +
                  s.add_dependency(%q<guard-rspec>, ["~> 4.3"])
         | 
| 91 | 
            +
                  s.add_dependency(%q<guard-spork>, ["~> 2.0"])
         | 
| 92 | 
            +
                  s.add_dependency(%q<jeweler>, ["~> 2.0"])
         | 
| 93 | 
            +
                  s.add_dependency(%q<rdoc>, ["~> 4.1"])
         | 
| 94 | 
            +
                  s.add_dependency(%q<rspec>, ["~> 3.1"])
         | 
| 95 | 
            +
                  s.add_dependency(%q<rspec-collection_matchers>, ["~> 1.1"])
         | 
| 96 | 
            +
                  s.add_dependency(%q<simplecov>, ["~> 0.9"])
         | 
| 97 | 
            +
                  s.add_dependency(%q<spork>, ["~> 0.9"])
         | 
| 98 | 
            +
                  s.add_dependency(%q<webmock>, ["~> 1.20"])
         | 
| 99 | 
            +
                  s.add_dependency(%q<yard>, ["~> 0.8"])
         | 
| 100 | 
            +
                  s.add_dependency(%q<libnotify>, [">= 0"])
         | 
| 101 | 
            +
                  s.add_dependency(%q<rb-inotify>, [">= 0"])
         | 
| 102 | 
            +
                end
         | 
| 103 | 
            +
              else
         | 
| 104 | 
            +
                s.add_dependency(%q<cod>, ["~> 0.6"])
         | 
| 105 | 
            +
                s.add_dependency(%q<logging>, ["~> 1.8"])
         | 
| 106 | 
            +
                s.add_dependency(%q<bundler>, ["~> 1.7"])
         | 
| 107 | 
            +
                s.add_dependency(%q<guard>, ["~> 2.8"])
         | 
| 108 | 
            +
                s.add_dependency(%q<guard-bundler>, ["~> 2.0"])
         | 
| 109 | 
            +
                s.add_dependency(%q<guard-rspec>, ["~> 4.3"])
         | 
| 110 | 
            +
                s.add_dependency(%q<guard-spork>, ["~> 2.0"])
         | 
| 111 | 
            +
                s.add_dependency(%q<jeweler>, ["~> 2.0"])
         | 
| 112 | 
            +
                s.add_dependency(%q<rdoc>, ["~> 4.1"])
         | 
| 113 | 
            +
                s.add_dependency(%q<rspec>, ["~> 3.1"])
         | 
| 114 | 
            +
                s.add_dependency(%q<rspec-collection_matchers>, ["~> 1.1"])
         | 
| 115 | 
            +
                s.add_dependency(%q<simplecov>, ["~> 0.9"])
         | 
| 116 | 
            +
                s.add_dependency(%q<spork>, ["~> 0.9"])
         | 
| 117 | 
            +
                s.add_dependency(%q<webmock>, ["~> 1.20"])
         | 
| 118 | 
            +
                s.add_dependency(%q<yard>, ["~> 0.8"])
         | 
| 119 | 
            +
                s.add_dependency(%q<libnotify>, [">= 0"])
         | 
| 120 | 
            +
                s.add_dependency(%q<rb-inotify>, [">= 0"])
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
            end
         | 
| 123 | 
            +
             | 
| @@ -2,12 +2,6 @@ require 'spec_helper' | |
| 2 2 |  | 
| 3 3 | 
             
            describe NDD::UrlChecker::AbstractUrlChecker do
         | 
| 4 4 |  | 
| 5 | 
            -
              context '#validate' do
         | 
| 6 | 
            -
                it 'is not implemented' do
         | 
| 7 | 
            -
                  expect { subject.validate('http://www.valid.mock/') }.to raise_error /must be implemented/
         | 
| 8 | 
            -
                end
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
             | 
| 11 5 | 
             
              context '#check' do
         | 
| 12 6 | 
             
                it 'is not implemented' do
         | 
| 13 7 | 
             
                  expect { subject.check('http://www.valid.mock/') }.to raise_error /must be implemented/
         | 
| @@ -0,0 +1,111 @@ | |
| 1 | 
            +
            <!DOCTYPE html>
         | 
| 2 | 
            +
            <html lang="en">
         | 
| 3 | 
            +
             | 
| 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 | 
            +
                    }
         | 
| 11 | 
            +
                </style>
         | 
| 12 | 
            +
             | 
| 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>
         | 
| 15 | 
            +
                <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 | 
            +
                            }
         | 
| 24 | 
            +
                        });
         | 
| 25 | 
            +
                    });
         | 
| 26 | 
            +
                </script>
         | 
| 27 | 
            +
            </head>
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            <body>
         | 
| 30 | 
            +
             | 
| 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>3</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>
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            <table class="table table-condensed table-hover" style="width: auto">
         | 
| 76 | 
            +
                <thead>
         | 
| 77 | 
            +
                <tr>
         | 
| 78 | 
            +
                    <th>#</th>
         | 
| 79 | 
            +
                    <th>URL</th>
         | 
| 80 | 
            +
                    <th>Result</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.com" target="_blank">http://www.google.com</a></td>
         | 
| 89 | 
            +
                    <td>NDD::UrlChecker::Status</td>
         | 
| 90 | 
            +
                    <td></td>
         | 
| 91 | 
            +
                </tr>
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                <tr class="danger">
         | 
| 94 | 
            +
                    <td>2</td>
         | 
| 95 | 
            +
                    <td><a href="http://www.google.de" target="_blank">http://www.google.de</a></td>
         | 
| 96 | 
            +
                    <td>NDD::UrlChecker::Status</td>
         | 
| 97 | 
            +
                    <td>some error</td>
         | 
| 98 | 
            +
                </tr>
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                <tr class="">
         | 
| 101 | 
            +
                    <td>3</td>
         | 
| 102 | 
            +
                    <td><a href="http://www.google.fr" target="_blank">http://www.google.fr</a></td>
         | 
| 103 | 
            +
                    <td>NDD::UrlChecker::Status</td>
         | 
| 104 | 
            +
                    <td></td>
         | 
| 105 | 
            +
                </tr>
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                </tbody>
         | 
| 108 | 
            +
            </table>
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            </body>
         | 
| 111 | 
            +
            </html>
         | 
| @@ -0,0 +1,97 @@ | |
| 1 | 
            +
            <!DOCTYPE html>
         | 
| 2 | 
            +
            <html lang="en">
         | 
| 3 | 
            +
             | 
| 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 | 
            +
                    }
         | 
| 11 | 
            +
                </style>
         | 
| 12 | 
            +
             | 
| 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>
         | 
| 15 | 
            +
                <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 | 
            +
                            }
         | 
| 24 | 
            +
                        });
         | 
| 25 | 
            +
                    });
         | 
| 26 | 
            +
                </script>
         | 
| 27 | 
            +
            </head>
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            <body>
         | 
| 30 | 
            +
             | 
| 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>
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            <table class="table table-condensed table-hover" style="width: auto">
         | 
| 76 | 
            +
                <thead>
         | 
| 77 | 
            +
                <tr>
         | 
| 78 | 
            +
                    <th>#</th>
         | 
| 79 | 
            +
                    <th>URL</th>
         | 
| 80 | 
            +
                    <th>Result</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>NDD::UrlChecker::Status</td>
         | 
| 90 | 
            +
                    <td></td>
         | 
| 91 | 
            +
                </tr>
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                </tbody>
         | 
| 94 | 
            +
            </table>
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            </body>
         | 
| 97 | 
            +
            </html>
         | 
| @@ -0,0 +1,70 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe NDD::UrlChecker::ReportingUrlChecker do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              before(:all) do
         | 
| 6 | 
            +
                # Logging.logger.root.level = :debug
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              subject(:checker) { NDD::UrlChecker::ReportingUrlChecker.new(NDD::UrlChecker::BlockingUrlChecker.new) }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              it_behaves_like 'a single URL checker'
         | 
| 12 | 
            +
              it_behaves_like 'a multiple URL checker'
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 15 | 
            +
              # ------------------------------------------------------------------------------------------------------ #report -----
         | 
| 16 | 
            +
              describe '#report' do
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                context 'when checking a single URL' do
         | 
| 19 | 
            +
                  it 'creates an HTML report' do
         | 
| 20 | 
            +
                    expected_result = NDD::UrlChecker::Status.new('http://www.google.fr').direct
         | 
| 21 | 
            +
                    checker = double
         | 
| 22 | 
            +
                    expect(checker).to receive(:check).and_return(expected_result)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    report_checker = NDD::UrlChecker::ReportingUrlChecker.new(checker)
         | 
| 25 | 
            +
                    report_checker.check(expected_result.uri)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    actual_report = actual_report(report_checker, 'single_url.html')
         | 
| 28 | 
            +
                    expected_report = expected_report('single_url.html')
         | 
| 29 | 
            +
                    expect(actual_report).to eq expected_report
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                context 'when checking multiple URLs' do
         | 
| 34 | 
            +
                  it 'creates an HTML report' do
         | 
| 35 | 
            +
                    expected_results = [
         | 
| 36 | 
            +
                        NDD::UrlChecker::Status.new('http://www.google.fr').direct,
         | 
| 37 | 
            +
                        NDD::UrlChecker::Status.new('http://www.google.com').direct,
         | 
| 38 | 
            +
                        NDD::UrlChecker::Status.new('http://www.google.de').failed('some error')
         | 
| 39 | 
            +
                    ]
         | 
| 40 | 
            +
                    checker = double
         | 
| 41 | 
            +
                    expect(checker).to receive(:check).and_return(expected_results)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    report_checker = NDD::UrlChecker::ReportingUrlChecker.new(checker)
         | 
| 44 | 
            +
                    report_checker.check(*expected_results.map { |status| status.uri })
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    actual_report = actual_report(report_checker, 'multiple_urls.html')
         | 
| 47 | 
            +
                    expected_report = expected_report('multiple_urls.html')
         | 
| 48 | 
            +
                    expect(actual_report).to eq expected_report
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
             | 
| 54 | 
            +
              # ------------------------------------------------------------------------------------------------------ private -----
         | 
| 55 | 
            +
              private
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              def actual_report(report_checker, output_file_name)
         | 
| 58 | 
            +
                # actual_file = '/tmp/multiple_urls.html'
         | 
| 59 | 
            +
                actual_file = Tempfile.new(output_file_name)
         | 
| 60 | 
            +
                actual_report = report_checker.report(:html, actual_file)
         | 
| 61 | 
            +
                expect(actual_report).to eq actual_file.read
         | 
| 62 | 
            +
                actual_report.gsub(/^\s+/, '').gsub(/<td>[\d\.e-]+ second\(s\)<\/td>/, '<td>XXX second(s)</td>')
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              def expected_report(expected_file_name)
         | 
| 66 | 
            +
                expected_path = File.expand_path(File.join(File.dirname(__FILE__), 'reporting_url_checker/' + expected_file_name))
         | 
| 67 | 
            +
                expected_report = File.new(expected_path).read
         | 
| 68 | 
            +
                expected_report.gsub(/^\s+/, '')
         | 
| 69 | 
            +
              end
         | 
| 70 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -27,6 +27,7 @@ Spork.prefork do | |
| 27 27 | 
             
              require 'logging'
         | 
| 28 28 | 
             
              require 'rspec'
         | 
| 29 29 | 
             
              require 'rspec/collection_matchers'
         | 
| 30 | 
            +
              require 'tempfile'
         | 
| 30 31 | 
             
              require 'webmock/rspec'
         | 
| 31 32 |  | 
| 32 33 | 
             
              # ----- code coverage
         | 
| @@ -79,5 +80,4 @@ Spork.each_run do | |
| 79 80 | 
             
              Dir["#{lib_path}/**/*.rb"].each { |file| require file }
         | 
| 80 81 | 
             
              Dir["#{spec_dir}/support/**/*.rb"].each { |file| require file }
         | 
| 81 82 |  | 
| 82 | 
            -
              require 'ndd/url_checker'
         | 
| 83 83 | 
             
            end
         | 
| @@ -17,26 +17,18 @@ RSpec.shared_examples 'a multiple URL checker' do |skip_verify| | |
| 17 17 | 
             
                let!(:stub1) { stub_request(:get, 'http://www.valid.mock/').to_return(status: 200) }
         | 
| 18 18 | 
             
                let!(:stub2) { stub_request(:get, 'http://www.invalid.mock/').to_raise(SocketError) }
         | 
| 19 19 |  | 
| 20 | 
            -
                describe '#validate' do
         | 
| 21 | 
            -
                  it 'returns a map of the results indexed by the URI' do
         | 
| 22 | 
            -
                    results = subject.validate('http://www.valid.mock/', 'http://www.invalid.mock/')
         | 
| 23 | 
            -
                    expect(results).to have(2).items
         | 
| 24 | 
            -
                    expect(results['http://www.valid.mock/']).to be_truthy
         | 
| 25 | 
            -
                    expect(results['http://www.invalid.mock/']).to be_falsey
         | 
| 26 | 
            -
                  end
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
             | 
| 29 20 | 
             
                describe '#check' do
         | 
| 30 21 | 
             
                  it 'returns a map of the results indexed by the URI' do
         | 
| 31 22 | 
             
                    results = subject.check('http://www.valid.mock/', 'http://www.invalid.mock/')
         | 
| 32 23 | 
             
                    expect(results).to have(2).items
         | 
| 24 | 
            +
                    results_hash = results.reduce({}) { |hash, result| hash[result.uri] = result; hash }
         | 
| 33 25 |  | 
| 34 | 
            -
                    status1 =  | 
| 26 | 
            +
                    status1 = results_hash['http://www.valid.mock/']
         | 
| 35 27 | 
             
                    expect(status1.code).to eq :direct
         | 
| 36 28 | 
             
                    expect(status1.uri).to eq 'http://www.valid.mock/'
         | 
| 37 29 | 
             
                    expect(status1.error).to be_nil
         | 
| 38 30 |  | 
| 39 | 
            -
                    status2 =  | 
| 31 | 
            +
                    status2 = results_hash['http://www.invalid.mock/']
         | 
| 40 32 | 
             
                    expect(status2.code).to eq :failed
         | 
| 41 33 | 
             
                    expect(status2.uri).to eq 'http://www.invalid.mock/'
         | 
| 42 34 | 
             
                    expect(status2.error).to be_a StandardError
         |