Browse Source

Merge branch 'origin/main' into minor/angular

Simon Legner 2 years ago
parent
commit
35c966afdd
48 changed files with 226 additions and 196 deletions
  1. 2 2
      .github/workflows/build.yml
  2. 1 1
      .github/workflows/schedule-doc-report.yml
  3. 1 1
      .github/workflows/test.yml
  4. 1 1
      .ruby-version
  5. 1 1
      .tool-versions
  6. 1 2
      Dockerfile
  7. 1 1
      Dockerfile-alpine
  8. 24 23
      Gemfile
  9. 74 71
      Gemfile.lock
  10. 1 0
      docs/maintainers.md
  11. 16 1
      lib/app.rb
  12. 1 1
      lib/docs/core/request.rb
  13. 8 8
      lib/docs/core/requester.rb
  14. 1 1
      lib/docs/core/scraper.rb
  15. 10 5
      lib/docs/filters/babel/clean_html.rb
  16. 1 0
      lib/docs/filters/core/images.rb
  17. 2 2
      lib/docs/scrapers/babel.rb
  18. 7 2
      lib/docs/scrapers/cmake.rb
  19. 1 1
      lib/tasks/docs.thor
  20. 1 1
      lib/tasks/updates.thor
  21. 5 5
      test/lib/docs/core/doc_test.rb
  22. 2 2
      test/lib/docs/core/entry_index_test.rb
  23. 3 3
      test/lib/docs/core/filter_test.rb
  24. 2 2
      test/lib/docs/core/instrumentable_test.rb
  25. 2 2
      test/lib/docs/core/manifest_test.rb
  26. 2 2
      test/lib/docs/core/models/entry_test.rb
  27. 2 2
      test/lib/docs/core/models/type_test.rb
  28. 2 2
      test/lib/docs/core/parser_test.rb
  29. 4 4
      test/lib/docs/core/request_test.rb
  30. 4 4
      test/lib/docs/core/requester_test.rb
  31. 2 2
      test/lib/docs/core/response_test.rb
  32. 3 3
      test/lib/docs/core/scraper_test.rb
  33. 2 2
      test/lib/docs/core/scrapers/file_scraper_test.rb
  34. 7 7
      test/lib/docs/core/scrapers/url_scraper_test.rb
  35. 2 2
      test/lib/docs/core/url_test.rb
  36. 2 2
      test/lib/docs/filters/core/apply_base_url_test.rb
  37. 2 2
      test/lib/docs/filters/core/clean_html_test.rb
  38. 2 2
      test/lib/docs/filters/core/clean_text_test.rb
  39. 2 2
      test/lib/docs/filters/core/container_test.rb
  40. 2 2
      test/lib/docs/filters/core/entries_test.rb
  41. 2 2
      test/lib/docs/filters/core/inner_html_test.rb
  42. 2 2
      test/lib/docs/filters/core/internal_urls_test.rb
  43. 2 2
      test/lib/docs/filters/core/normalize_paths_test.rb
  44. 2 2
      test/lib/docs/filters/core/normalize_urls_test.rb
  45. 2 2
      test/lib/docs/filters/core/parse_cf_email_test.rb
  46. 2 2
      test/lib/docs/filters/core/title_test.rb
  47. 3 3
      test/lib/docs/storage/abstract_store_test.rb
  48. 2 2
      test/lib/docs/storage/file_store_test.rb

+ 2 - 2
.github/workflows/build.yml

@@ -13,13 +13,13 @@ jobs:
     steps:
     - uses: actions/checkout@dc323e67f16fb5f7663d20ff7941f27f5809e9b6 # v2.6.0
     - name: Set up Ruby
-      uses: ruby/setup-ruby@f60ef1e8084a2e64569f928c3f1cfac6c7e12ad7 # v1.137.2
+      uses: ruby/setup-ruby@d3c9825d67b0d8720afdfdde5af56c79fdb38d16 # v1.138.0
       with:
         bundler-cache: true # runs 'bundle install' and caches installed gems automatically
     - name: Run tests
       run: bundle exec rake
     - name: Deploy to Heroku
