validate-website 1.9.3 → 1.10.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/History.md +11 -0
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/Rakefile +2 -0
- data/bin/validate-website +1 -0
- data/bin/validate-website-static +1 -0
- data/lib/validate_website.rb +2 -0
- data/lib/validate_website/colorful_messages.rb +3 -0
- data/lib/validate_website/core.rb +10 -6
- data/lib/validate_website/crawl.rb +7 -1
- data/lib/validate_website/option_parser.rb +3 -0
- data/lib/validate_website/runner.rb +3 -1
- data/lib/validate_website/static.rb +11 -3
- data/lib/validate_website/static_link.rb +4 -2
- data/lib/validate_website/utils.rb +3 -0
- data/lib/validate_website/validator.rb +6 -1
- data/lib/validate_website/validator_class_methods.rb +3 -0
- data/lib/validate_website/version.rb +1 -1
- data/test/core_test.rb +3 -1
- data/test/crawler_test.rb +35 -16
- data/test/static_test.rb +25 -5
- data/test/test_helper.rb +2 -3
- data/test/validator_test.rb +25 -23
- data/test/webmock_helper.rb +4 -2
- metadata +8 -23
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 4a5b0553089c9d66d3622781fe6c4ab5ca68ac6a198fe36c53c84c8d34e14adb
         | 
| 4 | 
            +
              data.tar.gz: f3f0cc4aef203f85ebb9868e793b7cd0312db8c4b6f7fb0d15beefeaaef1cc83
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c9a8fae92bcb19d5f92466a7b77f3e40cca59643c946c15563885d9e65a1d2793271dee2b723a296fe487d57634fdd88f4440a60d2fac625a6a7208c8105159d
         | 
| 7 | 
            +
              data.tar.gz: e7a78f899b42d5f27cb41e99472e37499389bf39c567dd9f16ab064fce38927a43de89c00411c25697c622ad76f59b8d4b9836d898249822cf9bc0d37591c3bf
         | 
    
        data/History.md
    CHANGED
    
    | @@ -1,4 +1,15 @@ | |
| 1 1 |  | 
| 2 | 
            +
            1.10.0 / 2020-07-03
         | 
| 3 | 
            +
            ==================
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              * Fix build for Ruby 2.3 and 2.4
         | 
| 6 | 
            +
              * Remove rbx-3 from build
         | 
| 7 | 
            +
              * Remove minitest-focus and fix minitest 6 warnings
         | 
| 8 | 
            +
              * Fix html5_validator option and change html5_validator_service_url
         | 
| 9 | 
            +
              * Add Ruby 2.7 to CI and update jruby
         | 
| 10 | 
            +
              * Update rubocop and fix offences
         | 
| 11 | 
            +
              * Remove Ruby 2.2 support and update rubocop
         | 
| 12 | 
            +
             | 
| 2 13 | 
             
            1.9.3 / 2019-04-11
         | 
| 3 14 | 
             
            ==================
         | 
| 4 15 |  | 
    
        data/LICENSE
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            The MIT License
         | 
| 2 2 |  | 
| 3 | 
            -
            Copyright (c) 2009- | 
| 3 | 
            +
            Copyright (c) 2009-2020 Laurent Arnoud <laurent@spkdev.net>
         | 
| 4 4 |  | 
| 5 5 | 
             
            Permission is hereby granted, free of charge, to any person obtaining
         | 