-      uses: akhileshns/heroku-deploy@79ef2ae4ff9b897010907016b268fd0f88561820 # tag=v3.12.12
+      uses: akhileshns/heroku-deploy@5ef17ff17a3fb8e9ad822ae6a61648a3ef9e0c3d # v3.12.13
       with:
         heroku_api_key: ${{secrets.HEROKU_API_KEY}}
         heroku_app_name: "devdocs"

+ 1 - 1
.github/workflows/schedule-doc-report.yml

@@ -10,7 +10,7 @@ jobs:
     steps:
     - uses: actions/checkout@dc323e67f16fb5f7663d20ff7941f27f5809e9b6 # v2.6.0
     - name: Set up Ruby
-      uses: ruby/setup-ruby@f60ef1e8084a2e64569f928c3f1cfac6c7e12ad7 # v1.137.2
+      uses: ruby/setup-ruby@d3c9825d67b0d8720afdfdde5af56c79fdb38d16 # v1.138.0
       with:
         bundler-cache: true # runs 'bundle install' and caches installed gems automatically
     - name: Generate report

+ 1 - 1
.github/workflows/test.yml

@@ -11,7 +11,7 @@ jobs:
     steps:
     - uses: actions/checkout@dc323e67f16fb5f7663d20ff7941f27f5809e9b6 # v2.6.0
     - name: Set up Ruby
-      uses: ruby/setup-ruby@f60ef1e8084a2e64569f928c3f1cfac6c7e12ad7 # v1.137.2
+      uses: ruby/setup-ruby@d3c9825d67b0d8720afdfdde5af56c79fdb38d16 # v1.138.0
       with:
         bundler-cache: true # runs 'bundle install' and caches installed gems automatically
     - name: Run tests

+ 1 - 1
.ruby-version

@@ -1 +1 @@
-2.7.7
+3.2.1

+ 1 - 1
.tool-versions

@@ -1 +1 @@
-ruby 2.7.7
+ruby 3.2.1

+ 1 - 2
Dockerfile

@@ -1,5 +1,4 @@
-FROM ruby:2.7.7
-
+FROM ruby:3.2.1
 ENV LANG=C.UTF-8
 ENV ENABLE_SERVICE_WORKER=true
 

+ 1 - 1
Dockerfile-alpine

@@ -1,4 +1,4 @@
-FROM ruby:2.7.7-alpine
+FROM ruby:3.2.1-alpine
 
 ENV LANG=C.UTF-8
 ENV ENABLE_SERVICE_WORKER=true

+ 24 - 23
Gemfile

@@ -1,37 +1,38 @@
 source 'https://rubygems.org'
-ruby '~> 2.7.3'
+ruby '3.2.1'
 
-gem 'rake'
-gem 'thor'
-gem 'pry', '~> 0.14.0'
-gem 'activesupport', '~> 5.2', require: false
-gem 'yajl-ruby', require: false
+gem 'activesupport', require: false
 gem 'html-pipeline'
-gem 'typhoeus'
 gem 'nokogiri'
+gem 'pry-byebug'
+gem 'rake'
 gem 'terminal-table'
+gem 'thor'
+gem 'typhoeus'
+gem 'yajl-ruby', require: false
 
 group :app do
+  gem 'browser'
+  gem 'chunky_png'
+  gem 'coffee-script'
+  gem 'erubi'
+  gem 'image_optim_pack', platforms: :ruby
+  gem 'image_optim'
+  gem 'rack-ssl-enforcer'
   gem 'rack'
-  gem 'sinatra'
+  gem 'rss'
+  gem 'sass'
   gem 'sinatra-contrib'
-  gem 'rack-ssl-enforcer'
-  gem 'thin'
-  gem 'sprockets'
+  gem 'sinatra'
   gem 'sprockets-helpers'
-  gem 'erubi'
-  gem 'browser'
-  gem 'sass'
-  gem 'coffee-script'
-  gem 'chunky_png'
   gem 'sprockets-sass'
-  gem 'image_optim'
-  gem 'image_optim_pack', platforms: :ruby
+  gem 'sprockets'
+  gem 'thin'
 end
 
 group :production do
-  gem 'uglifier'
   gem 'newrelic_rpm'
+  gem 'uglifier'
 end
 
 group :development do
@@ -39,17 +40,17 @@ group :development do
 end
 
 group :docs do
-  gem 'redcarpet'
+  gem 'net-sftp', require: false
   gem 'progress_bar', require: false
-  gem 'unix_utils', require: false
+  gem 'redcarpet'
   gem 'tty-pager', require: false
-  gem 'net-sftp', '>= 2.1.3.rc2', require: false
+  gem 'unix_utils', require: false
 end
 
 group :test do
   gem 'minitest'
-  gem 'rr', require: false
   gem 'rack-test', require: false
+  gem 'rr', require: false
 end
 
 if ENV['SELENIUM'] == '1'

+ 74 - 71
Gemfile.lock

@@ -1,136 +1,138 @@
 GEM
   remote: https://rubygems.org/
   specs:
-    activesupport (5.2.6)
+    activesupport (7.0.4.2)
       concurrent-ruby (~> 1.0, >= 1.0.2)
-      i18n (>= 0.7, < 2)
-      minitest (~> 5.1)
-      tzinfo (~> 1.1)
-    backports (3.15.0)
+      i18n (>= 1.6, < 2)
+      minitest (>= 5.1)
+      tzinfo (~> 2.0)
     better_errors (2.9.1)
       coderay (>= 1.0.0)
       erubi (>= 1.0.0)
       rack (>= 0.9.0)
-    browser (2.6.1)
-    chunky_png (1.3.11)
+    browser (5.3.1)
+    byebug (11.1.3)
+    chunky_png (1.4.0)
     coderay (1.1.3)
     coffee-script (2.4.1)
       coffee-script-source
       execjs
     coffee-script-source (1.12.2)
-    concurrent-ruby (1.1.9)
-    daemons (1.4.0)
-    erubi (1.10.0)
-    ethon (0.12.0)
-      ffi (>= 1.3.0)
+    concurrent-ruby (1.1.10)
+    daemons (1.4.1)
+    erubi (1.11.0)
+    ethon (0.16.0)
+      ffi (>= 1.15.0)
     eventmachine (1.2.7)
-    execjs (2.7.0)
-    exifr (1.3.6)
+    execjs (2.8.1)
+    exifr (1.3.10)
     ffi (1.15.5)
     fspath (3.1.2)
     highline (2.0.3)
-    html-pipeline (2.12.0)
+    html-pipeline (2.14.3)
       activesupport (>= 2)
       nokogiri (>= 1.4)
-    i18n (1.8.10)
+    i18n (1.12.0)
       concurrent-ruby (~> 1.0)
-    image_optim (0.26.5)
+    image_optim (0.31.3)
       exifr (~> 1.2, >= 1.2.2)
       fspath (~> 3.0)
-      image_size (>= 1.5, < 3)
+      image_size (>= 1.5, < 4)
       in_threads (~> 1.3)
       progress (~> 3.0, >= 3.0.1)
-    image_optim_pack (0.6.0)
+    image_optim_pack (0.9.1.20221104)
       fspath (>= 2.1, < 4)
       image_optim (~> 0.19)
-    image_size (2.0.2)
-    in_threads (1.5.3)
+    image_size (3.2.0)
+    in_threads (1.6.0)
     method_source (1.0.0)
     mini_portile2 (2.8.0)
-    minitest (5.14.4)
-    multi_json (1.13.1)
-    mustermann (1.1.2)
+    minitest (5.16.3)
+    multi_json (1.15.0)
+    mustermann (3.0.0)
       ruby2_keywords (~> 0.0.1)
-    net-sftp (3.0.0.beta1)
-      net-ssh (>= 5.0.0, < 6.0.0)
-    net-ssh (5.2.0)
-    newrelic_rpm (6.7.0.359)
-    nokogiri (1.13.10)
+    net-sftp (4.0.0)
+      net-ssh (>= 5.0.0, < 8.0.0)
+    net-ssh (7.0.1)
+    newrelic_rpm (8.12.0)
+    nokogiri (1.14.2)
       mini_portile2 (~> 2.8.0)
       racc (~> 1.4)
     options (2.3.2)