| 6 6 | 
             
            a copy of this software and associated documentation files (the
         | 
    
        data/README.md
    CHANGED
    
    | @@ -145,7 +145,7 @@ See [GitHub](https://github.com/spk/validate-website/graphs/contributors). | |
| 145 145 |  | 
| 146 146 | 
             
            The MIT License
         | 
| 147 147 |  | 
| 148 | 
            -
            Copyright (c) 2009- | 
| 148 | 
            +
            Copyright (c) 2009-2020 Laurent Arnoud <laurent@spkdev.net>
         | 
| 149 149 |  | 
| 150 150 | 
             
            ---
         | 
| 151 151 | 
             
            [](https://travis-ci.org/spk/validate-website)
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/bin/validate-website
    CHANGED
    
    
    
        data/bin/validate-website-static
    CHANGED
    
    
    
        data/lib/validate_website.rb
    CHANGED
    
    
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'set'
         | 
| 2 4 | 
             
            require 'open-uri'
         | 
| 3 5 | 
             
            require 'webrick/cookie'
         | 
| @@ -26,7 +28,7 @@ module ValidateWebsite | |
| 26 28 | 
             
                EXIT_FAILURE_MARKUP = 64
         | 
| 27 29 | 
             
                EXIT_FAILURE_NOT_FOUND = 65
         | 
| 28 30 | 
             
                EXIT_FAILURE_MARKUP_NOT_FOUND = 66
         | 
| 29 | 
            -
                START_MESSAGE = 'Validating' | 
| 31 | 
            +
                START_MESSAGE = 'Validating'
         | 
| 30 32 |  | 
| 31 33 | 
             
                # Initialize core ValidateWebsite class
         | 
| 32 34 | 
             
                # @example
         | 
| @@ -43,11 +45,11 @@ module ValidateWebsite | |
| 43 45 | 
             
                end
         | 
| 44 46 |  | 
| 45 47 | 
             
                def errors?
         | 
| 46 | 
            -
                  @errors_count | 
| 48 | 
            +
                  @errors_count.positive?
         | 
| 47 49 | 
             
                end
         | 
| 48 50 |  | 
| 49 51 | 
             
                def not_founds?
         | 
| 50 | 
            -
                  @not_founds_count | 
| 52 | 
            +
                  @not_founds_count.positive?
         | 
| 51 53 | 
             
                end
         | 
| 52 54 |  | 
| 53 55 | 
             
                def exit_status
         | 
| @@ -78,6 +80,7 @@ module ValidateWebsite | |
| 78 80 | 
             
                def check_css_syntax(page)
         | 
| 79 81 | 
             
                  nodes = Crass::Parser.parse_stylesheet(page.body)
         | 
| 80 82 | 
             
                  return unless any_css_errors?(nodes)
         | 
| 83 | 
            +
             | 
| 81 84 | 
             
                  handle_validation_error(page.url)
         | 
| 82 85 | 
             
                end
         | 
| 83 86 |  | 
| @@ -111,10 +114,10 @@ module ValidateWebsite | |
| 111 114 | 
             
                # @param [Nokogiri::HTML::Document] original_doc
         | 
| 112 115 | 
             
                # @param [String] The raw HTTP response body of the page
         | 
| 113 116 | 
             
                # @param [String] url
         | 
| 114 | 
            -
                # @param [ | 
| 117 | 
            +
                # @param [Hash] Validator options
         | 
| 115 118 | 
             
                #
         | 
| 116 | 
            -
                def validate(doc, body, url,  | 
| 117 | 
            -
                  validator = Validator.new(doc, body,  | 
| 119 | 
            +
                def validate(doc, body, url, options)
         | 
| 120 | 
            +
                  validator = Validator.new(doc, body, options)
         | 
| 118 121 | 
             
                  if validator.valid?
         | 
| 119 122 | 
             
                    print color(:success, '.', options[:color]) # rspec style
         | 
| 120 123 | 
             
                  else
         | 
| @@ -125,6 +128,7 @@ module ValidateWebsite | |
| 125 128 | 
             
                def handle_html_validation_error(validator, url)
         | 
| 126 129 | 
             
                  handle_validation_error(url)
         | 
| 127 130 | 
             
                  return unless options[:verbose]
         | 
| 131 | 
            +
             | 
| 128 132 | 
             
                  puts color(:error, validator.errors.join(', '), options[:color])
         | 
| 129 133 | 
             
                end
         | 
| 130 134 |  | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'validate_website/core'
         | 
| 2 4 | 
             
            require 'validate_website/utils'
         | 
| 3 5 |  | 
| @@ -41,6 +43,7 @@ module ValidateWebsite | |
| 41 43 | 
             
                #
         | 
| 42 44 | 
             
                def extract_imgs_from_page(page)
         | 
| 43 45 | 
             
                  return Set[] if page.is_redirect?
         | 
| 46 | 
            +
             | 
| 44 47 | 
             
                  page.doc.search('//img[@src]').reduce(Set[]) do |result, elem|
         | 
| 45 48 | 
             
                    u = elem.attributes['src'].content
         | 
| 46 49 | 
             
                    result << page.to_absolute(URI.parse(URI.encode(u)))
         | 
| @@ -77,7 +80,10 @@ module ValidateWebsite | |
| 77 80 | 
             
                    end
         | 
| 78 81 |  | 
| 79 82 | 
             
                    if validate?(page)
         | 
| 80 | 
            -
                       | 
| 83 | 
            +
                      keys = %i[ignore html5_validator]
         | 
| 84 | 
            +
                      # slice does not exists on Ruby <= 2.4
         | 
| 85 | 
            +
                      slice = Hash[[keys, options.values_at(*keys)].transpose]
         | 
| 86 | 
            +
                      validate(page.doc, page.body, page.url, slice)
         | 
| 81 87 | 
             
                    end
         | 
| 82 88 | 
             
                  end
         | 
| 83 89 | 
             
                end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'slop'
         | 
| 2 4 | 
             
            require File.expand_path('version', __dir__)
         | 
| 3 5 |  | 
| @@ -29,6 +31,7 @@ module ValidateWebsite | |
| 29 31 | 
             
                # Generic parse method for crawl or static options
         | 
| 30 32 | 
             
                def self.parse(options, type)
         | 
| 31 33 | 
             
                  raise ArgumentError unless VALID_TYPES.include?(type)
         | 
| 34 | 
            +
             | 
| 32 35 | 
             
                  # We are in command line (ARGV)
         | 
| 33 36 | 
             
                  if options.is_a?(Array)
         | 
| 34 37 | 
             
                    send("command_line_parse_#{type}", options)
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'validate_website/core'
         | 
| 2 4 |  | 
| 3 5 | 
             
            module ValidateWebsite
         | 
| @@ -5,7 +7,7 @@ module ValidateWebsite | |
| 5 7 | 
             
              class Runner
         | 
| 6 8 | 
             
                def self.trap_interrupt
         | 
| 7 9 | 
             
                  trap('INT') do
         | 
| 8 | 
            -
                     | 
| 10 | 
            +
                    warn "\nExiting..."
         | 
| 9 11 | 
             
                    exit!(1)
         | 
| 10 12 | 
             
                  end
         | 
| 11 13 | 
             
                end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'validate_website/core'
         | 
| 2 4 | 
             
            require 'validate_website/utils'
         | 
| 3 5 |  | 
| @@ -5,7 +7,7 @@ module ValidateWebsite | |
| 5 7 | 
             
              # Class for validation Static website
         | 
| 6 8 | 
             
              class Static < Core
         | 
| 7 9 | 
             
                CONTENT_TYPES = ['text/html', 'text/xhtml+xml'].freeze
         | 
| 8 | 
            -
                START_MESSAGE_TYPE = 'files' | 
| 10 | 
            +
                START_MESSAGE_TYPE = 'files'
         | 
| 9 11 |  | 
| 10 12 | 
             
                attr_reader :history_count
         | 
| 11 13 |  | 
| @@ -24,7 +26,8 @@ module ValidateWebsite | |
| 24 26 | 
             
                  files = Dir.glob(@options[:pattern])
         | 
| 25 27 | 
             
                  files.each do |file|
         | 
| 26 28 | 
             
                    next unless File.file?(file)
         | 
| 27 | 
            -
                    next if @options[:exclude] | 
| 29 | 
            +
                    next if @options[:exclude]&.match(file)
         | 
| 30 | 
            +
             | 
| 28 31 | 
             
                    @history_count += 1
         | 
| 29 32 | 
             
                    check_static_file(file)
         | 
| 30 33 | 
             
                  end
         | 
| @@ -57,7 +60,10 @@ module ValidateWebsite | |
| 57 60 |  | 
| 58 61 | 
             
                def check_page(file, page)
         | 
| 59 62 | 
             
                  if page.html? && options[:markup]
         | 
| 60 | 
            -
                     | 
| 63 | 
            +
                    keys = %i[ignore html5_validator]
         | 
| 64 | 
            +
                    # slice does not exists on Ruby <= 2.4
         | 
| 65 | 
            +
                    slice = Hash[[keys, options.values_at(*keys)].transpose]
         | 
| 66 | 
            +
                    validate(page.doc, page.body, file, slice)
         | 
| 61 67 | 
             
                  end
         | 
| 62 68 | 
             
                  check_static_not_found(page.links) if options[:not_found]
         | 
| 63 69 | 
             
                end
         | 
| @@ -68,11 +74,13 @@ module ValidateWebsite | |
| 68 74 | 
             
                  static_links = links.map { |l| StaticLink.new(l, @site) }
         | 
| 69 75 | 
             
                  static_links.each do |static_link|
         | 
| 70 76 | 
             
                    next unless static_link.check?
         | 
| 77 | 
            +
             | 
| 71 78 | 
             
                    unless File.exist?(static_link.file_path)
         | 
| 72 79 | 
             
                      not_found_error(static_link.file_path)
         | 
| 73 80 | 
             
                      next
         | 
| 74 81 | 
             
                    end
         | 
| 75 82 | 
             
                    next unless static_link.css?
         | 
| 83 | 
            +
             | 
| 76 84 | 
             
                    check_static_not_found static_link.extract_urls_from_fake_css_response
         | 
| 77 85 | 
             
                  end
         | 
| 78 86 | 
             
                end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'uri'
         | 
| 2 4 | 
             
            require 'validate_website/utils'
         | 
| 3 5 | 
             
            require 'validate_website/static'
         | 
| @@ -25,9 +27,9 @@ StaticLink = Struct.new(:link, :site) do | |
| 25 27 |  | 
| 26 28 | 
             
              def body
         | 
| 27 29 | 
             
                if File.exist?(link)
         | 
| 28 | 
            -
                  open(link).read
         | 
| 30 | 
            +
                  File.open(link).read
         | 
| 29 31 | 
             
                else
         | 
| 30 | 
            -
                  open(file_path).read
         | 
| 32 | 
            +
                  File.open(file_path).read
         | 
| 31 33 | 
             
                end
         | 
| 32 34 | 
             
              end
         | 
| 33 35 |  | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # Base module ValidateWebsite
         | 
| 2 4 | 
             
            module ValidateWebsite
         | 
| 3 5 | 
             
              # Utils class for CSS helpers
         | 
| @@ -10,6 +12,7 @@ module ValidateWebsite | |
| 10 12 | 
             
                def self.extract_urls_from_css(page)
         | 
| 11 13 | 
             
                  return Set[] unless page
         | 
| 12 14 | 
             
                  return Set[] if page.body.nil?
         | 
| 15 | 
            +
             | 
| 13 16 | 
             
                  nodes = Crass::Parser.parse_stylesheet(page.body)
         | 
| 14 17 | 
             
                  extract_urls_from_nodes nodes, page
         | 
| 15 18 | 
             
                end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'uri'
         | 
| 2 4 |  | 
| 3 5 | 
             
            require 'nokogiri'
         | 
| @@ -10,7 +12,7 @@ module ValidateWebsite | |
| 10 12 | 
             
              class Validator
         | 
| 11 13 | 
             
                extend ValidatorClassMethods
         | 
| 12 14 |  | 
| 13 | 
            -
                @html5_validator_service_url = 'https:// | 
| 15 | 
            +
                @html5_validator_service_url = 'https://validator.nu/'
         | 
| 14 16 | 
             
                XHTML_SCHEMA_PATH = File.expand_path('../../data/schemas', __dir__)
         | 
| 15 17 | 
             
                @mutex = Mutex.new
         | 
| 16 18 |  | 
| @@ -68,14 +70,17 @@ module ValidateWebsite | |
| 68 70 | 
             
                # http://www.w3.org/TR/xhtml1/#dtds
         | 
| 69 71 | 
             
                def find_namespace(dtd)
         | 
| 70 72 | 
             
                  return unless dtd.system_id
         | 
| 73 | 
            +
             | 
| 71 74 | 
             
                  dtd_uri = URI.parse(dtd.system_id)
         | 
| 72 75 | 
             
                  return unless dtd_uri.path
         | 
| 76 | 
            +
             | 
| 73 77 | 
             
                  @dtd_uri = dtd_uri
         | 
| 74 78 | 
             
                  File.basename(@dtd_uri.path, '.dtd')
         | 
| 75 79 | 
             
                end
         | 
| 76 80 |  | 
| 77 81 | 
             
                def document
         | 
| 78 82 | 
             
                  return @document if @document
         | 
| 83 | 
            +
             | 
| 79 84 | 
             
                  @document = if @dtd_uri && @body.match(@dtd_uri.to_s)
         | 
| 80 85 | 
             
                                @body.sub(@dtd_uri.to_s, @namespace + '.dtd')
         | 
| 81 86 | 
             
                              else
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'tidy_ffi'
         | 
| 2 4 |  | 
| 3 5 | 
             
            # Validator Class Methods
         | 
| @@ -9,6 +11,7 @@ module ValidatorClassMethods | |
| 9 11 |  | 
| 10 12 | 
             
              def tidy
         | 
| 11 13 | 
             
                return @tidy if defined?(@tidy)
         | 
| 14 | 
            +
             | 
| 12 15 | 
             
                @lib_tidy = TidyFFI::LibTidy
         | 
| 13 16 | 
             
                @tidy = TidyFFI::Tidy
         | 
| 14 17 | 
             
              rescue TidyFFI::LibTidyNotInstalled
         | 
    
        data/test/core_test.rb
    CHANGED
    
    | @@ -1,9 +1,11 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require File.expand_path('test_helper', __dir__)
         | 
| 2 4 |  | 
| 3 5 | 
             
            describe ValidateWebsite::Core do
         | 
| 4 6 | 
             
              describe 'invalid options' do
         | 
| 5 7 | 
             
                it 'raise ArgumentError on wrong validation_type' do
         | 
| 6 | 
            -
                  proc { ValidateWebsite::Core.new({ color: false }, :fail) }
         | 
| 8 | 
            +
                  _(proc { ValidateWebsite::Core.new({ color: false }, :fail) })
         | 
| 7 9 | 
             
                    .must_raise ArgumentError
         | 
| 8 10 | 
             
                end
         | 
| 9 11 | 
             
              end
         | 
    
        data/test/crawler_test.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require File.expand_path('test_helper', __dir__)
         | 
| 2 4 |  | 
| 3 5 | 
             
            # rubocop:disable Metrics/BlockLength
         | 
| @@ -21,7 +23,7 @@ describe ValidateWebsite::Crawl do | |
| 21 23 | 
             
                  _out, _err = capture_io do
         | 
| 22 24 | 
             
                    v = ValidateWebsite::Crawl.new(site: TEST_DOMAIN, user_agent: ua)
         | 
| 23 25 | 
             
                    v.crawl
         | 
| 24 | 
            -
                    v.crawler.user_agent.must_equal ua
         | 
| 26 | 
            +
                    _(v.crawler.user_agent).must_equal ua
         | 
| 25 27 | 
             
                  end
         | 
| 26 28 | 
             
                end
         | 
| 27 29 |  | 
| @@ -31,7 +33,7 @@ describe ValidateWebsite::Crawl do | |
| 31 33 | 
             
                  _out, _err = capture_io do
         | 
| 32 34 | 
             
                    ValidateWebsite::Crawl.new(site: TEST_DOMAIN,
         | 
| 33 35 | 
             
                                               html5_validator_service_url: new)
         | 
| 34 | 
            -
                    validator.html5_validator_service_url.must_equal new
         | 
| 36 | 
            +
                    _(validator.html5_validator_service_url).must_equal new
         | 
| 35 37 | 
             
                    validator.html5_validator_service_url = original
         | 
| 36 38 | 
             
                  end
         | 
| 37 39 | 
             
                end
         | 
| @@ -43,7 +45,8 @@ describe ValidateWebsite::Crawl do | |
| 43 45 | 
             
                  _out, _err = capture_io do
         | 
| 44 46 | 
             
                    v = ValidateWebsite::Crawl.new(site: TEST_DOMAIN, cookies: cookies)
         | 
| 45 47 | 
             
                    v.crawl
         | 
| 46 | 
            -
                    v.crawler.cookies.cookies_for_host(v.host) | 
| 48 | 
            +
                    _(v.crawler.cookies.cookies_for_host(v.host))
         | 
| 49 | 
            +
                      .must_equal v.default_cookies
         | 
| 47 50 | 
             
                  end
         | 
| 48 51 | 
             
                end
         | 
| 49 52 | 
             
              end
         | 
| @@ -53,37 +56,53 @@ describe ValidateWebsite::Crawl do | |
| 53 56 | 
             
                  name = 'xhtml1-strict'
         | 
| 54 57 | 
             
                  file = File.join('test', 'data', "#{name}.html")
         | 
| 55 58 | 
             
                  page = FakePage.new(name,
         | 
| 56 | 
            -
                                      body: open(file).read,
         | 
| 59 | 
            +
                                      body: File.open(file).read,
         | 
| 57 60 | 
             
                                      content_type: 'text/html')
         | 
| 58 61 | 
             
                  @validate_website.site = page.url
         | 
| 59 62 | 
             
                  _out, _err = capture_io do
         | 
| 60 63 | 
             
                    @validate_website.crawl
         | 
| 61 64 | 
             
                  end
         | 
| 62 | 
            -
                  @validate_website.history_count.must_equal 5
         | 
| 65 | 
            +
                  _(@validate_website.history_count).must_equal 5
         | 
| 63 66 | 
             
                end
         | 
| 64 67 |  | 
| 65 68 | 
             
                it 'extract link' do
         | 
| 66 69 | 
             
                  name = 'html4-strict'
         | 
| 67 70 | 
             
                  file = File.join('test', 'data', "#{name}.html")
         | 
| 68 71 | 
             
                  page = FakePage.new(name,
         | 
| 69 | 
            -
                                      body: open(file).read,
         | 
| 72 | 
            +
                                      body: File.open(file).read,
         | 
| 70 73 | 
             
                                      content_type: 'text/html')
         | 
| 71 74 | 
             
                  @validate_website.site = page.url
         | 
| 72 75 | 
             
                  _out, _err = capture_io do
         | 
| 73 76 | 
             
                    @validate_website.crawl
         | 
| 74 77 | 
             
                  end
         | 
| 75 | 
            -
                  @validate_website.history_count.must_equal 98
         | 
| 78 | 
            +
                  _(@validate_website.history_count).must_equal 98
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                it 'can change validator' do
         | 
| 82 | 
            +
                  name = 'html5-fail'
         | 
| 83 | 
            +
                  file = File.join('test', 'data', "#{name}.html")
         | 
| 84 | 
            +
                  page = FakePage.new(name,
         | 
| 85 | 
            +
                                      body: File.open(file).read,
         | 
| 86 | 
            +
                                      content_type: 'text/html')
         | 
| 87 | 
            +
                  validator_res = File.join('test', 'data', 'validator.nu-failure.json')
         | 
| 88 | 
            +
                  stub_request(:any, /#{validator.html5_validator_service_url}/)
         | 
| 89 | 
            +
                    .to_return(body: File.open(validator_res).read)
         | 
| 90 | 
            +
                  @validate_website.site = page.url
         | 
| 91 | 
            +
                  _out, _err = capture_io do
         | 
| 92 | 
            +
                    @validate_website.crawl(html5_validator: :nu, ignore: /Warning/)
         | 
| 93 | 
            +
                  end
         | 
| 94 | 
            +
                  _(@validate_website.errors_count).must_equal 1
         | 
| 76 95 | 
             
                end
         | 
| 77 96 |  | 
| 78 97 | 
             
                it 'crawl when URLs are not ascii only' do
         | 
| 79 98 | 
             
                  name = 'cozy-community'
         | 
| 80 99 | 
             
                  file = File.join('test', 'data', "#{name}.html")
         | 
| 81 100 | 
             
                  page = FakePage.new(name,
         | 
| 82 | 
            -
                                      body: open(file).read,
         | 
| 101 | 
            +
                                      body: File.open(file).read,
         | 
| 83 102 | 
             
                                      content_type: 'text/html')
         | 
| 84 103 | 
             
                  validator_res = File.join('test', 'data', 'validator.nu-failure.json')
         | 
| 85 104 | 
             
                  stub_request(:any, /#{validator.html5_validator_service_url}/)
         | 
| 86 | 
            -
                    .to_return(body: open(validator_res).read)
         | 
| 105 | 
            +
                    .to_return(body: File.open(validator_res).read)
         | 
| 87 106 | 
             
                  @validate_website.site = page.url
         | 
| 88 107 | 
             
                  _out, _err = capture_io do
         | 
| 89 108 | 
             
                    @validate_website.crawl
         | 
| @@ -119,7 +138,7 @@ describe ValidateWebsite::Crawl do | |
| 119 138 | 
             
                    _out, _err = capture_io do
         | 
| 120 139 | 
             
                      @validate_website.crawl
         | 
| 121 140 | 
             
                    end
         | 
| 122 | 
            -
                    @validate_website.history_count.must_equal 5
         | 
| 141 | 
            +
                    _(@validate_website.history_count).must_equal 5
         | 
| 123 142 | 
             
                  end
         | 
| 124 143 |  | 
| 125 144 | 
             
                  it 'should extract url with single quote' do
         | 
| @@ -130,7 +149,7 @@ describe ValidateWebsite::Crawl do | |
| 130 149 | 
             
                    _out, _err = capture_io do
         | 
| 131 150 | 
             
                      @validate_website.crawl
         | 
| 132 151 | 
             
                    end
         | 
| 133 | 
            -
                    @validate_website.history_count.must_equal 2
         | 
| 152 | 
            +
                    _(@validate_website.history_count).must_equal 2
         | 
| 134 153 | 
             
                  end
         | 
| 135 154 |  | 
| 136 155 | 
             
                  it 'should extract url with double quote' do
         | 
| @@ -141,7 +160,7 @@ describe ValidateWebsite::Crawl do | |
| 141 160 | 
             
                    _out, _err = capture_io do
         | 
| 142 161 | 
             
                      @validate_website.crawl
         | 
| 143 162 | 
             
                    end
         | 
| 144 | 
            -
                    @validate_website.history_count.must_equal 2
         | 
| 163 | 
            +
                    _(@validate_website.history_count).must_equal 2
         | 
| 145 164 | 
             
                  end
         | 
| 146 165 |  | 
| 147 166 | 
             
                  it 'should extract url with params' do
         | 
| @@ -152,7 +171,7 @@ describe ValidateWebsite::Crawl do | |
| 152 171 | 
             
                    _out, _err = capture_io do
         | 
| 153 172 | 
             
                      @validate_website.crawl
         | 
| 154 173 | 
             
                    end
         | 
| 155 | 
            -
                    @validate_website.history_count.must_equal 2
         | 
| 174 | 
            +
                    _(@validate_website.history_count).must_equal 2
         | 
| 156 175 | 
             
                  end
         | 
| 157 176 |  | 
| 158 177 | 
             
                  it 'should not extract invalid urls' do
         | 
| @@ -163,7 +182,7 @@ describe ValidateWebsite::Crawl do | |
| 163 182 | 
             
                    _out, _err = capture_io do
         | 
| 164 183 | 
             
                      @validate_website.crawl
         | 
| 165 184 | 
             
                    end
         | 
| 166 | 
            -
                    @validate_website.history_count.must_equal 1
         | 
| 185 | 
            +
                    _(@validate_website.history_count).must_equal 1
         | 
| 167 186 | 
             
                  end
         | 
| 168 187 | 
             
                end
         | 
| 169 188 |  | 
| @@ -182,7 +201,7 @@ describe ValidateWebsite::Crawl do | |
| 182 201 | 
             
                    _out, _err = capture_io do
         | 
| 183 202 | 
             
                      @validate_website.crawl
         | 
| 184 203 | 
             
                    end
         | 
| 185 | 
            -
                    @validate_website.errors_count.must_equal 1
         | 
| 204 | 
            +
                    _(@validate_website.errors_count).must_equal 1
         | 
| 186 205 | 
             
                  end
         | 
| 187 206 |  | 
| 188 207 | 
             
                  it 'should be invalid with syntax error' do
         | 
| @@ -193,7 +212,7 @@ describe ValidateWebsite::Crawl do | |
| 193 212 | 
             
                    _out, _err = capture_io do
         | 
| 194 213 | 
             
                      @validate_website.crawl
         | 
| 195 214 | 
             
                    end
         | 
| 196 | 
            -
                    @validate_website.errors_count.must_equal 1
         | 
| 215 | 
            +
                    _(@validate_website.errors_count).must_equal 1
         | 
| 197 216 | 
             
                  end
         | 
| 198 217 | 
             
                end
         | 
| 199 218 | 
             
              end
         | 
    
        data/test/static_test.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require File.expand_path('test_helper', __dir__)
         | 
| 2 4 |  | 
| 3 5 | 
             
            # rubocop:disable Metrics/BlockLength
         | 
| @@ -17,7 +19,7 @@ describe ValidateWebsite::Static do | |
| 17 19 | 
             
                                          not_found: false,
         | 
| 18 20 | 
             
                                          exclude: /data|example/)
         | 
| 19 21 | 
             
                end
         | 
| 20 | 
            -
                @validate_website.history_count.must_equal 0
         | 
| 22 | 
            +
                _(@validate_website.history_count).must_equal 0
         | 
| 21 23 | 
             
              end
         | 
| 22 24 |  | 
| 23 25 | 
             
              it 'no space in directory name' do
         | 
| @@ -28,7 +30,7 @@ describe ValidateWebsite::Static do | |
| 28 30 | 
             
                                          markup: false,
         | 
| 29 31 | 
             
                                          not_found: false)
         | 
| 30 32 | 
             
                end
         | 
| 31 | 
            -
                @validate_website.not_founds_count.must_equal 0
         | 
| 33 | 
            +
                _(@validate_website.not_founds_count).must_equal 0
         | 
| 32 34 | 
             
              end
         | 
| 33 35 |  | 
| 34 36 | 
             
              it 'not found' do
         | 
| @@ -40,7 +42,25 @@ describe ValidateWebsite::Static do | |
| 40 42 | 
             
                                            markup: false,
         | 
| 41 43 | 
             
                                            not_found: true)
         | 
| 42 44 | 
             
                  end
         | 
| 43 | 
            -
                  @validate_website.not_founds_count.must_equal 213
         | 
| 45 | 
            +
                  _(@validate_website.not_founds_count).must_equal 213
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              it 'can change validator' do
         | 
| 50 | 
            +
                validator_res = File.join('test', 'data', 'validator.nu-failure.json')
         | 
| 51 | 
            +
                stub_request(:any,
         | 
| 52 | 
            +
                             /#{ValidateWebsite::Validator.html5_validator_service_url}/)
         | 
| 53 | 
            +
                  .to_return(body: File.open(validator_res).read)
         | 
| 54 | 
            +
                pattern = File.join(File.dirname(__FILE__), 'data',
         | 
| 55 | 
            +
                                    'html5-fail.html')
         | 
| 56 | 
            +
                Dir.chdir('test/data') do
         | 
| 57 | 
            +
                  _out, _err = capture_io do
         | 
| 58 | 
            +
                    @validate_website.crawl(pattern: pattern,
         | 
| 59 | 
            +
                                            site: 'http://w3.org/',
         | 
| 60 | 
            +
                                            ignore: /Warning/,
         | 
| 61 | 
            +
                                            html5_validator: :nu)
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                  _(@validate_website.errors_count).must_equal 1
         | 
| 44 64 | 
             
                end
         | 
| 45 65 | 
             
              end
         | 
| 46 66 |  | 
| @@ -53,7 +73,7 @@ describe ValidateWebsite::Static do | |
| 53 73 | 
             
                                            site: 'http://w3.org/',
         | 
| 54 74 | 
             
                                            ignore: /height|width|Length/)
         | 
| 55 75 | 
             
                  end
         | 
| 56 | 
            -
                  @validate_website.errors_count.must_equal 0
         | 
| 76 | 
            +
                  _(@validate_website.errors_count).must_equal 0
         | 
| 57 77 | 
             
                end
         | 
| 58 78 | 
             
              end
         | 
| 59 79 |  | 
| @@ -67,7 +87,7 @@ describe ValidateWebsite::Static do | |
| 67 87 | 
             
                                              markup: false,
         | 
| 68 88 | 
             
                                              css_syntax: true)
         | 
| 69 89 | 
             
                    end
         | 
| 70 | 
            -
                    @validate_website.errors_count.must_equal 1
         | 
| 90 | 
            +
                    _(@validate_website.errors_count).must_equal 1
         | 
| 71 91 | 
             
                  end
         | 
| 72 92 | 
             
                end
         | 
| 73 93 | 
             
              end
         | 
    
        data/test/test_helper.rb
    CHANGED
    
    | @@ -4,16 +4,15 @@ begin | |
| 4 4 | 
             
              require 'coveralls'
         | 
| 5 5 | 
             
              Coveralls.wear!
         | 
| 6 6 | 
             
            rescue LoadError
         | 
| 7 | 
            -
               | 
| 7 | 
            +
              warn 'coveralls not loaded'
         | 
| 8 8 | 
             
            end
         | 
| 9 9 |  | 
| 10 10 | 
             
            require 'minitest/autorun'
         | 
| 11 | 
            -
            require 'minitest/focus'
         | 
| 12 11 | 
             
            require 'spidr'
         | 
| 13 12 |  | 
| 14 13 | 
             
            require 'validate_website/core'
         | 
| 15 14 |  | 
| 16 15 | 
             
            require File.expand_path('webmock_helper', __dir__)
         | 
| 17 16 |  | 
| 18 | 
            -
            TEST_DOMAIN = 'http://www.example.com/' | 
| 17 | 
            +
            TEST_DOMAIN = 'http://www.example.com/'
         | 
| 19 18 | 
             
            ENV['LC_ALL'] = 'C.UTF-8' if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
         | 
    
        data/test/validator_test.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require File.expand_path('test_helper', __dir__)
         | 
| 2 4 |  | 
| 3 5 | 
             
            # rubocop:disable Metrics/BlockLength
         | 
| @@ -14,15 +16,15 @@ describe ValidateWebsite::Validator do | |
| 14 16 | 
             
                  name = 'w3.org-xhtml1-strict-errors'
         | 
| 15 17 | 
             
                  file = File.join('test', 'data', "#{name}.html")
         | 
| 16 18 | 
             
                  page = FakePage.new(name,
         | 
| 17 | 
            -
                                      body: open(file).read,
         | 
| 19 | 
            +
                                      body: File.open(file).read,
         | 
| 18 20 | 
             
                                      content_type: 'text/html')
         | 
| 19 21 | 
             
                  @xhtml1_page = @http.get_page(page.url)
         | 
| 20 22 | 
             
                  ignore = /width|height|Length/
         | 
| 21 23 | 
             
                  validator = subject.new(@xhtml1_page.doc,
         | 
| 22 24 | 
             
                                          @xhtml1_page.body,
         | 
| 23 25 | 
             
                                          ignore: ignore)
         | 
| 24 | 
            -
                  validator.valid | 
| 25 | 
            -
                  validator.errors.must_equal []
         | 
| 26 | 
            +
                  _(validator.valid?).must_equal true
         | 
| 27 | 
            +
                  _(validator.errors).must_equal []
         | 
| 26 28 | 
             
                end
         | 
| 27 29 |  | 
| 28 30 | 
             
                it 'xhtml1-strict should be valid' do
         | 
| @@ -30,17 +32,17 @@ describe ValidateWebsite::Validator do | |
| 30 32 | 
             
                  dtd_uri = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
         | 
| 31 33 | 
             
                  file = File.join('test', 'data', "#{name}.html")
         | 
| 32 34 | 
             
                  page = FakePage.new(name,
         | 
| 33 | 
            -
                                      body: open(file).read,
         | 
| 35 | 
            +
                                      body: File.open(file).read,
         | 
| 34 36 | 
             
                                      content_type: 'text/html')
         | 
| 35 37 | 
             
                  @xhtml1_page = @http.get_page(page.url)
         | 
| 36 38 | 
             
                  ignore = /width|height|Length/
         | 
| 37 39 | 
             
                  validator = subject.new(@xhtml1_page.doc,
         | 
| 38 40 | 
             
                                          @xhtml1_page.body,
         | 
| 39 41 | 
             
                                          ignore: ignore)
         | 
| 40 | 
            -
                  validator.dtd.system_id.must_equal dtd_uri
         | 
| 41 | 
            -
                  validator.namespace.must_equal name
         | 
| 42 | 
            -
                  validator.valid | 
| 43 | 
            -
                  validator.errors.must_equal []
         | 
| 42 | 
            +
                  _(validator.dtd.system_id).must_equal dtd_uri
         | 
| 43 | 
            +
                  _(validator.namespace).must_equal name
         | 
| 44 | 
            +
                  _(validator.valid?).must_equal true
         | 
| 45 | 
            +
                  _(validator.errors).must_equal []
         | 
| 44 46 | 
             
                end
         | 
| 45 47 | 
             
              end
         | 
| 46 48 |  | 
| @@ -49,18 +51,18 @@ describe ValidateWebsite::Validator do | |
| 49 51 | 
             
                  before do
         | 
| 50 52 | 
             
                    validator_res = File.join('test', 'data', 'validator.nu-success.json')
         | 
| 51 53 | 
             
                    stub_request(:any, /#{subject.html5_validator_service_url}/)
         | 
| 52 | 
            -
                      .to_return(body: open(validator_res).read)
         | 
| 54 | 
            +
                      .to_return(body: File.open(validator_res).read)
         | 
| 53 55 | 
             
                  end
         | 
| 54 56 | 
             
                  it 'html5 should be valid' do
         | 
| 55 57 | 
             
                    name = 'html5'
         | 
| 56 58 | 
             
                    file = File.join('test', 'data', "#{name}.html")
         | 
| 57 59 | 
             
                    page = FakePage.new(name,
         | 
| 58 | 
            -
                                        body: open(file).read,
         | 
| 60 | 
            +
                                        body: File.open(file).read,
         | 
| 59 61 | 
             
                                        content_type: 'text/html')
         | 
| 60 62 | 
             
                    @html5_page = @http.get_page(page.url)
         | 
| 61 63 | 
             
                    validator = subject.new(@html5_page.doc,
         | 
| 62 64 | 
             
                                            @html5_page.body)
         | 
| 63 | 
            -
                    validator.valid | 
| 65 | 
            +
                    _(validator.valid?).must_equal true
         | 
| 64 66 | 
             
                  end
         | 
| 65 67 | 
             
                end
         | 
| 66 68 |  | 
| @@ -68,11 +70,11 @@ describe ValidateWebsite::Validator do | |
| 68 70 | 
             
                  before do
         | 
| 69 71 | 
             
                    validator_res = File.join('test', 'data', 'validator.nu-failure.json')
         | 
| 70 72 | 
             
                    stub_request(:any, /#{subject.html5_validator_service_url}/)
         | 
| 71 | 
            -
                      .to_return(body: open(validator_res).read)
         | 
| 73 | 
            +
                      .to_return(body: File.open(validator_res).read)
         | 
| 72 74 | 
             
                    name = 'html5-fail'
         | 
| 73 75 | 
             
                    file = File.join('test', 'data', "#{name}.html")
         | 
| 74 76 | 
             
                    page = FakePage.new(name,
         | 
| 75 | 
            -
                                        body: open(file).read,
         | 
| 77 | 
            +
                                        body: File.open(file).read,
         | 
| 76 78 | 
             
                                        content_type: 'text/html')
         | 
| 77 79 | 
             
                    @html5_page = @http.get_page(page.url)
         | 
| 78 80 | 
             
                  end
         | 
| @@ -82,8 +84,8 @@ describe ValidateWebsite::Validator do | |
| 82 84 | 
             
                      validator = subject.new(@html5_page.doc,
         | 
| 83 85 | 
             
                                              @html5_page.body,
         | 
| 84 86 | 
             
                                              html5_validator: :nu)
         | 
| 85 | 
            -
                      validator.valid | 
| 86 | 
            -
                      validator.errors.size.must_equal 3
         | 
| 87 | 
            +
                      _(validator.valid?).must_equal false
         | 
| 88 | 
            +
                      _(validator.errors.size).must_equal 3
         | 
| 87 89 | 
             
                    end
         | 
| 88 90 |  | 
| 89 91 | 
             
                    it 'should exclude errors ignored by :ignore option' do
         | 
| @@ -92,8 +94,8 @@ describe ValidateWebsite::Validator do | |
| 92 94 | 
             
                                              @html5_page.body,
         | 
| 93 95 | 
             
                                              ignore: ignore,
         | 
| 94 96 | 
             
                                              html5_validator: :nu)
         | 
| 95 | 
            -
                      validator.valid | 
| 96 | 
            -
                      validator.errors.size.must_equal 1
         | 
| 97 | 
            +
                      _(validator.valid?).must_equal false
         | 
| 98 | 
            +
                      _(validator.errors.size).must_equal 1
         | 
| 97 99 | 
             
                    end
         | 
| 98 100 | 
             
                  end
         | 
| 99 101 |  | 
| @@ -101,8 +103,8 @@ describe ValidateWebsite::Validator do | |
| 101 103 | 
             
                    it 'should have an array of errors' do
         | 
| 102 104 | 
             
                      validator = subject.new(@html5_page.doc,
         | 
| 103 105 | 
             
                                              @html5_page.body)
         | 
| 104 | 
            -
                      validator.valid | 
| 105 | 
            -
                      validator.errors.size.must_equal 3
         | 
| 106 | 
            +
                      _(validator.valid?).must_equal false
         | 
| 107 | 
            +
                      _(validator.errors.size).must_equal 3
         | 
| 106 108 | 
             
                    end
         | 
| 107 109 |  | 
| 108 110 | 
             
                    it 'should exclude errors ignored by :ignore option' do
         | 
| @@ -110,8 +112,8 @@ describe ValidateWebsite::Validator do | |
| 110 112 | 
             
                      validator = subject.new(@html5_page.doc,
         | 
| 111 113 | 
             
                                              @html5_page.body,
         | 
| 112 114 | 
             
                                              ignore: ignore)
         | 
| 113 | 
            -
                      validator.valid | 
| 114 | 
            -
                      validator.errors.size.must_equal 2
         | 
| 115 | 
            +
                      _(validator.valid?).must_equal false
         | 
| 116 | 
            +
                      _(validator.errors.size).must_equal 2
         | 
| 115 117 | 
             
                    end
         | 
| 116 118 | 
             
                  end
         | 
| 117 119 | 
             
                end
         | 
| @@ -122,13 +124,13 @@ describe ValidateWebsite::Validator do | |
| 122 124 | 
             
                  name = 'html4-strict'
         | 
| 123 125 | 
             
                  file = File.join('test', 'data', "#{name}.html")
         | 
| 124 126 | 
             
                  page = FakePage.new(name,
         | 
| 125 | 
            -
                                      body: open(file).read,
         | 
| 127 | 
            +
                                      body: File.open(file).read,
         | 
| 126 128 | 
             
                                      content_type: 'text/html')
         | 
| 127 129 | 
             
                  @html4_strict_page = @http.get_page(page.url)
         | 
| 128 130 | 
             
                  validator = subject.new(@html4_strict_page.doc,
         | 
| 129 131 | 
             
                                          @html4_strict_page.body)
         | 
| 130 132 | 
             
                  validator.valid?
         | 
| 131 | 
            -
                  validator.errors.must_equal []
         | 
| 133 | 
            +
                  _(validator.errors).must_equal []
         | 
| 132 134 | 
             
                end
         | 
| 133 135 | 
             
              end
         | 
| 134 136 | 
             
            end
         | 
    
        data/test/webmock_helper.rb
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require 'webmock/minitest'
         | 
| 2 4 |  | 
| 3 5 | 
             
            # FakePage html helper for webmock
         | 
| @@ -27,8 +29,8 @@ class FakePage | |
| 27 29 |  | 
| 28 30 | 
             
              def create_body
         | 
| 29 31 | 
             
                @body = '<html><body>'
         | 
| 30 | 
            -
                @links | 
| 31 | 
            -
                @hrefs | 
| 32 | 
            +
                @links&.each { |l| @body += "<a href=\"#{TEST_DOMAIN}#{l}\"></a>" }
         | 
| 33 | 
            +
                @hrefs&.each { |h| @body += "<a href=\"#{h}\"></a>" }
         | 
| 32 34 | 
             
                @body += '</body></html>'
         | 
| 33 35 | 
             
              end
         | 
| 34 36 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: validate-website
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.10.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Laurent Arnoud
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2020-07-03 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: crass
         | 
| @@ -114,28 +114,14 @@ dependencies: | |
| 114 114 | 
             
                requirements:
         | 
| 115 115 | 
             
                - - "~>"
         | 
| 116 116 | 
             
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            -
                    version: '5'
         | 
| 117 | 
            +
                    version: '5.0'
         | 
| 118 118 | 
             
              type: :development
         | 
| 119 119 | 
             
              prerelease: false
         | 
| 120 120 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 121 | 
             
                requirements:
         | 
| 122 122 | 
             
                - - "~>"
         | 
| 123 123 | 
             
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            -
                    version: '5'
         | 
| 125 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 126 | 
            -
              name: minitest-focus
         | 
| 127 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 128 | 
            -
                requirements:
         | 
| 129 | 
            -
                - - "~>"
         | 
| 130 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 131 | 
            -
                    version: '1'
         | 
| 132 | 
            -
              type: :development
         | 
| 133 | 
            -
              prerelease: false
         | 
| 134 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 | 
            -
                requirements:
         | 
| 136 | 
            -
                - - "~>"
         | 
| 137 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 138 | 
            -
                    version: '1'
         | 
| 124 | 
            +
                    version: '5.0'
         | 
| 139 125 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 140 126 | 
             
              name: rake
         | 
| 141 127 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -156,14 +142,14 @@ dependencies: | |
| 156 142 | 
             
                requirements:
         | 
| 157 143 | 
             
                - - "~>"
         | 
| 158 144 | 
             
                  - !ruby/object:Gem::Version
         | 
| 159 | 
            -
                    version: 0. | 
| 145 | 
            +
                    version: 0.72.0
         | 
| 160 146 | 
             
              type: :development
         | 
| 161 147 | 
             
              prerelease: false
         | 
| 162 148 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 163 149 | 
             
                requirements:
         | 
| 164 150 | 
             
                - - "~>"
         | 
| 165 151 | 
             
                  - !ruby/object:Gem::Version
         | 
| 166 | 
            -
                    version: 0. | 
| 152 | 
            +
                    version: 0.72.0
         | 
| 167 153 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 168 154 | 
             
              name: webmock
         | 
| 169 155 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -273,15 +259,14 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 273 259 | 
             
              requirements:
         | 
| 274 260 | 
             
              - - ">="
         | 
| 275 261 | 
             
                - !ruby/object:Gem::Version
         | 
| 276 | 
            -
                  version: 2. | 
| 262 | 
            +
                  version: 2.3.0
         | 
| 277 263 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 278 264 | 
             
              requirements:
         | 
| 279 265 | 
             
              - - ">="
         | 
| 280 266 | 
             
                - !ruby/object:Gem::Version
         | 
| 281 267 | 
             
                  version: '0'
         | 
| 282 268 | 
             
            requirements: []
         | 
| 283 | 
            -
             | 
| 284 | 
            -
            rubygems_version: 2.7.6.2
         | 
| 269 | 
            +
            rubygems_version: 3.1.2
         | 
| 285 270 | 
             
            signing_key: 
         | 
| 286 271 | 
             
            specification_version: 4
         | 
| 287 272 | 
             
            summary: Web crawler for checking the validity of your documents
         |