-    progress (3.5.2)
-    progress_bar (1.3.0)
+    progress (3.6.0)
+    progress_bar (1.3.3)
       highline (>= 1.6, < 3)
       options (~> 2.3.0)
     pry (0.14.1)
       coderay (~> 1.1)
       method_source (~> 1.0)
+    pry-byebug (3.10.1)
+      byebug (~> 11.0)
+      pry (>= 0.13, < 0.15)
     racc (1.6.1)
     rack (2.2.6.2)
-    rack-protection (2.0.7)
+    rack-protection (3.0.3)
       rack
     rack-ssl-enforcer (0.2.9)
-    rack-test (1.1.0)
-      rack (>= 1.0, < 3)
-    rake (13.0.0)
-    rb-fsevent (0.10.3)
-    rb-inotify (0.10.0)
+    rack-test (2.0.2)
+      rack (>= 1.3)
+    rake (13.0.6)
+    rb-fsevent (0.11.2)
+    rb-inotify (0.10.1)
       ffi (~> 1.0)
     redcarpet (3.5.1)
-    rr (1.2.1)
+    rexml (3.2.5)
+    rr (3.1.0)
+    rss (0.2.9)
+      rexml
     ruby2_keywords (0.0.5)
     sass (3.7.4)
       sass-listen (~> 4.0.0)
     sass-listen (4.0.0)
       rb-fsevent (~> 0.9, >= 0.9.4)
       rb-inotify (~> 0.9, >= 0.9.7)
-    sinatra (2.0.7)
-      mustermann (~> 1.0)
-      rack (~> 2.0)
-      rack-protection (= 2.0.7)
+    sinatra (3.0.3)
+      mustermann (~> 3.0)
+      rack (~> 2.2, >= 2.2.4)
+      rack-protection (= 3.0.3)
       tilt (~> 2.0)
-    sinatra-contrib (2.0.7)
-      backports (>= 2.8.2)
+    sinatra-contrib (3.0.3)
       multi_json
-      mustermann (~> 1.0)
-      rack-protection (= 2.0.7)
-      sinatra (= 2.0.7)
+      mustermann (~> 3.0)
+      rack-protection (= 3.0.3)
+      sinatra (= 3.0.3)
       tilt (~> 2.0)
     sprockets (3.7.2)
       concurrent-ruby (~> 1.0)
       rack (> 1, < 3)
-    sprockets-helpers (1.2.1)
+    sprockets-helpers (1.4.0)
       sprockets (>= 2.2)
     sprockets-sass (2.0.0.beta2)
       sprockets (>= 2.0, < 4.0)
-    strings (0.1.6)
-      strings-ansi (~> 0.1)
-      unicode-display_width (~> 1.5)
+    strings (0.2.1)
+      strings-ansi (~> 0.2)
+      unicode-display_width (>= 1.5, < 3.0)
       unicode_utils (~> 1.4)
-    strings-ansi (0.1.0)
-    terminal-table (1.8.0)
-      unicode-display_width (~> 1.1, >= 1.1.1)
+    strings-ansi (0.2.0)
+    terminal-table (3.0.2)
+      unicode-display_width (>= 1.1.1, < 3)
     thin (1.8.1)
       daemons (~> 1.0, >= 1.0.9)
       eventmachine (~> 1.0, >= 1.0.4)
       rack (>= 1, < 3)
-    thor (0.20.3)
-    thread_safe (0.3.6)
+    thor (1.2.1)
     tilt (2.0.11)
-    tty-pager (0.12.1)
-      strings (~> 0.1.4)
-      tty-screen (~> 0.6)
-      tty-which (~> 0.4)
-    tty-screen (0.7.0)
-    tty-which (0.4.1)
-    typhoeus (1.3.1)
+    tty-pager (0.14.0)
+      strings (~> 0.2.0)
+      tty-screen (~> 0.8)
+    tty-screen (0.8.1)
+    typhoeus (1.4.0)
       ethon (>= 0.9.0)
-    tzinfo (1.2.10)
-      thread_safe (~> 0.1)
+    tzinfo (2.0.6)
+      concurrent-ruby (~> 1.0)
     uglifier (4.2.0)
       execjs (>= 0.3.0, < 3)
-    unicode-display_width (1.6.0)
+    unicode-display_width (2.3.0)
     unicode_utils (1.4.0)
     unix_utils (0.0.15)
     yajl-ruby (1.4.3)
@@ -139,7 +141,7 @@ PLATFORMS
   ruby
 
 DEPENDENCIES
-  activesupport (~> 5.2)
+  activesupport
   better_errors
   browser
   chunky_png
@@ -149,17 +151,18 @@ DEPENDENCIES
   image_optim
   image_optim_pack
   minitest
-  net-sftp (>= 2.1.3.rc2)
+  net-sftp
   newrelic_rpm
   nokogiri
   progress_bar
-  pry (~> 0.14.0)
+  pry-byebug
   rack
   rack-ssl-enforcer
   rack-test
   rake
   redcarpet
   rr
+  rss
   sass
   sinatra
   sinatra-contrib
@@ -176,7 +179,7 @@ DEPENDENCIES
   yajl-ruby
 
 RUBY VERSION
-   ruby 2.7.3p183
+   ruby 3.2.1p31
 
 BUNDLED WITH
-   2.1.4
+   2.4.6

+ 1 - 0
docs/maintainers.md

@@ -32,6 +32,7 @@ In order to deploy DevDocs, you must:
 - be given access to DevDocs's [Sentry instance](https://sentry.io/devdocs/devdocs-js/) (for JS error tracking) and familiarize yourself with its UI.
 
 - be provided with DevDocs's S3 credentials, and install (`brew install awscli` on macOS) and [configure](https://docs.aws.amazon.com/cli/latest/reference/configure/) the AWS CLI on your computer. The configuration must add a named profile called "devdocs":
+
   ```
   aws configure --profile devdocs
   ```

+ 16 - 1
lib/app.rb

@@ -238,7 +238,22 @@ class App < Sinatra::Application
     end
 
     def supports_js_redirection?
-      browser.modern? && !memoized_cookies.empty?
+      modern_browser?(browser) && !memoized_cookies.empty?
+    end
+
+    # https://github.com/fnando/browser#detecting-modern-browsers
+    # https://github.com/fnando/browser/blob/v2.6.1/lib/browser/browser.rb
+    # This restores the old browser gem `#modern?` functionality as it was in 2.6.1
+    # It's possible this isn't even really needed any longer, these versions are quite old now
+    def modern_browser?(browser)
+      [
+        browser.webkit?,
+        browser.firefox? && browser.version.to_i >= 17,
+        browser.ie? && browser.version.to_i >= 9 && !browser.compatibility_view?,
+        browser.edge? && !browser.compatibility_view?,
+        browser.opera? && browser.version.to_i >= 12,
+        browser.firefox? && browser.device.tablet? && browser.platform.android? && b.version.to_i >= 14
+      ].any?
     end
   end
 

+ 1 - 1
lib/docs/core/request.rb

@@ -13,7 +13,7 @@ module Docs
       request.run
     end
 
-    def initialize(url, options = {})
+    def initialize(url, **options)
       super url.to_s, DEFAULT_OPTIONS.merge(options)
     end
 

+ 8 - 8
lib/docs/core/requester.rb

@@ -4,10 +4,10 @@ module Docs
 
     attr_reader :request_options
 
-    def self.run(urls, options = {}, &block)
+    def self.run(urls, **options, &block)
       urls = urls.dup
-      requester = new(options)
-      requester.on_response(&block) if block
+      requester = new(**options)
+      requester.on_response(&block) if block_given?
       requester.on_response do # cheap hack to ensure root page is processed first
         if urls
           requester.request(urls)
@@ -19,16 +19,16 @@ module Docs
       requester
     end
 
-    def initialize(options = {})
+    def initialize(**options)
       @request_options = options.extract!(:request_options)[:request_options].try(:dup) || {}
       options[:max_concurrency] ||= 20
       options[:pipelining] = 0
       super
     end
 
-    def request(urls, options = {}, &block)
+    def request(urls, **options, &block)
       requests = [urls].flatten.map do |url|
-        build_and_queue_request(url, options, &block)
+        build_and_queue_request(url, **options, &block)
       end
       requests.length == 1 ? requests.first : requests
     end
@@ -46,8 +46,8 @@ module Docs
 
     private
 
-    def build_and_queue_request(url, options, &block)
-      request = Request.new(url, request_options.merge(options))
+    def build_and_queue_request(url, **options, &block)
+      request = Request.new(url, **request_options.merge(options))
       request.on_complete(&block) if block
       queue(request)
       request

+ 1 - 1
lib/docs/core/scraper.rb

@@ -51,7 +51,7 @@ module Docs
     end
 
     def initialize_stubs
-      self.class.stubs.each do |path, block|
+      self.class.stubs.each do |path, &block|
         Typhoeus.stub(url_for(path)).and_return do
           Typhoeus::Response.new \
             effective_url: url_for(path),

+ 10 - 5
lib/docs/filters/babel/clean_html.rb

@@ -3,6 +3,8 @@ module Docs
     class CleanHtmlFilter < Filter
       def call
 
+        @doc = at_css('.theme-doc-markdown')
+
         css('.fixedHeaderContainer').remove
 
         css('.toc').remove
@@ -15,14 +17,17 @@ module Docs
 
         css('.docs-prevnext').remove
 
-        css('pre > code.hljs').each do |node|
-          node.parent['data-language'] = node['class'][/language-(\w+)/, 1]
-        end
-
         css('pre').each do |node|
-          node.content = node.content
+          node.content = node.css('.token-line').map(&:content).join("\n")
+          node['data-language'] = node['class'][/language-(\w+)/, 1]
         end
 
+        css('.codeBlockTitle_x_ju').remove
+
+        css('*').remove_attr('class')
+
+        css('*').remove_attr('style')
+
         doc
 
       end

+ 1 - 0
lib/docs/filters/core/images.rb

@@ -1,5 +1,6 @@
 # frozen_string_literal: true
 
+require 'base64'
 require 'image_optim'
 
 module Docs

+ 2 - 2
lib/docs/scrapers/babel.rb

@@ -1,7 +1,7 @@
 module Docs
   class Babel < UrlScraper
     self.type = 'simple'
-    self.base_url = 'https://babeljs.io/docs/en/'
+    self.base_url = 'https://babeljs.io/docs/'
     self.links = {
       home: 'https://babeljs.io/',
       code: 'https://github.com/babel/babel'
@@ -30,7 +30,7 @@ module Docs
     HTML
 
     version '7' do
-      self.release = '7.16.4'
+      self.release = '7.21.1'
     end
 
     version '6' do

+ 7 - 2
lib/docs/scrapers/cmake.rb

@@ -4,7 +4,7 @@ module Docs
     self.type = 'sphinx_simple'
     self.links = {
       home: 'https://cmake.org/',
-      code: 'https://cmake.org/gitweb?p=cmake.git;a=summary'
+      code: 'https://gitlab.kitware.com/cmake/cmake/'
     }
 
     html_filters.push 'cmake/clean_html', 'sphinx/clean_html', 'cmake/entries', 'title'
@@ -16,10 +16,15 @@ module Docs
     options[:skip_patterns] = [/\Agenerator/, /\Acpack_gen/, /\Ainclude/, /\Arelease/, /tutorial\/(\w*%20)+/]
 
     options[:attribution] = <<-HTML
-      &copy; 2000&ndash;2022 Kitware, Inc. and Contributors<br>
+      &copy; 2000&ndash;2023 Kitware, Inc. and Contributors<br>
       Licensed under the BSD 3-clause License.
     HTML
 
+    version '3.26' do
+      self.release = '3.26'
+      self.base_url = "https://cmake.org/cmake/help/v#{self.version}/"
+    end
+
     version '3.25' do
       self.release = '3.25'
       self.base_url = "https://cmake.org/cmake/help/v#{self.version}/"

+ 1 - 1
lib/tasks/docs.thor

@@ -241,7 +241,7 @@ class DocsCLI < Thor
           ['index.json', 'meta.json'].each do |filename|
             json = "https://documents.devdocs.io/#{doc.path}/#{filename}?#{time}"
             begin
-              open(json) do |file|
+              URI.open(json) do |file|
                 mutex.synchronize do
                   path = File.join(dir, filename)
                   File.write(path, file.read)

+ 1 - 1
lib/tasks/updates.thor

@@ -259,7 +259,7 @@ Maintainers can close this issue when all documentations are up-to-date. The iss
   # HTTP utilities
   #
 
-  def github_get(endpoint, params = {})
+  def github_get(endpoint, **params)
     github_request(endpoint, {method: :get, params: params})
   end
 

+ 5 - 5
test/lib/docs/core/doc_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsDocTest < MiniTest::Spec
   let :doc do
@@ -197,7 +197,7 @@ class DocsDocTest < MiniTest::Spec
         it "opens the .path directory before storing the file" do
           stub(doc).path { 'path' }
           stub(store).write { assert false }
-          mock(store).open('path') do |_, block|
+          mock(store).open('path') do |_, &block|
             stub(store).write
             block.call
           end
@@ -258,7 +258,7 @@ class DocsDocTest < MiniTest::Spec
 
       before do
         any_instance_of(doc) do |instance|
-          stub(instance).build_pages { |block| pages.each(&block) }
+          stub(instance).build_pages { |&block| pages.each(&block) }
         end
       end
 
@@ -313,7 +313,7 @@ class DocsDocTest < MiniTest::Spec
         it "replaces the .path directory before storing the files" do
           stub(doc).path { 'path' }
           stub(store).write { assert false }
-          mock(store).replace('path') do |_, block|
+          mock(store).replace('path') do |_, &block|
             stub(store).write
             block.call
           end

+ 2 - 2
test/lib/docs/core/entry_index_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsEntryIndexTest < MiniTest::Spec
   let :entry do

+ 3 - 3
test/lib/docs/core/filter_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsFilterTest < MiniTest::Spec
   include FilterTestHelper
@@ -19,7 +19,7 @@ class DocsFilterTest < MiniTest::Spec
 
   describe "#subpath_to" do
     it "returns the subpath from the #base_url to the url, ignoring case" do
-      stub(filter.base_url).subpath_to('url', hash_including(ignore_case: true)) { 'subpath' }
+      stub(filter.base_url).subpath_to('url', ignore_case: true) { 'subpath' }
       assert_equal 'subpath', filter.subpath_to('url')
     end
   end

+ 2 - 2
test/lib/docs/core/instrumentable_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsInstrumentableTest < MiniTest::Spec
   let :extended_class do

+ 2 - 2
test/lib/docs/core/manifest_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class ManifestTest < MiniTest::Spec
   let :doc do

+ 2 - 2
test/lib/docs/core/models/entry_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class DocsEntryTest < MiniTest::Spec
   Entry = Docs::Entry

+ 2 - 2
test/lib/docs/core/models/type_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class DocsTypeTest < MiniTest::Spec
   Type = Docs::Type

+ 2 - 2
test/lib/docs/core/parser_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsParserTest < MiniTest::Spec
   def parser(content)

+ 4 - 4
test/lib/docs/core/request_test.rb

@@ -1,13 +1,13 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsRequestTest < MiniTest::Spec
   let :url do
     'http://example.com'
   end
 
-  def request(url = self.url, options = {})
-    Docs::Request.new(url, options).tap do |request|
+  def request(url = self.url, **options)
+    Docs::Request.new(url, **options).tap do |request|
       request.extend FakeInstrumentation
     end
   end

+ 4 - 4
test/lib/docs/core/requester_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsRequesterTest < MiniTest::Spec
   def stub_request(url)
@@ -7,7 +7,7 @@ class DocsRequesterTest < MiniTest::Spec
   end
 
   let :requester do
-    Docs::Requester.new(options)
+    Docs::Requester.new(**options)
   end
 
   let :url do
@@ -81,7 +81,7 @@ class DocsRequesterTest < MiniTest::Spec
       end
 
       it "returns an array of requests" do
-        result = requester.request(urls, { params: 'test' }, &block)
+        result = requester.request(urls, params: 'test', &block)
         assert_instance_of Array, result
         assert_equal urls.length, result.length
         assert result.all? { |obj| obj.instance_of? Docs::Request }

+ 2 - 2
test/lib/docs/core/response_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsResponseTest < MiniTest::Spec
   let :response do

+ 3 - 3
test/lib/docs/core/scraper_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsScraperTest < MiniTest::Spec
   class Scraper < Docs::Scraper
@@ -223,7 +223,7 @@ class DocsScraperTest < MiniTest::Spec
 
     context "when the response is processable" do
       before do
-        stub(scraper).request_all do |urls, block|
+        stub(scraper).request_all do |urls, &block|
           urls.each { |url| @next_urls ||= block.call(response) }
         end
         stub(scraper).handle_response(response) { processed_response }

+ 2 - 2
test/lib/docs/core/scrapers/file_scraper_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class FileScraperTest < MiniTest::Spec
   ROOT_PATH = File.expand_path('../../../../../../', __FILE__)

+ 7 - 7
test/lib/docs/core/scrapers/url_scraper_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class DocsUrlScraperTest < MiniTest::Spec
   class Scraper < Docs::UrlScraper
@@ -54,29 +54,29 @@ class DocsUrlScraperTest < MiniTest::Spec
     end
 
     it "runs a Requester with the given urls" do
-      mock(Docs::Requester).run 'urls', anything
+      mock(Docs::Requester).run('urls', request_options: {params: {}, headers: {"User-Agent" => "DevDocs"}})
       result
     end
 
     it "runs a Requester with .headers as :request_options" do
       stub(Scraper).headers { { testheader: true } }
-      mock(Docs::Requester).run anything, satisfy { |options| options[:request_options][:headers][:testheader] }
+      mock(Docs::Requester).run('urls', request_options: {params: {}, headers: {testheader: true}})
       result
     end
 
     it "runs a Requester with default .headers as :request_options" do
-      mock(Docs::Requester).run anything, satisfy { |options| options[:request_options][:headers]["User-Agent"] }
+      mock(Docs::Requester).run('urls', request_options: {params: {}, headers: {"User-Agent" => "DevDocs"}})
       result
     end
 
     it "runs a Requester with .params as :request_options" do
       stub(Scraper).params { { test: true } }
-      mock(Docs::Requester).run anything, satisfy { |options| options[:request_options][:params][:test] }
+      mock(Docs::Requester).run('urls', request_options: {params: {test: true}, headers: {"User-Agent" => "DevDocs"}})
       result
     end
 
     it "runs a Requester with the given block" do
-      stub(Docs::Requester).run { |*args| @block = args.last }
+      stub(Docs::Requester).run { |*_args, **_kwargs, &block| @block = block }
       result
       assert_equal block, @block
     end

+ 2 - 2
test/lib/docs/core/url_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsUrlTest < MiniTest::Spec
   URL = Docs::URL

+ 2 - 2
test/lib/docs/filters/core/apply_base_url_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class ApplyBaseUrlFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/clean_html_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class CleanHtmlFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/clean_text_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class CleanTextFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/container_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class ContainerFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/entries_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class EntriesFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/inner_html_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class InnerHtmlFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/internal_urls_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class InternalUrlsFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/normalize_paths_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class NormalizePathsFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/normalize_urls_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class NormalizeUrlsFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/parse_cf_email_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class ParseCfEmailFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 2 - 2
test/lib/docs/filters/core/title_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../../test_helper'
+require_relative '../../../../../lib/docs'
 
 class TitleFilterTest < MiniTest::Spec
   include FilterTestHelper

+ 3 - 3
test/lib/docs/storage/abstract_store_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsAbstractStoreTest < MiniTest::Spec
   InvalidPathError = Docs::AbstractStore::InvalidPathError
@@ -368,7 +368,7 @@ class DocsAbstractStoreTest < MiniTest::Spec
     end
 
     def stub_paths(*paths)
-      stub(store).each { |block| paths.each(&block) }
+      stub(store).each { |&block| paths.each(&block) }
     end
 
     it "calls the block" do

+ 2 - 2
test/lib/docs/storage/file_store_test.rb

@@ -1,5 +1,5 @@
-require 'test_helper'
-require 'docs'
+require_relative '../../../test_helper'
+require_relative '../../../../lib/docs'
 
 class DocsFileStoreTest < MiniTest::Spec
   let :store do