From 40afe72f0b53d6ba95c389e22036e32317a26153 Mon Sep 17 00:00:00 2001 From: Peter Boling Date: Tue, 3 Sep 2024 14:36:39 -0600 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=99=88=20track=20Gemfile.lock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - Gemfile.lock | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 Gemfile.lock diff --git a/.gitignore b/.gitignore index d87d4be6..8f994bdb 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ .bundle .config .yardoc -Gemfile.lock InstalledFiles _yardoc coverage diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 00000000..f8d7c71a --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,108 @@ +PATH + remote: . + specs: + ruby-openid (2.9.2) + +GEM + remote: https://rubygems.org/ + specs: + ast (2.4.2) + byebug (11.1.3) + diff-lcs (1.5.1) + diffy (3.4.2) + json (2.7.2) + language_server-protocol (3.17.0.3) + lint_roller (1.1.0) + minitest (5.25.1) + parallel (1.26.3) + parser (3.3.4.2) + ast (~> 2.4.1) + racc + racc (1.8.1) + rainbow (3.1.1) + rake (13.2.1) + regexp_parser (2.9.2) + rexml (3.3.6) + strscan + rspec-block_is_expected (1.0.6) + rubocop (1.64.1) + json (~> 2.3) + language_server-protocol (>= 3.17.0) + parallel (~> 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.31.1, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.32.2) + parser (>= 3.3.1.0) + rubocop-gradual (0.3.6) + diff-lcs (>= 1.2.0, < 2.0) + diffy (~> 3.0) + parallel (~> 1.10) + rainbow (>= 2.2.2, < 4.0) + rubocop (~> 1.0) + rubocop-lts (18.2.1) + rubocop-ruby2_7 (>= 2.0.4, < 3) + standard-rubocop-lts (>= 1.0.3, < 3) + version_gem (>= 1.1.2, < 3) + rubocop-md (1.2.2) + rubocop (>= 1.0) + rubocop-performance (1.21.1) + rubocop (>= 1.48.1, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) + rubocop-rake (0.6.0) + rubocop (~> 1.0) + rubocop-ruby2_7 (2.0.6) + rubocop-gradual (~> 0.3, >= 0.3.1) + rubocop-md (~> 1.2) + rubocop-rake (~> 0.6) + rubocop-shopify (~> 2.14) + rubocop-thread_safety (~> 0.5, >= 0.5.1) + standard-rubocop-lts (~> 1.0, >= 1.0.7) + version_gem (>= 1.1.3, < 3) + rubocop-shopify (2.15.1) + rubocop (~> 1.51) + rubocop-thread_safety (0.5.1) + rubocop (>= 0.90.0) + ruby-progressbar (1.13.0) + standard (1.37.0) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.64.0) + standard-custom (~> 1.0.0) + standard-performance (~> 1.4) + standard-custom (1.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.50) + standard-performance (1.4.0) + lint_roller (~> 1.1) + rubocop-performance (~> 1.21.0) + standard-rubocop-lts (1.0.10) + rspec-block_is_expected (~> 1.0, >= 1.0.5) + standard (>= 1.35.1, < 2) + standard-custom (>= 1.0.2, < 2) + standard-performance (>= 1.3.1, < 2) + version_gem (>= 1.1.4, < 3) + strscan (3.1.0) + unicode-display_width (2.5.0) + version_gem (1.1.4) + webrick (1.8.1) + +PLATFORMS + arm64-darwin-22 + arm64-darwin-23 + +DEPENDENCIES + byebug + minitest (>= 5) + rake + rexml (~> 3.2) + rubocop-lts (~> 18.2, >= 18.2.1) + ruby-openid! + webrick (~> 1.8) + +BUNDLED WITH + 2.4.22 From efb01b4af0ea25ddd19e9e21b69f22cf7cb43d09 Mon Sep 17 00:00:00 2001 From: Peter Boling Date: Tue, 3 Sep 2024 14:37:35 -0600 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9E=95=20rubocop-lts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Version 18 targets Ruby 2.7 --- bin/byebug | 27 +++++++++++++++++++++++++++ bin/htmldiff | 27 +++++++++++++++++++++++++++ bin/ldiff | 27 +++++++++++++++++++++++++++ bin/racc | 27 +++++++++++++++++++++++++++ bin/rubocop | 27 +++++++++++++++++++++++++++ bin/rubocop-gradual | 27 +++++++++++++++++++++++++++ bin/ruby-parse | 27 +++++++++++++++++++++++++++ bin/ruby-rewrite | 27 +++++++++++++++++++++++++++ bin/standardrb | 27 +++++++++++++++++++++++++++ ruby-openid.gemspec | 1 + 10 files changed, 244 insertions(+) create mode 100755 bin/byebug create mode 100755 bin/htmldiff create mode 100755 bin/ldiff create mode 100755 bin/racc create mode 100755 bin/rubocop create mode 100755 bin/rubocop-gradual create mode 100755 bin/ruby-parse create mode 100755 bin/ruby-rewrite create mode 100755 bin/standardrb diff --git a/bin/byebug b/bin/byebug new file mode 100755 index 00000000..abc90dbf --- /dev/null +++ b/bin/byebug @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'byebug' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("byebug", "byebug") diff --git a/bin/htmldiff b/bin/htmldiff new file mode 100755 index 00000000..0aeaec87 --- /dev/null +++ b/bin/htmldiff @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'htmldiff' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("diff-lcs", "htmldiff") diff --git a/bin/ldiff b/bin/ldiff new file mode 100755 index 00000000..8173edec --- /dev/null +++ b/bin/ldiff @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'ldiff' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("diff-lcs", "ldiff") diff --git a/bin/racc b/bin/racc new file mode 100755 index 00000000..81900158 --- /dev/null +++ b/bin/racc @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'racc' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("racc", "racc") diff --git a/bin/rubocop b/bin/rubocop new file mode 100755 index 00000000..369a05be --- /dev/null +++ b/bin/rubocop @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'rubocop' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("rubocop", "rubocop") diff --git a/bin/rubocop-gradual b/bin/rubocop-gradual new file mode 100755 index 00000000..07520055 --- /dev/null +++ b/bin/rubocop-gradual @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'rubocop-gradual' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("rubocop-gradual", "rubocop-gradual") diff --git a/bin/ruby-parse b/bin/ruby-parse new file mode 100755 index 00000000..d8ebc68d --- /dev/null +++ b/bin/ruby-parse @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'ruby-parse' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("parser", "ruby-parse") diff --git a/bin/ruby-rewrite b/bin/ruby-rewrite new file mode 100755 index 00000000..b4574aba --- /dev/null +++ b/bin/ruby-rewrite @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'ruby-rewrite' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("parser", "ruby-rewrite") diff --git a/bin/standardrb b/bin/standardrb new file mode 100755 index 00000000..b329561c --- /dev/null +++ b/bin/standardrb @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'standardrb' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("standard", "standardrb") diff --git a/ruby-openid.gemspec b/ruby-openid.gemspec index 40e48599..2ba68ec1 100644 --- a/ruby-openid.gemspec +++ b/ruby-openid.gemspec @@ -25,5 +25,6 @@ Gem::Specification.new do |s| s.add_development_dependency 'minitest', '>= 5' s.add_development_dependency 'rake', '>= 13' s.add_development_dependency 'rexml', '~> 3.2' + s.add_development_dependency 'rubocop-lts', '~> 18.2', ">= 18.2.1" s.add_development_dependency 'webrick', '~> 1.8' end From 22d40efbb8ef55af5976c4a3942deebf58f47c65 Mon Sep 17 00:00:00 2001 From: Peter Boling Date: Tue, 3 Sep 2024 16:27:50 -0600 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=9A=A8=20rubocop-gradual=20first=20li?= =?UTF-8?q?nting=20+=20lockfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/coverage.yml | 111 + .github/workflows/heads.yml | 61 + .github/workflows/style.yml | 42 + .rubocop.yml | 8 + .rubocop_gradual.lock | 10467 ++++++++++++++++ .tool-versions | 2 +- Gemfile | 5 +- Gemfile.lock | 22 +- Rakefile | 15 +- admin/mkassoc | 6 +- bin/bundle | 2 +- examples/README.md | 6 +- .../XXX_add_open_id_store_to_db.rb | 26 +- .../XXX_upgrade_open_id_store.rb | 26 +- .../lib/association.rb | 1 - .../lib/open_id_setting.rb | 1 - .../lib/openid_ar_store.rb | 56 +- .../test/store_test.rb | 110 +- examples/discover | 29 +- examples/rails_openid/Gemfile | 4 +- examples/rails_openid/Rakefile | 2 +- .../app/controllers/consumer_controller.rb | 89 +- .../app/controllers/login_controller.rb | 22 +- .../app/controllers/server_controller.rb | 122 +- .../rails_openid/app/helpers/server_helper.rb | 6 +- examples/rails_openid/config.ru | 2 +- examples/rails_openid/config/application.rb | 6 +- examples/rails_openid/config/boot.rb | 4 +- examples/rails_openid/config/environment.rb | 2 +- .../rails_openid/config/environments/test.rb | 4 +- .../config/initializers/session_store.rb | 2 +- .../config/initializers/wrap_parameters.rb | 2 +- examples/rails_openid/config/routes.rb | 11 +- examples/rails_openid/public/dispatch.fcgi | 4 +- examples/rails_openid/public/dispatch.rb | 8 +- examples/rails_openid/script/rails | 4 +- .../test/functional/login_controller_test.rb | 5 +- .../test/functional/server_controller_test.rb | 5 +- examples/rails_openid/test/test_helper.rb | 4 +- gemfiles/coverage.gemfile | 10 + gemfiles/style.gemfile | 10 + gemfiles/vanilla.gemfile | 4 +- lib/hmac/hmac.rb | 46 +- lib/openid/association.rb | 151 +- lib/openid/consumer.rb | 73 +- lib/openid/consumer/associationmanager.rb | 157 +- lib/openid/consumer/checkid_request.rb | 73 +- lib/openid/consumer/discovery.rb | 262 +- lib/openid/consumer/discovery_manager.rb | 46 +- lib/openid/consumer/html_parse.rb | 99 +- lib/openid/consumer/idres.rb | 252 +- lib/openid/consumer/responses.rb | 21 +- lib/openid/consumer/session.rb | 4 +- lib/openid/cryptutil.rb | 88 +- lib/openid/dh.rb | 47 +- lib/openid/extension.rb | 11 +- lib/openid/extensions/ax.rb | 242 +- lib/openid/extensions/oauth.rb | 39 +- lib/openid/extensions/pape.rb | 83 +- lib/openid/extensions/sreg.rb | 113 +- lib/openid/extensions/ui.rb | 22 +- lib/openid/fetchers.rb | 159 +- lib/openid/kvform.rb | 87 +- lib/openid/kvpost.rb | 19 +- lib/openid/message.rb | 262 +- lib/openid/protocolerror.rb | 1 - lib/openid/server.rb | 671 +- lib/openid/store/filesystem.rb | 174 +- lib/openid/store/interface.rb | 6 +- lib/openid/store/memcache.rb | 52 +- lib/openid/store/memory.rb | 40 +- lib/openid/store/nonce.rb | 39 +- lib/openid/trustroot.rb | 182 +- lib/openid/urinorm.rb | 31 +- lib/openid/util.rb | 75 +- lib/openid/version.rb | 2 +- lib/openid/yadis/accept.rb | 89 +- lib/openid/yadis/constants.rb | 13 +- lib/openid/yadis/discovery.rb | 44 +- lib/openid/yadis/filters.rb | 71 +- lib/openid/yadis/htmltokenizer.rb | 101 +- lib/openid/yadis/parsehtml.rb | 25 +- lib/openid/yadis/services.rb | 17 +- lib/openid/yadis/xrds.rb | 106 +- lib/openid/yadis/xri.rb | 61 +- lib/openid/yadis/xrires.rb | 73 +- ruby-openid.gemspec | 39 +- setup.rb | 560 +- test/discoverdata.rb | 93 +- test/test_accept.rb | 90 +- test/test_association.rb | 155 +- test/test_associationmanager.rb | 346 +- test/test_ax.rb | 250 +- test/test_checkid_request.rb | 65 +- test/test_consumer.rb | 58 +- test/test_cryptutil.rb | 35 +- test/test_dh.rb | 54 +- test/test_discover.rb | 383 +- test/test_discovery_manager.rb | 98 +- test/test_extension.rb | 52 +- test/test_fetchers.rb | 314 +- test/test_filters.rb | 122 +- test/test_idres.rb | 503 +- test/test_kvform.rb | 126 +- test/test_kvpost.rb | 44 +- test/test_linkparse.rb | 101 +- test/test_message.rb | 494 +- test/test_nonce.rb | 33 +- test/test_oauth.rb | 118 +- test/test_openid_yadis.rb | 121 +- test/test_pape.rb | 125 +- test/test_parsehtml.rb | 43 +- test/test_responses.rb | 18 +- test/test_server.rb | 1223 +- test/test_sreg.rb | 194 +- test/test_stores.rb | 123 +- test/test_trustroot.rb | 76 +- test/test_ui.rb | 36 +- test/test_urinorm.rb | 8 +- test/test_util.rb | 157 +- test/test_xrds.rb | 69 +- test/test_xri.rb | 5 +- test/test_xrires.rb | 13 +- test/test_yadis_discovery.rb | 87 +- test/testutil.rb | 40 +- test/util.rb | 1 - 126 files changed, 16123 insertions(+), 5906 deletions(-) create mode 100644 .github/workflows/coverage.yml create mode 100644 .github/workflows/heads.yml create mode 100644 .github/workflows/style.yml create mode 100644 .rubocop.yml create mode 100644 .rubocop_gradual.lock mode change 100644 => 100755 Rakefile mode change 100644 => 100755 admin/mkassoc mode change 100644 => 100755 examples/rails_openid/Rakefile mode change 100644 => 100755 examples/rails_openid/public/dispatch.fcgi mode change 100644 => 100755 examples/rails_openid/public/dispatch.rb create mode 100644 gemfiles/coverage.gemfile create mode 100644 gemfiles/style.gemfile diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000..2c210689 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,111 @@ +name: Ruby - Coverage + +env: + K_SOUP_COV_MIN_BRANCH: 71 + K_SOUP_COV_MIN_LINE: 89 + K_SOUP_COV_MIN_HARD: true + +on: + push: + branches: + - 'master' + tags: + - '!*' # Do not execute on tags + pull_request: + branches: + - '*' + # Allow manually triggering the workflow. + workflow_dispatch: + +permissions: + contents: read + +# Cancels all previous workflow runs for the same branch that have not yet completed. +concurrency: + # The concurrency group contains the workflow name and the branch name. + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +jobs: + test: + name: Specs with Coverage - Ruby ${{ matrix.ruby }} ${{ matrix.name_extra || '' }} + if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps + BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile + runs-on: ubuntu-latest + strategy: + matrix: + rubygems: + - latest + bundler: + - latest + gemfile: + - coverage + ruby: + - '3.1' + + steps: + - name: CodeClimate Install + uses: amancevice/setup-code-climate@v2 + if: ${{ github.event_name != 'pull_request' }} + with: + cc_test_reporter_id: "${{ secrets.CC_TEST_REPORTER_ID }}" + + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Ruby & RubyGems + uses: ruby/setup-ruby@v1 + with: + ruby-version: "${{ matrix.ruby }}" + rubygems: "${{ matrix.rubygems }}" + bundler: "${{ matrix.bundler }}" + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + + - name: CodeClimate Pre-build Notification + run: cc-test-reporter before-build + if: ${{ github.event_name != 'pull_request' }} + continue-on-error: ${{ matrix.experimental != 'false' }} + + - name: Run tests + run: bundle exec rake test + + - name: CodeClimate Post-build Notification + run: cc-test-reporter after-build + if: ${{ github.event_name != 'pull_request' }} + continue-on-error: ${{ matrix.experimental != 'false' }} + + - name: Code Coverage Summary Report + uses: irongut/CodeCoverageSummary@v1.3.0 + if: ${{ github.event_name == 'pull_request' }} + with: + filename: ./coverage/coverage.xml + badge: true + fail_below_min: true + format: markdown + hide_branch_rate: false + hide_complexity: true + indicators: true + output: both + thresholds: '93 82' + continue-on-error: ${{ matrix.experimental != 'false' }} + + - name: Add Coverage PR Comment + uses: marocchino/sticky-pull-request-comment@v2 + if: ${{ github.event_name == 'pull_request' }} + with: + recreate: true + path: code-coverage-results.md + continue-on-error: ${{ matrix.experimental != 'false' }} + + - name: Coveralls + uses: coverallsapp/github-action@master + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + continue-on-error: ${{ matrix.experimental != 'false' }} + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v4.5.0 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: pboling/sanitize_email diff --git a/.github/workflows/heads.yml b/.github/workflows/heads.yml new file mode 100644 index 00000000..0b015655 --- /dev/null +++ b/.github/workflows/heads.yml @@ -0,0 +1,61 @@ +name: Ruby Heads Matrix + +env: + K_SOUP_COV_DO: false + +on: + push: + branches: + - 'main' + - '*-stable' + - '*-dev' + tags: + - '!*' # Do not execute on tags + pull_request: + branches: + - '*' + # Allow manually triggering the workflow. + workflow_dispatch: + +permissions: + contents: read + +# Cancels all previous workflow runs for the same branch that have not yet completed. +concurrency: + # The concurrency group contains the workflow name and the branch name. + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +jobs: + test: + name: Specs - Ruby ${{ matrix.ruby }} ${{ matrix.name_extra || '' }} + if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps + BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + rubygems: + - latest + bundler: + - latest + gemfile: + - vanilla + ruby: + - head + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Ruby & RubyGems + uses: ruby/setup-ruby@v1 + with: + ruby-version: "${{ matrix.ruby }}" + rubygems: "${{ matrix.rubygems }}" + bundler: "${{ matrix.bundler }}" + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + + - name: Run tests + run: bundle exec rake test diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml new file mode 100644 index 00000000..a7f140b4 --- /dev/null +++ b/.github/workflows/style.yml @@ -0,0 +1,42 @@ +name: Ruby - Style + +on: + push: + branches: + - 'master' + tags: + - '!*' # Do not execute on tags + pull_request: + branches: + - '*' + +jobs: + rubocop: + name: RuboCop + strategy: + fail-fast: false + matrix: + rubygems: + - latest + bundler: + - latest + gemfile: + - style + ruby: + - "3.2" + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} + env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps + BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Ruby & RubyGems + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + rubygems: ${{ matrix.rubygems }} + bundler: ${{ matrix.bundler }} + bundler-cache: true + - name: Run RuboCop + run: bundle exec rake rubocop_gradual:check diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 00000000..ee7c8d56 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,8 @@ +inherit_gem: + rubocop-lts: config/rubygem.yml + +require: + - rubocop-minitest + +Style/EmptyElse: + Enabled: false diff --git a/.rubocop_gradual.lock b/.rubocop_gradual.lock new file mode 100644 index 00000000..7184c5c7 --- /dev/null +++ b/.rubocop_gradual.lock @@ -0,0 +1,10467 @@ +{ + "Rakefile:2793549681": [ + [2, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2774402722], + [4, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 886525804], + [6, 6, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1056464297], + [7, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [8, 13, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91810818], + [9, 13, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [10, 27, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1649292142], + [15, 11, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1919486743], + [19, 10, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3457666992] + ], + "admin/mkassoc:1081746274": [ + [3, 9, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2222937256], + [4, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2754036930], + [8, 10, 45, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 72987428], + [14, 8, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [17, 8, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340392] + ], + "bin/bundle:498800082": [ + [33, 24, 58, "Performance/ConstantRegexp: Extract this regexp into a constant, memoize it, or append an `/o` option to its options.", 2287896868], + [59, 40, 62, "Performance/ConstantRegexp: Extract this regexp into a constant, memoize it, or append an `/o` option to its options.", 2593609308], + [64, 5, 20, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 2485198147], + [86, 7, 34, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 991972134], + [93, 5, 194, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1374511802], + [94, 5, 7, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 285434243] + ], + "examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb:734915733": [ + [3, 3, 577, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1097702499], + [4, 5, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4130037486], + [4, 18, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2661305942], + [5, 7, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3465894827], + [5, 16, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 764267412], + [6, 7, 39, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2645330640], + [6, 16, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [7, 7, 39, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 792606614], + [7, 16, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505321043], + [8, 7, 40, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3649651508], + [8, 16, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 983225976], + [9, 7, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 947806906], + [9, 16, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 614585910], + [10, 7, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2553717392], + [10, 16, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [13, 5, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3839491198], + [13, 18, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3456002118], + [14, 7, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 915931249], + [15, 7, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 98432029], + [16, 7, 36, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1173515338], + [20, 3, 89, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 239984272], + [21, 5, 33, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1025769182], + [21, 16, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2661305942], + [22, 5, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2460131022], + [22, 16, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3456002118] + ], + "examples/active_record_openid_store/XXX_upgrade_open_id_store.rb:1355034522": [ + [4, 3, 286, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3578418894], + [5, 5, 29, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 71959601], + [5, 16, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3623016377], + [6, 5, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2460131022], + [6, 16, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3456002118], + [7, 5, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3839491198], + [7, 18, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3456002118], + [8, 7, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 915931249], + [9, 7, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 98432029], + [10, 7, 36, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1173515338], + [14, 3, 311, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1202366324], + [15, 5, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2460131022], + [15, 16, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3456002118], + [16, 5, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3839491198], + [16, 18, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3456002118], + [17, 7, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 978662435], + [17, 16, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1273852972], + [18, 7, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3849319577], + [18, 16, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1144547333], + [21, 5, 44, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2216586593], + [21, 18, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3623016377], + [22, 7, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2826775964], + [22, 16, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3080356019], + [23, 7, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 840034779], + [23, 16, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918] + ], + "examples/active_record_openid_store/init.rb:2555575082": [ + [3, 11, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3893002469], + [7, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3058584636], + [8, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2159066224] + ], + "examples/active_record_openid_store/lib/association.rb:81044197": [ + [1, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191648330], + [2, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039807664], + [5, 18, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2661305942] + ], + "examples/active_record_openid_store/lib/nonce.rb:2734965079": [ + [2, 18, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3456002118] + ], + "examples/active_record_openid_store/lib/openid_ar_store.rb:671407042": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1155121084], + [2, 9, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1273852972], + [3, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2055340646], + [9, 25, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 398238559], + [10, 25, 20, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 653022716], + [11, 25, 20, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 9026684], + [12, 25, 25, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 344256287], + [13, 25, 24, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1645641596], + [14, 25, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1909070332], + [19, 5, 11, "Layout/IndentationWidth: Use 2 (not 11) spaces for indentation.", 3128322693], + [20, 14, 4, "Layout/ElseAlignment: Align `else` with `assocs`.", 2087423834], + [22, 14, 3, "Layout/EndAlignment: `end` at 22, 13 is not aligned with `assocs = if` at 18, 4.", 193405706], + [25, 14, 12, "Performance/ReverseEach: Use `reverse_each` instead of `reverse.each`.", 157836516], + [27, 9, 34, "Style/InvertibleUnlessCondition: Prefer `if a.expires_in.nonzero?` over `unless a.expires_in.zero?`.", 520282744], + [37, 29, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2437216309], + [50, 23, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3634498586], + [55, 29, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2280192003] + ], + "examples/active_record_openid_store/test/store_test.rb:2342592106": [ + [1, 37, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3040302562], + [2, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4196518618], + [3, 13, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [4, 60, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1174533131], + [8, 21, 64, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3671555844], + [25, 29, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1585570767], + [25, 37, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2158746291], + [25, 45, 17, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3475663134], + [25, 64, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 308967862], + [26, 29, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [26, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [43, 5, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4157441164], + [47, 18, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4020453642], + [65, 46, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [68, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [139, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [140, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [141, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [142, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340470], + [145, 5, 51, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1311833160], + [145, 30, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 913889614], + [148, 59, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [151, 5, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3919615708], + [155, 18, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4020453642], + [156, 18, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [178, 5, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3941805004], + [178, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1980376218], + [180, 5, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3941806095], + [180, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1980376313], + [182, 5, 62, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2198473742], + [182, 52, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3391383544], + [186, 5, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2500046652], + [190, 5, 73, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2563588008], + [190, 52, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2166337150], + [192, 5, 73, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4238004139], + [192, 52, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3301162013], + [194, 5, 77, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3622967051], + [194, 5, 77, "Minitest/RefuteFalse: Prefer using `refute(@store.use_nonce(server_url, ts, salt), 'recent_nonce after cleanup')`.", 3622967051], + [194, 53, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4135549020] + ], + "examples/discover:1665001044": [ + [2, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [3, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [7, 1, 6, "Style/GlobalVars: Do not introduce global variables.", 3073907349], + [7, 11, 31, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 4135741642], + [7, 24, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [7, 27, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3769697387], + [8, 11, 31, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 37053962], + [8, 22, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [8, 27, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3839479045], + [9, 11, 31, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3553412330], + [9, 11, 31, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3553412330], + [9, 27, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809450178], + [14, 10, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3546160837], + [17, 10, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2425075971], + [22, 7, 6, "Style/GlobalVars: Do not introduce global variables.", 3073907349], + [26, 12, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4213499674], + [27, 7, 79, "Style/For: Prefer `each` over `for`.", 2403441437], + [36, 8, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920] + ], + "examples/rails_openid/Gemfile:4162108669": [ + [1, 8, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 448921280], + [3, 5, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1437747136], + [3, 14, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3170618502], + [8, 5, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4239006400], + [10, 5, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3028309981], + [15, 7, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1699918049], + [15, 23, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3701814133], + [16, 7, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3093007423], + [16, 20, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [16, 23, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3701814071], + [21, 7, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1574639498], + [21, 19, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3581454100], + [24, 5, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3820846349], + [41, 5, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4174453037], + [41, 29, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3058584636] + ], + "examples/rails_openid/Rakefile:4123297806": [ + [5, 26, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 405106042] + ], + "examples/rails_openid/app/controllers/consumer_controller.rb:3199742153": [ + [1, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1702461967], + [3, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3058584636], + [4, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2456996725], + [5, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2457518418], + [6, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3740769632], + [19, 25, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3326623288], + [20, 9, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3610921313], + [20, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316181179], + [26, 7, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3610921313], + [26, 27, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316181179], + [36, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 262424560], + [36, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338684], + [43, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 256187543], + [43, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338684], + [45, 27, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 328758303], + [45, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [46, 17, 44, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3197559562], + [46, 33, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 770858572], + [47, 13, 50, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1386902029], + [47, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316181179], + [50, 7, 69, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3307021142], + [52, 7, 96, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1782987469], + [52, 78, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [52, 79, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085194088], + [52, 87, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3139932341], + [52, 100, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [58, 35, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 770858572], + [60, 34, 37, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 368077676], + [65, 7, 18, "Layout/IndentationWidth: Use 2 (not 18) spaces for indentation.", 2915888645], + [65, 72, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [66, 42, 29, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 934954122], + [66, 43, 1, "Layout/LineContinuationLeadingSpace: Move leading spaces to the end of previous line.", 177541], + [67, 23, 4, "Layout/ElseAlignment: Align `else` with `flash[:error]`.", 2087423834], + [69, 23, 3, "Layout/EndAlignment: `end` at 69, 22 is not aligned with `flash[:error] = if` at 64, 6.", 193405706], + [71, 72, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [72, 26, 13, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 432424200], + [72, 26, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 432424200], + [72, 27, 1, "Layout/LineContinuationLeadingSpace: Move leading spaces to the end of previous line.", 177541], + [75, 24, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 678173919], + [77, 27, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 659639648], + [79, 27, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2897122240], + [88, 24, 58, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1430087669], + [89, 28, 69, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4033694170], + [90, 9, 18, "Layout/IndentationWidth: Use 2 (not 18) spaces for indentation.", 2915888645], + [90, 27, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2653597755], + [91, 25, 4, "Layout/ElseAlignment: Align `else` with `pape_message`.", 2087423834], + [92, 27, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2224386926], + [93, 25, 3, "Layout/EndAlignment: `end` at 93, 24 is not aligned with `pape_message << if` at 89, 8.", 193405706], + [99, 23, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3989114503], + [101, 23, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3857750781], + [103, 5, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3610921313], + [103, 25, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316181179], + [110, 43, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085182115], + [110, 54, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 398560409] + ], + "examples/rails_openid/app/controllers/login_controller.rb:1977093716": [ + [4, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3058584636], + [7, 10, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3488474240], + [10, 25, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1195619942], + [14, 22, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3274948509], + [14, 51, 20, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 304204806], + [14, 63, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3488474240], + [15, 51, 18, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4244333790], + [15, 59, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4153819994], + [16, 51, 16, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 96327556], + [34, 5, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3610921313], + [34, 25, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316181179], + [41, 5, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3610921313], + [41, 25, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316181179] + ], + "examples/rails_openid/app/controllers/server_controller.rb:538341200": [ + [1, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1702461967], + [3, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3058584636], + [4, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [5, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2456996725], + [6, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2457518418], + [7, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3740769632], + [19, 7, 32, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2105828355], + [25, 7, 49, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1385699146], + [25, 20, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 986670823], + [59, 22, 23, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3512843920], + [59, 38, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316181179], + [74, 44, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3992767694], + [80, 5, 50, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3019960204], + [80, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1429539717], + [80, 47, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3488474240], + [85, 26, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3164581826], + [90, 8, 50, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 1319698872], + [90, 15, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [90, 35, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [96, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046900628], + [96, 73, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3915219543], + [100, 41, 23, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3512843920], + [100, 57, 7, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1316181179], + [107, 22, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3274948509], + [108, 5, 26, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1508359634], + [115, 7, 16, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4018542702], + [123, 7, 27, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2066949602], + [134, 7, 29, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1697201987], + [141, 23, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [141, 41, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [146, 17, 48, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 547006035], + [146, 66, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [147, 17, 37, "Layout/MultilineOperationIndentation: Use 2 (not 6) spaces for indenting an expression in an assignment spanning multiple lines.", 1517841545], + [147, 17, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1517841545], + [169, 20, 41, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2721560093], + [169, 36, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316181179], + [170, 43, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085182115], + [170, 54, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 989269838], + [188, 16, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [202, 40, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3488474240], + [208, 5, 56, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2852683596], + [208, 39, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [221, 7, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [222, 7, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1875033617], + [222, 21, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 516688894], + [223, 7, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1168115721], + [223, 7, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 571416037], + [223, 18, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 556082122], + [245, 7, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 427506154], + [248, 7, 44, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2081834702], + [248, 40, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [251, 7, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 427508332] + ], + "examples/rails_openid/app/helpers/server_helper.rb:3313097524": [ + [3, 5, 54, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1229068545], + [3, 25, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046900628] + ], + "examples/rails_openid/config.ru:3997924571": [ + [3, 9, 2, "Style/RedundantConstantBase: Remove redundant `::`.", 5859653], + [3, 28, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1592781621] + ], + "examples/rails_openid/config/application.rb:1759216590": [ + [1, 26, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018670611], + [3, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4052701038], + [37, 23, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1764750583], + [50, 15, 9, "Naming/InclusiveLanguage: Consider replacing 'whitelist' with 'allowlist' or 'permit'.", 469122336], + [51, 33, 9, "Naming/InclusiveLanguage: Consider replacing 'whitelist' with 'allowlist' or 'permit'.", 469122336], + [52, 65, 9, "Naming/InclusiveLanguage: Consider replacing 'whitelist' with 'allowlist' or 'permit'.", 469122336], + [52, 78, 9, "Naming/InclusiveLanguage: Consider replacing 'blacklist' with 'denylist' or 'block'.", 3660646720], + [54, 26, 9, "Naming/InclusiveLanguage: Consider replacing 'whitelist' with 'allowlist' or 'permit'.", 469122336], + [60, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202] + ], + "examples/rails_openid/config/boot.rb:3494763414": [ + [1, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3893002469], + [4, 5, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 571350823], + [4, 44, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1075108611], + [6, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1248052779], + [6, 44, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 571350823] + ], + "examples/rails_openid/config/environment.rb:1618598201": [ + [2, 26, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2788635423] + ], + "examples/rails_openid/config/environments/development.rb:2208087211": [ + [13, 37, 6, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3135555589] + ], + "examples/rails_openid/config/environments/production.rb:1079409931": [ + [8, 37, 6, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3135555589] + ], + "examples/rails_openid/config/environments/test.rb:2656600651": [ + [12, 33, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2746002346], + [18, 37, 6, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3135555589] + ], + "examples/rails_openid/config/initializers/rails_root.rb:368272739": [ + [1, 1, 2, "Style/RedundantConstantBase: Remove redundant `::`.", 5859653] + ], + "examples/rails_openid/config/initializers/secret_token.rb:809294578": [ + [7, 48, 130, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2913002960] + ], + "examples/rails_openid/config/initializers/session_store.rb:3039477780": [ + [3, 1, 89, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3081952341], + [3, 67, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 997240952] + ], + "examples/rails_openid/config/routes.rb:3491850805": [ + [2, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1195619942], + [3, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3902216850], + [3, 36, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3488474240], + [3, 54, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4153819994], + [4, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1814963255], + [4, 39, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3488474240], + [4, 57, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3081138200], + [5, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3399879109], + [5, 44, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3488474240], + [5, 62, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3071043510], + [9, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3888645235], + [9, 45, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3040069193], + [12, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2872956560], + [69, 9, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 670537414] + ], + "examples/rails_openid/public/dispatch.fcgi:2968153546": [ + [23, 34, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2480398037], + [24, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 365592137] + ], + "examples/rails_openid/public/dispatch.rb:4169000974": [ + [5, 34, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2480398037], + [9, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2429785346], + [11, 23, 12, "Performance/ReverseEach: Use `reverse_each` instead of `reverse.each`.", 157836516] + ], + "examples/rails_openid/script/rails:311767589": [ + [4, 29, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2954865013], + [5, 26, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2838700537], + [6, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3305626523] + ], + "examples/rails_openid/test/functional/login_controller_test.rb:488768860": [ + [1, 34, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1939554730], + [2, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1857158437], + [8, 8, 3, "Layout/EndAlignment: `end` at 8, 7 is not aligned with `class` at 5, 0.", 193405706], + [13, 13, 3, "Layout/ExtraSpacing: Unnecessary spacing detected.", 193341061], + [14, 14, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [19, 5, 11, "Minitest/UselessAssertion: Useless assertion detected.", 3190231601], + [19, 5, 11, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3190231601] + ], + "examples/rails_openid/test/functional/server_controller_test.rb:79069372": [ + [1, 34, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1939554730], + [2, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4042317955], + [8, 8, 3, "Layout/EndAlignment: `end` at 8, 7 is not aligned with `class` at 5, 0.", 193405706], + [13, 13, 3, "Layout/ExtraSpacing: Unnecessary spacing detected.", 193341061], + [14, 14, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [19, 5, 11, "Minitest/UselessAssertion: Useless assertion detected.", 3190231601], + [19, 5, 11, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3190231601] + ], + "examples/rails_openid/test/performance/browsing_test.rb:844810685": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2037186570], + [2, 9, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1417555152], + [10, 5, 7, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2790896092], + [10, 9, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330] + ], + "examples/rails_openid/test/test_helper.rb:1351592444": [ + [1, 5, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 994064770], + [1, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [2, 26, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2282653114], + [3, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2642860055] + ], + "gemfiles/vanilla.gemfile:3655380785": [ + [3, 8, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 448921280], + [9, 15, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94110058] + ], + "lib/hmac/hmac.rb:2461487484": [ + [21, 23, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [22, 23, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [31, 13, 61, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1780366037], + [42, 7, 102, "Style/For: Prefer `each` over `for`.", 141019575], + [53, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [54, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [55, 30, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [56, 30, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [73, 5, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [84, 5, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [89, 5, 130, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2366241697], + [97, 5, 136, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 822383092] + ], + "lib/hmac/sha1.rb:1265625862": [ + [1, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 698911498], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1564102729] + ], + "lib/hmac/sha2.rb:3448671720": [ + [1, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 698911498], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1564102762] + ], + "lib/openid.rb:4222399549": [ + [18, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3690201737], + [19, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3337961901], + [20, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1480177078] + ], + "lib/openid/association.rb:735520189": [ + [1, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1508131736], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [3, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3933002043], + [4, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [7, 3, 221, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 130585597], + [8, 22, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [10, 25, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [26, 5, 757, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2995744313], + [30, 30, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3650089341], + [30, 75, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [31, 9, 66, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3688940998], + [31, 10, 1, "Layout/LineContinuationLeadingSpace: Move leading spaces to the end of previous line.", 177541], + [35, 21, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [36, 30, 47, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4103011818], + [36, 77, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [37, 30, 27, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2181066025], + [40, 11, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1585570767], + [41, 11, 26, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2563438500], + [42, 11, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2666857624], + [43, 11, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3196629657], + [44, 11, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 874512463], + [48, 5, 154, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1890157839], + [65, 18, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [70, 9, 22, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 856842207], + [82, 7, 8, "Layout/IndentationWidth: Use 2 (not 8) spaces for indentation.", 121035013], + [83, 13, 4, "Layout/ElseAlignment: Align `else` with `now`.", 2087423834], + [85, 13, 3, "Layout/EndAlignment: `end` at 85, 12 is not aligned with `now = if` at 81, 6.", 193405706], + [96, 12, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [98, 12, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [101, 30, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3892836044], + [101, 62, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [109, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [110, 28, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1582904561], + [112, 36, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [114, 54, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044978], + [114, 73, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [119, 48, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [147, 38, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [147, 45, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [148, 10, 37, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 4138849417], + [148, 38, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [149, 30, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3734290715], + [152, 50, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [153, 28, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3747808803], + [153, 90, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [156, 41, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [161, 50, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044978], + [164, 22, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [167, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [167, 68, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [169, 41, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [177, 5, 285, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3235921710], + [179, 12, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [181, 12, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [188, 5, 281, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 263588636], + [191, 71, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [192, 28, 50, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3940346270], + [217, 7, 99, "Style/For: Prefer `each` over `for`.", 781032692], + [232, 32, 21, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1599267866], + [233, 32, 27, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2985348595], + [234, 32, 25, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3102852378], + [235, 32, 29, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3275427155], + [235, 32, 29, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3275427155], + [238, 32, 21, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1599267866], + [239, 32, 25, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3102852378], + [239, 32, 25, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3102852378] + ], + "lib/openid/consumer.rb:16799660": [ + [1, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1493934251], + [2, 9, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 246787047], + [3, 9, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2222937256], + [4, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2748495602], + [5, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4161438236], + [6, 9, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 54321348], + [7, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [8, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [9, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906546608], + [10, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3682152042], + [196, 29, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3900563010], + [227, 36, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2024717836], + [227, 36, 110, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2442999481], + [227, 75, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [228, 36, 34, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 297961990], + [228, 72, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [285, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [285, 49, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3644585460], + [287, 23, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3963495571], + [312, 19, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2989869788], + [316, 19, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2989869788], + [320, 28, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2989869788], + [340, 30, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2771281978], + [340, 38, 18, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2906765223], + [341, 30, 26, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1105194116], + [341, 58, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 478984755], + [349, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [349, 49, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3707812743], + [350, 27, 23, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4021950972], + [351, 27, 30, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 942270268], + [359, 42, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [360, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3782363013], + [361, 46, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1645991854], + [363, 27, 23, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4021950972], + [364, 27, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 165548477], + [364, 34, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3716925445], + [364, 43, 9, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 798169870], + [370, 47, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2858095960], + [376, 48, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2858095960], + [385, 29, 14, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2862574081], + [385, 45, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1236122734], + [386, 29, 19, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1494598494] + ], + "lib/openid/consumer/associationmanager.rb:64903966": [ + [1, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847734175], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [3, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524986166], + [4, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3933002043], + [5, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 395966781], + [6, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191648330], + [13, 36, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3182699763], + [13, 50, 20, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2073210945], + [14, 21, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2643630003], + [25, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [25, 18, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1302701622], + [25, 77, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [27, 16, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 742512847], + [28, 16, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4057239290], + [37, 47, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 983435646], + [37, 58, 18, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2061968077], + [37, 58, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [38, 47, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 431100592], + [39, 53, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [42, 24, 19, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2128550779], + [43, 24, 16, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4000433325], + [43, 42, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 354680469], + [50, 23, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [50, 23, 9, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 4235576623], + [52, 30, 13, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 4104210786], + [52, 31, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [59, 23, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [59, 23, 11, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 4043085327], + [61, 30, 15, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 2724636354], + [61, 31, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [70, 23, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [70, 23, 15, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 809518918], + [71, 30, 25, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 3501034513], + [78, 49, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [86, 7, 415, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2528873537], + [88, 14, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [90, 14, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [92, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [95, 32, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2992907656], + [95, 68, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [96, 32, 25, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1756177313], + [101, 22, 16, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 3355952069], + [109, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [132, 35, 3, "Lint/UselessAssignment: Useless assignment to variable - `why`.", 193429443], + [134, 24, 50, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2396748906], + [141, 20, 60, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1969914410], + [141, 20, 60, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1969914410], + [151, 39, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [151, 58, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [152, 12, 31, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 3512279041], + [153, 20, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 377204125], + [153, 71, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [154, 20, 44, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 485722392], + [155, 11, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [161, 64, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [162, 18, 28, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 755607094], + [165, 62, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [166, 64, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [168, 28, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [169, 71, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [170, 20, 52, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1218829677], + [170, 20, 52, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1218829677], + [173, 20, 52, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3871633811], + [173, 72, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [174, 20, 56, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3197511017], + [195, 20, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4104438515], + [195, 66, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [196, 20, 22, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3162646123], + [199, 78, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [200, 20, 6, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3211374341], + [211, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [211, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [212, 11, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [212, 11, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1919477926], + [215, 14, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [220, 12, 51, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 3368354881], + [220, 48, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [221, 16, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [240, 58, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [248, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [249, 66, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [250, 20, 16, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1129564704], + [250, 20, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129564704], + [256, 31, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [257, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [263, 7, 3, "Lint/IneffectiveAccessModifier: `protected` (on line 146) does not make singleton methods protected. Use `protected` inside a `class << self` block instead.", 193404514], + [263, 7, 312, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4293339091], + [265, 53, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [266, 83, 27, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 1775799068], + [277, 45, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 983435646], + [277, 56, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2380346415], + [277, 56, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [278, 45, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 431100592], + [279, 47, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 983435646], + [279, 58, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1473517757], + [279, 58, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [280, 47, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 431100592], + [285, 9, 17, "Layout/IndentationWidth: Use 2 (not 17) spaces for indentation.", 2300919173], + [286, 24, 4, "Layout/ElseAlignment: Align `else` with `session_type`.", 2087423834], + [287, 49, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2385542796], + [287, 61, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 434188188], + [287, 61, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [288, 49, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 431100592], + [289, 24, 3, "Layout/EndAlignment: `end` at 289, 23 is not aligned with `session_type = if` at 284, 8.", 193405706], + [293, 40, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [293, 60, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [304, 34, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1437281911], + [304, 68, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [305, 34, 43, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2689799403], + [305, 77, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [312, 32, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2399794975], + [312, 69, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [313, 32, 38, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 368502171], + [313, 70, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [323, 32, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2737759946], + [323, 57, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [324, 32, 38, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 368502171], + [324, 70, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [328, 37, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4014237853], + [328, 49, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4223563293], + [328, 63, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2158746291], + [329, 37, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 874512463] + ], + "lib/openid/consumer/checkid_request.rb:1462436096": [ + [1, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [39, 32, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1583341909], + [39, 68, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [40, 33, 27, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2885968457], + [40, 33, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2885968457], + [79, 70, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [80, 33, 21, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 270427808], + [82, 72, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [83, 33, 10, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2811205159], + [83, 33, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2811205159], + [85, 78, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [86, 33, 32, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2634935182], + [86, 33, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2634935182], + [91, 28, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [91, 50, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [92, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [94, 42, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [94, 57, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [97, 36, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [112, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [114, 39, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [118, 38, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [121, 27, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 436922608], + [124, 73, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [125, 18, 18, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2861807504], + [149, 23, 20, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 86594967], + [158, 23, 20, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 86594967], + [159, 43, 5, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 194523634], + [160, 43, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1228896939], + [161, 43, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4004308532], + [162, 43, 14, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2584027489] + ], + "lib/openid/consumer/discovery.rb:185566619": [ + [3, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92337995], + [4, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [5, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [6, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2013616931], + [7, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [8, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906546608], + [9, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 53893767], + [10, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2995095577], + [11, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 380634196], + [12, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 916562793], + [13, 9, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 812078005], + [14, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2871107037], + [17, 19, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2133742372], + [18, 25, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1731169625], + [19, 21, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1249287630], + [20, 21, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 494420947], + [21, 21, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 494421042], + [35, 7, 15, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3931244506], + [82, 50, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [83, 10, 35, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 324742179], + [120, 51, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2736082105], + [121, 51, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2272531167], + [128, 25, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [136, 32, 61, "Performance/FlatMap: Use `flat_map` instead of `map...flatten`.", 760117748], + [143, 5, 223, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2614195864], + [153, 5, 738, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1527998342], + [163, 27, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [163, 50, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [169, 11, 24, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 4138595764], + [178, 5, 863, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4018794406], + [185, 27, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1333860129], + [185, 47, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1421172607], + [186, 9, 53, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 984139143], + [186, 27, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 952285399], + [186, 44, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 333762157], + [208, 5, 265, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 373672457], + [217, 5, 532, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3316063732], + [226, 7, 9, "Layout/IndentationWidth: Use 2 (not 9) spaces for indentation.", 3994155397], + [226, 23, 11, "Performance/StringIdentifierArgument: Use `:from_xrds` instead of `'from_xrds'`.", 237794897], + [226, 23, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 237794897], + [227, 14, 4, "Layout/ElseAlignment: Align `else` with `meth`.", 2087423834], + [228, 23, 11, "Performance/StringIdentifierArgument: Use `:from_html` instead of `'from_html'`.", 220325553], + [228, 23, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 220325553], + [229, 14, 3, "Layout/EndAlignment: `end` at 229, 13 is not aligned with `meth = if` at 225, 6.", 193405706], + [231, 17, 31, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 26138215], + [232, 17, 30, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3449287990], + [235, 5, 381, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2059921948], + [248, 14, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2805694759], + [248, 14, 102, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3627285386], + [248, 49, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [249, 22, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1127491977], + [250, 14, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 874138713], + [250, 26, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4189021428], + [250, 39, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2485497820], + [251, 14, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2474818138], + [251, 25, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1951871869], + [251, 40, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1487200955], + [255, 3, 1822, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3218903155], + [272, 43, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [273, 8, 34, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 3174666560], + [275, 37, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3058584636], + [276, 24, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 769811929], + [281, 37, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92236619], + [282, 24, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1017562001], + [293, 20, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1363767349], + [303, 3, 152, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 837487512], + [310, 3, 361, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 376189395], + [323, 3, 573, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 900947344], + [338, 3, 713, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3445101566], + [361, 3, 652, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2608187650], + [372, 39, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 669407501], + [373, 39, 39, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2382182910], + [382, 3, 1462, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4102428152], + [428, 3, 982, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1160687725], + [435, 41, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3337159803], + [443, 16, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2550112513], + [443, 43, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085273599], + [458, 3, 474, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3768303582], + [460, 26, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247383], + [460, 32, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [460, 54, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247569], + [462, 69, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [463, 9, 38, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1801377088], + [463, 49, 9, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3952783510], + [474, 3, 677, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2399137430], + [476, 11, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2243046439], + [476, 40, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94548671], + [484, 28, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [496, 3, 170, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 343927248] + ], + "lib/openid/consumer/discovery_manager.rb:3719214426": [ + [36, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 804762737], + [37, 11, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1492599511], + [38, 11, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2202791179], + [39, 11, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3648352012], + [39, 11, 24, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1439570498], + [47, 7, 416, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 775251457], + [50, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2202791179], + [51, 74, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3648352012], + [53, 25, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 804762737], + [53, 48, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1492599511], + [54, 35, 10, "Performance/StringIdentifierArgument: Use `:@current` instead of `'@current'`.", 1568415500], + [54, 35, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1568415500], + [66, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3024670477], + [114, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [128, 9, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2620721662] + ], + "lib/openid/consumer/html_parse.rb:3832194346": [ + [1, 9, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 634180536], + [22, 3, 114, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1956273507], + [23, 12, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3325330116], + [23, 21, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339971], + [23, 31, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3094424448], + [23, 39, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340825], + [23, 49, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3094036075], + [23, 57, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340763], + [23, 67, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2959556167], + [26, 3, 118, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3427068683], + [28, 10, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [34, 3, 1703, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1576226162], + [36, 40, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [39, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [39, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1308083146], + [39, 96, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [40, 23, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [45, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [45, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3877449556], + [45, 95, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [46, 23, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [59, 16, 1, "Lint/AssignmentInCondition: Wrap assignment in parentheses if intentional", 177560], + [59, 32, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3025445581], + [59, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3025445581], + [59, 40, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3896501570], + [59, 40, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3896501570], + [59, 49, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3029763365], + [59, 49, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029763365], + [59, 57, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3018684341], + [59, 57, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018684341], + [59, 65, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3903542778], + [59, 65, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3903542778], + [60, 32, 6, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3026048248], + [60, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3026048248], + [60, 40, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3897327799], + [60, 40, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3897327799], + [63, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3896501570], + [63, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018684341], + [63, 43, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3903542778], + [63, 52, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3897327799], + [66, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3026048248], + [69, 27, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3025445581], + [79, 40, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3026048248], + [81, 64, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029763365], + [84, 5, 16, "Lint/RescueException: Avoid rescuing the `Exception` class. Perhaps you meant to rescue `StandardError`?", 2127134117], + [89, 3, 254, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1800542362], + [101, 3, 212, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2707051651], + [105, 27, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92035358], + [109, 3, 361, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2025146561], + [124, 3, 348, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2788268418], + [130, 5, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [130, 28, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [133, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3025988988] + ], + "lib/openid/consumer/idres.rb:4244772821": [ + [1, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [2, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 395966781], + [3, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524986166], + [4, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [5, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2013616931], + [18, 37, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1377421297], + [18, 37, 10, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 1377421297], + [19, 42, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 414939563], + [19, 42, 20, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 414939563], + [25, 7, 41, "ThreadSafety/ClassAndModuleAttributes: Avoid mutating class and module attributes.", 3551885003], + [38, 7, 46, "ThreadSafety/ClassAndModuleAttributes: Avoid mutating class and module attributes.", 1060533723], + [63, 31, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044978], + [81, 9, 43, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 3459188814], + [94, 35, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [95, 32, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1363294098], + [97, 48, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [113, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [115, 26, 54, "Layout/MultilineOperationIndentation: Use 2 (not 15) spaces for indenting an expression in an assignment spanning multiple lines.", 2166414118], + [117, 44, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [120, 55, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [121, 31, 39, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3993100286], + [138, 59, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [140, 33, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 419474237], + [162, 64, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [163, 35, 36, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3035481342], + [163, 71, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [169, 18, 40, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1926304207], + [175, 34, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149656968], + [175, 77, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [176, 35, 34, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1682708439], + [178, 11, 30, "Style/InvertibleUnlessCondition: Prefer `if rt_val == bare_val` over `unless rt_val != bare_val`.", 780811326], + [180, 64, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [181, 33, 37, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 4268890387], + [181, 70, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [201, 9, 10, "Layout/IndentationWidth: Use 2 (not 10) spaces for indentation.", 2958109189], + [202, 17, 4, "Layout/ElseAlignment: Align `else` with `assoc`.", 2087423834], + [203, 60, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [204, 17, 3, "Layout/EndAlignment: `end` at 204, 16 is not aligned with `assoc = if` at 200, 8.", 193405706], + [225, 76, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [226, 32, 23, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 24014699], + [235, 51, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [235, 79, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [243, 39, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [243, 47, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [251, 48, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [251, 60, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 967974776], + [253, 57, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [263, 9, 32, "Style/InvertibleUnlessCondition: Prefer `if is_valid == 'true'` over `unless is_valid != 'true'`.", 3463344452], + [263, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039078867], + [265, 71, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [266, 31, 42, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2195962727], + [277, 24, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [279, 48, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1679224880], + [282, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1865380876], + [285, 30, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2228831613], + [293, 9, 72, "Style/InvertibleUnlessCondition: Prefer `if @store.nil? || @store.use_nonce(server_url, time, extra)` over `unless !@store.nil? && !@store.use_nonce(server_url, time, extra)`.", 2752413603], + [295, 30, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3407293298], + [295, 68, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [296, 30, 18, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3964513585], + [315, 37, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [316, 35, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [317, 37, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [320, 32, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3638734137], + [320, 69, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [321, 33, 19, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 789517483], + [321, 33, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [323, 32, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 489820086], + [323, 71, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [324, 33, 17, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2749623588], + [324, 33, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [336, 20, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2391770610], + [342, 22, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 689390617], + [342, 65, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [343, 22, 27, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 30803478], + [344, 22, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576329453], + [349, 9, 57, "Style/InvertibleUnlessCondition: Prefer `if @endpoint.claimed_id == to_match.claimed_id` over `unless @endpoint.claimed_id != to_match.claimed_id`.", 3332715157], + [361, 34, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3429882387], + [361, 77, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [362, 35, 44, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1043719975], + [362, 35, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1043719975], + [362, 79, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [363, 35, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3598230640], + [363, 76, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [364, 35, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1793389965], + [364, 79, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [365, 35, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3341948396], + [373, 35, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [388, 22, 56, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3261276623], + [390, 22, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576329453], + [412, 32, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2299532018], + [412, 65, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [413, 33, 15, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1055658553], + [422, 9, 466, "Style/For: Prefer `each` over `for`.", 255677739], + [423, 11, 419, "Style/For: Prefer `each` over `for`.", 730259390], + [439, 20, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821006290], + [443, 30, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1804032806], + [443, 65, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [444, 31, 27, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2976111178], + [450, 9, 143, "Style/For: Prefer `each` over `for`.", 3303244153], + [470, 34, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1865380876], + [474, 32, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1493035381], + [474, 71, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [475, 33, 23, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1012300656], + [475, 33, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1012300656], + [475, 56, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [476, 64, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [481, 32, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3738802926], + [481, 62, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [482, 33, 32, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2867922559], + [482, 65, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [494, 19, 50, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1497511346], + [494, 19, 239, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1407987139], + [494, 69, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [495, 19, 53, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 16589726], + [495, 72, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [496, 73, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [500, 32, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 23577805], + [500, 64, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [501, 33, 30, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1371391256], + [501, 63, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657] + ], + "lib/openid/consumer/responses.rb:553064480": [ + [31, 9, 38, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 710955324], + [48, 9, 46, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 4279840451] + ], + "lib/openid/consumer/session.rb:1120055937": [ + [29, 21, 50, "Performance/FlatMap: Use `flat_map` instead of `map...flatten`.", 2891182408] + ], + "lib/openid/cryptutil.rb:3218515747": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1564102729], + [3, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1564102762], + [5, 11, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2148273213], + [9, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 493142244], + [10, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 493142087], + [13, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 718606630], + [14, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 718606597], + [29, 5, 68, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 33433268], + [34, 5, 59, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2498740062], + [38, 5, 171, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 216141853], + [41, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001831342], + [44, 5, 63, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1057833566], + [48, 5, 177, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3411150301], + [51, 48, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 524201038], + [57, 5, 214, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1117887805], + [58, 11, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [70, 5, 154, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2301666000], + [73, 15, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [74, 19, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085145293], + [78, 5, 217, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 897599771], + [82, 16, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085157825], + [90, 5, 80, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 936504201], + [95, 5, 82, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1329530532], + [99, 5, 186, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3562629295] + ], + "lib/openid/dh.rb:162355747": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [2, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3933002043], + [20, 5, 84, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 464948698], + [52, 5, 3, "Lint/IneffectiveAccessModifier: `private` (on line 45) does not make singleton methods private. Use `private_class_method` or `private` inside a `class << self` block instead.", 193404514], + [52, 5, 453, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2364973817], + [54, 62, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [55, 30, 43, "Layout/MultilineOperationIndentation: Use 2 (not 21) spaces for indenting an expression spanning multiple lines.", 3655353865], + [58, 10, 29, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2153121443], + [59, 70, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085144268], + [63, 19, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [70, 5, 3, "Lint/IneffectiveAccessModifier: `private` (on line 45) does not make singleton methods private. Use `private_class_method` or `private` inside a `class << self` block instead.", 193404514], + [70, 5, 249, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1671549284] + ], + "lib/openid/extension.rb:2931551022": [ + [1, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136] + ], + "lib/openid/extensions/ax.rb:460223884": [ + [3, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2850088810], + [4, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3577044961], + [5, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [9, 24, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 72681354], + [13, 5, 179, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1058960602], + [14, 21, 20, "Performance/RedundantMatch: Use `=~` in places where the `MatchData` returned by `#match` will not be used.", 3795418109], + [14, 21, 20, "Performance/RegexpMatch: Use `match?` instead of `match` when `MatchData` is not used.", 3795418109], + [16, 63, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [17, 21, 18, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 270710046], + [17, 21, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 270710046], + [28, 16, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1826014241], + [31, 50, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085186044], + [37, 21, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085186044], + [47, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [48, 9, 34, "Style/InvertibleUnlessCondition: Prefer `if actual_mode == @mode` over `unless actual_mode != @mode`.", 3596772208], + [54, 10, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [54, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [54, 26, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [104, 5, 342, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4093177575], + [107, 26, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [122, 14, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [152, 11, 9, "Layout/IndentationWidth: Use 2 (not 9) spaces for indentation.", 3994155397], + [153, 18, 4, "Layout/ElseAlignment: Align `else` with `name`.", 2087423834], + [155, 18, 3, "Layout/EndAlignment: `end` at 155, 17 is not aligned with `name = if` at 151, 10.", 193405706], + [165, 17, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [165, 45, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [166, 17, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [166, 53, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [185, 7, 808, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3671465444], + [188, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [188, 37, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [188, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [194, 35, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 983435646], + [194, 46, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1442212370], + [194, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [195, 35, 39, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3310022405], + [195, 62, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [196, 25, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [214, 21, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [215, 31, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [221, 23, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [235, 53, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [239, 57, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [243, 18, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3010610473], + [245, 19, 97, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1846473514], + [248, 31, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4053342112], + [273, 9, 7, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1918335173], + [301, 19, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [303, 21, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [327, 21, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [328, 31, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [338, 29, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [341, 29, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1065821536], + [343, 44, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1065821536], + [402, 17, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [421, 20, 24, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 987258332], + [437, 52, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [451, 19, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [452, 19, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [452, 38, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [454, 23, 30, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 1808039685], + [455, 17, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4053342112], + [462, 31, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4053342112], + [467, 7, 413, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3474868742], + [470, 9, 12, "Layout/IndentationWidth: Use 2 (not 12) spaces for indentation.", 155433733], + [471, 19, 4, "Layout/ElseAlignment: Align `else` with `ax_args`.", 2087423834], + [473, 19, 3, "Layout/EndAlignment: `end` at 473, 18 is not aligned with `ax_args = if` at 469, 8.", 193405706], + [486, 14, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2289977748], + [496, 7, 259, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4000433818], + [499, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [499, 38, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [499, 49, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [517, 22, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 128040026], + [518, 22, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2231038713], + [523, 22, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1925511496], + [523, 82, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [526, 9, 10, "Layout/IndentationWidth: Use 2 (not 10) spaces for indentation.", 2958109189], + [527, 17, 4, "Layout/ElseAlignment: Align `else` with `@mode`.", 2087423834], + [529, 17, 3, "Layout/EndAlignment: `end` at 529, 16 is not aligned with `@mode = if` at 525, 8.", 193405706], + [533, 7, 185, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2202480771], + [535, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [535, 52, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [544, 17, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [544, 58, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806] + ], + "lib/openid/extensions/oauth.rb:4188595383": [ + [5, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2850088810], + [9, 14, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3007888442], + [16, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1246672322], + [24, 17, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 279448603], + [25, 17, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911], + [32, 7, 216, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2413522248], + [35, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [44, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 279448603], + [45, 23, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911], + [55, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1246672322], + [62, 7, 235, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2080666142], + [64, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [76, 31, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1044601616], + [77, 23, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911], + [82, 17, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1044601616], + [83, 17, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911] + ], + "lib/openid/extensions/pape.rb:941715807": [ + [5, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2850088810], + [9, 14, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2108437785], + [11, 7, 71, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3681686524], + [13, 7, 62, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3959903684], + [15, 7, 68, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1412882747], + [23, 21, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034771041], + [33, 19, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2940713374], + [40, 11, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3932791566], + [40, 11, 63, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1264816171], + [40, 70, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [42, 17, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1656633178], + [49, 7, 213, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2414389803], + [52, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [62, 29, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3932791566], + [63, 9, 121, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 1662354873], + [64, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [69, 33, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1656633178], + [70, 26, 41, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 986556649], + [77, 49, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3924764720], + [87, 21, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034771041], + [101, 7, 232, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2080666142], + [103, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [115, 29, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [116, 45, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [116, 66, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [116, 86, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032063535], + [118, 31, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3918600891], + [121, 38, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [128, 25, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [128, 45, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [135, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [139, 12, 31, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 2973786234], + [142, 32, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2467135494], + [148, 17, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [149, 9, 29, "Layout/IndentationWidth: Use 2 (not 29) spaces for indentation.", 4209615749], + [149, 38, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032063535], + [150, 36, 4, "Layout/ElseAlignment: Align `else` with `ns_args['auth_policies']`.", 2087423834], + [151, 58, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [152, 36, 3, "Layout/EndAlignment: `end` at 152, 35 is not aligned with `ns_args['auth_policies'] = if` at 148, 8.", 193405706], + [154, 18, 31, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4257387903], + [154, 25, 7, "Performance/RangeInclude: Use `Range#cover?` instead of `Range#member?`.", 1205904490], + [158, 19, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3918600891], + [162, 32, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2467135494], + [162, 77, 28, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 3955942864], + [164, 19, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567] + ], + "lib/openid/extensions/sreg.rb:334344688": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2850088810], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [8, 7, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1875033617], + [8, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2196907409], + [9, 7, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [9, 21, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3069562381], + [10, 7, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91538572], + [10, 16, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 98399837], + [11, 7, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1168115721], + [11, 18, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2073838738], + [12, 7, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 595520346], + [12, 19, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 345049786], + [13, 7, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 152993488], + [13, 21, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3524310685], + [14, 7, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 289239021], + [14, 20, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2345971085], + [15, 7, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 746505975], + [15, 21, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4194158807], + [16, 7, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3905143278], + [16, 7, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1107266950], + [16, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4031222958], + [19, 18, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3482333731], + [20, 18, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3121512103], + [24, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [31, 17, 29, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3162063551], + [52, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [83, 21, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [98, 7, 415, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2730285120], + [104, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [125, 31, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [126, 36, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [127, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [134, 31, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [135, 36, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [136, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [142, 28, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 771425937], + [169, 32, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 776268046], + [169, 75, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 802847699], + [171, 21, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4109061975], + [173, 14, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2902827824], + [176, 13, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 141845254], + [189, 67, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [190, 36, 28, "Layout/MultilineOperationIndentation: Use 2 (not 27) spaces for indenting a condition in an `unless` statement spanning multiple lines.", 1454824539], + [201, 14, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [201, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [202, 14, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [202, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [203, 14, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 771425937], + [220, 21, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [227, 7, 201, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2920278435], + [237, 7, 446, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 850652346], + [241, 11, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172] + ], + "lib/openid/extensions/ui.rb:2959852943": [ + [4, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2850088810], + [8, 14, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2152454945], + [14, 21, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085207193], + [23, 17, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3030033825], + [24, 17, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3033241998], + [25, 17, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [32, 7, 207, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3227081811], + [35, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [43, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3030033825], + [44, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3033241998], + [45, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118] + ], + "lib/openid/fetchers.rb:665209309": [ + [1, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 679062125], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3690201737], + [6, 11, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 934211966], + [8, 20, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 330809641], + [8, 72, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [9, 20, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2594958896], + [10, 11, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 679062125], + [21, 28, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 407869191], + [26, 62, 6, "Style/RedundantRegexpArgument: Use string `\"\\\\*\"` as argument instead of regexp `/\\\\\\*/`.", 3305913427], + [26, 70, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 557456888], + [27, 28, 25, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 4160157766], + [36, 21, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085147624], + [37, 45, 6, "Style/RedundantRegexpArgument: Use string `\"\\\\*\"` as argument instead of regexp `/\\\\\\*/`.", 3305913427], + [37, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 557456888], + [38, 28, 25, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 4160157766], + [42, 37, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1006256633], + [53, 5, 157, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 586528253], + [60, 5, 78, "Style/MissingRespondToMissing: When using `method_missing`, define `respond_to_missing?`.", 944250440], + [65, 40, 7, "Performance/StringIdentifierArgument: Use `:@body` instead of `'@body'`.", 3857852341], + [65, 40, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3857852341], + [71, 40, 7, "Performance/StringIdentifierArgument: Use `:@read` instead of `'@read'`.", 3876333271], + [71, 40, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3876333271], + [86, 3, 173, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3393125662], + [87, 18, 48, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 997846376], + [91, 3, 88, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 834352859], + [92, 5, 8, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 2254613070], + [92, 39, 8, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 2254613070], + [94, 5, 8, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 2254613070], + [97, 3, 55, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 702922609], + [98, 5, 8, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 2254613070], + [103, 3, 288, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4125263876], + [104, 24, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1318580622], + [108, 5, 8, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 2254613070], + [108, 36, 14, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2160310550], + [108, 52, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2159466735], + [109, 36, 14, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2159303911], + [109, 52, 18, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3094046633], + [116, 19, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2592099727], + [122, 20, 16, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 3363870545], + [141, 7, 21, "Layout/IndentationWidth: Use 2 (not 21) spaces for indentation.", 3973078917], + [142, 26, 4, "Layout/ElseAlignment: Align `else` with `conn.verify_mode`.", 2087423834], + [144, 26, 3, "Layout/EndAlignment: `end` at 144, 25 is not aligned with `conn.verify_mode = if` at 140, 6.", 193405706], + [151, 22, 50, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 892760043], + [151, 22, 50, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 892760043], + [152, 22, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3315070089], + [155, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1074813806], + [164, 81, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [165, 20, 47, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3506740841], + [180, 15, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 860394976], + [186, 22, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [190, 37, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2895478287], + [196, 71, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [201, 21, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1450505561], + [201, 41, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1436832301], + [213, 7, 80, "Lint/RescueException: Avoid rescuing the `Exception` class. Perhaps you meant to rescue `StandardError`?", 3610119133], + [221, 13, 58, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 216718555], + [221, 58, 10, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3294717144], + [225, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [243, 29, 1, "Lint/AssignmentInCondition: Wrap assignment in parentheses if intentional", 177560], + [243, 52, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 266497343] + ], + "lib/openid/kvform.rb:4138952503": [ + [2, 23, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [6, 5, 1352, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4285174228], + [29, 107, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [42, 22, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [45, 18, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [48, 5, 1472, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2664258689], + [65, 18, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 840924278], + [76, 31, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [78, 27, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [104, 5, 62, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 440967781], + [108, 5, 80, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2800167629] + ], + "lib/openid/kvpost.rb:2836741614": [ + [1, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [2, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [17, 5, 242, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1326314621], + [18, 32, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 983435646], + [18, 43, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1182861117], + [18, 43, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [19, 32, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1058754967], + [19, 32, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1058754967], + [20, 43, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [32, 5, 407, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2633894042], + [42, 70, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [43, 9, 18, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3996805664], + [51, 3, 302, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2138086473], + [54, 5, 93, "Lint/RescueException: Avoid rescuing the `Exception` class. Perhaps you meant to rescue `StandardError`?", 2065347935] + ], + "lib/openid/message.rb:4102770874": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [2, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1508131736], + [5, 23, 52, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2891208136], + [9, 14, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3482333731], + [12, 16, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 494421042], + [13, 17, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 494420947], + [17, 16, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1670302195], + [37, 8, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087698470], + [37, 13, 5, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 165548477], + [37, 19, 9, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 1228896939], + [38, 13, 9, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 798169870], + [38, 23, 6, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2172846391], + [39, 16, 12, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3549528604], + [40, 16, 6, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 1126279802], + [41, 24, 10, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2517626812], + [42, 14, 5, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 194523634], + [42, 20, 17, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 820088305], + [43, 17, 14, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 1615061360], + [43, 32, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193433784], + [44, 18, 10, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3672542120], + [44, 29, 6, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 1714235388], + [53, 36, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [56, 43, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [60, 34, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [77, 5, 518, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 196384904], + [80, 10, 51, "Performance/InefficientHashSearch: Use `#value?` instead of `#values.include?`.", 3072957018], + [82, 15, 51, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 929725521], + [87, 15, 36, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1335562897], + [101, 20, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1632211398], + [111, 5, 563, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2888237997], + [116, 32, 47, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2388501200], + [116, 80, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [117, 32, 48, "Layout/MultilineOperationIndentation: Use 2 (not 21) spaces for indenting an expression spanning multiple lines.", 2109521780], + [120, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [122, 22, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3058584636], + [122, 31, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [136, 5, 115, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3449424395], + [149, 39, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [155, 24, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [157, 42, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [157, 56, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [211, 5, 106, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3270016872], + [228, 9, 11, "Layout/IndentationWidth: Use 2 (not 11) spaces for indentation.", 3128322693], + [228, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [229, 18, 4, "Layout/ElseAlignment: Align `else` with `ns_key`.", 2087423834], + [230, 20, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2420531233], + [231, 18, 3, "Layout/EndAlignment: `end` at 231, 17 is not aligned with `ns_key = if` at 227, 8.", 193405706], + [250, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044978], + [252, 17, 112, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2329669508], + [262, 72, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2595197252], + [265, 7, 124, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 980989257], + [271, 25, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2956022523], + [272, 25, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1346626202], + [272, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035277469], + [273, 25, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 635587538], + [273, 45, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [274, 25, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2014057493], + [274, 38, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1436832301], + [276, 16, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1943456495], + [314, 41, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3416983464], + [323, 30, 42, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2865054466], + [323, 72, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [324, 31, 36, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3722534173], + [327, 26, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [328, 15, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401258014], + [328, 66, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [329, 16, 26, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1806639495], + [332, 25, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [355, 7, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [358, 7, 9, "Layout/IndentationWidth: Use 2 (not 9) spaces for indentation.", 3994155397], + [359, 14, 4, "Layout/ElseAlignment: Align `else` with `tail`.", 2087423834], + [361, 14, 3, "Layout/EndAlignment: `end` at 361, 13 is not aligned with `tail = if` at 357, 6.", 193405706], + [363, 7, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044978], + [403, 7, 4, "Lint/UnderscorePrefixedVariableName: Do not use prefix `_` for a variable that is used.", 2089550317], + [412, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [414, 41, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [415, 22, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [417, 59, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [419, 72, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [420, 28, 20, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 4157070020], + [460, 19, 47, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4136001751], + [461, 19, 52, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2076082156], + [466, 32, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [468, 15, 125, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2845360073], + [474, 21, 29, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1018314689], + [474, 41, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [475, 21, 41, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1589210437], + [480, 7, 6, "Lint/UnderscorePrefixedVariableName: Do not use prefix `_` for a variable that is used.", 3498751916], + [481, 17, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [483, 15, 96, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2447880605], + [496, 7, 6, "Lint/UnderscorePrefixedVariableName: Do not use prefix `_` for a variable that is used.", 3498751916], + [501, 7, 5, "Style/InfiniteLoop: Use `Kernel#loop` for infinite loops.", 191284826], + [502, 18, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91803692], + [512, 28, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427456841] + ], + "lib/openid/protocolerror.rb:1786077515": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655] + ], + "lib/openid/server.rb:1792470822": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3933002043], + [2, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [3, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847734175], + [4, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3682152042], + [5, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3577044961], + [6, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191648330], + [7, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [9, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039807664], + [19, 22, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2575269614], + [20, 19, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1624212443], + [21, 25, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1059129454], + [38, 15, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2073241892], + [73, 17, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [83, 7, 973, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3171094024], + [84, 51, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [85, 56, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [92, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [92, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [92, 83, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [96, 46, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [98, 30, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [99, 12, 8, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 2919038096], + [100, 24, 55, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3263298957], + [100, 24, 55, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3263298957], + [101, 24, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4192817487], + [101, 34, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1236122734], + [119, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039078867], + [119, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 967974776], + [120, 44, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [126, 26, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [135, 9, 2, "Lint/UselessAssignment: Useless assignment to variable - `ih`.", 5861156], + [138, 9, 7, "Layout/IndentationWidth: Use 2 (not 7) spaces for indentation.", 394119301], + [138, 23, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3908694509], + [139, 14, 4, "Layout/ElseAlignment: Align `else` with `ih`.", 2087423834], + [140, 16, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [141, 14, 3, "Layout/EndAlignment: `end` at 141, 13 is not aligned with `ih = if` at 137, 8.", 193405706], + [143, 16, 39, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1837372532], + [143, 16, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1837372532], + [144, 16, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 874138713], + [144, 28, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2725934909], + [145, 16, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2088898008], + [145, 22, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1289273623], + [145, 31, 2, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 5861156], + [174, 15, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [177, 7, 60, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2656680418], + [182, 10, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [182, 11, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [182, 46, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [202, 15, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [202, 27, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [204, 39, 6, "Performance/StringIdentifierArgument: Use `:sha1` instead of `'sha1'`.", 3036224142], + [204, 39, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036224142], + [213, 7, 1347, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2912282318], + [214, 49, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 742512847], + [215, 45, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4057239290], + [216, 25, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [216, 37, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [217, 12, 24, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 3973005723], + [217, 21, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [220, 11, 12, "Layout/IndentationWidth: Use 2 (not 12) spaces for indentation.", 155433733], + [220, 23, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 146392796], + [221, 21, 4, "Layout/ElseAlignment: Align `else` with `missing`.", 2087423834], + [222, 23, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2734874678], + [223, 21, 3, "Layout/EndAlignment: `end` at 223, 20 is not aligned with `missing = if` at 219, 10.", 193405706], + [225, 35, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1236122734], + [226, 35, 189, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1472291387], + [226, 42, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 481919470], + [226, 42, 131, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 11793590], + [226, 84, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [227, 43, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2957720444], + [228, 42, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 766506497], + [231, 23, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [239, 54, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1302701622], + [241, 35, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1236122734], + [242, 35, 120, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3540486081], + [242, 42, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036264092], + [242, 42, 103, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3707757476], + [242, 76, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [243, 43, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2851615900], + [243, 70, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1236122734], + [252, 34, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 401758518], + [253, 34, 16, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 113985684], + [254, 34, 6, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2158746291], + [256, 11, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [257, 11, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [257, 11, 40, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1905445545], + [264, 9, 12, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1081125640], + [265, 25, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [266, 39, 8, "Performance/StringIdentifierArgument: Use `:sha256` instead of `'sha256'`.", 3618363438], + [266, 39, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3618363438], + [267, 33, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [285, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [286, 9, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [287, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [287, 9, 47, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2738224754], + [299, 17, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [303, 7, 1625, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2180283986], + [305, 53, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [306, 30, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [307, 22, 49, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2863953747], + [307, 72, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [308, 22, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 823424615], + [310, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [313, 54, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [315, 37, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1236122734], + [316, 37, 35, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3756360383], + [316, 37, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3756360383], + [323, 35, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1236122734], + [324, 35, 47, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2012162986], + [324, 42, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3483985885], + [331, 35, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1236122734], + [332, 35, 96, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4173394173], + [332, 42, 30, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3242654537], + [332, 42, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3242654537], + [333, 42, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3549528604], + [333, 56, 1, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 177600], + [336, 49, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [336, 63, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [338, 24, 54, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 832416581], + [338, 24, 54, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832416581], + [339, 24, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3549528604], + [339, 38, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 874512463], + [357, 39, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [357, 39, 46, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2955192202], + [357, 62, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085254948], + [358, 39, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [359, 39, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [359, 39, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2546167319], + [360, 37, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [361, 37, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 983435646], + [362, 37, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 622463645], + [363, 41, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [363, 57, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [364, 16, 19, "Layout/MultilineOperationIndentation: Use 4 (not 7) spaces for indenting a condition in an `unless` statement spanning multiple lines.", 2529528845], + [366, 24, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [376, 30, 28, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 930639504], + [380, 44, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [380, 58, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [381, 44, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [385, 24, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [391, 24, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [439, 22, 17, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 1804413748], + [450, 19, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [453, 19, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [456, 23, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [457, 12, 39, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 1911918224], + [481, 7, 3250, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3356184989], + [485, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [486, 20, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [488, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [491, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [494, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [495, 31, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [496, 24, 44, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 476443748], + [497, 24, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1236122734], + [501, 51, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [502, 53, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [505, 17, 50, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1746623819], + [508, 28, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [509, 16, 55, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 208938461], + [509, 72, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [510, 18, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [512, 30, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [513, 16, 57, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3301285874], + [513, 74, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [514, 16, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [522, 9, 21, "Layout/IndentationWidth: Use 2 (not 21) spaces for indentation.", 3973078917], + [522, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [523, 28, 4, "Layout/ElseAlignment: Align `else` with `trust_root_param`.", 2087423834], + [524, 30, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [525, 28, 3, "Layout/EndAlignment: `end` at 525, 27 is not aligned with `trust_root_param = if` at 521, 8.", 193405706], + [530, 32, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [530, 51, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [531, 44, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2779224600], + [531, 74, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [532, 35, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1644573363], + [535, 55, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [543, 26, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [543, 30, 2, "Style/RedundantLineContinuation: Redundant line continuation.", 5862675], + [544, 12, 42, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 1433226521], + [642, 34, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [645, 56, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [646, 34, 39, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2602809986], + [646, 34, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2602809986], + [646, 73, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [647, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2300316435], + [654, 9, 9, "Layout/IndentationWidth: Use 2 (not 9) spaces for indentation.", 3994155397], + [654, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [655, 16, 5, "Layout/ElseAlignment: Align `elsif` with `mode`.", 165509744], + [657, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [659, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [661, 16, 5, "Layout/ElseAlignment: Align `elsif` with `mode`.", 165509744], + [662, 18, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2136724950], + [663, 16, 4, "Layout/ElseAlignment: Align `else` with `mode`.", 2087423834], + [664, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [665, 16, 3, "Layout/EndAlignment: `end` at 665, 15 is not aligned with `mode = if` at 653, 8.", 193405706], + [669, 23, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [670, 31, 42, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2666858070], + [670, 73, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [671, 32, 48, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 4195874379], + [674, 43, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [679, 36, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1916080336], + [679, 67, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [680, 37, 39, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 4227485895], + [680, 37, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4227485895], + [680, 76, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [681, 37, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1814540314], + [688, 25, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [689, 77, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [690, 37, 40, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1024475881], + [697, 36, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1136706503], + [697, 73, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [698, 37, 30, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2556113020], + [703, 34, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [704, 34, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1521254679], + [704, 72, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [705, 35, 38, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1633875015], + [705, 35, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1633875015], + [709, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [709, 41, 14, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1836193926], + [710, 41, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [711, 41, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [712, 41, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1679224880], + [712, 41, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1273866756], + [713, 39, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [716, 48, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [718, 39, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 983435646], + [719, 39, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 794246204], + [719, 39, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [719, 53, 19, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2958100160], + [723, 46, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [725, 36, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [726, 36, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4268070343], + [726, 76, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [727, 37, 31, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3446768576], + [727, 37, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3446768576], + [732, 44, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4288552051], + [732, 55, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1377032075], + [733, 44, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2898622406], + [733, 58, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2933321160], + [733, 71, 5, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 170962968], + [734, 44, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2725934909], + [734, 59, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2485497820], + [737, 48, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2858095960], + [755, 14, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [755, 15, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [755, 15, 15, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 423708262], + [756, 15, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [757, 15, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [758, 15, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [758, 15, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 815332326], + [758, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [762, 15, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [764, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [768, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [789, 35, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1122663964], + [789, 79, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [790, 35, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1557781339], + [794, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [794, 45, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [799, 16, 30, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1729843511], + [799, 16, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1729843511], + [799, 48, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 874138713], + [800, 16, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4288552051], + [801, 16, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4046627668], + [802, 16, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2933321160], + [803, 16, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2725934909], + [836, 16, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2638383570], + [836, 16, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2638383570], + [837, 16, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 874138713], + [838, 16, 14, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2979001140], + [839, 16, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 463181332], + [865, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [865, 47, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [875, 31, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [876, 12, 40, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 695384809], + [930, 60, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [956, 23, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 309987210], + [957, 21, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2223259751], + [959, 7, 52, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2152933968], + [963, 7, 48, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 90040144], + [981, 27, 47, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 726413268], + [981, 27, 89, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3743516744], + [981, 75, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [982, 28, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2893032440], + [982, 42, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4223563293], + [982, 56, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1236122734], + [989, 27, 35, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 856335427], + [989, 27, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 856335427], + [990, 27, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1236122734], + [990, 36, 5, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 170529416], + [990, 43, 1, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 177600], + [1012, 21, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [1015, 26, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [1017, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1018, 22, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1039, 56, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1042, 25, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2515247934], + [1049, 9, 8, "Layout/IndentationWidth: Use 2 (not 8) spaces for indentation.", 121035013], + [1050, 15, 4, "Layout/ElseAlignment: Align `else` with `key`.", 2087423834], + [1052, 15, 3, "Layout/EndAlignment: `end` at 1052, 14 is not aligned with `key = if` at 1048, 8.", 193405706], + [1067, 33, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4058440666], + [1070, 9, 8, "Layout/IndentationWidth: Use 2 (not 8) spaces for indentation.", 121035013], + [1071, 15, 4, "Layout/ElseAlignment: Align `else` with `key`.", 2087423834], + [1073, 15, 3, "Layout/EndAlignment: `end` at 1073, 14 is not aligned with `key = if` at 1069, 8.", 193405706], + [1076, 18, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1077, 27, 52, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1475066302], + [1077, 27, 52, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1475066302], + [1078, 27, 19, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 490773607], + [1078, 27, 19, "Style/TernaryParentheses: Use parentheses for ternary expressions with complex conditions.", 490773607], + [1078, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032076797], + [1078, 44, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [1079, 27, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4223563293], + [1079, 41, 16, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1887357502], + [1092, 9, 8, "Layout/IndentationWidth: Use 2 (not 8) spaces for indentation.", 121035013], + [1093, 15, 4, "Layout/ElseAlignment: Align `else` with `key`.", 2087423834], + [1095, 15, 3, "Layout/EndAlignment: `end` at 1095, 14 is not aligned with `key = if` at 1091, 8.", 193405706], + [1109, 7, 17, "Naming/VariableName: Use snake_case for variable names.", 1925358418], + [1118, 38, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1441780294], + [1118, 47, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [1119, 38, 25, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1408178878], + [1123, 38, 13, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1762536984], + [1124, 38, 26, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4276289632], + [1124, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1124, 40, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [1124, 62, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1126, 38, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1441780294], + [1126, 47, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [1127, 38, 23, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2619964149], + [1158, 39, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1161, 22, 44, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1581867789], + [1161, 22, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1581867789], + [1162, 22, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2137101542], + [1162, 33, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2137101542], + [1166, 84, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [1171, 9, 15, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 963280966], + [1178, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1178, 50, 14, "Performance/StringIdentifierArgument: Use `:from_message` instead of `'from_message'`.", 434155943], + [1178, 50, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434155943], + [1179, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [1179, 54, 14, "Performance/StringIdentifierArgument: Use `:from_message` instead of `'from_message'`.", 434155943], + [1179, 54, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434155943], + [1180, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [1180, 59, 14, "Performance/StringIdentifierArgument: Use `:from_message` instead of `'from_message'`.", 434155943], + [1180, 59, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434155943], + [1181, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [1181, 9, 54, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3449255941], + [1181, 48, 14, "Performance/StringIdentifierArgument: Use `:from_message` instead of `'from_message'`.", 434155943], + [1181, 48, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434155943], + [1200, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [1200, 34, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [1206, 17, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [1211, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1213, 24, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 731998518], + [1217, 49, 17, "Performance/StringIdentifierArgument: Use `:default_decoder` instead of `'default_decoder'`.", 969315183], + [1217, 49, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 969315183], + [1226, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1227, 22, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3149754674], + [1245, 7, 16, "Naming/VariableName: Use snake_case for variable names.", 3054764905], + [1246, 7, 14, "Naming/VariableName: Use snake_case for variable names.", 683624799], + [1247, 7, 14, "Naming/VariableName: Use snake_case for variable names.", 2473038197], + [1286, 28, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149045475], + [1288, 24, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 516793225], + [1288, 24, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 516793225], + [1289, 24, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2088335225], + [1289, 30, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1896618937], + [1305, 49, 5, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 170962968], + [1306, 49, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 874512463], + [1309, 28, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2694843697], + [1309, 28, 92, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2502729472], + [1309, 73, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [1310, 29, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2355236949], + [1310, 48, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 874512463], + [1310, 60, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3549528604], + [1312, 38, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1236122734], + [1313, 38, 20, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2751211893], + [1314, 38, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 902673318], + [1341, 27, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [1357, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [1359, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1372, 34, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1372, 42, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [1373, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [1375, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3782363013], + [1377, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1645991854], + [1407, 41, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1408, 14, 40, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 695384809], + [1415, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [1417, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1429, 26, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [1434, 29, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [1440, 27, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [1445, 9, 15, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 963280966], + [1465, 16, 38, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 780812507], + [1465, 16, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 780812507], + [1466, 16, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1377032075], + [1467, 16, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2933321160] + ], + "lib/openid/store/filesystem.rb:4219162133": [ + [1, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2304965300], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1702461967], + [3, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3470819279], + [5, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [6, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2055340646], + [7, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191648330], + [12, 7, 18, "Naming/VariableName: Use snake_case for variable names.", 2080787395], + [12, 28, 66, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4004737191], + [12, 101, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [16, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3382444895], + [17, 49, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3759258831], + [18, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039401801], + [29, 86, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94548671], + [31, 40, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94548671], + [32, 45, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [35, 9, 16, "Layout/IndentationWidth: Use 2 (not 16) spaces for indentation.", 720477445], + [36, 23, 4, "Layout/ElseAlignment: Align `else` with `handle_hash`.", 2087423834], + [37, 25, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [38, 23, 3, "Layout/EndAlignment: `end` at 38, 22 is not aligned with `handle_hash = if` at 34, 8.", 193405706], + [39, 64, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340392], + [81, 52, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340111], + [90, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [96, 42, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338263], + [110, 11, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [134, 23, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [135, 42, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94548671], + [137, 19, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [138, 18, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [140, 15, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4109305420], + [142, 45, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [146, 27, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2030884720], + [167, 65, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340111], + [170, 29, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338263], + [195, 44, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340111], + [200, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [201, 35, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340392], + [215, 26, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92110924], + [221, 13, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [227, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 614818917], + [236, 11, 15, "Performance/StringReplacement: Use `tr!` instead of `gsub!`.", 2554757118], + [236, 17, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340206], + [236, 22, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337626], + [237, 11, 15, "Performance/StringReplacement: Use `tr!` instead of `gsub!`.", 4095748107], + [237, 17, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [237, 22, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [238, 11, 14, "Performance/StringReplacement: Use `delete!` instead of `gsub!`.", 3654193431], + [238, 17, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [238, 22, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789] + ], + "lib/openid/store/interface.rb:3334483540": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655] + ], + "lib/openid/store/memcache.rb:883087020": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [2, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2055340646], + [3, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3682152042], + [4, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039807664], + [11, 49, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2581133716], + [61, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337131], + [61, 53, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338713], + [61, 64, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338713], + [62, 47, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [63, 43, 19, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4042310284], + [69, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193336772], + [70, 16, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338713], + [74, 7, 23, "Style/SingleLineMethods: Avoid single-line method definitions.", 128304659], + [76, 7, 16, "Style/SingleLineMethods: Avoid single-line method definitions.", 3679187158], + [78, 7, 29, "Style/SingleLineMethods: Avoid single-line method definitions.", 787492483], + [84, 44, 19, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4042310284] + ], + "lib/openid/store/memory.rb:979248015": [ + [1, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2055340646], + [17, 51, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [17, 83, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [22, 9, 5, "Lint/UselessAssignment: Useless assignment to variable - `assoc`. Did you mean `assocs`?", 170529416], + [26, 25, 37, "Performance/CompareWithBlock: Use `sort_by(&:issued)` instead of `sort { |a, b| a.issued <=> b.issued }`.", 656767338], + [40, 52, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789] + ], + "lib/openid/store/nonce.rb:959609319": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3933002043], + [2, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3020570481], + [3, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039807664], + [8, 16, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2507889197], + [9, 20, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4126522891], + [10, 5, 12, "Naming/VariableName: Use snake_case for variable names.", 2011612633], + [10, 20, 64, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 418873156], + [17, 5, 33, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 946500752], + [18, 7, 5, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 214151279], + [21, 5, 55, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2221980689], + [22, 7, 5, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 214151279], + [26, 5, 341, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3565164022], + [39, 5, 480, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3166460613], + [58, 5, 264, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2698479003], + [61, 7, 6, "Layout/IndentationWidth: Use 2 (not 6) spaces for indentation.", 3135555589], + [62, 11, 4, "Layout/ElseAlignment: Align `else` with `t`.", 2087423834], + [64, 11, 3, "Layout/EndAlignment: `end` at 64, 10 is not aligned with `t = if` at 60, 6.", 193405706] + ], + "lib/openid/trustroot.rb:881014105": [ + [1, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92337995], + [2, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2013616931], + [5, 39, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [13, 65, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [19, 25, 1120, "Metrics/CollectionLiteralLength: Avoid hard coding large quantities of data in code. Prefer reading the data from an external source.", 2864642788], + [20, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860896], + [20, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860897], + [20, 16, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087549180], + [20, 21, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860898], + [20, 24, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860899], + [20, 27, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860909], + [20, 30, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860904], + [20, 33, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860905], + [20, 36, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860906], + [20, 39, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860907], + [20, 42, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860917], + [20, 45, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860918], + [20, 48, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087568679], + [20, 53, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860919], + [20, 56, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087576927], + [20, 61, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860912], + [21, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860915], + [21, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860924], + [21, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860926], + [21, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861062], + [21, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861061], + [21, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861059], + [21, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861058], + [21, 31, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861057], + [21, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861056], + [21, 37, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861071], + [21, 40, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861070], + [21, 43, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193415412], + [21, 47, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861069], + [21, 50, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861066], + [21, 53, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861065], + [21, 56, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861064], + [21, 59, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861077], + [21, 62, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861076], + [21, 65, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861075], + [22, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861072], + [22, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861086], + [22, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861085], + [22, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861095], + [22, 22, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193416115], + [22, 26, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861093], + [22, 29, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861090], + [22, 32, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861088], + [22, 35, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861089], + [22, 38, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861102], + [22, 41, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861103], + [22, 44, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861101], + [22, 47, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861098], + [22, 50, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861099], + [22, 53, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861096], + [22, 56, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861097], + [22, 59, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193416292], + [22, 63, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087770454], + [23, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861107], + [23, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861104], + [23, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861118], + [23, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861119], + [23, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861116], + [23, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860740], + [23, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860747], + [23, 31, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860746], + [23, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860748], + [23, 37, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860750], + [23, 40, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860763], + [23, 43, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860771], + [23, 46, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193405521], + [23, 50, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860773], + [23, 53, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860775], + [23, 56, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860786], + [23, 59, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860787], + [23, 62, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860788], + [23, 65, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860789], + [24, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860937], + [24, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860936], + [24, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860942], + [24, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860940], + [24, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860945], + [24, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860963], + [24, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860960], + [24, 31, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860966], + [24, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860967], + [24, 37, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860964], + [24, 40, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860965], + [24, 43, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860970], + [24, 46, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860971], + [24, 49, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860974], + [24, 52, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860975], + [24, 55, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860972], + [24, 58, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193412219], + [24, 62, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860978], + [24, 65, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860979], + [25, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860977], + [25, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860982], + [25, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860983], + [25, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860981], + [25, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860987], + [25, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861126], + [25, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861120], + [25, 31, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861123], + [25, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861151], + [25, 37, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861145], + [25, 40, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861144], + [25, 43, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861160], + [25, 46, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861161], + [25, 49, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861152], + [25, 52, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861153], + [25, 55, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861154], + [25, 58, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087826411], + [25, 63, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193418006], + [26, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861181], + [26, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861182], + [26, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861183], + [26, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861176], + [26, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861322], + [26, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861314], + [26, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861312], + [26, 31, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2088000401], + [26, 36, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861343], + [26, 39, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861355], + [26, 42, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861353], + [26, 45, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861350], + [26, 48, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861351], + [26, 51, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861347], + [26, 54, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861344], + [26, 57, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861374], + [26, 60, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861372], + [26, 63, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861369], + [27, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861364], + [27, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861000], + [27, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861003], + [27, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861002], + [27, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860992], + [27, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5860994], + [27, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861019], + [27, 31, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861018], + [27, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861021], + [27, 37, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861020], + [27, 40, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861023], + [27, 43, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861008], + [27, 46, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861033], + [27, 49, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861035], + [27, 52, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861036], + [27, 55, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861037], + [27, 58, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861039], + [27, 61, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861024], + [27, 64, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193413805], + [28, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861028], + [28, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861029], + [28, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861030], + [28, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861031], + [28, 22, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087698668], + [28, 27, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861048], + [28, 30, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861049], + [28, 33, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861050], + [28, 36, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861051], + [28, 39, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861052], + [28, 42, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861053], + [28, 45, 6, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 1486950451], + [28, 52, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861054], + [28, 55, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861055], + [28, 58, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861040], + [28, 61, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861041], + [28, 64, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861042], + [29, 10, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087876002], + [29, 15, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861192], + [29, 18, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861198], + [29, 21, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193419642], + [29, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861197], + [29, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861196], + [29, 31, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861186], + [29, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861191], + [29, 37, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861188], + [29, 40, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861211], + [29, 43, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861209], + [29, 46, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861214], + [29, 49, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861201], + [29, 52, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861223], + [29, 55, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193420831], + [29, 59, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861396], + [29, 62, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861392], + [29, 65, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861395], + [30, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861405], + [30, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861406], + [30, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861401], + [30, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861400], + [30, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861403], + [30, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861383], + [30, 28, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193425544], + [30, 32, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861382], + [30, 35, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861377], + [30, 38, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861378], + [30, 41, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861388], + [30, 44, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861429], + [30, 47, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861586], + [30, 50, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861592], + [30, 53, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861572], + [30, 56, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861570], + [30, 59, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861568], + [30, 62, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861623], + [30, 65, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861620], + [31, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861618], + [31, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861619], + [31, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861617], + [31, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861630], + [31, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861631], + [31, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861628], + [31, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861629], + [31, 31, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861626], + [31, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861627], + [31, 37, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861624], + [31, 40, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861625], + [31, 43, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861604], + [31, 46, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861602], + [31, 49, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861603], + [31, 52, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861600], + [31, 55, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861615], + [31, 58, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861612], + [31, 61, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861266], + [31, 64, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861269], + [32, 11, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861271], + [32, 14, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861270], + [32, 17, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861273], + [32, 20, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861275], + [32, 23, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861274], + [32, 26, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861277], + [32, 29, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861276], + [32, 32, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861279], + [32, 35, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861278], + [32, 38, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861249], + [32, 41, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861251], + [32, 44, 6, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 1720061981], + [32, 51, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861253], + [32, 54, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861255], + [32, 57, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861254], + [32, 60, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861259], + [32, 63, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861297], + [33, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861307], + [33, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861283], + [33, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861289], + [33, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861290], + [33, 22, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861458], + [33, 25, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861456], + [33, 28, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861462], + [33, 31, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861460], + [33, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861466], + [33, 37, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861469], + [33, 40, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861446], + [33, 43, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861492], + [33, 46, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861473], + [33, 49, 11, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 661945988], + [34, 25, 16, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 504767231], + [34, 42, 14, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 1704504236], + [35, 19, 11, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 4242353991], + [35, 31, 18, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 153616670], + [36, 26, 12, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2941599748], + [36, 39, 12, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2668491249], + [36, 52, 10, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2602151602], + [36, 63, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861689], + [37, 10, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861673], + [37, 13, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861854], + [37, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861842], + [37, 19, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5861832], + [46, 29, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3484016338], + [59, 5, 131, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3228933781], + [67, 5, 751, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1710960170], + [75, 31, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [78, 12, 22, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 3836799498], + [78, 35, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [81, 12, 36, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 200772756], + [93, 5, 429, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1374864212], + [117, 5, 826, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 92446907], + [117, 53, 5, "Lint/UnderscorePrefixedVariableName: Do not use prefix `_` for a variable that is used.", 235583841], + [119, 22, 25, "Performance/StringIdentifierArgument: Use `:get_allowed_return_urls` instead of `'get_allowed_return_urls'`.", 874029638], + [119, 22, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 874029638], + [121, 28, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 867927444], + [121, 86, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [138, 65, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [148, 7, 232, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1348770474], + [151, 31, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [152, 33, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [154, 14, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [156, 14, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339942], + [161, 7, 527, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3105728993], + [171, 11, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [174, 38, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2644306263], + [175, 38, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1362124624], + [176, 38, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1773074458], + [178, 10, 19, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2831996527], + [178, 27, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [178, 31, 17, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 202211162], + [178, 46, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [179, 10, 17, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 962241635], + [179, 25, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [179, 29, 10, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3484498728], + [179, 29, 10, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3484498728], + [179, 37, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [182, 7, 840, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1111616375], + [187, 38, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4179240059], + [188, 25, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085256097], + [188, 31, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [191, 22, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [192, 36, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [193, 18, 26, "Style/TernaryParentheses: Use parentheses for ternary expressions with complex conditions.", 2823557365], + [193, 27, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3026032253], + [194, 45, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [194, 55, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [198, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [201, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [201, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [204, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [204, 28, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [204, 44, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339942], + [206, 9, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [211, 7, 172, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1035216957], + [220, 7, 120, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2760771742], + [239, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039950300], + [240, 29, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [240, 63, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [240, 83, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [254, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1018961288], + [256, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [266, 44, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [274, 42, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [292, 40, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340111], + [296, 25, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [296, 29, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [297, 15, 28, "Layout/MultilineOperationIndentation: Use 4 (not 6) spaces for indenting a condition in a `elsif` statement spanning multiple lines.", 293532131], + [297, 31, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [297, 44, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [298, 15, 15, "Layout/MultilineOperationIndentation: Use 4 (not 6) spaces for indenting a condition in a `elsif` statement spanning multiple lines.", 614050840], + [312, 37, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [313, 11, 12, "Layout/IndentationWidth: Use 2 (not 12) spaces for indentation.", 155433733], + [313, 23, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339971], + [314, 21, 4, "Layout/ElseAlignment: Align `else` with `allowed`.", 2087423834], + [315, 23, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085280725], + [316, 21, 3, "Layout/EndAlignment: `end` at 316, 20 is not aligned with `allowed = if` at 312, 10.", 193405706] + ], + "lib/openid/urinorm.rb:1109248654": [ + [1, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92337995], + [7, 5, 757, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1251035241], + [10, 38, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 907637041], + [13, 38, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 403837407], + [15, 38, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1356343460], + [17, 38, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1356343460], + [22, 18, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [34, 5, 58, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1308491834], + [38, 5, 901, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1082193363], + [42, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94110058], + [44, 32, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085260164], + [46, 32, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94215563], + [48, 23, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085263396], + [49, 18, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [50, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3109116421], + [53, 23, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94215658], + [54, 18, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [56, 16, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085260197], + [56, 22, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [57, 18, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [60, 35, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [61, 26, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [68, 28, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789] + ], + "lib/openid/util.rb:934305720": [ + [1, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91426760], + [2, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92337995], + [3, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 800403441], + [7, 26, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [17, 20, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3956381438], + [18, 21, 40, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 4252227259], + [18, 21, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4252227259], + [19, 32, 104, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 926887679], + [24, 11, 16, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2686537055], + [26, 5, 113, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4263461037], + [32, 5, 64, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3430225037], + [33, 16, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338280], + [33, 21, 14, "Performance/StringReplacement: Use `delete` instead of `gsub`.", 1187769177], + [33, 32, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [36, 5, 215, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1781608294], + [37, 44, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [40, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338280], + [43, 5, 375, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 764313457], + [47, 17, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [54, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [56, 14, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339971], + [59, 5, 113, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3881247632], + [65, 5, 233, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1836615070], + [69, 44, 11, "Performance/StringIdentifierArgument: Use `:each_pair` instead of `'each_pair'`.", 1158397247], + [69, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1158397247], + [71, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [71, 35, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339971], + [71, 41, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [75, 27, 6, "Style/GlobalStdStream: Use `$stderr` instead of `STDERR`.", 3356712163], + [76, 25, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2817345500], + [78, 5, 56, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2727557201], + [82, 5, 38, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1822287760], + [87, 5, 56, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3115535040], + [91, 5, 355, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3095635635], + [91, 45, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 490006018], + [110, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [110, 22, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339971], + [110, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3325330116], + [110, 38, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340825], + [110, 45, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3094424448], + [110, 53, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340763], + [110, 60, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3094036075], + [110, 75, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2959556167], + [110, 92, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 588061377], + [110, 100, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [112, 5, 88, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 778275783] + ], + "lib/openid/version.rb:172215805": [ + [2, 13, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3885394300] + ], + "lib/openid/yadis/accept.rb:3796527798": [ + [6, 5, 673, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1005755367], + [10, 16, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202], + [15, 79, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [17, 23, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3612323881], + [26, 27, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202], + [27, 9, 12, "Layout/IndentationWidth: Use 2 (not 12) spaces for indentation.", 155433733], + [28, 19, 4, "Layout/ElseAlignment: Align `else` with `chunks`.", 2087423834], + [29, 28, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2379971602], + [30, 19, 3, "Layout/EndAlignment: `end` at 30, 18 is not aligned with `chunks << if` at 26, 8.", 193405706], + [33, 19, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085262697], + [36, 5, 968, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1809754118], + [43, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [46, 29, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340734], + [49, 24, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [54, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [58, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [59, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [60, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338420], + [75, 5, 1585, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3200748744], + [87, 38, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [89, 7, 12, "Layout/IndentationWidth: Use 2 (not 12) spaces for indentation.", 155433733], + [90, 17, 4, "Layout/ElseAlignment: Align `else` with `default`.", 2087423834], + [92, 17, 3, "Layout/EndAlignment: `end` at 92, 16 is not aligned with `default = if` at 87, 6.", 193405706], + [97, 20, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340111], + [100, 22, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340111], + [110, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [112, 9, 6, "Layout/IndentationWidth: Use 2 (not 6) spaces for indentation.", 3135555589], + [113, 13, 4, "Layout/ElseAlignment: Align `else` with `q`.", 2087423834], + [115, 13, 3, "Layout/EndAlignment: `end` at 115, 12 is not aligned with `q = if` at 111, 8.", 193405706], + [127, 5, 511, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 874198912] + ], + "lib/openid/yadis/constants.rb:902908108": [ + [1, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 43233146], + [5, 25, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3274948509], + [6, 26, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [11, 8, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [12, 8, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 372628359], + [13, 7, 25, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 2119769783] + ], + "lib/openid/yadis/discovery.rb:2199614362": [ + [1, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [2, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [3, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2743300663], + [4, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1996466898], + [70, 5, 1535, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3246323220], + [73, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [73, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1562230085], + [73, 72, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [74, 7, 102, "Lint/RescueException: Avoid rescuing the `Exception` class. Perhaps you meant to rescue `StandardError`?", 3710982363], + [77, 23, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247383], + [77, 29, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [77, 46, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247569], + [79, 70, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [80, 11, 55, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1128263547], + [80, 68, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2088302577], + [89, 34, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1203671929], + [93, 26, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [99, 25, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247383], + [99, 31, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [99, 48, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247569], + [101, 67, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [102, 91, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2088302577], + [108, 36, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1203671929], + [122, 5, 906, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3059427424], + [125, 27, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1203671929], + [129, 29, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [129, 59, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [130, 10, 60, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 2715920954], + [130, 29, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340734], + [140, 20, 9, "Naming/InclusiveLanguage: Consider replacing 'whitelist' with 'allowlist' or 'permit'.", 469122336], + [140, 35, 9, "Naming/InclusiveLanguage: Consider replacing 'blacklist' with 'denylist' or 'block'.", 3660646720] + ], + "lib/openid/yadis/filters.rb:2626927831": [ + [41, 7, 73, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2334760220], + [136, 7, 71, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3846490198], + [136, 7, 71, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 3846490198], + [143, 5, 253, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 178241044], + [157, 5, 1247, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2569421294], + [158, 84, 6, "Performance/StringIdentifierArgument: Use `:each` instead of `'each'`.", 3028709770], + [158, 84, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3028709770], + [166, 36, 23, "Performance/StringIdentifierArgument: Use `:get_service_endpoints` instead of `'get_service_endpoints'`.", 1099711038], + [166, 36, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1099711038], + [169, 39, 29, "Performance/StringIdentifierArgument: Use `:from_basic_service_endpoint` instead of `'from_basic_service_endpoint'`.", 1551624392], + [169, 39, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551624392], + [172, 46, 29, "Performance/StringIdentifierArgument: Use `:from_basic_service_endpoint` instead of `'from_basic_service_endpoint'`.", 1551624392], + [172, 46, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551624392], + [173, 39, 6, "Performance/StringIdentifierArgument: Use `:call` instead of `'call'`.", 3017009927], + [173, 39, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3017009927] + ], + "lib/openid/yadis/htmltokenizer.rb:727650592": [ + [50, 3, 36, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2915883728], + [69, 5, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [71, 8, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340825], + [73, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 93876292], + [75, 31, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94282683], + [82, 31, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340763], + [90, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340825], + [121, 29, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [122, 10, 63, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 3993109313], + [122, 35, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [133, 10, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340825], + [135, 9, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [141, 17, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [144, 37, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [146, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [146, 40, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [158, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [162, 28, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [181, 5, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [185, 29, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [206, 5, 11, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1279960888], + [208, 31, 56, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3200292774], + [219, 5, 11, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1279960888], + [220, 8, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340825], + [220, 23, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [220, 26, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340763], + [221, 33, 56, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3200292774], + [230, 8, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [233, 19, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [260, 13, 8, "Layout/IndentationWidth: Use 2 (not 8) spaces for indentation.", 121035013], + [261, 19, 5, "Layout/ElseAlignment: Align `elsif` with `val`.", 165509744], + [261, 46, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [261, 49, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085177534], + [263, 19, 4, "Layout/ElseAlignment: Align `else` with `val`.", 2087423834], + [265, 19, 3, "Layout/EndAlignment: `end` at 265, 18 is not aligned with `val = if` at 259, 12.", 193405706], + [282, 12, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91918406], + [283, 26, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91647932], + [283, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91647932], + [284, 12, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3732771833], + [285, 26, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91647932], + [285, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91647932], + [288, 5, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789] + ], + "lib/openid/yadis/parsehtml.rb:2435886207": [ + [1, 9, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 634180536], + [2, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91426760], + [6, 5, 1184, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2583187193], + [13, 18, 1, "Lint/AssignmentInCondition: Wrap assignment in parentheses if intentional", 177560], + [13, 34, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3025445581], + [13, 34, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3025445581], + [13, 42, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3896501570], + [13, 42, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3896501570], + [13, 51, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3038082424], + [13, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3038082424], + [13, 59, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3018684341], + [13, 59, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018684341], + [13, 67, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3903542778], + [13, 67, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3903542778], + [14, 34, 6, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3026048248], + [14, 34, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3026048248], + [14, 42, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3253849258], + [14, 42, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3253849258], + [17, 11, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [17, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3896501570], + [17, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018684341], + [17, 43, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3903542778], + [19, 29, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3025445581], + [19, 56, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [24, 29, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3253849258], + [24, 58, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [25, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4008454117], + [28, 11, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [28, 40, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3026048248], + [30, 38, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3038082424], + [30, 45, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [30, 71, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3484828462], + [32, 14, 31, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 1997956661], + [32, 35, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3782231308], + [33, 50, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3782231308] + ], + "lib/openid/yadis/services.rb:1434186558": [ + [1, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 916562793], + [2, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906546608], + [3, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 53893767], + [7, 5, 719, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 909444346], + [17, 40, 21, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3188732146], + [18, 40, 20, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 808345795], + [18, 62, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193411163], + [26, 5, 453, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 100913079] + ], + "lib/openid/yadis/xrds.rb:3502384701": [ + [1, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2413211883], + [2, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2206965434], + [3, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4025230449], + [5, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2995095577], + [9, 18, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 308764201], + [10, 15, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3243062565], + [13, 7, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [14, 7, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92236619], + [14, 7, 19, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 198401798], + [24, 5, 1505, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 973105365], + [36, 41, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 21417637], + [46, 37, 6, "Performance/StringIdentifierArgument: Use `:name` instead of `'name'`.", 3032265122], + [46, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032265122], + [48, 42, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2887863650], + [54, 7, 10, "Style/ReturnNil: Use `return` instead of `return nil`.", 1900003172], + [61, 54, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340004], + [63, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2887863650], + [66, 38, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4182789614], + [66, 38, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4182789614], + [66, 65, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1969631860], + [67, 38, 6, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1898500505], + [75, 36, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 729603208], + [84, 5, 400, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2176692576], + [86, 29, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2383194659], + [91, 31, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4015944537], + [96, 29, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2383194659], + [100, 5, 229, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3284163917], + [101, 7, 10, "Lint/UnderscorePrefixedVariableName: Do not use prefix `_` for a variable that is used.", 517067060], + [108, 5, 173, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 706989265], + [111, 27, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3006973656], + [115, 5, 263, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4119939356], + [116, 25, 14, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 535875337], + [117, 25, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1862751848], + [117, 25, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1862751848], + [118, 25, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3664293015], + [121, 27, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1031125964], + [125, 5, 127, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1135967129], + [127, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3784266648], + [130, 5, 131, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2325223047], + [138, 5, 338, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 4077987403], + [140, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91008555], + [142, 23, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 283114958], + [149, 5, 156, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 397670671], + [151, 21, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2582233879], + [151, 59, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2582233879] + ], + "lib/openid/yadis/xri.rb:750587094": [ + [1, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [8, 26, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340004], + [8, 31, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [8, 36, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193336805], + [8, 41, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340206], + [8, 46, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340033], + [8, 51, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340173], + [10, 7, 271, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2782130302], + [11, 29, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [12, 12, 21, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 807609306], + [12, 34, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [13, 12, 87, "Layout/MultilineOperationIndentation: Use 4 (not 3) spaces for indenting a condition in an `if` statement spanning multiple lines.", 739852162], + [13, 30, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3794133634], + [13, 41, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [24, 7, 147, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 305119605], + [26, 23, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3277843292], + [26, 40, 20, "Performance/RedundantMatch: Use `=~` in places where the `MatchData` returned by `#match` will not be used.", 713822284], + [26, 40, 20, "Performance/RegexpMatch: Use `match?` instead of `match` when `MatchData` is not used.", 713822284], + [26, 50, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3794133634], + [32, 7, 287, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 477612230], + [35, 19, 3, "Style/RedundantRegexpArgument: Use string `\"%\"` as argument instead of regexp `/%/`.", 193348832], + [35, 24, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94025095], + [47, 7, 76, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2929197802], + [52, 7, 157, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1946667856], + [58, 7, 227, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 649186306], + [59, 40, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340004], + [66, 7, 435, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3686715349], + [67, 39, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3277843292], + [68, 31, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [69, 39, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340173], + [70, 9, 9, "Layout/IndentationWidth: Use 2 (not 9) spaces for indentation.", 3994155397], + [70, 48, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340268], + [71, 16, 5, "Layout/ElseAlignment: Align `elsif` with `root`.", 165509744], + [73, 16, 4, "Layout/ElseAlignment: Align `else` with `root`.", 2087423834], + [75, 16, 3, "Layout/EndAlignment: `end` at 75, 15 is not aligned with `root = if` at 69, 8.", 193405706], + [80, 7, 101, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2087973483], + [81, 15, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3277843292], + [81, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3277843292] + ], + "lib/openid/yadis/xrires.rb:2128153021": [ + [1, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91426760], + [2, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2995095577], + [3, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 53893767], + [4, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [12, 25, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 295561528], + [17, 25, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [17, 36, 22, "Performance/RedundantMatch: Use `=~` in places where the `MatchData` returned by `#match` will not be used.", 2937463082], + [17, 36, 22, "Performance/RegexpMatch: Use `match?` instead of `match` when `MatchData` is not used.", 2937463082], + [17, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085263598], + [26, 19, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [26, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 460732345], + [26, 32, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [26, 54, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [28, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 460732159], + [31, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 460732345], + [31, 31, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 477917816], + [49, 11, 11, "Naming/VariableName: Use snake_case for variable names.", 1131396834], + [51, 12, 11, "Naming/VariableName: Use snake_case for variable names.", 1131396834], + [59, 7, 170, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 430146384], + [62, 35, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [64, 16, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339971], + [67, 7, 380, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3699337347], + [72, 84, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [74, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [75, 9, 8, "Layout/IndentationWidth: Use 2 (not 8) spaces for indentation.", 121035013], + [75, 17, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339971], + [76, 15, 4, "Layout/ElseAlignment: Align `else` with `sep`.", 2087423834], + [77, 17, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [78, 15, 3, "Layout/EndAlignment: `end` at 78, 14 is not aligned with `sep = if` at 74, 8.", 193405706] + ], + "lib/ruby-openid.rb:3010806139": [ + [1, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3058584636] + ], + "setup.rb:1023388634": [ + [13, 5, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [19, 5, 4, "Security/Open: The use of `Kernel#open` is a serious security risk.", 2087926481], + [34, 3, 4, "Security/Open: The use of `Kernel#open` is a serious security risk.", 2087926481], + [34, 15, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085197365], + [41, 19, 38, "Style/TernaryParentheses: Use parentheses for ternary expressions with complex conditions.", 1033489889], + [41, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [41, 54, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [56, 23, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3101244657], + [76, 5, 19, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3810613190], + [92, 21, 45, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1517383745], + [96, 5, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3229145574], + [110, 5, 73, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2547818485], + [114, 5, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3588584513], + [119, 26, 3, "Style/RedundantRegexpArgument: Use string `\"=\"` as argument instead of regexp `/=/`.", 193349112], + [123, 5, 65, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2377746729], + [128, 25, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338482], + [130, 9, 35, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1792105273], + [130, 57, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [137, 7, 7, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 78553435], + [144, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1307896607], + [144, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [144, 38, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1171993823], + [146, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 30577054], + [147, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 21512210], + [148, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 302478374], + [157, 10, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1785749249], + [159, 7, 43, "Style/IdenticalConditionalBranches: Move `libruby = \"#{c['prefix']}/lib/ruby\"` out of the conditional.", 2215780936], + [159, 14, 8, "Layout/ExtraSpacing: Unnecessary spacing detected.", 121035013], + [159, 30, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [160, 17, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [160, 27, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1785749249], + [161, 21, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [161, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1643505218], + [162, 15, 7, "Layout/ExtraSpacing: Unnecessary spacing detected.", 394119301], + [162, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4234663473], + [163, 18, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [163, 27, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 687744342], + [164, 27, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 688156649], + [167, 7, 43, "Style/IdenticalConditionalBranches: Move `libruby = \"#{c['prefix']}/lib/ruby\"` out of the conditional.", 2215780936], + [167, 14, 8, "Layout/ExtraSpacing: Unnecessary spacing detected.", 121035013], + [167, 30, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [168, 17, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [168, 30, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [169, 21, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [169, 30, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [169, 65, 6, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3024581309], + [170, 15, 7, "Layout/ExtraSpacing: Unnecessary spacing detected.", 394119301], + [170, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4234663473], + [171, 18, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [172, 43, 6, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3024581309], + [175, 7, 43, "Style/IdenticalConditionalBranches: Move `libruby = \"#{c['prefix']}/lib/ruby\"` out of the conditional.", 2215780936], + [175, 14, 8, "Layout/ExtraSpacing: Unnecessary spacing detected.", 121035013], + [175, 30, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [176, 17, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [176, 30, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [177, 21, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [177, 30, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [177, 65, 6, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3024581309], + [178, 15, 7, "Layout/ExtraSpacing: Unnecessary spacing detected.", 394119301], + [178, 30, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [179, 18, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [180, 43, 6, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3024581309], + [183, 36, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1551502453], + [183, 50, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1548672017], + [186, 23, 1, "Lint/AssignmentInCondition: Wrap assignment in parentheses if intentional", 177560], + [186, 27, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1690550869], + [187, 5, 13, "Layout/IndentationWidth: Use 2 (not 13) spaces for indentation.", 834345861], + [187, 26, 3, "Style/RedundantRegexpArgument: Use string `\"'\"` as argument instead of regexp `/'/`.", 193348770], + [187, 31, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [187, 41, 3, "Style/RedundantRegexpArgument: Use string `\"=\"` as argument instead of regexp `/=/`.", 193349112], + [188, 16, 4, "Layout/ElseAlignment: Align `else` with `makeprog`.", 2087423834], + [189, 18, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3038188071], + [190, 16, 3, "Layout/EndAlignment: `end` at 190, 15 is not aligned with `makeprog = if` at 186, 4.", 193405706], + [193, 20, 13, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2446033704], + [193, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2446033704], + [193, 35, 15, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3176853474], + [193, 35, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3176853474], + [194, 20, 86, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2113793577], + [194, 20, 86, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2113793577], + [194, 107, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [194, 107, 2, "Style/RedundantLineContinuation: Redundant line continuation.", 5862675], + [197, 18, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91984998], + [198, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1445673674], + [198, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1951367035], + [199, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1414682918], + [199, 32, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 36641443], + [200, 18, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036246382], + [201, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1445673674], + [201, 32, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3474772823], + [202, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1414682918], + [202, 32, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3901508239], + [203, 18, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3025230314], + [204, 15, 34, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3441816019], + [204, 30, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2009331388], + [204, 61, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2988464618], + [205, 21, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551502453], + [205, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2988464618], + [206, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1445673674], + [206, 32, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 875506794], + [207, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1414682918], + [207, 32, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 875506794], + [210, 20, 8, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1551502453], + [210, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551502453], + [210, 30, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [210, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [210, 38, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4148693648], + [210, 40, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551502453], + [211, 20, 35, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 917498357], + [211, 20, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 917498357], + [212, 20, 8, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1307896607], + [212, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1307896607], + [212, 30, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [212, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [212, 38, 30, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 209624456], + [212, 58, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1307896607], + [213, 20, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3501475194], + [213, 20, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3501475194], + [214, 20, 8, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 872653981], + [214, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 872653981], + [214, 30, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [214, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [214, 38, 30, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1191026698], + [214, 58, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 872653981], + [215, 20, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 123497335], + [215, 20, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 123497335], + [216, 20, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3526085130], + [216, 20, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3526085130], + [216, 31, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [216, 31, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [216, 39, 31, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1119322173], + [216, 59, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3526085130], + [217, 20, 31, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 541418743], + [217, 20, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 541418743], + [218, 20, 8, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1458684760], + [218, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1458684760], + [218, 30, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [218, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [218, 38, 30, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1311152079], + [218, 58, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1458684760], + [219, 20, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 269167916], + [219, 20, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269167916], + [220, 20, 12, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 507415527], + [220, 20, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 507415527], + [220, 34, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [220, 34, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [220, 42, 34, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1044358256], + [220, 62, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 507415527], + [221, 20, 46, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1989644878], + [221, 20, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1989644878], + [222, 20, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 727638752], + [222, 20, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 727638752], + [222, 37, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [222, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [222, 45, 37, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3352126743], + [222, 65, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 727638752], + [223, 20, 36, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3496158084], + [223, 20, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3496158084], + [224, 20, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3057438366], + [224, 20, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3057438366], + [224, 31, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [224, 31, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [224, 39, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3909639934], + [225, 20, 34, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 701625835], + [225, 20, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 701625835], + [226, 20, 12, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1310986591], + [226, 20, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1310986591], + [226, 34, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [226, 34, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [226, 42, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3760131391], + [227, 20, 43, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2352288944], + [227, 20, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2352288944], + [228, 20, 16, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4120070791], + [228, 20, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4120070791], + [228, 38, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [228, 38, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [228, 46, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3347440871], + [229, 20, 44, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3081707299], + [229, 20, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3081707299], + [230, 20, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2325976818], + [230, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2325976818], + [230, 32, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [230, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [230, 40, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3569060466], + [231, 20, 58, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1524062742], + [231, 20, 58, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524062742], + [232, 20, 13, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4267631347], + [232, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4267631347], + [232, 35, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [232, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [232, 43, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 717624627], + [233, 20, 38, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3024222343], + [233, 20, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3024222343], + [234, 20, 17, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 62094379], + [234, 20, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 62094379], + [234, 39, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [234, 39, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [234, 47, 15, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2643969771], + [235, 20, 37, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 107468023], + [235, 20, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 107468023], + [236, 20, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1445673674], + [236, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1445673674], + [236, 29, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [236, 29, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [236, 37, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3474772823], + [236, 37, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3474772823], + [237, 20, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2000238734], + [237, 20, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2000238734], + [238, 20, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1414682918], + [238, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1414682918], + [238, 29, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [238, 29, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [238, 37, 18, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3901508239], + [238, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3901508239], + [239, 20, 35, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1966158335], + [239, 20, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1966158335], + [240, 20, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3877471316], + [240, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3877471316], + [240, 32, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3034775496], + [240, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [240, 40, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3314995604], + [241, 20, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3417445759], + [241, 20, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3417445759], + [242, 23, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3878127123], + [242, 23, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3878127123], + [242, 35, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3032265122], + [242, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032265122], + [242, 43, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3314995604], + [243, 23, 41, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2293639221], + [243, 23, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2293639221], + [244, 23, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3053329101], + [244, 23, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3053329101], + [244, 35, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3032265122], + [244, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032265122], + [244, 43, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 349201645], + [245, 23, 45, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4180423793], + [245, 23, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4180423793], + [246, 22, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3694809809], + [246, 22, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3694809809], + [246, 33, 16, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 471387538], + [246, 33, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 471387538], + [246, 51, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3036588153], + [246, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036588153], + [247, 22, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4135617539], + [247, 22, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4135617539], + [248, 20, 13, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 477302125], + [248, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 477302125], + [248, 35, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4223913156], + [248, 35, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4223913156], + [248, 45, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2085192580], + [248, 45, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085192580], + [249, 20, 42, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2814751267], + [249, 20, 42, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2814751267], + [249, 20, 43, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2692478634], + [256, 7, 7, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 78553435], + [262, 32, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3040981127], + [262, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3040981127], + [262, 40, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 703880647], + [262, 40, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 703880647], + [262, 56, 2, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 5858789], + [262, 56, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [262, 60, 5, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 90326020], + [262, 60, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90326020], + [263, 32, 40, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3184414199], + [263, 32, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3184414199], + [264, 32, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2593518601], + [264, 32, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2593518601], + [264, 43, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 703880647], + [264, 43, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 703880647], + [264, 59, 2, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 5858789], + [264, 59, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [264, 63, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2995304175], + [264, 63, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2995304175], + [265, 32, 47, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3930053737], + [265, 32, 47, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3930053737], + [265, 32, 48, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 842754464], + [271, 5, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3693569623], + [271, 19, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1310986591], + [272, 5, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3303962618], + [272, 18, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1310986591], + [273, 5, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1785749249], + [273, 21, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1310986591], + [274, 5, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1643505218], + [274, 18, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4120070791], + [275, 5, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3906518815], + [275, 27, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2325976818], + [276, 5, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 858660959], + [276, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4267631347], + [277, 5, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 301956690], + [277, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1307896607], + [278, 5, 9, "Lint/DuplicateHashKey: Duplicated key in hash literal.", 301956690], + [278, 5, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 301956690], + [278, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1307896607], + [279, 5, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 399135655], + [279, 17, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1445673674], + [280, 5, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3805114955], + [280, 17, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1414682918], + [281, 5, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 485317863], + [281, 19, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3526085130], + [282, 5, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1870221977], + [282, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3877471316], + [283, 5, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1870820574], + [283, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3878127123], + [284, 5, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036588153], + [284, 15, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3878127123], + [285, 5, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3759210944], + [285, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3053329101], + [286, 5, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3038188071], + [286, 5, 20, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2812513964], + [286, 15, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3053329101], + [295, 44, 3, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 193338713], + [299, 35, 46, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3425105503], + [304, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3979659268], + [323, 5, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [344, 7, 52, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 866105429], + [351, 7, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018670347], + [361, 14, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92501706], + [363, 14, 44, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 665339080], + [364, 9, 68, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 523561238], + [366, 7, 29, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 2522905054], + [366, 7, 44, "Style/TernaryParentheses: Use parentheses for ternary expressions with complex conditions.", 1991149237], + [366, 39, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92501706], + [366, 47, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085192580], + [372, 7, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [378, 7, 53, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2615934229], + [379, 7, 49, "Style/TernaryParentheses: Use parentheses for ternary expressions with complex conditions.", 1961964063], + [379, 21, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340033], + [385, 7, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191461457], + [392, 29, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [396, 7, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505102189], + [402, 7, 61, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3655685420], + [409, 7, 32, "Style/SuperWithArgsParentheses: Use parentheses for `super` with arguments.", 3341264437], + [410, 29, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [415, 7, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029533854], + [423, 7, 54, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3436685383], + [430, 7, 68, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2669760910], + [431, 7, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3006330163], + [437, 7, 35, "Style/SuperWithArgsParentheses: Use parentheses for `super` with arguments.", 2555334469], + [444, 7, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3501008127], + [450, 7, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1924333448], + [470, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018670347], + [474, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [478, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029533854], + [482, 7, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 85907733], + [486, 7, 70, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2481990227], + [486, 38, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4223913156], + [486, 58, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92501706], + [486, 66, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085192580], + [490, 7, 53, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2866971479], + [490, 38, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034775496], + [504, 15, 120, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3267797847], + [513, 15, 128, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 469536112], + [525, 5, 26, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 410447990], + [530, 8, 24, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 2915234756], + [535, 32, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [536, 7, 14, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 744382528], + [541, 5, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2742604467], + [544, 5, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3767037237], + [548, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1157305697], + [551, 5, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1459338775], + [556, 7, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1589197111], + [558, 7, 17, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 387576167], + [560, 7, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3767037237], + [566, 22, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [567, 22, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085260197], + [571, 9, 19, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3235484104], + [573, 9, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3882126232], + [575, 9, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1243459210], + [579, 7, 14, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3002185017], + [586, 5, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3767750430], + [588, 7, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2248600565], + [590, 23, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085200688], + [591, 9, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1919443788], + [593, 7, 36, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2651720926], + [594, 7, 15, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 77424020], + [599, 5, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1589197111], + [604, 5, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4152096649], + [605, 5, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2555221883], + [609, 5, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3172191710], + [618, 7, 13, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1346643999], + [620, 25, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085200688], + [621, 7, 11, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 584666693], + [623, 5, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1095391443], + [625, 48, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [627, 37, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [641, 5, 19, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1213319813], + [641, 20, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [642, 70, 3, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 193339909], + [646, 5, 33, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2663536190], + [646, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3878127123], + [650, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3053329101], + [678, 3, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [713, 25, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [719, 23, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [725, 29, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [733, 3, 7, "Naming/ConstantName: Use SCREAMING_SNAKE_CASE for constants.", 747123679], + [733, 10, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [733, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4000527666], + [734, 3, 9, "Naming/ConstantName: Use SCREAMING_SNAKE_CASE for constants.", 3550994816], + [734, 15, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2147898356], + [737, 6, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91647140], + [737, 12, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [737, 18, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 892894677], + [738, 6, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 244412271], + [738, 15, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [738, 18, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 838401029], + [739, 6, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036219654], + [739, 13, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [739, 18, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4131192844], + [740, 6, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1406874978], + [740, 14, 3, "Layout/ExtraSpacing: Unnecessary spacing detected.", 193341061], + [740, 18, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2033827210], + [741, 6, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3821883108], + [741, 16, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [741, 18, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3370386466], + [742, 6, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [742, 13, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [742, 18, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3130228534], + [743, 6, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789667264], + [743, 14, 3, "Layout/ExtraSpacing: Unnecessary spacing detected.", 193341061], + [744, 5, 57, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3539951389], + [744, 6, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 151228458], + [747, 3, 289, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1157637016], + [756, 3, 74, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2207359901], + [757, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 384936547], + [760, 3, 250, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3092851240], + [761, 12, 1, "Lint/AssignmentInCondition: Wrap assignment in parentheses if intentional", 177560], + [761, 34, 22, "Performance/StartWith: Use `String#start_with?` instead of a regex match anchored to the beginning of the string.", 684889064], + [763, 7, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 624544067], + [763, 39, 3, "Style/RedundantRegexpArgument: Use string `\"=\"` as argument instead of regexp `/=/`.", 193349112], + [764, 7, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2852339319], + [764, 15, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3928309633], + [766, 15, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1754213311], + [789, 15, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91647140], + [797, 12, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 244412271], + [797, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [799, 12, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789667264], + [799, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 151228458], + [804, 7, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 862979311], + [804, 16, 18, "Performance/StringIdentifierArgument: Use `:\"parsearg_#{task}\"` instead of `\"parsearg_#{task}\"`.", 3052874771], + [806, 7, 23, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2833512469], + [806, 16, 14, "Performance/StringIdentifierArgument: Use `:\"exec_#{task}\"` instead of `\"exec_#{task}\"`.", 1494709161], + [811, 5, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2708343814], + [815, 66, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [827, 5, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [831, 5, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [839, 15, 1, "Lint/AssignmentInCondition: Wrap assignment in parentheses if intentional", 177560], + [842, 9, 37, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3925533], + [844, 12, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085264217], + [844, 18, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3072035449], + [846, 12, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1158569535], + [848, 12, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3859573492], + [849, 9, 19, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3459220807], + [850, 9, 6, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1180004245], + [851, 12, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1169301599], + [853, 9, 6, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1180004245], + [854, 12, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2207210144], + [856, 9, 6, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1180004245], + [858, 9, 47, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4174008571], + [869, 70, 3, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 193338713], + [875, 5, 60, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2785239536], + [875, 59, 3, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 193339909], + [878, 3, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [878, 22, 6, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3135555589], + [879, 3, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [879, 23, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [880, 3, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [880, 22, 6, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3135555589], + [881, 3, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [881, 23, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [882, 3, 5, "Style/Alias: Use `alias_method` instead of `alias`.", 169933683], + [882, 27, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [888, 13, 1, "Lint/AssignmentInCondition: Wrap assignment in parentheses if intentional", 177560], + [889, 10, 14, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 1575866315], + [897, 9, 26, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 624986630], + [899, 7, 13, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3222504368], + [902, 7, 44, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 346314877], + [912, 30, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [913, 13, 1, "Lint/AssignmentInCondition: Wrap assignment in parentheses if intentional", 177560], + [915, 12, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3597850463], + [918, 24, 3, "Style/RedundantRegexpArgument: Use string `\"=\"` as argument instead of regexp `/=/`.", 193349112], + [919, 60, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [922, 9, 45, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1746159422], + [928, 14, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2858517364], + [929, 26, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1761978731], + [930, 26, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1761978731], + [931, 26, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1761978731], + [933, 14, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3778090186], + [934, 24, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1761978731], + [935, 24, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1761978731], + [939, 14, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4194074276], + [940, 5, 58, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3077402039], + [940, 21, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 72198057], + [940, 34, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [940, 37, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3210209203], + [941, 5, 59, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1720545183], + [941, 21, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1098570143], + [941, 37, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 924793517], + [942, 5, 52, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 406015040], + [942, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 295670548], + [942, 33, 3, "Layout/ExtraSpacing: Unnecessary spacing detected.", 193341061], + [942, 37, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1181196121], + [943, 5, 56, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 507147374], + [943, 21, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1118493759], + [943, 37, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2629465340], + [944, 5, 60, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 870856334], + [944, 21, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 417241344], + [944, 39, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1800231267], + [946, 14, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2963420481], + [948, 7, 26, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3392487035], + [953, 14, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3732723458], + [955, 7, 66, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2151223324], + [957, 5, 74, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3049774973], + [957, 21, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1220290671], + [957, 40, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2322821756], + [959, 14, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 250058357], + [960, 5, 70, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2481768540], + [960, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3597850463], + [960, 34, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2371691469], + [960, 70, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91856554], + [961, 5, 58, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2756683357], + [961, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2275095909], + [961, 38, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 201983353], + [961, 61, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [988, 7, 36, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1593566115], + [1007, 11, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1421498110], + [1009, 71, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [1013, 5, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1448170422], + [1015, 7, 59, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 15249805], + [1022, 11, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1993332146], + [1025, 56, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [1034, 41, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 651502127], + [1035, 41, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 762710393], + [1036, 41, 18, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 381245439], + [1038, 9, 3, "Layout/ExtraSpacing: Unnecessary spacing detected.", 193341061], + [1038, 40, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3040981127], + [1039, 40, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2593518601], + [1047, 20, 3, "Performance/RedundantSplitRegexpArgument: Use string as argument instead of regexp.", 193348489], + [1047, 20, 3, "Style/RedundantRegexpArgument: Use string `\",\"` as argument instead of regexp `/,/`.", 193348489], + [1049, 7, 41, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3012728676], + [1056, 12, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 29299821], + [1057, 12, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085249637], + [1057, 39, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [1066, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 852258928], + [1066, 14, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2239004549], + [1068, 5, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4114562831], + [1068, 14, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2163180890], + [1073, 5, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3311497437], + [1073, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3312707720], + [1075, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1914603842], + [1075, 14, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3597989175], + [1079, 5, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3644464987], + [1079, 14, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401090574], + [1081, 5, 23, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1249902532], + [1081, 14, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2528185777], + [1085, 5, 19, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2179485324], + [1085, 14, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3743131897], + [1087, 5, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1892605427], + [1087, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2443720294], + [1091, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1399440064], + [1092, 5, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3928983935], + [1092, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2676525802], + [1094, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1297396256], + [1094, 14, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4224971221], + [1098, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1399440064], + [1099, 5, 24, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4288380437], + [1099, 14, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2425109056], + [1101, 5, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 221857034], + [1101, 14, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2857600895], + [1109, 5, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3299441124], + [1109, 15, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3864115756], + [1109, 43, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3864115756], + [1111, 7, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2222436242], + [1112, 7, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1276380855], + [1113, 7, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 306767418], + [1115, 7, 17, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1775010191], + [1115, 17, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3701599146], + [1120, 5, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1117817532], + [1144, 16, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [1194, 5, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4005193577], + [1194, 24, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 244412271], + [1197, 3, 28, "Style/SingleLineMethods: Avoid single-line method definitions.", 3718985244], + [1199, 3, 28, "Style/SingleLineMethods: Avoid single-line method definitions.", 185630], + [1201, 3, 28, "Style/SingleLineMethods: Avoid single-line method definitions.", 142072027], + [1208, 5, 53, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2236464008], + [1211, 3, 29, "Style/SingleLineMethods: Avoid single-line method definitions.", 2195792169], + [1213, 3, 29, "Style/SingleLineMethods: Avoid single-line method definitions.", 255901533], + [1220, 5, 26, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1265420196], + [1220, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1406874978], + [1225, 7, 40, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 107921929], + [1232, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3104178722], + [1234, 23, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085197365], + [1236, 9, 6, "Lint/NonLocalExitFromIterator: Non-local exit from iterator, without return value. `next`, `break`, `Array#find`, `Array#any?`, etc. is preferred.", 2123913871], + [1236, 56, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [1236, 78, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036588153], + [1238, 9, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2555929647], + [1239, 28, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085200688], + [1240, 11, 60, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 290949185], + [1240, 44, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 93791783], + [1240, 59, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3877471316], + [1241, 11, 14, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1477675439], + [1244, 7, 38, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2614564728], + [1246, 7, 19, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 211073657], + [1250, 3, 27, "Style/SingleLineMethods: Avoid single-line method definitions.", 3590025587], + [1252, 3, 27, "Style/SingleLineMethods: Avoid single-line method definitions.", 2861718582], + [1258, 3, 28, "Style/SingleLineMethods: Avoid single-line method definitions.", 3725429924], + [1260, 3, 28, "Style/SingleLineMethods: Avoid single-line method definitions.", 756127504], + [1267, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3646792246], + [1267, 10, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2739602672], + [1268, 5, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1639867938], + [1268, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3821883108], + [1272, 5, 62, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 461366471], + [1272, 42, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1307896607], + [1276, 5, 61, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 38656375], + [1276, 42, 7, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1445673674], + [1282, 5, 119, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 306146493], + [1282, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [1283, 19, 41, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3363415336], + [1283, 29, 7, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1414682918], + [1284, 19, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 116531407], + [1288, 5, 63, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2811630899], + [1288, 42, 9, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3526085130], + [1294, 5, 66, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3137091486], + [1294, 42, 12, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 507415527], + [1298, 5, 62, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4148030913], + [1298, 42, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1458684760], + [1302, 5, 36, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 90451], + [1304, 7, 49, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3623462406], + [1314, 5, 67, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1826891555], + [1334, 10, 6, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3263606339], + [1334, 17, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2087952548], + [1334, 22, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2089271460], + [1334, 27, 11, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3371217936], + [1335, 18, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5858924], + [1335, 21, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193347554], + [1335, 25, 8, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3412027555], + [1335, 34, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5858947], + [1335, 37, 6, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3296728833], + [1335, 44, 5, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 106316928], + [1336, 8, 5, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 106316934], + [1336, 14, 5, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 106303273], + [1336, 20, 5, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 106343497], + [1336, 26, 6, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3508490898], + [1336, 33, 5, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 106320828], + [1336, 39, 3, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 193468660], + [1336, 43, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5859147], + [1338, 11, 4, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2085630054], + [1338, 16, 2, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 5859009], + [1342, 63, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [1362, 5, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340235], + [1363, 5, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340033], + [1364, 5, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339942], + [1365, 5, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340111], + [1365, 5, 11, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3808987112], + [1365, 12, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085260321], + [1370, 75, 3, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 193338713], + [1378, 13, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [1381, 28, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [1382, 7, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3061077347], + [1382, 12, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2747753289], + [1385, 5, 23, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 392517155], + [1385, 10, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1031725513], + [1386, 5, 49, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2538697179], + [1386, 14, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2349486063], + [1394, 5, 26, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 647942022], + [1394, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789667264], + [1395, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1399440064], + [1396, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3646792246], + [1396, 10, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2739602672], + [1399, 3, 27, "Style/SingleLineMethods: Avoid single-line method definitions.", 423957459], + [1401, 3, 27, "Style/SingleLineMethods: Avoid single-line method definitions.", 2826294225], + [1406, 5, 12, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2167649090], + [1406, 10, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789667264], + [1406, 32, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1191561601], + [1409, 3, 28, "Style/SingleLineMethods: Avoid single-line method definitions.", 4089338630], + [1411, 3, 28, "Style/SingleLineMethods: Avoid single-line method definitions.", 1532303474], + [1418, 5, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1315037292], + [1418, 24, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 151228458], + [1419, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1399440064], + [1420, 5, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3646792246], + [1420, 10, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2739602672], + [1423, 3, 31, "Style/SingleLineMethods: Avoid single-line method definitions.", 399819577], + [1425, 3, 31, "Style/SingleLineMethods: Avoid single-line method definitions.", 3635848507], + [1430, 5, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1213441064], + [1430, 10, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 151228458], + [1430, 36, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1191561601], + [1433, 3, 32, "Style/SingleLineMethods: Avoid single-line method definitions.", 1698690028], + [1435, 3, 32, "Style/SingleLineMethods: Avoid single-line method definitions.", 4291526744], + [1442, 5, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1940450706], + [1444, 17, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 477302125], + [1444, 35, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92501706], + [1444, 41, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1444, 53, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91803692], + [1445, 9, 36, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4058626395], + [1445, 14, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 788664625], + [1448, 7, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4201956362], + [1450, 5, 23, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 447872813], + [1455, 7, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1940450706], + [1456, 7, 44, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 48473263], + [1456, 48, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [1458, 9, 33, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 766441064], + [1460, 7, 23, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 447872813], + [1468, 5, 13, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2625545522], + [1470, 5, 13, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3991096799], + [1471, 5, 18, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2390661708], + [1471, 10, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3889059286], + [1474, 5, 17, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 157536142], + [1475, 5, 18, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1617885870], + [1475, 10, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 107581620], + [1480, 13, 22, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 4291533779], + [1481, 13, 25, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1164194509], + [1481, 13, 25, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1164194509], + [1485, 7, 38, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 424683079], + [1489, 7, 52, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 244878913], + [1506, 5, 15, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2516515855], + [1507, 5, 50, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1373098124], + [1508, 5, 6, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1180004244] + ], + "test/discoverdata.rb:3810468909": [ + [1, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92337995], + [2, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2743300663], + [3, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906546608], + [4, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [13, 14, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1181645659], + [13, 23, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1181645659], + [13, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [14, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [14, 15, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 470251418], + [14, 24, 11, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3128322693], + [14, 36, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 470251418], + [14, 45, 10, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2958109189], + [14, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [15, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [15, 15, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3970794962], + [15, 34, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [15, 36, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3970794962], + [15, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [16, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [16, 15, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [16, 22, 13, "Layout/ExtraSpacing: Unnecessary spacing detected.", 834345861], + [16, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [16, 43, 12, "Layout/ExtraSpacing: Unnecessary spacing detected.", 155433733], + [16, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [17, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [17, 15, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1773413503], + [17, 30, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [17, 36, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1773413503], + [17, 51, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [17, 56, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1773413503], + [18, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [18, 15, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2279316420], + [18, 29, 6, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3135555589], + [18, 36, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2279316420], + [18, 50, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [18, 56, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2279316420], + [19, 15, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4154753178], + [19, 27, 8, "Layout/ExtraSpacing: Unnecessary spacing detected.", 121035013], + [19, 36, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4154753178], + [19, 48, 7, "Layout/ExtraSpacing: Unnecessary spacing detected.", 394119301], + [19, 56, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4154753178], + [20, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [20, 15, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3660885228], + [20, 29, 6, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3135555589], + [20, 36, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1181645659], + [20, 44, 11, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3128322693], + [20, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [21, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [21, 15, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2464312269], + [21, 30, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [21, 36, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 470251418], + [21, 45, 10, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2958109189], + [21, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [22, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [22, 15, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 106442895], + [22, 28, 7, "Layout/ExtraSpacing: Unnecessary spacing detected.", 394119301], + [22, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [22, 43, 12, "Layout/ExtraSpacing: Unnecessary spacing detected.", 155433733], + [22, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [23, 15, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4086766317], + [23, 33, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [23, 36, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4154753178], + [23, 48, 7, "Layout/ExtraSpacing: Unnecessary spacing detected.", 394119301], + [23, 56, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4154753178], + [24, 13, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [24, 15, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1285407835], + [24, 36, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1181645659], + [24, 44, 11, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3128322693], + [24, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [25, 15, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 127997555], + [25, 42, 12, "Layout/ExtraSpacing: Unnecessary spacing detected.", 155433733], + [26, 15, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2508738664], + [26, 33, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [26, 42, 12, "Layout/ExtraSpacing: Unnecessary spacing detected.", 155433733], + [27, 15, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3129039434], + [27, 31, 6, "Layout/ExtraSpacing: Unnecessary spacing detected.", 3135555589], + [27, 42, 12, "Layout/ExtraSpacing: Unnecessary spacing detected.", 155433733], + [28, 15, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3145018768], + [28, 42, 12, "Layout/ExtraSpacing: Unnecessary spacing detected.", 155433733], + [29, 7, 52, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1362538017], + [29, 15, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2445264214], + [29, 42, 12, "Layout/ExtraSpacing: Unnecessary spacing detected.", 155433733], + [32, 27, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1390506058], + [33, 27, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3779756970], + [56, 10, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 99625963], + [57, 10, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3672783539], + [58, 10, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2862978979], + [59, 9, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2510043270], + [59, 10, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2995499426], + [70, 24, 18, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 813725433], + [71, 24, 30, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 3005006690], + [91, 9, 29, "Minitest/AssertPredicate: Prefer using `assert_predicate(result_name, :nil?)`.", 1352720295], + [101, 36, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1791508675], + [102, 40, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639] + ], + "test/test_accept.rb:4115500396": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 43233146], + [4, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [14, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4167781427], + [31, 25, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [31, 29, 2, "Style/AndOr: Use `||` instead of `or`.", 5861240], + [31, 53, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339942], + [53, 35, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [64, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [72, 27, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [73, 29, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [75, 39, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340734], + [77, 11, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 717514236], + [77, 36, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [79, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [80, 11, 21, "Minitest/AssertOperator: Prefer using `assert_operator(q, :==, 'q')`.", 2598250828], + [80, 11, 21, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2598250828], + [80, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338420], + [95, 28, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2928631141], + [97, 32, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3175448956], + [102, 11, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2302609754], + [102, 17, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1747587146], + [106, 30, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2237246747], + [111, 11, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2302609754], + [111, 17, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1747587146], + [115, 16, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4130200496], + [120, 9, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 97380905], + [122, 22, 39, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1215809733], + [123, 22, 37, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1420598686], + [134, 14, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [136, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [136, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [138, 12, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [138, 27, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [140, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [140, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 208791113], + [140, 37, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1522533826], + [142, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [142, 20, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 575702787], + [142, 34, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94346540], + [142, 43, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91039335], + [144, 12, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [145, 12, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039374547], + [147, 10, 38, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1539834100], + [147, 12, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1162061288], + [147, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92058095], + [147, 42, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92066993], + [148, 10, 32, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1437503730], + [148, 10, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1437503730], + [148, 10, 33, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 192982895], + [156, 24, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2875697563], + [156, 41, 36, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1661866372], + [157, 24, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 799861183] + ], + "test/test_association.rb:1641817857": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191648330], + [3, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 395966781], + [14, 32, 8, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 310091503], + [14, 32, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [14, 42, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3505321043], + [14, 42, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505321043], + [14, 52, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1645597496], + [15, 32, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 308967862], + [15, 42, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 389098948], + [15, 42, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [20, 7, 121, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1457950109], + [42, 7, 28, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 403078475], + [49, 66, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2058359486], + [55, 43, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4014237853], + [56, 43, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2589083084], + [57, 43, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2937001200], + [58, 43, 17, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1489129996], + [67, 7, 34, "Minitest/AssertOperator: Prefer using `assert_operator(assoc.issued, :>=, start_time)`.", 351769233], + [72, 16, 15, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 4220377421], + [73, 16, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3699894189], + [73, 16, 15, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3699894189], + [75, 8, 103, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 760314115], + [75, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [76, 8, 80, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1869580903], + [76, 8, 80, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1869580903], + [76, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [77, 51, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [77, 61, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [79, 9, 75, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 654224346], + [79, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [79, 75, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [85, 28, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551395949], + [85, 49, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [88, 9, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2298301550], + [88, 45, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [89, 22, 37, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2691761586], + [89, 22, 94, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1616319040], + [89, 50, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [90, 22, 34, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 255331889], + [90, 22, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 255331889], + [95, 43, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2085944928], + [95, 49, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 310091503], + [95, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [95, 59, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 766756148], + [95, 59, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [96, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [96, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [98, 28, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [98, 35, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1273973851], + [105, 43, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2085944928], + [105, 49, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 310091503], + [105, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [105, 59, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 766756148], + [105, 59, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [106, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [106, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [108, 28, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [108, 38, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2182135796], + [115, 43, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2085944928], + [115, 49, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 310091503], + [115, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [115, 59, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 766756148], + [115, 59, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [116, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [116, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [118, 28, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [118, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 969225728], + [125, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1500858930], + [134, 25, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [134, 25, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [134, 35, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [135, 25, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4182825318], + [135, 41, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4000236688], + [136, 25, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [136, 37, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2125633385], + [137, 25, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [137, 25, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4071763292], + [137, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2786037762], + [138, 23, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [139, 33, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [139, 34, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [139, 43, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [139, 50, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [140, 43, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2085944928], + [140, 49, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 81419720], + [140, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 81419720], + [140, 59, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 766756148], + [140, 59, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [141, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [141, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [143, 7, 89, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1918827267], + [143, 20, 68, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3476122214], + [143, 21, 26, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 4234447833], + [143, 22, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4182825318], + [143, 36, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4000236688], + [144, 21, 18, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 522316250], + [144, 21, 18, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 522316250], + [144, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [144, 30, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [144, 42, 5, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 187707580], + [149, 34, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [149, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [149, 35, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 248562579], + [149, 45, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [150, 35, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4182825318], + [150, 51, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4000236688], + [151, 35, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [151, 35, 17, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 586306384], + [151, 44, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 264651534], + [151, 52, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [152, 43, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2085944928], + [152, 49, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 81419720], + [152, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 81419720], + [152, 59, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 766756148], + [152, 59, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [153, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [153, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [161, 34, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [161, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [161, 35, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 248562579], + [161, 45, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [162, 35, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4182825318], + [162, 51, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4000236688], + [163, 35, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [163, 35, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 511411831], + [163, 47, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [163, 53, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [164, 43, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2085944928], + [164, 49, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 81419720], + [164, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 81419720], + [164, 59, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 766756148], + [164, 59, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [165, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [165, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [173, 34, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [173, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [173, 35, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 248562579], + [173, 45, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [174, 35, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4182825318], + [174, 51, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4000236688], + [175, 35, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [175, 47, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [176, 35, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [176, 35, 33, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 742917864], + [176, 59, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 264651534], + [176, 68, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [177, 43, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2085944928], + [177, 49, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 81419720], + [177, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 81419720], + [177, 59, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 766756148], + [177, 59, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [178, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [178, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [179, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1974080929], + [179, 7, 41, "Minitest/RefuteFalse: Prefer using `refute(assoc.check_message_signature(m))`.", 1974080929], + [184, 34, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [184, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [184, 35, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 248562579], + [184, 45, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [185, 35, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4182825318], + [185, 51, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4000236688], + [186, 35, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [186, 47, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [187, 35, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [187, 35, 33, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 742917864], + [187, 59, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 264651534], + [187, 68, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [188, 43, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2085944928], + [188, 49, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 81419720], + [188, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 81419720], + [188, 59, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 766756148], + [188, 59, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 766756148], + [189, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [189, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [193, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 264651534], + [205, 7, 24, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3180609530], + [212, 7, 39, "Minitest/AssertOperator: Prefer using `assert_operator(neg.object_id, :!=, neg2.object_id)`.", 2120276328], + [212, 7, 39, "Minitest/RefuteEqual: Prefer using `refute_equal(neg.object_id, neg2.object_id)`.", 2120276328], + [217, 7, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 536331140], + [217, 7, 45, "Minitest/RefuteFalse: Prefer using `refute(neg.allowed?('HMAC-SHA1', 'DH-SHA1'))`.", 536331140], + [217, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [217, 41, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [218, 7, 51, "Minitest/RefuteFalse: Prefer using `refute(neg.allowed?('HMAC-SHA1', 'no-encryption'))`.", 1562738029], + [218, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [218, 41, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [219, 7, 49, "Minitest/RefuteFalse: Prefer using `refute(neg.allowed?('HMAC-SHA256', 'DH-SHA256'))`.", 1598416196], + [219, 28, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [219, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [220, 7, 53, "Minitest/RefuteFalse: Prefer using `refute(neg.allowed?('HMAC-SHA256', 'no-encryption'))`.", 2725563469], + [220, 28, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [220, 43, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [221, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [222, 7, 44, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3491469797], + [222, 27, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [222, 40, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [223, 27, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [223, 40, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [224, 7, 49, "Minitest/RefuteFalse: Prefer using `refute(neg.allowed?('HMAC-SHA256', 'DH-SHA256'))`.", 1598416196], + [224, 28, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [224, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [225, 7, 53, "Minitest/RefuteFalse: Prefer using `refute(neg.allowed?('HMAC-SHA256', 'no-encryption'))`.", 2725563469], + [225, 28, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [225, 43, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [226, 28, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [226, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [227, 7, 44, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3491469797], + [227, 27, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [227, 40, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [228, 27, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [228, 40, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [229, 27, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [229, 42, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [230, 7, 53, "Minitest/RefuteFalse: Prefer using `refute(neg.allowed?('HMAC-SHA256', 'no-encryption'))`.", 2725563469], + [230, 28, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [230, 43, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [231, 20, 43, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3904048898], + [247, 20, 34, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4278672544], + [247, 20, 76, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2547996889], + [248, 20, 21, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1599267866], + [249, 41, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [249, 56, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [253, 20, 36, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 713801005], + [253, 20, 78, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3864031508], + [254, 20, 21, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1599267866], + [255, 7, 69, "Minitest/RefuteFalse: Prefer using `refute(EncryptedNegotiator.allowed?('HMAC-SHA256', 'no-encryption'))`.", 1661228785], + [255, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [255, 59, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918] + ], + "test/test_associationmanager.rb:3812113412": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2222937256], + [4, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191648330], + [5, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847734175], + [6, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [7, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3933002043], + [8, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [9, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 395966781], + [10, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2754036930], + [11, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046940385], + [12, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039807664], + [19, 7, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3383473990], + [19, 21, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1302701622], + [20, 41, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1302701622], + [27, 7, 93, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4265010061], + [27, 20, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1936713411], + [28, 20, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2053327837], + [29, 60, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 742512847], + [30, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4057239290], + [31, 28, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1302701622], + [49, 31, 20, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4008656186], + [50, 31, 19, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 565403175], + [51, 31, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1275173523], + [61, 31, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [62, 31, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [65, 7, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 420389699], + [69, 31, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [77, 31, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [85, 31, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [85, 51, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1821255529], + [86, 31, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [94, 31, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [95, 31, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [95, 46, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1007277191], + [139, 20, 21, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1623479055], + [143, 16, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1410924255], + [145, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [145, 40, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [145, 60, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [146, 7, 47, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3583103019], + [152, 21, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [155, 9, 31, "ThreadSafety/ClassAndModuleAttributes: Avoid mutating class and module attributes.", 4153333934], + [157, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [161, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [162, 43, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 515091358], + [163, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1141326191], + [164, 43, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3549528604], + [166, 7, 52, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Consumer::NoEncryptionSession, session)`.", 1977489826], + [168, 10, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [168, 11, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [168, 11, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [169, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [170, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [170, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [171, 11, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [171, 11, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1404560870], + [171, 11, 29, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 558428987], + [171, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [179, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [180, 43, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 515091358], + [181, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1141326191], + [182, 43, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3549528604], + [184, 7, 52, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Consumer::NoEncryptionSession, session)`.", 1977489826], + [185, 20, 126, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1439057918], + [185, 46, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [185, 47, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [185, 47, 21, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2463901841], + [185, 57, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [186, 47, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [186, 47, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1404560870], + [186, 74, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [186, 79, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2087569090], + [191, 22, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [192, 43, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 515091358], + [193, 43, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1141326191], + [194, 43, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3549528604], + [196, 7, 57, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Consumer::DiffieHellmanSHA1Session, session)`.", 1237980873], + [200, 43, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1302701622], + [201, 32, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1302701622], + [205, 44, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [205, 45, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [205, 45, 21, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2463901841], + [205, 55, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [206, 45, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [206, 63, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [207, 45, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [207, 45, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1404560870], + [207, 72, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [208, 7, 28, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3018016448], + [214, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [214, 40, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [214, 59, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [219, 8, 2, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 5858789], + [219, 8, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [220, 8, 4, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2085266362], + [220, 8, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085266362], + [221, 8, 4, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2085250132], + [221, 8, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085250132], + [222, 8, 3, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 193339909], + [222, 8, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [223, 8, 6, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3115122221], + [223, 8, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3115122221], + [224, 8, 10, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1822601811], + [224, 8, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1822601811], + [225, 8, 5, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 94328198], + [226, 8, 17, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2827476328], + [226, 8, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2827476328], + [226, 8, 17, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2827476328], + [232, 10, 1, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 177557], + [233, 10, 1, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 177556], + [234, 10, 4, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2085879588], + [235, 10, 7, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1740037692], + [236, 10, 2, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 5859332], + [245, 53, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 354627053], + [250, 58, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [251, 7, 56, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Consumer::DiffieHellmanSHA256Session, sess)`.", 2905640449], + [251, 7, 56, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2905640449], + [258, 12, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [265, 56, 5, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 195037722], + [265, 63, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4189021428], + [266, 56, 6, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1544116833], + [266, 64, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 478984755], + [268, 9, 24, "ThreadSafety/ClassAndModuleAttributes: Avoid mutating class and module attributes.", 2990482522], + [271, 15, 10, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 1640279285], + [287, 5, 6, "Naming/ConstantName: Use SCREAMING_SNAKE_CASE for constants.", 2713853249], + [290, 21, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [297, 26, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1960889003], + [305, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [305, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [305, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [305, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [306, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [306, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [307, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [307, 26, 36, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2034060325], + [307, 44, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 32253951], + [307, 62, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [309, 26, 30, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3432157201], + [309, 26, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3432157201], + [310, 26, 130, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2260067405], + [310, 77, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [311, 26, 52, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1218829677], + [311, 26, 52, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1218829677], + [319, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [319, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [319, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [319, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [320, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [320, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [321, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [321, 26, 32, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 358940837], + [321, 42, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1413051212], + [321, 58, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [323, 26, 30, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3432157201], + [323, 26, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3432157201], + [324, 26, 130, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2260067405], + [324, 77, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [325, 26, 52, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1218829677], + [325, 26, 52, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1218829677], + [338, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [338, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [338, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [338, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [339, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [339, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [340, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [340, 42, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3424883397], + [341, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [341, 26, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4087413599], + [341, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3424883397], + [341, 57, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [343, 26, 30, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3432157201], + [343, 26, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3432157201], + [344, 26, 51, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2590182195], + [344, 26, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2590182195], + [352, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [352, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [352, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [352, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [353, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [353, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [354, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [354, 42, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [355, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [355, 26, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 162450869], + [355, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [355, 53, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [357, 31, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [357, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505321043], + [357, 69, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [359, 26, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3432157201], + [367, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [367, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [367, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [367, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [368, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [368, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [369, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [369, 42, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [370, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [370, 26, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 162450869], + [370, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [370, 53, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [372, 26, 30, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3432157201], + [372, 26, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3432157201], + [373, 26, 31, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2196551010], + [381, 31, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [381, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505321043], + [381, 69, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [399, 5, 6, "Naming/ConstantName: Use SCREAMING_SNAKE_CASE for constants.", 2713853249], + [402, 21, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [407, 26, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1960889003], + [409, 9, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2911369585], + [414, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [414, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [414, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [414, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [415, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [415, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [416, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [416, 26, 36, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2034060325], + [416, 44, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 32253951], + [416, 62, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [418, 26, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1960889003], + [420, 9, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2911369585], + [425, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [425, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [425, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [425, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [426, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [426, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [427, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [427, 26, 32, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 358940837], + [427, 42, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1413051212], + [427, 58, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [429, 26, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1960889003], + [431, 9, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2911369585], + [441, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [441, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [441, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [441, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [442, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [442, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [443, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [443, 42, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3424883397], + [444, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [444, 26, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4087413599], + [444, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3424883397], + [444, 57, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [446, 26, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1960889003], + [448, 9, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2911369585], + [453, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [453, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [453, 26, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 473866675], + [453, 37, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4177803720], + [454, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [454, 42, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [455, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [455, 42, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [456, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [456, 26, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 162450869], + [456, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [456, 53, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [458, 31, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [458, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505321043], + [458, 69, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [460, 26, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1960889003], + [462, 9, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2911369585], + [467, 31, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [467, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505321043], + [467, 69, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [470, 9, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 813416791], + [480, 7, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [480, 23, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3116022756], + [481, 7, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [481, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 118406318], + [482, 7, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [482, 23, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 791031356], + [483, 7, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [483, 7, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3515029592], + [483, 25, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2258589442], + [505, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 624304330], + [516, 9, 63, "Style/InvertibleUnlessCondition: Prefer `if ns == OPENID1_NS or name == 'missing_session_type'` over `unless ns != OPENID1_NS and name != 'missing_session_type'`.", 152372073], + [516, 38, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [516, 50, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2126107015], + [527, 23, 14, "Performance/StringIdentifierArgument: Use `:\"test_#{name}\"` instead of `\"test_#{name}\"`.", 1858721710], + [544, 9, 53, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 3499488584], + [554, 23, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [558, 29, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 166675591], + [563, 6, 33, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 284396585], + [563, 7, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [563, 24, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [564, 6, 40, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 129370435], + [564, 7, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [564, 18, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [565, 6, 42, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 493846883], + [565, 7, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [565, 20, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [566, 6, 40, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3317814691], + [566, 7, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [566, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [567, 6, 36, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 561757225], + [567, 7, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [567, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [568, 6, 36, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1540363945], + [568, 7, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [568, 20, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [569, 6, 40, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3321165344], + [569, 6, 40, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3321165344], + [569, 7, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [569, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [581, 40, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [581, 40, 22, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3406163359], + [581, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3116022756], + [582, 40, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [582, 58, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 118406318], + [583, 40, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [583, 56, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [584, 40, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [584, 40, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2613221521], + [584, 53, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337597], + [585, 38, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [589, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 326416219], + [589, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 118406318], + [590, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [592, 7, 30, "Minitest/AssertOperator: Prefer using `assert_operator('X', :*, 20, assoc.secret)`.", 2602735311], + [592, 7, 30, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal('X' * 20, assoc.secret)`?", 2602735311], + [592, 14, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337597], + [599, 18, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [606, 12, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [608, 7, 26, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2916323182], + [611, 48, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4126302520], + [612, 48, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1236122734], + [613, 78, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [614, 24, 37, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 267694270], + [614, 24, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 267694270], + [614, 61, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [615, 64, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [617, 7, 71, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 318245961], + [620, 6, 29, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 310355104], + [620, 7, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91878542], + [620, 14, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [621, 6, 30, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 149025013], + [621, 7, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1168718992], + [621, 16, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [621, 33, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [622, 6, 33, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1242709499], + [622, 7, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 721645693], + [622, 18, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [622, 29, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [623, 6, 39, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2601783003], + [623, 6, 39, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2601783003], + [623, 7, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4187990237], + [623, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [623, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [628, 21, 14, "Performance/StringIdentifierArgument: Use `:\"test_#{name}\"` instead of `\"test_#{name}\"`.", 1858721710], + [634, 17, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [634, 34, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [642, 18, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [645, 23, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2065679424], + [648, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [650, 23, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2001088788], + [655, 36, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [655, 36, 22, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3406163359], + [655, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3116022756], + [656, 36, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [657, 36, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [658, 36, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [659, 36, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [659, 36, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2290219986], + [660, 34, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [663, 11, 49, "ThreadSafety/ClassAndModuleAttributes: Avoid mutating class and module attributes.", 211023675], + [670, 21, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3190639583], + [686, 27, 20, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2419795508], + [687, 27, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3411488468], + [687, 44, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 847819849], + [691, 5, 312, "Minitest/MultipleAssertions: Test case has too many assertions [5/3].", 75079858], + [693, 7, 44, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1830324732], + [704, 29, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 241401847], + [709, 42, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [709, 56, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1952920922], + [710, 29, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3277377612], + [717, 14, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [724, 35, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 515091358], + [725, 35, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [725, 35, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [725, 48, 9, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4235576623], + [725, 48, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [728, 44, 5, "Performance/StringIdentifierArgument: Use `:@dh` instead of `'@dh'`.", 90311657], + [728, 44, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90311657], + [730, 42, 23, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 217329996], + [731, 42, 14, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 274358536], + [731, 58, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3372013299], + [734, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [735, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [736, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [736, 25, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [737, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [737, 27, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [738, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [738, 25, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3116022756], + [739, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [739, 9, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 162450869], + [739, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [741, 19, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [748, 7, 17, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1970104094], + [748, 7, 17, "Minitest/RefuteFalse: Prefer using `refute(ret.nil?)`.", 1970104094], + [749, 20, 27, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3149731823], + [749, 36, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [751, 20, 20, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 753136612], + [751, 32, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [752, 20, 18, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2200906390], + [758, 44, 21, "Performance/StringIdentifierArgument: Use `:@compatibility_mode` instead of `'@compatibility_mode'`.", 4195595287], + [758, 44, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4195595287], + [764, 38, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [765, 29, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1514618186], + [778, 21, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [782, 32, 8, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 310091503], + [782, 32, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 310091503], + [782, 42, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3505321043], + [782, 42, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505321043], + [782, 52, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3003142632], + [782, 62, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3783842155], + [783, 32, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [783, 32, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [792, 7, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 451410349], + [798, 7, 24, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2448203515], + [802, 7, 52, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 597826187], + [806, 7, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 436262237], + [812, 7, 52, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 597826187], + [818, 33, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [821, 7, 287, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 303370780], + [822, 28, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2189277160], + [823, 40, 20, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1306346024], + [823, 62, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 389098948], + [823, 62, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [824, 40, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 809518918], + [824, 40, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [825, 11, 19, "Minitest/AssertNil: Prefer using `assert_nil(result)`.", 2261710389], + [825, 11, 19, "Minitest/AssertPredicate: Prefer using `assert_predicate(result, :nil?)`.", 2261710389], + [825, 11, 19, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2261710389], + [836, 62, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [837, 21, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [838, 23, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [841, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [841, 30, 27, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1404560870], + [842, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [843, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [843, 48, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3897746176], + [844, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [844, 46, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3116022756], + [845, 30, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [845, 30, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2613221521], + [845, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337597], + [846, 28, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [864, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3897746176], + [870, 35, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [871, 26, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 668382283], + [879, 35, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [879, 49, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 935703851], + [880, 26, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 52426656] + ], + "test/test_ax.rb:998212053": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4064548815], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [4, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2748495602], + [5, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [6, 9, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 246787047], + [11, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [11, 15, 7, "ThreadSafety/MutableClassInstanceVariable: Freeze mutable objects assigned to class instance variables.", 832170441], + [32, 52, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [32, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [32, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [32, 78, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [33, 29, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [33, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [33, 49, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [42, 7, 317, "Minitest/MultipleAssertions: Test case has too many assertions [5/3].", 2732559077], + [44, 20, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2042810206], + [49, 9, 35, "Minitest/RefuteFalse: Prefer using `refute(ainfo.required)`.", 2720445676], + [60, 15, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [62, 11, 22, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(uris)`.", 1923563010], + [62, 11, 22, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1923563010], + [68, 37, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 804983478], + [73, 15, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 804983478], + [74, 16, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3966420134], + [77, 9, 25, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2143931148], + [81, 16, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 804983478], + [82, 17, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3966420134], + [85, 16, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 724954885], + [86, 17, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155872226], + [89, 62, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [90, 9, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3181680333], + [98, 9, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3522106008], + [113, 19, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [113, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [113, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [113, 43, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [117, 19, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [117, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [117, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [117, 45, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524397422], + [117, 60, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [117, 63, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [123, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [123, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [123, 38, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 696671459], + [123, 52, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [124, 38, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524397422], + [124, 38, 22, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3734497697], + [124, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [124, 60, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [130, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [130, 18, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [130, 18, 25, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3921293207], + [130, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [131, 18, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [131, 32, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [132, 18, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [132, 32, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [133, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524397422], + [133, 18, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2998728133], + [133, 49, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [136, 9, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 657293818], + [137, 9, 35, "Minitest/AssertPredicate: Prefer using `assert_predicate(foo, :wants_unlimited_values?)`.", 2954238777], + [142, 16, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [146, 29, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [147, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [148, 11, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1798815044], + [148, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 977786847], + [151, 9, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4015480015], + [151, 23, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 977786847], + [151, 37, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [157, 11, 12, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1280361256], + [160, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [160, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 734001950], + [160, 13, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2973455816], + [160, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [161, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524706597], + [161, 13, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4269221175], + [161, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [161, 31, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [162, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [162, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 734004124], + [162, 13, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3357318538], + [162, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [163, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524704423], + [163, 13, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2803959157], + [163, 13, 20, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4084742824], + [163, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [163, 31, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [166, 22, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [175, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [175, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [175, 13, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 696671459], + [175, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [176, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524397422], + [176, 13, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1591744381], + [176, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [176, 31, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [177, 11, 19, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 4072185395], + [177, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [177, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [177, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [183, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [183, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [183, 13, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 696671459], + [183, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [184, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4202872454], + [184, 13, 17, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2715084965], + [184, 28, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [184, 30, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [185, 11, 19, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 4072185395], + [185, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [185, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [185, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [191, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [191, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [191, 13, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 696671459], + [191, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [192, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4202872454], + [192, 28, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [193, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 734038306], + [193, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [194, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4203006257], + [194, 13, 17, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1335694866], + [194, 28, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [194, 30, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [195, 11, 10, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 3499928963], + [201, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [201, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [201, 13, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 696671459], + [201, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [202, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4202872454], + [202, 28, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [203, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 734038306], + [203, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129736743], + [204, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4203006257], + [204, 13, 17, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1335694866], + [204, 28, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [204, 30, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [205, 11, 36, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 3989899096], + [205, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [205, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [205, 30, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129736743], + [205, 45, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [211, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [211, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733901397], + [211, 13, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 696671459], + [211, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [212, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4202872454], + [212, 13, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2259794381], + [212, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2412293261], + [212, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [213, 11, 30, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 2531599483], + [213, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [213, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129887376], + [213, 27, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2412293261], + [213, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [221, 19, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3251873265], + [222, 19, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [226, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [229, 7, 262, "Minitest/MultipleAssertions: Test case has too many assertions [4/3].", 174762134], + [230, 9, 43, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@msg.requested_attributes)`.", 4159619496], + [233, 32, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1840586718], + [234, 9, 42, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(msg.requested_attributes)`.", 782729000], + [234, 9, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 782729000], + [235, 22, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1840586718], + [239, 15, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1201620719], + [241, 9, 26, "Minitest/RefuteFalse: Prefer using `refute(@msg.member?(uri))`.", 4033074256], + [244, 9, 25, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1024255377], + [248, 15, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1375609605], + [255, 23, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [256, 9, 52, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1730668256], + [264, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 238200392], + [268, 30, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [268, 42, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [273, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [273, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [273, 29, 29, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1899731898], + [274, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [274, 29, 23, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3955101608], + [274, 52, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [278, 26, 26, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 443301374], + [278, 26, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 443301374], + [279, 26, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2771978150], + [279, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2771978150], + [281, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [281, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [281, 29, 34, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 716224134], + [282, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [282, 29, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3858558004], + [282, 57, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [286, 26, 26, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 443301374], + [286, 26, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 443301374], + [287, 26, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2771978150], + [287, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2771978150], + [288, 26, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [290, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [290, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [290, 29, 34, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 716224134], + [291, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [291, 29, 24, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1485978868], + [291, 53, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [295, 9, 41, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@msg.get_required_attrs)`.", 3808127895], + [300, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [300, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [301, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [301, 11, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4281089988], + [306, 7, 553, "Minitest/MultipleAssertions: Test case has too many assertions [7/3].", 1232560028], + [308, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [308, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [309, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [310, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [310, 11, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3548423094], + [313, 9, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1718280057], + [316, 9, 26, "Minitest/AssertKindOf: Prefer using `assert_kind_of(AttrInfo, ai)`.", 3856014535], + [316, 9, 26, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3856014535], + [317, 9, 20, "Minitest/RefuteFalse: Prefer using `refute(ai.required)`.", 3437055720], + [325, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [325, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [326, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [327, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [327, 11, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3548423094], + [330, 9, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1584778433], + [331, 9, 52, "Minitest/RefuteFalse: Prefer using `refute(@msg.requested_attributes[@type_a].required)`.", 2345955159], + [336, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [336, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [337, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [338, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [338, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [339, 11, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [339, 11, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3215310454], + [342, 9, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1584778433], + [348, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [348, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [349, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [350, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [350, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [351, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [351, 11, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3548423094], + [354, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [354, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [355, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [356, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [356, 11, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3548423094], + [359, 9, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 102566528], + [367, 9, 19, "Minitest/AssertNil: Prefer using `assert_nil(ax_req)`.", 2099275804], + [367, 9, 19, "Minitest/AssertPredicate: Prefer using `assert_predicate(ax_req, :nil?)`.", 2099275804], + [367, 9, 19, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2099275804], + [371, 15, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1243689806], + [372, 16, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029522364], + [373, 17, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3327842902], + [376, 54, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [376, 54, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [376, 64, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [377, 54, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [378, 54, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [379, 54, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [379, 73, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3584414324], + [380, 54, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [380, 67, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2289977748], + [381, 54, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3605399460], + [382, 54, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1080767135], + [382, 76, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [383, 54, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3972363319], + [383, 54, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 239701415], + [383, 75, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261018], + [384, 52, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [388, 9, 19, "Minitest/AssertNil: Prefer using `assert_nil(ax_req)`.", 2099275804], + [388, 9, 19, "Minitest/AssertPredicate: Prefer using `assert_predicate(ax_req, :nil?)`.", 2099275804], + [388, 9, 19, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2099275804], + [393, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [393, 53, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2607646422], + [393, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [394, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [395, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [395, 64, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1592175288], + [396, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [397, 53, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [397, 72, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 854788005], + [398, 53, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [398, 53, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3371330272], + [398, 66, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [399, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [409, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [409, 53, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2607646422], + [409, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [410, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [411, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [412, 53, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [412, 72, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 854788005], + [413, 53, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [413, 53, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3371330272], + [413, 66, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [414, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [424, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [424, 53, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2607646422], + [424, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [425, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [426, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [426, 64, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1592175288], + [427, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [428, 53, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [428, 72, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3584414324], + [429, 53, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [429, 53, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3371330272], + [429, 66, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [430, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [434, 9, 30, "Minitest/AssertKindOf: Prefer using `assert_kind_of(FetchRequest, fr)`.", 4079076683], + [434, 9, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4079076683], + [439, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [439, 53, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2607646422], + [439, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [440, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [441, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [441, 68, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1592175288], + [442, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [443, 53, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [443, 72, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3584414324], + [444, 53, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [444, 53, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3371330272], + [444, 66, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [445, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [449, 9, 30, "Minitest/AssertKindOf: Prefer using `assert_kind_of(FetchRequest, fr)`.", 4079076683], + [449, 9, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4079076683], + [454, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [454, 53, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2607646422], + [454, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [455, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [456, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [456, 53, 41, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 959747093], + [456, 68, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1592175288], + [457, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [464, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1939718458], + [469, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [469, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [470, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4289251244], + [470, 29, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029522364], + [471, 11, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2744304266], + [471, 11, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3713556342], + [471, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1939718458], + [475, 11, 61, "Minitest/AssertEqual: Prefer using `assert_equal(openid_req.message.get_arg(AXMessage::NS_URI, k), v)`.", 3555178750], + [475, 11, 61, "Minitest/AssertOperator: Prefer using `assert_operator(openid_req.message.get_arg(AXMessage::NS_URI, k), :==, v)`.", 3555178750], + [483, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3414814182], + [484, 21, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1065822204], + [485, 19, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1565928318], + [486, 19, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 594902712], + [487, 31, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2663590179], + [492, 9, 27, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@msg.data)`.", 410552280], + [497, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [497, 11, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1667082309], + [497, 21, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [499, 9, 44, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3267008100], + [504, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [504, 11, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1667082309], + [504, 21, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [507, 9, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1616519587], + [511, 15, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043092869], + [512, 16, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029522364], + [514, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [514, 21, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [515, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [516, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [516, 11, 22, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 220877111], + [516, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [520, 9, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1616519587], + [524, 15, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043092869], + [525, 16, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029522364], + [527, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [527, 21, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [528, 11, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4053342112], + [529, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [530, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [530, 11, 22, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 220877111], + [530, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [534, 9, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1616519587], + [541, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [541, 21, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [542, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [543, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1065821536], + [543, 11, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1504438596], + [548, 9, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1616519587], + [555, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [555, 21, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [556, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [557, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1065821536], + [557, 32, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261018], + [558, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1065821536], + [558, 32, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261113], + [559, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [559, 11, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3363414859], + [559, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [567, 9, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1616519587], + [578, 9, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2531944719], + [591, 15, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1243689806], + [592, 16, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029522364], + [593, 17, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3327842902], + [596, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [596, 48, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [596, 58, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [597, 48, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [598, 48, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [599, 48, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [599, 67, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3584414324], + [600, 48, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [600, 61, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [601, 48, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3605399460], + [602, 48, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1080767135], + [602, 70, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [603, 48, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3972363319], + [603, 48, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 239701415], + [603, 69, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261018], + [604, 46, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [612, 9, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2988317452], + [616, 15, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1243689806], + [617, 16, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029522364], + [618, 17, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3327842902], + [620, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [620, 21, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [621, 11, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [622, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [623, 11, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [623, 30, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3584414324], + [624, 11, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [624, 24, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [625, 11, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3605399460], + [626, 11, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1080767135], + [626, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [627, 11, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3972363319], + [627, 11, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 239701415], + [627, 32, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261018], + [638, 9, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2988317452], + [642, 15, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1243689806], + [643, 16, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029522364], + [644, 17, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3327842902], + [647, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [647, 48, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [647, 58, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [648, 48, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [649, 48, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [650, 48, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [650, 67, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3584414324], + [651, 48, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [651, 61, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2879878949], + [652, 48, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3605399460], + [653, 48, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1080767135], + [653, 70, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [654, 48, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3972363319], + [654, 48, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 239701415], + [654, 69, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261018], + [655, 46, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [660, 9, 58, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1011061467], + [665, 47, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [665, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [665, 58, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [665, 66, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [668, 9, 20, "Minitest/AssertNil: Prefer using `assert_nil(ax_resp)`.", 977858510], + [668, 9, 20, "Minitest/AssertPredicate: Prefer using `assert_predicate(ax_resp, :nil?)`.", 977858510], + [668, 9, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 977858510], + [675, 19, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1670049094], + [676, 19, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2980390710], + [680, 9, 27, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@msg.data)`.", 410552280], + [685, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [685, 11, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 673885940], + [685, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2289977748], + [687, 9, 44, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3267008100], + [691, 15, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1243689806], + [692, 16, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029522364], + [693, 17, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3327842902], + [696, 54, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [696, 54, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [696, 64, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [697, 54, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [698, 54, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304033295], + [699, 54, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3001394999], + [699, 73, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3584414324], + [700, 54, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3252387569], + [700, 67, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 10234167], + [701, 54, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3605399460], + [702, 54, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1080767135], + [702, 76, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [703, 54, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3972363319], + [703, 54, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 239701415], + [703, 75, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261018], + [704, 52, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [708, 9, 19, "Minitest/AssertNil: Prefer using `assert_nil(ax_req)`.", 2099275804], + [708, 9, 19, "Minitest/AssertPredicate: Prefer using `assert_predicate(ax_req, :nil?)`.", 2099275804], + [708, 9, 19, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2099275804], + [716, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [716, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2289977748], + [717, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1511391955], + [718, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1065821536], + [718, 32, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261018], + [718, 40, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [719, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1065821536], + [719, 32, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085261113], + [719, 40, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [720, 11, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 269067912], + [720, 11, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3363414859], + [720, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [722, 9, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 715657157], + [729, 9, 22, "Minitest/AssertPredicate: Prefer using `assert_predicate(msg, :succeeded?)`.", 2361315725], + [729, 9, 22, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2361315725], + [730, 9, 26, "Minitest/RefuteFalse: Prefer using `refute(msg.error_message)`.", 3132408732], + [731, 22, 38, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 702321308], + [731, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [731, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [731, 34, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 128040026], + [731, 58, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [732, 22, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 39959482], + [737, 9, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 527737196], + [737, 9, 23, "Minitest/RefuteFalse: Prefer using `refute(msg.succeeded?)`.", 527737196], + [738, 9, 26, "Minitest/RefuteFalse: Prefer using `refute(msg.error_message)`.", 3132408732], + [739, 22, 38, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 589518463], + [739, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [739, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [739, 34, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2231038713], + [739, 58, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [740, 22, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 39959482], + [744, 18, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4140515081], + [746, 9, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 527737196], + [746, 9, 23, "Minitest/RefuteFalse: Prefer using `refute(msg.succeeded?)`.", 527737196], + [748, 22, 57, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 755513452], + [748, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [748, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [748, 34, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2231038713], + [748, 60, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [748, 77, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [749, 22, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 39959482] + ], + "test/test_checkid_request.rb:3181476264": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 246787047], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [4, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [5, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046940385], + [11, 45, 9, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1186898464], + [11, 56, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1499292878], + [12, 23, 17, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1315904953], + [12, 42, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 763240358], + [35, 32, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3556767251], + [36, 34, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1439813565], + [37, 34, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 577111635], + [39, 20, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3343583840], + [40, 24, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3454663621], + [46, 42, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [47, 42, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [51, 18, 27, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 201319342], + [52, 18, 58, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3492294928], + [56, 11, 40, "Minitest/AssertNil: Prefer using `assert_nil(msg.get_arg(OPENID_NS, key))`.", 1491741623], + [56, 11, 40, "Minitest/AssertPredicate: Prefer using `assert_predicate(msg.get_arg(OPENID_NS, key), :nil?)`.", 1491741623], + [61, 73, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [62, 25, 43, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1304133911], + [63, 11, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2480698047], + [74, 11, 95, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1030961435], + [74, 24, 19, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2039428508], + [75, 24, 37, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3084676180], + [78, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [89, 46, 8, "Performance/StringIdentifierArgument: Use `:@assoc` instead of `'@assoc'`.", 2940950504], + [89, 46, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2940950504], + [90, 36, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1199179425], + [93, 41, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [97, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018052059], + [97, 50, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 788245688], + [97, 59, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 838773347], + [98, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018052059], + [98, 50, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3530184846], + [98, 62, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1363195027], + [99, 11, 55, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 409337681], + [99, 58, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018052059], + [100, 24, 37, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 310610829], + [100, 24, 107, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1113605159], + [100, 54, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018052059], + [101, 24, 45, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 439366537], + [101, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [101, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 788245688], + [101, 37, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 838773347], + [101, 46, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3530184846], + [101, 60, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1363195027], + [101, 67, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [103, 36, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1199179425], + [111, 11, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2027585796], + [111, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 838773347], + [111, 43, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3803001432], + [112, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1363195027], + [112, 43, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1825333230], + [116, 36, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1199179425], + [125, 13, 38, "Minitest/AssertOperator: Prefer using `assert_operator(url.length, :<, OPENID1_URL_LIMIT)`.", 1899165077], + [125, 13, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1899165077], + [128, 27, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3111616268], + [130, 13, 38, "Minitest/AssertOperator: Prefer using `assert_operator(url.length, :>, OPENID1_URL_LIMIT)`.", 2569842007], + [130, 13, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2569842007], + [133, 13, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 97380905], + [146, 11, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [156, 42, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [157, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [161, 54, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [162, 53, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [176, 36, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1199179425], + [186, 36, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1199179425], + [195, 36, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1199179425], + [203, 36, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1199179425], + [206, 41, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [222, 11, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [227, 42, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [228, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [232, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [233, 42, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [239, 42, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [240, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [260, 36, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1199179425], + [264, 24, 17, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3640066673], + [265, 24, 35, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2104949854], + [265, 48, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [275, 11, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [279, 13, 35, "Naming/ClassAndModuleCamelCase: Use CamelCase for classes and modules.", 4259957932], + [285, 11, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392] + ], + "test/test_consumer.rb:3042093981": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3337961901], + [14, 11, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3475187669], + [16, 11, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3475187669], + [19, 11, 14, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1424197095], + [24, 36, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3408531532], + [24, 48, 9, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 320676721], + [25, 23, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 166761937], + [25, 47, 16, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 988400250], + [25, 65, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1050921666], + [28, 36, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085230842], + [29, 25, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3529252716], + [55, 11, 47, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1725211459], + [56, 24, 88, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1812662217], + [56, 25, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2620721662], + [56, 65, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [57, 25, 20, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3900563010], + [57, 25, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3900563010], + [57, 48, 19, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3752794404], + [88, 25, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3808043744], + [111, 11, 43, "Minitest/AssertInstanceOf: Prefer using `assert_instance_of(CheckIDRequest, result)`.", 1020889370], + [111, 11, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1020889370], + [130, 24, 28, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2552768381], + [131, 24, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 896245067], + [145, 11, 36, "Minitest/AssertEmpty: Prefer using `assert_empty(result.return_to_args)`.", 3826612051], + [145, 11, 36, "Minitest/AssertPredicate: Prefer using `assert_predicate(result.return_to_args, :empty?)`.", 3826612051], + [153, 11, 36, "Minitest/AssertEmpty: Prefer using `assert_empty(result.return_to_args)`.", 3826612051], + [153, 11, 36, "Minitest/AssertPredicate: Prefer using `assert_predicate(result.return_to_args, :empty?)`.", 3826612051], + [164, 41, 95, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2514658741], + [164, 42, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [164, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [164, 43, 25, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1167825989], + [165, 43, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [165, 43, 22, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2224151445], + [165, 60, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456002], + [165, 65, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [165, 69, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [166, 11, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4167381184], + [170, 42, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [170, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [170, 68, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [171, 11, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4167381184], + [175, 42, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [175, 43, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [175, 60, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [175, 68, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [176, 11, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 97734950], + [180, 42, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [180, 43, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [180, 60, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2136724950], + [180, 74, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [181, 11, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4167381184], + [185, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2767921482], + [186, 19, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [186, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [186, 47, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [186, 64, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2136724950], + [186, 80, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3657948047], + [186, 116, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [188, 11, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 60732691], + [193, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2767921482], + [195, 13, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3657948047], + [196, 13, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [196, 13, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3771358084], + [196, 30, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [199, 11, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 60732691], + [204, 21, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085198093], + [205, 23, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2143133061], + [207, 13, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [207, 30, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [208, 13, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3886244786], + [209, 13, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 18241689], + [209, 13, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2232191921], + [212, 11, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4167381184], + [216, 16, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [218, 11, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4167381184], + [225, 13, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [225, 13, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3771358084], + [225, 30, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [245, 11, 56, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1493079945], + [249, 27, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3961404958], + [254, 11, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4167381184] + ], + "test/test_cryptutil.rb:2395176984": [ + [1, 11, 10, "Style/MagicCommentFormat: Prefer lowercase for magic comment values.", 4204254942], + [3, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [4, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3933002043], + [5, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1702461967], + [12, 5, 26, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Integer, BIG)`.", 1456198392], + [18, 5, 24, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Integer, a)`.", 329751157], + [18, 5, 24, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 329751157], + [19, 5, 24, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Integer, b)`.", 488978486], + [28, 5, 18, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2004725069], + [34, 11, 33, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4097964054], + [35, 7, 23, "Minitest/AssertKindOf: Prefer using `assert_kind_of(String, s)`.", 2574677460], + [35, 7, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2574677460], + [37, 7, 33, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 330900324], + [50, 7, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2988554761], + [50, 7, 65, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3457944154], + [54, 7, 28, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1323461861], + [61, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3020570357], + [61, 38, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1227294489], + [90, 5, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3821171663], + [92, 5, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3299416908], + [97, 46, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085169938], + [98, 5, 28, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2082736757], + [102, 18, 53, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3423110767], + [103, 18, 27, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4099484488], + [103, 41, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [107, 18, 55, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2178984275], + [108, 18, 37, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3205997572], + [108, 46, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [108, 51, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [112, 18, 94, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4267546724], + [113, 18, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2339760104], + [113, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [117, 18, 92, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1531176], + [118, 18, 39, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2742990692], + [118, 48, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [118, 53, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589] + ], + "test/test_dh.rb:2561778968": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847734175], + [7, 5, 81, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1962538541], + [20, 17, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [20, 24, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [21, 10, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [21, 14, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [21, 20, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [21, 24, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [22, 10, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [22, 14, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [22, 24, 5, "Layout/ExtraSpacing: Unnecessary spacing detected.", 95016837], + [22, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [23, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91636485], + [23, 16, 3, "Layout/ExtraSpacing: Unnecessary spacing detected.", 193341061], + [23, 28, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [23, 30, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91636485], + [24, 10, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [24, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [25, 17, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [25, 27, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [26, 17, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [26, 27, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [27, 9, 28, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 270280839], + [27, 17, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [27, 27, 2, "Layout/ExtraSpacing: Unnecessary spacing detected.", 5858821], + [30, 9, 78, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1847966569], + [30, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [30, 78, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [36, 10, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [36, 14, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [39, 9, 60, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2698389154], + [39, 14, 4, "Layout/ExtraSpacing: Unnecessary spacing detected.", 2085287685], + [39, 64, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [52, 7, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 80391962], + [59, 35, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3294173645], + [60, 35, 22, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3294173645], + [61, 7, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 638963779], + [72, 22, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4146858687], + [73, 32, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [75, 9, 28, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3203257149], + [81, 7, 32, "Minitest/AssertPredicate: Prefer using `assert_predicate(dh, :using_default_values?)`.", 2308506574], + [81, 7, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2308506574], + [83, 7, 33, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3432763311], + [83, 7, 33, "Minitest/RefuteFalse: Prefer using `refute(dh.using_default_values?)`.", 3432763311] + ], + "test/test_discover.rb:276855472": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046940385], + [4, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [5, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906546608], + [6, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [7, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2871107037], + [8, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2995095577], + [9, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [10, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [23, 7, 23, "Minitest/AssertPredicate: Prefer using `assert_predicate(body, :nil?)`.", 547496276], + [23, 7, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 547496276], + [31, 7, 12, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1081125640], + [34, 52, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2388311584], + [35, 52, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043092869], + [36, 52, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 548693648], + [37, 52, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1459202587], + [38, 10, 147, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2114437374], + [38, 38, 3, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 193360151], + [38, 43, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [38, 48, 47, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2001776290], + [38, 49, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [38, 50, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 171675229], + [38, 71, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4149884991], + [38, 93, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [39, 38, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2231187983], + [39, 38, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2231187983], + [40, 10, 65, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1415470631], + [40, 10, 66, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3760857946], + [40, 52, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4149884991], + [55, 17, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2944992319], + [78, 20, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [86, 7, 12, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1081125640], + [92, 9, 16, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4213398675], + [100, 27, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2840892634], + [115, 25, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4225197456], + [117, 9, 38, "Minitest/AssertMatch: Prefer using `assert_match(e.to_s, 'Failed to fetch')`.", 983023043], + [117, 9, 38, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 983023043], + [117, 29, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1134446913], + [140, 17, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3522629037], + [141, 16, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [146, 50, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [146, 51, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1203671929], + [146, 74, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [154, 7, 12, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1081125640], + [155, 17, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 109117395], + [161, 23, 14, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 894147852], + [162, 23, 11, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 2404760888], + [163, 23, 24, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 2456542325], + [165, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3669888374], + [166, 9, 19, "Minitest/RefuteFalse: Prefer using `refute(claimed_id)`.", 1240093182], + [167, 9, 17, "Minitest/RefuteFalse: Prefer using `refute(local_id)`.", 900303800], + [168, 9, 21, "Minitest/RefuteFalse: Prefer using `refute(s.claimed_id)`.", 3221811299], + [169, 9, 19, "Minitest/RefuteFalse: Prefer using `refute(s.local_id)`.", 2236738853], + [170, 9, 23, "Minitest/RefuteFalse: Prefer using `refute(s.get_local_id)`.", 579848844], + [171, 9, 29, "Minitest/RefuteFalse: Prefer using `refute(s.compatibility_mode)`.", 4108014984], + [173, 22, 21, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3025067649], + [174, 22, 21, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3390199144], + [181, 30, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 917910725], + [183, 9, 75, "Minitest/RefuteFalse: Prefer using `refute(s.used_yadis, 'Expected to use old-style discovery')`.", 4141706771], + [183, 16, 13, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2961409063], + [184, 16, 37, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3149819188], + [184, 16, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3149819188], + [188, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [189, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202], + [190, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94278985], + [191, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3669888374], + [191, 9, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 507470635], + [231, 19, 17, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 2810553898], + [244, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3109879802], + [249, 7, 8, "Lint/UselessAssignment: Useless assignment to variable - `services`.", 907487467], + [249, 28, 12, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3522629037], + [249, 28, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3522629037], + [250, 28, 6, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3028237119], + [250, 28, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3028237119], + [250, 36, 1, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 177557], + [253, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [254, 24, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4122345380], + [255, 9, 1, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 177556], + [260, 9, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [264, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [265, 9, 5, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 170962968], + [270, 17, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3488675989], + [273, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [274, 24, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2546470011], + [275, 9, 1, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 177559], + [280, 9, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [284, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94278985], + [285, 9, 5, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 170962968], + [290, 9, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [294, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [295, 9, 5, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 170962968], + [300, 28, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 785086186], + [300, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [301, 28, 50, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2226023022], + [301, 43, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4080986586], + [302, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [304, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [305, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [305, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [306, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [307, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [307, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [308, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [309, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829329741], + [309, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [310, 21, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 170962968], + [316, 22, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [317, 29, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4080986586], + [322, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1497574630], + [328, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [329, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [329, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [330, 21, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 549175785], + [331, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [331, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [332, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [333, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829329741], + [333, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [334, 21, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 170962968], + [338, 28, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 785086186], + [338, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [339, 28, 51, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4013671132], + [339, 43, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 825574824], + [340, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [342, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [343, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [343, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [344, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [345, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [345, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [346, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [347, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830442831], + [347, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94278985], + [348, 21, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 170962968], + [353, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [354, 24, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 559649613], + [355, 9, 1, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 177559], + [358, 21, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94278985], + [358, 28, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [359, 23, 1, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 177622], + [360, 23, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [360, 23, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [361, 23, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [362, 23, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [362, 23, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [363, 23, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [364, 23, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193474391], + [365, 23, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 170962968], + [370, 34, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2175624954], + [371, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [372, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [374, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [375, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [375, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [376, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [377, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [377, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [378, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [379, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829329741], + [379, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [380, 21, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 170962968], + [384, 17, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [384, 17, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [385, 17, 57, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1580274600], + [385, 32, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 811986716], + [386, 17, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177557], + [393, 28, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3043806936], + [393, 39, 22, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1990526015], + [393, 39, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [394, 39, 57, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1580274600], + [394, 39, 57, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1580274600], + [394, 54, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 811986716], + [396, 28, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 785086186], + [396, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [397, 28, 60, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2493700195], + [397, 43, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3688496279], + [398, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [400, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [401, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [401, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [402, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [403, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [403, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [404, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [405, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829329741], + [405, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [406, 21, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 170962968], + [410, 28, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [410, 28, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [411, 28, 60, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 355623723], + [411, 43, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2415079391], + [412, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [414, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [415, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [415, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [416, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [417, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [418, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [419, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829330700], + [419, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202], + [420, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [424, 28, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [424, 28, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [425, 28, 67, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3887176836], + [425, 43, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2715785456], + [426, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [428, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [429, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [429, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [430, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [431, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [432, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [433, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830442831], + [433, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94278985], + [434, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [438, 28, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [438, 28, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [439, 28, 55, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3435425082], + [439, 43, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2887826830], + [440, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [442, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [443, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [443, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [444, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [445, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [445, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [446, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [447, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830442831], + [447, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94278985], + [448, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [452, 28, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [452, 28, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [453, 28, 52, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1224977559], + [453, 43, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2316622755], + [454, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [456, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [457, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [457, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [458, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [458, 26, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [458, 31, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [459, 21, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3199036592], + [459, 22, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3669888374], + [460, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [465, 28, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [465, 28, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [466, 28, 61, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2404502615], + [466, 43, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2681998563], + [467, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [469, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [470, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [470, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [471, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [471, 26, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [471, 31, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [472, 21, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3199036592], + [472, 22, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3669888374], + [473, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [478, 19, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [478, 19, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [479, 19, 63, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 10858848], + [479, 34, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1489600852], + [480, 19, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [485, 28, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [485, 28, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [486, 28, 62, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1670963999], + [486, 43, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 774170667], + [487, 28, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [489, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [490, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [490, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [491, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 732701340], + [492, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [492, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [493, 21, 3, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 193419246], + [494, 21, 14, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2748667117], + [494, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94278985], + [494, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [495, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [500, 19, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1990526015], + [500, 19, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [501, 19, 75, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3487638247], + [501, 34, 52, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 611275283], + [502, 19, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177556], + [521, 19, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [522, 77, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [523, 33, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4227011157], + [526, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [532, 17, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3522629037], + [533, 16, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [538, 35, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2141063537], + [538, 43, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2087730517], + [539, 35, 27, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1638662663], + [539, 36, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [539, 37, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1203671929], + [539, 60, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [539, 64, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193422222], + [548, 7, 12, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1081125640], + [552, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [552, 22, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 636880821], + [552, 22, 140, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3177629283], + [552, 36, 22, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1990526015], + [552, 36, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [553, 36, 66, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2120400458], + [553, 36, 66, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2120400458], + [553, 51, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1203662910], + [554, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3166134712], + [554, 40, 22, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1990526015], + [554, 40, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [555, 40, 65, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2248360097], + [555, 40, 65, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2248360097], + [555, 40, 66, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1181439132], + [555, 55, 42, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 627706709], + [555, 106, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [559, 41, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 636880821], + [561, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [562, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [562, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [563, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3775940364], + [563, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [564, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [564, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [565, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3775940364], + [565, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [566, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829330700], + [566, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202], + [567, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [568, 21, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 636880821], + [568, 21, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 636880821], + [570, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359324], + [571, 21, 46, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3389913047], + [571, 21, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3389913047], + [572, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3775940364], + [572, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [573, 21, 31, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 548286958], + [573, 21, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 548286958], + [574, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3775940364], + [574, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [575, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829330700], + [575, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202], + [576, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [577, 21, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 636880821], + [577, 21, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 636880821], + [581, 41, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2873963884], + [583, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359421], + [584, 21, 32, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 187866998], + [584, 21, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 187866998], + [585, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3775940364], + [585, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [586, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1830371113], + [586, 21, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1830371113], + [587, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3775940364], + [587, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [588, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829330700], + [588, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202], + [589, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [590, 21, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 636880821], + [590, 21, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 636880821], + [592, 21, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 690359324], + [593, 21, 46, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3389913047], + [593, 21, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3389913047], + [594, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3775940364], + [594, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [595, 21, 31, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 548286958], + [595, 21, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 548286958], + [596, 21, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3775940364], + [596, 41, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [597, 21, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1829330700], + [597, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452202], + [598, 21, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2087932467], + [599, 21, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 636880821], + [599, 21, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 636880821], + [604, 43, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3166134712], + [605, 9, 23, "Minitest/AssertEmpty: Prefer using `assert_empty(services)`.", 1173104492], + [605, 9, 23, "Minitest/AssertPredicate: Prefer using `assert_predicate(services, :empty?)`.", 1173104492], + [605, 9, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1173104492], + [613, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [614, 51, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [615, 7, 66, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1284057323], + [615, 63, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3410460824], + [623, 7, 12, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1081125640], + [627, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [627, 22, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 636880821], + [627, 22, 135, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3762372481], + [627, 36, 22, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1990526015], + [627, 36, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1990526015], + [628, 36, 61, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2235769576], + [628, 36, 61, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2235769576], + [628, 51, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393694428], + [628, 98, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [632, 41, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 636880821], + [633, 7, 55, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2822105475], + [633, 7, 55, "Minitest/RefuteFalse: Prefer using `refute(services.empty?, 'Expected services, got zero')`.", 2822105475], + [633, 32, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1040214983], + [634, 20, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1331896354], + [634, 20, 89, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 418232694], + [635, 20, 46, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3389913047], + [635, 20, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3389913047], + [641, 7, 12, "Style/SuperArguments: Call `super` without arguments and parentheses when the signature is identical.", 1081125640], + [645, 23, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 724954885], + [650, 23, 15, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2548208505], + [651, 23, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3931244506], + [651, 23, 16, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 882049863], + [652, 23, 15, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 3931244506], + [653, 23, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2548208505], + [653, 23, 17, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 450190105], + [662, 9, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3361003049], + [673, 7, 35, "Minitest/RefuteFalse: Prefer using `refute(@endpoint.is_op_identifier)`.", 873861676], + [678, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 873861676], + [678, 7, 35, "Minitest/RefuteFalse: Prefer using `refute(@endpoint.is_op_identifier)`.", 873861676], + [683, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 873861676], + [683, 7, 35, "Minitest/RefuteFalse: Prefer using `refute(@endpoint.is_op_identifier)`.", 873861676], + [688, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 873861676], + [688, 7, 35, "Minitest/RefuteFalse: Prefer using `refute(@endpoint.is_op_identifier)`.", 873861676], + [693, 7, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2861773325], + [697, 30, 15, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2548208505], + [698, 30, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3931244506], + [698, 30, 15, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3931244506], + [699, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 873861676], + [699, 7, 35, "Minitest/RefuteFalse: Prefer using `refute(@endpoint.is_op_identifier)`.", 873861676], + [703, 30, 15, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2548208505], + [704, 30, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3931244506], + [705, 30, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4238333211], + [705, 30, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4238333211], + [706, 7, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2861773325], + [712, 26, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2259650780], + [726, 7, 37, "Minitest/RefuteFalse: Prefer using `refute(@endpoint.compatibility_mode)`.", 1374481464], + [743, 7, 11, "Naming/VariableName: Use snake_case for variable names.", 2215990581], + [743, 42, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91120070], + [745, 7, 11, "Naming/VariableName: Use snake_case for variable names.", 2215974520], + [745, 42, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91008555], + [749, 52, 11, "Naming/VariableName: Use snake_case for variable names.", 2215974520], + [750, 54, 11, "Naming/VariableName: Use snake_case for variable names.", 2215990581], + [751, 24, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91008555], + [751, 47, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 859901937], + [752, 24, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91008555], + [752, 47, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3900123940], + [753, 24, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91120070], + [753, 47, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3059201737], + [754, 24, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91120070], + [754, 47, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2812889840], + [766, 8, 5, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 91610211], + [766, 8, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [767, 8, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4046276539], + [768, 8, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3931244506], + [769, 8, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2548208505], + [770, 8, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4238333211], + [770, 8, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4238333211], + [772, 11, 81, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(@endpoint.supports_type(t), format('Must support %s', t))`?", 95999423], + [772, 18, 26, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2217721222], + [773, 18, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 360082841], + [773, 25, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1550002083], + [775, 11, 87, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(!@endpoint.supports_type(t), format(\"Shouldn't support %s\", t))`?", 565335413], + [775, 11, 87, "Minitest/RefuteFalse: Prefer using `refute(@endpoint.supports_type(t), format(\"Shouldn't support %s\", t))`.", 565335413], + [775, 18, 27, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2571326855], + [776, 18, 33, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 88488242], + [792, 30, 19, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4238333211], + [793, 30, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2548208505], + [807, 30, 15, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 4046276539], + [808, 30, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2548208505], + [808, 30, 15, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2548208505], + [809, 30, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4046276539], + [810, 30, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2548208505], + [814, 30, 15, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 4046276539], + [815, 30, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2548208505], + [816, 30, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4238333211], + [816, 30, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4238333211], + [817, 30, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4046276539], + [818, 30, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2548208505], + [819, 30, 19, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4238333211], + [826, 30, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2057884295], + [827, 7, 69, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1302101538], + [827, 7, 69, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1302101538], + [827, 20, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3400679892], + [834, 30, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3595439721] + ], + "test/test_discovery_manager.rb:315298276": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3337961901], + [3, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [8, 23, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2072284162], + [9, 20, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2302635327], + [12, 58, 13, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2458119473], + [13, 58, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 771198903], + [14, 58, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 605384036], + [32, 7, 38, "Minitest/RefuteFalse: Prefer using `refute(@disco_services.for_url?(nil))`.", 603865808], + [33, 7, 44, "Minitest/RefuteFalse: Prefer using `refute(@disco_services.for_url?('invalid'))`.", 1657632970], + [33, 40, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3644585460], + [37, 7, 33, "Minitest/RefuteFalse: Prefer using `refute(@disco_services.started?)`.", 4092600212], + [39, 7, 32, "Minitest/AssertPredicate: Prefer using `assert_predicate(@disco_services, :started?)`.", 267902325], + [39, 7, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 267902325], + [41, 7, 32, "Minitest/AssertPredicate: Prefer using `assert_predicate(@disco_services, :started?)`.", 267902325], + [41, 7, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 267902325], + [43, 7, 33, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4092600212], + [43, 7, 33, "Minitest/RefuteFalse: Prefer using `refute(@disco_services.started?)`.", 4092600212], + [47, 7, 61, "Minitest/AssertEmpty: Prefer using `assert_empty(Consumer::DiscoveredServices.new(nil, nil, []))`.", 2026411797], + [47, 7, 61, "Minitest/AssertPredicate: Prefer using `assert_predicate(Consumer::DiscoveredServices.new(nil, nil, []), :empty?)`.", 2026411797], + [49, 7, 31, "Minitest/RefuteFalse: Prefer using `refute(@disco_services.empty?)`.", 151347072], + [54, 7, 32, "Minitest/AssertPredicate: Prefer using `assert_predicate(@disco_services, :started?)`.", 267902325], + [61, 5, 64, "Style/MissingRespondToMissing: When using `method_missing`, define `respond_to_missing?`.", 281345496], + [70, 14, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3604246711], + [71, 21, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 687875443], + [72, 20, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 466049418], + [80, 7, 60, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2881323096], + [80, 7, 60, "Minitest/RefuteFalse: Prefer using `refute(m.instance_variable_get('@session_key_suffix').nil?)`.", 2881323096], + [80, 39, 21, "Performance/StringIdentifierArgument: Use `:@session_key_suffix` instead of `'@session_key_suffix'`.", 1877800091], + [80, 39, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1877800091], + [82, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1637612273], + [83, 7, 72, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2851020872], + [83, 20, 58, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 938433784], + [83, 44, 21, "Performance/StringIdentifierArgument: Use `:@session_key_suffix` instead of `'@session_key_suffix'`.", 1877800091], + [83, 44, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1877800091], + [83, 68, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1637612273], + [94, 7, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3504332328], + [94, 20, 20, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1614705176], + [94, 35, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91847809], + [95, 20, 19, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2782662248], + [95, 34, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91847809], + [101, 20, 32, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 4208648948], + [101, 47, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92087849], + [102, 20, 34, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 452879222], + [102, 47, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1530396587], + [104, 7, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 778344386], + [104, 20, 22, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1328130418], + [104, 35, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1530396587], + [109, 23, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023166795], + [113, 7, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 376649296], + [113, 20, 22, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2789446816], + [113, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023166795], + [123, 10, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [137, 7, 28, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4012397391], + [142, 7, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2619799968], + [142, 20, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1538216752], + [142, 38, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91847809], + [147, 21, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085211091], + [150, 55, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316400827], + [163, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316400827], + [169, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [170, 7, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3273880133], + [170, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [173, 67, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91847809], + [175, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 305279532], + [178, 49, 26, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2320481983], + [178, 49, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2320481983], + [179, 49, 25, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3788493985], + [179, 49, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3788493985], + [179, 76, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1924192519], + [179, 77, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91847809], + [181, 7, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3966878101], + [186, 7, 27, "Minitest/AssertNil: Prefer using `assert_nil(@session[@key])`.", 1272841747], + [186, 7, 27, "Minitest/AssertPredicate: Prefer using `assert_predicate(@session[@key], :nil?)`.", 1272841747], + [192, 7, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4032471369], + [195, 20, 28, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2797186198], + [195, 39, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1144547333], + [207, 7, 19, "Minitest/AssertNil: Prefer using `assert_nil(result)`.", 2261710389], + [207, 7, 19, "Minitest/AssertPredicate: Prefer using `assert_predicate(result, :nil?)`.", 2261710389], + [207, 7, 19, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2261710389], + [208, 7, 27, "Minitest/AssertNil: Prefer using `assert_nil(@session[@key])`.", 1272841747], + [208, 7, 27, "Minitest/AssertPredicate: Prefer using `assert_predicate(@session[@key], :nil?)`.", 1272841747], + [216, 73, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036105047], + [217, 56, 22, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 865916723], + [217, 56, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 865916723], + [218, 56, 27, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3754071943], + [218, 56, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3754071943], + [219, 56, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2905354993], + [219, 57, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036105047], + [223, 7, 27, "Minitest/AssertNil: Prefer using `assert_nil(@session[@key])`.", 1272841747], + [223, 7, 27, "Minitest/AssertPredicate: Prefer using `assert_predicate(@session[@key], :nil?)`.", 1272841747], + [223, 7, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1272841747], + [227, 7, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 917748266], + [231, 7, 27, "Minitest/AssertNil: Prefer using `assert_nil(@session[@key])`.", 1272841747], + [231, 7, 27, "Minitest/AssertPredicate: Prefer using `assert_predicate(@session[@key], :nil?)`.", 1272841747], + [231, 7, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1272841747], + [236, 16, 53, "Layout/FirstArgumentIndentation: Indent the first argument one step more than the start of the previous line.", 3382928478], + [236, 16, 53, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 3382928478], + [236, 47, 21, "Performance/StringIdentifierArgument: Use `:@session_key_suffix` instead of `'@session_key_suffix'`.", 1877800091], + [236, 47, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1877800091], + [241, 15, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3062658746], + [242, 7, 27, "Minitest/AssertNil: Prefer using `assert_nil(@session[@key])`.", 1272841747], + [242, 7, 27, "Minitest/AssertPredicate: Prefer using `assert_predicate(@session[@key], :nil?)`.", 1272841747], + [242, 7, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1272841747], + [244, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 173228842], + [248, 15, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3062658746], + [250, 7, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 895759390], + [254, 15, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3062658746], + [256, 7, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 895759390], + [258, 7, 27, "Minitest/AssertNil: Prefer using `assert_nil(@session[@key])`.", 1272841747], + [258, 7, 27, "Minitest/AssertPredicate: Prefer using `assert_predicate(@session[@key], :nil?)`.", 1272841747], + [258, 7, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1272841747], + [259, 7, 26, "Minitest/AssertNil: Prefer using `assert_nil(@manager.load)`.", 1827108999], + [259, 7, 26, "Minitest/AssertPredicate: Prefer using `assert_predicate(@manager.load, :nil?)`.", 1827108999] + ], + "test/test_extension.rb:2855651568": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2850088810], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [7, 16, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1015948479], + [8, 18, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 908829581], + [25, 7, 54, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3322503391], + [28, 9, 56, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 2090975631], + [30, 20, 26, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1847548107], + [31, 20, 46, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1953707571], + [39, 7, 55, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1478049918], + [39, 7, 55, "Minitest/RefuteFalse: Prefer using `refute(namespaces.implicit?(DummyExtension::TEST_URI))`.", 1478049918], + [42, 9, 56, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 2090975631], + [44, 20, 26, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1847548107], + [45, 20, 46, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1953707571] + ], + "test/test_fetchers.rb:2487649088": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 679062125], + [3, 9, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 976895910], + [4, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [5, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046940385], + [6, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [7, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 209039958], + [10, 11, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 934211966], + [23, 5, 39, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4213754095], + [24, 5, 39, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3299874831], + [25, 5, 49, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 326244463], + [30, 14, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [41, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3370555476], + [42, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 511796379], + [47, 44, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1264728786], + [48, 20, 13, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 3118792408], + [48, 28, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [59, 8, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2897667817], + [60, 8, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1008273769], + [61, 8, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3621649451], + [62, 8, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1785807569], + [63, 8, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3949100114], + [64, 8, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 937006152], + [65, 8, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 298108482], + [65, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2897667817], + [66, 8, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3323379297], + [66, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2897667817], + [67, 8, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 288675584], + [67, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2897667817], + [68, 7, 33, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3727184956], + [68, 8, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4216042884], + [68, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2897667817], + [74, 12, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1105879864], + [74, 37, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2897667817], + [81, 19, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1264728786], + [87, 7, 57, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4143225396], + [88, 7, 45, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1580705770], + [88, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4174453037], + [88, 39, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 860394976], + [94, 7, 39, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3538985785], + [94, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2998511773], + [95, 7, 35, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2029199834], + [103, 12, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1105879864], + [103, 37, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3216360115], + [105, 7, 57, "Minitest/AssertOperator: Prefer using `assert_operator(@_redirect_counter, :<, 10, 'Fetched too many times.')`.", 4225552770], + [105, 7, 57, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4225552770], + [105, 7, 57, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4225552770], + [105, 39, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1641480383], + [117, 12, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1485943929], + [117, 30, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2101751492], + [125, 12, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1485943929], + [125, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 785086186], + [126, 14, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733600577], + [133, 12, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1485943929], + [133, 30, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4001032979], + [134, 14, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505628293], + [146, 39, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4269900310], + [147, 39, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 50753631], + [148, 39, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1191369785], + [149, 22, 10, "ThreadSafety/NewThread: Avoid starting new threads.", 3411682361], + [150, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2897667817], + [151, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 298108482], + [152, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3323379297], + [153, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 288675584], + [154, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4216042884], + [155, 26, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3621649451], + [156, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1785807569], + [157, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1008273769], + [158, 26, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3949100114], + [159, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 937006152], + [160, 26, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1763722887], + [161, 26, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3550525586], + [163, 14, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1105879864], + [163, 39, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1763722887], + [165, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3924864146], + [166, 26, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3216360115], + [167, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2228087641], + [168, 26, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1653373887], + [169, 26, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2714771337], + [173, 5, 9, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3965863974], + [176, 25, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340330], + [178, 27, 17, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1792026482], + [178, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1018961288], + [180, 27, 10, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3790250079], + [181, 25, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [208, 7, 41, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2490066218], + [210, 22, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1763722887], + [214, 5, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 37095573], + [214, 18, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247383], + [219, 7, 41, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2490066218], + [221, 22, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3550525586], + [225, 5, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 37095573], + [225, 18, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247383], + [229, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3924864146], + [233, 5, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 37095573], + [233, 18, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94247383], + [238, 22, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3216360115], + [240, 27, 4, "Lint/UselessAssignment: Useless assignment to variable - `body`.", 2087730517], + [240, 39, 7, "Lint/UselessAssignment: Useless assignment to variable - `headers`.", 643017641], + [240, 54, 14, "Lint/UselessAssignment: Useless assignment to variable - `redirect_limit`.", 3383958005], + [245, 22, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2228087641], + [247, 5, 46, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1697927681], + [254, 22, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1653373887], + [256, 5, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 384617280], + [256, 18, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 733600577], + [268, 22, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2714771337], + [270, 5, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1539815172], + [270, 18, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3505628293], + [277, 5, 960, "Style/For: Prefer `each` over `for`.", 657325437], + [280, 7, 17, "Layout/IndentationWidth: Use 2 (not 17) spaces for indentation.", 2300919173], + [281, 22, 4, "Layout/ElseAlignment: Align `else` with `expected_url`.", 2087423834], + [283, 22, 3, "Layout/EndAlignment: `end` at 283, 21 is not aligned with `expected_url = if` at 279, 6.", 193405706], + [289, 9, 38, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 418973800], + [291, 27, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94568688], + [321, 15, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3107493707], + [322, 7, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1693193124], + [322, 13, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2944387327], + [324, 20, 66, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2904753765], + [324, 28, 58, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2887634005], + [339, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3913868777], + [353, 40, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3347929572], + [354, 5, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1725276603], + [373, 42, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3347929572], + [376, 5, 25, "Minitest/AssertNil: Prefer using `assert_nil(conn.ca_file)`.", 2516667301], + [376, 5, 25, "Minitest/AssertPredicate: Prefer using `assert_predicate(conn.ca_file, :nil?)`.", 2516667301], + [388, 35, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 778972559], + [397, 7, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 203172771], + [401, 35, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 778972559], + [420, 15, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 212082712], + [439, 15, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 212082712], + [483, 15, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 212082712], + [497, 15, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 212082712], + [527, 15, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 212082712], + [538, 5, 53, "Minitest/AssertKindOf: Prefer using `assert_kind_of(OpenID::StandardFetcher, OpenID.fetcher)`.", 3391577287], + [544, 5, 59, "Minitest/AssertEqual: Prefer using `assert_equal(OpenID.fetch('not-a-url'), BogusFetcher::RESPONSE)`.", 3056821591], + [544, 5, 59, "Minitest/AssertOperator: Prefer using `assert_operator(OpenID.fetch('not-a-url'), :==, BogusFetcher::RESPONSE)`.", 3056821591], + [544, 25, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3428928858], + [548, 5, 53, "Minitest/AssertKindOf: Prefer using `assert_kind_of(OpenID::StandardFetcher, OpenID.fetcher)`.", 3391577287], + [548, 5, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3391577287], + [555, 39, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3689154350], + [559, 15, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3040778792], + [562, 7, 6, "Minitest/ReturnInTestMethod: Use `skip` instead of `return`.", 2123913871], + [562, 17, 33, "Performance/RegexpMatch: Use `match?` instead of `=~` when `MatchData` is not used.", 2671838566], + [566, 5, 51, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4106286157], + [566, 5, 51, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4106286157], + [566, 11, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 817451863], + [570, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1318580622], + [570, 25, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3952490545], + [574, 47, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1603650831], + [575, 5, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1064158613], + [575, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3689154350] + ], + "test/test_filters.rb:4212640425": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2413211883], + [4, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 53893767], + [5, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 916562793], + [9, 5, 916, "Minitest/MultipleAssertions: Test case has too many assertions [8/3].", 3756493961], + [12, 16, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1939718458], + [12, 29, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 680669056], + [13, 19, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3207940878], + [19, 7, 47, "Minitest/AssertEqual: Prefer using `assert_equal(no_types_endpoint.match_types([]), [])`.", 201081095], + [19, 7, 47, "Minitest/AssertOperator: Prefer using `assert_operator(no_types_endpoint.match_types([]), :==, [])`.", 201081095], + [20, 7, 59, "Minitest/AssertEqual: Prefer using `assert_equal(no_types_endpoint.match_types(['urn:absent']), [])`.", 1410079131], + [20, 7, 59, "Minitest/AssertOperator: Prefer using `assert_operator(no_types_endpoint.match_types(['urn:absent']), :==, [])`.", 1410079131], + [20, 45, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1426442137], + [22, 7, 49, "Minitest/AssertEqual: Prefer using `assert_equal(some_types_endpoint.match_types([]), [])`.", 2116289682], + [22, 7, 49, "Minitest/AssertOperator: Prefer using `assert_operator(some_types_endpoint.match_types([]), :==, [])`.", 2116289682], + [23, 7, 61, "Minitest/AssertEqual: Prefer using `assert_equal(some_types_endpoint.match_types(['urn:absent']), [])`.", 1719751438], + [23, 7, 61, "Minitest/AssertOperator: Prefer using `assert_operator(some_types_endpoint.match_types(['urn:absent']), :==, [])`.", 1719751438], + [23, 47, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1426442137], + [24, 7, 55, "Minitest/AssertEqual: Prefer using `assert_equal(some_types_endpoint.match_types(types), types)`.", 26371506], + [24, 7, 55, "Minitest/AssertOperator: Prefer using `assert_operator(some_types_endpoint.match_types(types), :==, types)`.", 26371506], + [25, 7, 70, "Minitest/AssertEqual: Prefer using `assert_equal(some_types_endpoint.match_types([types[1], types[0]]), types)`.", 274462322], + [25, 7, 70, "Minitest/AssertOperator: Prefer using `assert_operator(some_types_endpoint.match_types([types[1], types[0]]), :==, types)`.", 274462322], + [26, 7, 65, "Minitest/AssertEqual: Prefer using `assert_equal(some_types_endpoint.match_types([types[0]]), [types[0]])`.", 469229682], + [26, 7, 65, "Minitest/AssertOperator: Prefer using `assert_operator(some_types_endpoint.match_types([types[0]]), :==, [types[0]])`.", 469229682], + [27, 7, 72, "Minitest/AssertEqual: Prefer using `assert_equal(some_types_endpoint.match_types(types + ['urn:absent']), types)`.", 2362494531], + [27, 7, 72, "Minitest/AssertOperator: Prefer using `assert_operator(some_types_endpoint.match_types(types + ['urn:absent']), :==, types)`.", 2362494531], + [27, 55, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1426442137], + [32, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [35, 7, 98, "Minitest/AssertEqual: Prefer using `assert_equal(Yadis::BasicServiceEndpoint.from_basic_service_endpoint(endpoint), endpoint)`.", 1754948524], + [35, 7, 98, "Minitest/AssertOperator: Prefer using `assert_operator(Yadis::BasicServiceEndpoint.from_basic_service_endpoint(endpoint), :==, endpoint)`.", 1754948524], + [37, 7, 72, "Minitest/AssertEqual: Prefer using `assert_equal(e.from_basic_service_endpoint(endpoint), endpoint)`.", 4129746987], + [37, 7, 72, "Minitest/AssertOperator: Prefer using `assert_operator(e.from_basic_service_endpoint(endpoint), :==, endpoint)`.", 4129746987], + [44, 36, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3784266648], + [46, 29, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3003823453], + [49, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91008555], + [55, 19, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2697248032], + [56, 13, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 861529542], + [57, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1555163167], + [57, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1555163324], + [73, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [75, 7, 38, "Minitest/AssertNil: Prefer using `assert_nil(t.apply_filters(endpoint))`.", 2720526108], + [75, 7, 38, "Minitest/AssertPredicate: Prefer using `assert_predicate(t.apply_filters(endpoint), :nil?)`.", 2720526108], + [75, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2720526108], + [82, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [83, 7, 38, "Minitest/AssertNil: Prefer using `assert_nil(t.apply_filters(endpoint))`.", 2720526108], + [83, 7, 38, "Minitest/AssertPredicate: Prefer using `assert_predicate(t.apply_filters(endpoint), :nil?)`.", 2720526108], + [83, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2720526108], + [91, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [92, 7, 45, "Minitest/AssertEqual: Prefer using `assert_equal(t.apply_filters(endpoint), endpoint)`.", 3452878725], + [92, 7, 45, "Minitest/AssertOperator: Prefer using `assert_operator(t.apply_filters(endpoint), :==, endpoint)`.", 3452878725], + [92, 7, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3452878725], + [98, 27, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 427213517], + [101, 18, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [102, 7, 54, "Minitest/AssertEqual: Prefer using `assert_equal(t.apply_filters(endpoint), returned_endpoint)`.", 2049925297], + [102, 7, 54, "Minitest/AssertOperator: Prefer using `assert_operator(t.apply_filters(endpoint), :==, returned_endpoint)`.", 2049925297], + [102, 7, 54, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2049925297], + [108, 20, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91850218], + [110, 21, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029179133], + [121, 7, 42, "Minitest/AssertEqual: Prefer using `assert_equal(t.apply_filters(odd), odd_result)`.", 3396290035], + [121, 7, 42, "Minitest/AssertOperator: Prefer using `assert_operator(t.apply_filters(odd), :==, odd_result)`.", 3396290035], + [121, 7, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3396290035], + [122, 7, 44, "Minitest/AssertEqual: Prefer using `assert_equal(t.apply_filters(even), even_result)`.", 4078926419], + [122, 7, 44, "Minitest/AssertOperator: Prefer using `assert_operator(t.apply_filters(even), :==, even_result)`.", 4078926419], + [139, 17, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1530851366], + [144, 9, 41, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3531467300], + [148, 7, 58, "Minitest/AssertEqual: Prefer using `assert_equal(cf.get_service_endpoints('unused', 'unused'), all)`.", 4069255035], + [148, 7, 58, "Minitest/AssertOperator: Prefer using `assert_operator(cf.get_service_endpoints('unused', 'unused'), :==, all)`.", 4069255035], + [148, 7, 58, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4069255035], + [148, 7, 58, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4069255035], + [148, 39, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [148, 49, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [155, 7, 48, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Yadis::TransformFilterMaker, result)`.", 3041670560], + [155, 7, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3041670560], + [155, 7, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3041670560], + [163, 7, 48, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Yadis::TransformFilterMaker, result)`.", 3041670560], + [163, 7, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3041670560], + [163, 7, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3041670560], + [164, 7, 73, "Minitest/AssertEqual: Prefer using `assert_equal(result.filter_procs[0], e1.method('from_basic_service_endpoint'))`.", 500847677], + [164, 7, 73, "Minitest/AssertOperator: Prefer using `assert_operator(result.filter_procs[0], :==, e1.method('from_basic_service_endpoint'))`.", 500847677], + [164, 7, 73, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 500847677], + [164, 50, 29, "Performance/StringIdentifierArgument: Use `:from_basic_service_endpoint` instead of `'from_basic_service_endpoint'`.", 1551624392], + [164, 50, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551624392], + [165, 7, 73, "Minitest/AssertEqual: Prefer using `assert_equal(result.filter_procs[1], e2.method('from_basic_service_endpoint'))`.", 3552524639], + [165, 7, 73, "Minitest/AssertOperator: Prefer using `assert_operator(result.filter_procs[1], :==, e2.method('from_basic_service_endpoint'))`.", 3552524639], + [165, 7, 73, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3552524639], + [165, 50, 29, "Performance/StringIdentifierArgument: Use `:from_basic_service_endpoint` instead of `'from_basic_service_endpoint'`.", 1551624392], + [165, 50, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551624392], + [171, 7, 48, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Yadis::TransformFilterMaker, result)`.", 3041670560], + [171, 7, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3041670560], + [171, 7, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3041670560], + [178, 7, 30, "Minitest/AssertEqual: Prefer using `assert_equal(result.subfilters, [])`.", 1130885585], + [178, 7, 30, "Minitest/AssertOperator: Prefer using `assert_operator(result.subfilters, :==, [])`.", 1130885585], + [178, 7, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1130885585], + [178, 7, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1130885585], + [183, 7, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2299389776], + [183, 7, 45, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2299389776], + [189, 7, 48, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Yadis::TransformFilterMaker, result)`.", 3041670560], + [189, 7, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3041670560], + [189, 7, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3041670560], + [194, 7, 60, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2921340448], + [194, 7, 60, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2921340448], + [194, 37, 29, "Performance/StringIdentifierArgument: Use `:from_basic_service_endpoint` instead of `'from_basic_service_endpoint'`.", 1551624392], + [194, 37, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551624392], + [201, 7, 48, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Yadis::TransformFilterMaker, result)`.", 3041670560], + [201, 7, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3041670560], + [201, 7, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3041670560], + [205, 7, 38, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2341221211], + [216, 7, 42, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Yadis::CompoundFilter, result)`.", 1799602205], + [216, 7, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1799602205], + [217, 7, 36, "Minitest/AssertEqual: Prefer using `assert_equal(result.subfilters, [f1, f2])`.", 3203932606], + [217, 7, 36, "Minitest/AssertOperator: Prefer using `assert_operator(result.subfilters, :==, [f1, f2])`.", 3203932606], + [217, 7, 36, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3203932606], + [220, 5, 755, "Minitest/MultipleAssertions: Test case has too many assertions [5/3].", 2440747337], + [232, 7, 42, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Yadis::CompoundFilter, result)`.", 1799602205], + [232, 7, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1799602205], + [234, 7, 33, "Minitest/AssertEqual: Prefer using `assert_equal(result.subfilters[0], f1)`.", 2632130614], + [234, 7, 33, "Minitest/AssertOperator: Prefer using `assert_operator(result.subfilters[0], :==, f1)`.", 2632130614], + [234, 7, 33, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2632130614], + [235, 7, 86, "Minitest/AssertEqual: Prefer using `assert_equal(result.subfilters[1].filter_procs[0], e.method('from_basic_service_endpoint'))`.", 3322215778], + [235, 7, 86, "Minitest/AssertOperator: Prefer using `assert_operator(result.subfilters[1].filter_procs[0], :==, e.method('from_basic_service_endpoint'))`.", 3322215778], + [235, 7, 86, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3322215778], + [235, 63, 29, "Performance/StringIdentifierArgument: Use `:from_basic_service_endpoint` instead of `'from_basic_service_endpoint'`.", 1551624392], + [235, 63, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551624392], + [236, 7, 87, "Minitest/AssertEqual: Prefer using `assert_equal(result.subfilters[2].filter_procs[0], f2.method('from_basic_service_endpoint'))`.", 2983250352], + [236, 7, 87, "Minitest/AssertOperator: Prefer using `assert_operator(result.subfilters[2].filter_procs[0], :==, f2.method('from_basic_service_endpoint'))`.", 2983250352], + [236, 7, 87, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2983250352], + [236, 64, 29, "Performance/StringIdentifierArgument: Use `:from_basic_service_endpoint` instead of `'from_basic_service_endpoint'`.", 1551624392], + [236, 64, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1551624392], + [237, 7, 49, "Minitest/AssertEqual: Prefer using `assert_equal(result.subfilters[2].filter_procs[1], f3)`.", 709519885], + [237, 7, 49, "Minitest/AssertOperator: Prefer using `assert_operator(result.subfilters[2].filter_procs[1], :==, f3)`.", 709519885], + [237, 7, 49, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 709519885], + [243, 14, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [243, 35, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441] + ], + "test/test_idres.rb:1650360912": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046940385], + [4, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1493934251], + [5, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 395966781], + [6, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2754036930], + [7, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3682152042], + [16, 9, 15, "Style/SingleLineMethods: Avoid single-line method definitions.", 460931552], + [23, 41, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [24, 41, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [28, 31, 14, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1615061360], + [28, 46, 10, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2517626812], + [28, 57, 12, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 4223563293], + [29, 31, 11, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2162137574], + [36, 34, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [36, 63, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [36, 87, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [42, 12, 2, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 5862883], + [43, 12, 7, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1932037605], + [43, 13, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [44, 12, 11, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 734155001], + [44, 12, 11, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 734155001], + [48, 15, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3330304394], + [58, 12, 39, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1286312231], + [58, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044557], + [59, 12, 40, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 213668630], + [59, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044557], + [60, 12, 39, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 954026852], + [60, 12, 39, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 954026852], + [60, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044590], + [71, 29, 41, "Performance/StringIdentifierArgument: Use `:\"test_#{i}_#{ver}_check_missing_#{field}\"` instead of `\"test_#{i}_#{ver}_check_missing_#{field}\"`.", 2082573537], + [78, 12, 55, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2546590862], + [78, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044557], + [79, 12, 56, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2541930495], + [79, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044557], + [80, 12, 67, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1950570660], + [80, 13, 9, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2149044590], + [80, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044590], + [80, 24, 10, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 2385542796], + [80, 36, 14, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 120341984], + [81, 13, 14, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3747912675], + [81, 13, 15, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3422033950], + [94, 29, 55, "Performance/StringIdentifierArgument: Use `:\"test_#{i}_#{ver}_check_missing_signed_#{signed_field}\"` instead of `\"test_#{i}_#{ver}_check_missing_signed_#{signed_field}\"`.", 1649943041], + [99, 9, 1687, "Minitest/MultipleAssertions: Test case has too many assertions [5/3].", 2633333981], + [100, 19, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [100, 20, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [100, 20, 63, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2444755693], + [100, 45, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4041942401], + [101, 20, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [101, 43, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1039290706], + [102, 20, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [102, 41, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3952821122], + [103, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [103, 37, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [104, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [104, 35, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1670302195], + [105, 20, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 350227365], + [105, 40, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2108437785], + [106, 20, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 203138929], + [106, 44, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3128290302], + [107, 20, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 639074633], + [107, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032063535], + [108, 20, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3190715482], + [108, 47, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2465284971], + [109, 20, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1005119878], + [109, 53, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [110, 20, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2954082535], + [110, 47, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3718229702], + [111, 20, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [111, 42, 78, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2090979964], + [112, 20, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [112, 36, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3322422035], + [113, 20, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [113, 20, 153, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2278698032], + [113, 39, 134, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3220687478], + [113, 173, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [114, 11, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1414655387], + [114, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [116, 11, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 860412032], + [120, 25, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [120, 42, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [122, 11, 27, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 21209496], + [130, 33, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2561153136], + [154, 13, 38, "Style/SingleLineMethods: Avoid single-line method definitions.", 4292271591], + [167, 34, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [167, 34, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3771358084], + [167, 51, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [168, 34, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [168, 56, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2064429562], + [169, 34, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [169, 34, 14, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1152280913], + [169, 43, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [170, 32, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [174, 27, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2182293065], + [175, 29, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [175, 29, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3771358084], + [175, 46, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [176, 29, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [176, 51, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 778972559], + [177, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [177, 29, 14, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1152280913], + [177, 38, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [178, 27, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [182, 27, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2745045801], + [183, 29, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [183, 29, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3771358084], + [183, 46, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [184, 29, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [184, 29, 51, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3821938912], + [184, 51, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2064429562], + [185, 27, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [188, 29, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [188, 29, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3771358084], + [188, 46, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [189, 29, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [189, 51, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2064429562], + [190, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [190, 29, 15, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3661401749], + [190, 38, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [191, 27, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [197, 23, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 38923297], + [200, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [200, 40, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [201, 30, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [201, 37, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [208, 13, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1060996402], + [210, 13, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 640163262], + [212, 13, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3687688452], + [214, 13, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1284469395], + [215, 13, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1301124627], + [215, 13, 31, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1301124627], + [217, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [226, 18, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3152030653], + [227, 12, 10, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2625157340], + [228, 12, 47, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2827422102], + [228, 20, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 83733816], + [228, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [228, 38, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 317355086], + [228, 51, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91654033], + [228, 56, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [229, 12, 52, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1044998663], + [229, 20, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3318704169], + [229, 42, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [229, 43, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 317355086], + [229, 56, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91654033], + [229, 61, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [230, 12, 26, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 442277761], + [230, 13, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2989198973], + [231, 12, 28, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1737483483], + [231, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91434820], + [231, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90394724], + [232, 12, 42, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2860076163], + [232, 13, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2712329231], + [233, 12, 41, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4140961490], + [233, 13, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2444233950], + [234, 12, 41, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3587599376], + [234, 12, 41, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3587599376], + [234, 13, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3126570844], + [235, 18, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [256, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2474060695], + [258, 25, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1801837736], + [263, 47, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [263, 47, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3771358084], + [263, 64, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [264, 47, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [264, 68, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4000236688], + [265, 47, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [266, 47, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [267, 47, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [267, 66, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1743392150], + [268, 47, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1275777835], + [268, 47, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3327013346], + [268, 60, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1014285839], + [269, 45, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [284, 51, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2209910647], + [292, 39, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [292, 46, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3008243614], + [293, 33, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380884614], + [299, 39, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [299, 55, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2814598172], + [306, 11, 25, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1706602699], + [317, 11, 25, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1706602699], + [323, 33, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1020630014], + [335, 33, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1095760778], + [338, 45, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2450203155], + [357, 15, 134, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 82017048], + [373, 35, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2450203155], + [378, 40, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2450203155], + [394, 27, 41, "Performance/StringIdentifierArgument: Use `:\"test_create_check_auth_missing_#{field}\"` instead of `\"test_create_check_auth_missing_#{field}\"`.", 4083570117], + [401, 39, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [401, 47, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [402, 11, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1353106467], + [412, 49, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [412, 49, 20, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 378977955], + [412, 49, 20, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 378977955], + [412, 63, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039078867], + [413, 47, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [416, 25, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [431, 41, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [431, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 967974776], + [439, 39, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [439, 60, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 142039096], + [444, 39, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [444, 60, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 142039096], + [446, 41, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [446, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 967974776], + [457, 39, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [457, 60, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 142039096], + [458, 30, 30, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2576269534], + [459, 30, 38, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 424638109], + [472, 13, 31, "ThreadSafety/ClassAndModuleAttributes: Avoid mutating class and module attributes.", 406405732], + [475, 15, 7, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 764524831], + [476, 15, 8, "ThreadSafety/InstanceVariableInClassMethod: Avoid instance variables in class methods.", 2800675911], + [491, 12, 2, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 5861859], + [492, 12, 29, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2793276320], + [492, 13, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [492, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [492, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [493, 12, 30, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3766369553], + [493, 12, 30, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3766369553], + [493, 13, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [493, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [493, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [494, 31, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [494, 32, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1377421297], + [494, 52, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [499, 12, 2, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 5861859], + [500, 12, 29, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2793276320], + [500, 13, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [500, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [500, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [501, 12, 30, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3766369553], + [501, 12, 30, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3766369553], + [501, 13, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [501, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [501, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [502, 35, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2550229320], + [507, 33, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2550229320], + [508, 31, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [508, 32, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1377421297], + [508, 32, 20, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 4066386203], + [509, 32, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [509, 32, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1167825989], + [509, 57, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [514, 28, 93, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2966214573], + [514, 29, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [514, 30, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2954082535], + [514, 30, 33, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 723221389], + [515, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [515, 30, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1167825989], + [515, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [515, 59, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2087932467], + [519, 12, 2, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 5861859], + [520, 12, 29, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2793276320], + [520, 13, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [520, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [520, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [521, 12, 30, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3766369553], + [521, 12, 30, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3766369553], + [521, 13, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [521, 14, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [521, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [522, 35, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2550229320], + [523, 33, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [523, 34, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2954082535], + [523, 67, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [530, 29, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [530, 30, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1377421297], + [530, 50, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [534, 33, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 475335373], + [535, 31, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [535, 32, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1377421297], + [535, 52, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [540, 33, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2218463995], + [541, 31, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [541, 32, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1377421297], + [541, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1567638011], + [541, 53, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [572, 34, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [573, 11, 126, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 967284434], + [573, 40, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3993648688], + [573, 40, 92, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 65280189], + [573, 66, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [574, 40, 25, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 2076013982], + [574, 67, 2, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 5861859], + [580, 26, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [580, 27, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [580, 41, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2760345234], + [580, 60, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [586, 26, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3808043744], + [589, 52, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [589, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1981564209], + [590, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [590, 52, 24, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 875195209], + [591, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [595, 40, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 414939563], + [606, 16, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3393071065], + [609, 32, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1414826366], + [615, 13, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2476236265], + [620, 33, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3993648688], + [620, 59, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [621, 33, 28, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 3805699656], + [622, 26, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [622, 27, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [622, 45, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [627, 40, 36, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 110264665], + [627, 40, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 110264665], + [628, 40, 170, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3410477327], + [628, 41, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [628, 42, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [628, 42, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [629, 42, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [629, 59, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [630, 42, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [630, 42, 33, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 319077384], + [630, 56, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1137243677], + [630, 75, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [635, 35, 38, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1316348278], + [636, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [636, 29, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [636, 29, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [637, 29, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [637, 46, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [638, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [638, 29, 32, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1615184088], + [638, 45, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2113128034], + [638, 61, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [643, 9, 413, "Minitest/MultipleAssertions: Test case has too many assertions [4/3].", 1481369174], + [644, 25, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [646, 26, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [646, 27, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [646, 27, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [647, 27, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [647, 27, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2734484774], + [647, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [651, 11, 39, "Minitest/AssertNil: Prefer using `assert_nil(result_endpoint.claimed_id)`.", 673432702], + [651, 11, 39, "Minitest/AssertPredicate: Prefer using `assert_predicate(result_endpoint.claimed_id, :nil?)`.", 673432702], + [656, 33, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1061815792], + [658, 39, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 879690588], + [659, 33, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [659, 34, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [659, 34, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [660, 34, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [660, 48, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476417388], + [661, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [661, 50, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1061815792], + [662, 34, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [662, 34, 29, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2311346102], + [662, 51, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [662, 63, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [672, 34, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3060818131], + [673, 32, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1082189443], + [676, 33, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1061815792], + [678, 39, 32, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1215101171], + [678, 39, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1215101171], + [679, 39, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3293157154], + [679, 39, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3293157154], + [680, 33, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [680, 34, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [680, 34, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [681, 34, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [681, 48, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476417388], + [682, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [682, 50, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1061815792], + [683, 34, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [683, 34, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4185694723], + [683, 51, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2123753923], + [683, 65, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [689, 11, 31, "Minitest/AssertSame: Prefer using `assert_same(endpoint, result)`.", 810882736], + [694, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576882983], + [695, 34, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2421032754], + [696, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [700, 33, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3646872497], + [705, 11, 38, "Minitest/AssertMatch: Prefer using `assert_match(/different subjects/, e.to_s)`.", 90467571], + [705, 11, 38, "Minitest/AssertOperator: Prefer using `assert_operator(e.to_s, :=~, /different subjects/)`.", 90467571], + [710, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576882983], + [711, 34, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2421032754], + [712, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [716, 33, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2421032754], + [724, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576882983], + [725, 34, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2421032754], + [726, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [730, 26, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [730, 27, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [730, 27, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [731, 27, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [732, 27, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [733, 27, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [733, 27, 37, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3264057753], + [733, 64, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [735, 11, 32, "Minitest/AssertSame: Prefer using `assert_same(result, @endpoint)`.", 181223632], + [738, 9, 1334, "Minitest/MultipleAssertions: Test case has too many assertions [4/3].", 2440956486], + [739, 18, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3956106481], + [742, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576882983], + [743, 34, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2338043999], + [744, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [748, 43, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [748, 44, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [748, 44, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [749, 44, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [750, 44, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [752, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [753, 44, 20, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2239386969], + [753, 64, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [762, 30, 32, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1215101171], + [762, 30, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1215101171], + [763, 30, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3293157154], + [763, 30, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3293157154], + [771, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576882983], + [772, 34, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2421032754], + [773, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [777, 26, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [777, 27, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [777, 27, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290182001], + [778, 27, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [778, 27, 32, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3121728514], + [778, 59, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [780, 11, 32, "Minitest/AssertSame: Prefer using `assert_same(result, @endpoint)`.", 181223632], + [784, 38, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [786, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576882983], + [787, 34, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2338043999], + [788, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [791, 30, 32, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1215101171], + [791, 30, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1215101171], + [792, 30, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3293157154], + [792, 30, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3293157154], + [794, 35, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [794, 36, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [794, 36, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290182001], + [795, 36, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [795, 36, 32, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3121728514], + [795, 68, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [805, 24, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1561452039], + [806, 42, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1497574630], + [808, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3576882983], + [810, 34, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 758930038], + [814, 26, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [814, 27, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [814, 27, 18, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2290219986], + [815, 27, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [816, 27, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [817, 27, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [817, 27, 37, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3264057753], + [817, 64, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [829, 34, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 727628427], + [830, 34, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3293993744], + [833, 33, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 727628427], + [834, 33, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3293993744], + [835, 31, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3293993744], + [847, 33, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2280966844], + [848, 33, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2484088729], + [849, 31, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 977690607], + [867, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3742634839], + [869, 13, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [870, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [871, 13, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [872, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [873, 13, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [874, 13, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [875, 13, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1679224880], + [876, 13, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [876, 44, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340297], + [877, 13, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [877, 13, 16, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3264528997], + [880, 54, 3, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 193414780], + [880, 59, 9, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1228896939], + [881, 54, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 195037722], + [881, 61, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 309350150], + [882, 11, 97, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4074147228], + [882, 24, 19, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1494598494], + [883, 24, 39, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3880454769], + [883, 48, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044978], + [895, 29, 12, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2254095060], + [901, 30, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 792187647], + [902, 35, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035934855], + [919, 30, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1159094422], + [920, 35, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 612910580], + [921, 26, 27, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1721463124], + [922, 26, 18, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 8296583], + [922, 26, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 8296583], + [922, 46, 2, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 5862883], + [922, 50, 10, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3687049664] + ], + "test/test_kvform.rb:1350933767": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1508131736], + [3, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [4, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046940385], + [14, 8, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [16, 34, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [16, 35, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3699066030], + [16, 48, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4237363788], + [16, 61, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [17, 8, 28, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2250857078], + [18, 8, 42, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4034750748], + [18, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [18, 10, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3017305826], + [18, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2066390276], + [18, 33, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1387529586], + [18, 44, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085147079], + [18, 48, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [18, 52, 1, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 177557], + [18, 52, 1, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 177557], + [19, 8, 65, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1137684515], + [20, 8, 88, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2662435043], + [20, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [20, 10, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [20, 10, 20, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 378977955], + [20, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039078867], + [21, 10, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [21, 10, 53, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3856756485], + [21, 33, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3610157810], + [21, 63, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [21, 67, 1, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 177557], + [21, 67, 1, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 177557], + [32, 16, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [32, 17, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [32, 23, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [32, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [33, 27, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [33, 28, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [33, 34, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3606009942], + [33, 47, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [36, 36, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [36, 37, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2863094020], + [36, 49, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1290666282], + [36, 64, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [37, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [37, 39, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1476007742], + [37, 50, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2294637430], + [37, 68, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [38, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [38, 29, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3020792241], + [38, 39, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3028726278], + [38, 45, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [41, 8, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3298243829], + [41, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [41, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1446516351], + [41, 42, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [41, 45, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [42, 7, 71, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 646022986], + [42, 35, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [42, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3028726278], + [42, 46, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3040560528], + [42, 54, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1273984970], + [42, 65, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1414097488], + [42, 72, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [82, 12, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [87, 10, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3264456540], + [87, 21, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2359684249], + [87, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [87, 38, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337735], + [90, 8, 50, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 4167551331], + [90, 9, 24, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2291073610], + [90, 10, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 352883356], + [90, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3068178649], + [91, 9, 14, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3580175020], + [91, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 93829828], + [91, 17, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 93828679], + [91, 26, 30, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3087998339], + [91, 58, 1, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 177565], + [91, 58, 1, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 177565], + [95, 8, 52, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2315081891], + [95, 9, 26, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1449205130], + [95, 10, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3127806652], + [95, 23, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 432143513], + [96, 9, 14, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3580175020], + [96, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 93829828], + [96, 17, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 93828679], + [96, 26, 32, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 3571642371], + [96, 60, 1, "Layout/MultilineArrayLineBreaks: Each item in a multi-line array must start on a separate line.", 177565], + [96, 60, 1, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 177565], + [98, 7, 31, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 141792329], + [118, 7, 27, "Minitest/AssertKindOf: Prefer using `assert_kind_of(String, actual)`.", 2015651912], + [118, 7, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2015651912], + [143, 9, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2146124422], + [143, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2359684249], + [144, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [144, 16, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [144, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036110482], + [145, 7, 34, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 675736210], + [145, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [145, 16, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [145, 25, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018048984], + [145, 33, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036110482], + [162, 7, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1200566456], + [162, 20, 15, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2418240424] + ], + "test/test_kvpost.rb:3000925352": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1524986166], + [4, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1508131736], + [5, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [16, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [16, 29, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [16, 39, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3507903553], + [16, 47, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [17, 46, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [18, 7, 61, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3978282719], + [18, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [18, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [18, 39, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3507903553], + [18, 47, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [22, 15, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [22, 16, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [22, 16, 34, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 46497405], + [22, 27, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3490731558], + [23, 16, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [23, 16, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2000337041], + [23, 32, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3127351416], + [23, 41, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [26, 48, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [28, 22, 37, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 464140603], + [28, 36, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3490731558], + [29, 22, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 457221909], + [29, 36, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3127351416], + [37, 15, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [37, 16, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [37, 16, 34, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 46497405], + [37, 27, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3490731558], + [38, 16, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [38, 16, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2000337041], + [38, 32, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3127351416], + [38, 41, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [41, 42, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794565366], + [54, 61, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529] + ], + "test/test_linkparse.rb:1319944605": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 812078005], + [15, 23, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340111], + [16, 29, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [28, 24, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [37, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [37, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [37, 19, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [37, 24, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [37, 29, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [37, 30, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [37, 39, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [37, 44, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [38, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [38, 10, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023137289], + [38, 20, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [38, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [38, 30, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [38, 31, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [38, 40, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [38, 45, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [39, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [39, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [39, 19, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [39, 26, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018057665], + [39, 36, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456732], + [39, 41, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [39, 46, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [39, 47, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [39, 56, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [39, 61, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [40, 8, 51, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 228165677], + [40, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [40, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [40, 19, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [40, 26, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018057665], + [40, 36, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456732], + [40, 43, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92107323], + [40, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92107228], + [40, 57, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [41, 8, 34, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1568005439], + [41, 8, 35, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 204571970], + [41, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [41, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [41, 19, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [41, 26, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92107323], + [41, 35, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92107228], + [41, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [44, 13, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [44, 14, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [44, 23, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [44, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [45, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [45, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [45, 19, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [45, 24, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [45, 29, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [45, 30, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456299], + [45, 39, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456732], + [45, 44, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [46, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [46, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [46, 19, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [46, 24, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [47, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [47, 10, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023137289], + [47, 20, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [47, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [47, 30, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [47, 31, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023137289], + [47, 41, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [47, 46, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [48, 7, 56, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2491639079], + [48, 9, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [48, 10, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [48, 19, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [48, 26, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92107323], + [48, 35, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92107228], + [48, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [48, 45, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [48, 46, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [48, 55, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [48, 60, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [50, 5, 57, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2253223304], + [50, 21, 39, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(attr_cmp(c[0], c[1]), c.inspect)`?", 4229811215], + [51, 20, 40, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(!attr_cmp(c[0], c[1]), c.inspect)`?", 4265199310], + [51, 20, 40, "Minitest/RefuteFalse: Prefer using `refute(attr_cmp(c[0], c[1]), c.inspect)`.", 4265199310], + [55, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2033165926], + [62, 14, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [65, 24, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [66, 13, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [67, 17, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 235807414], + [68, 11, 79, "Minitest/AssertNil: Prefer using `assert_nil(numtests, 'datafile parsing error: there can be only one NumTests')`.", 2040125313], + [68, 11, 79, "Minitest/AssertPredicate: Prefer using `assert_predicate(numtests, :nil?, 'datafile parsing error: there can be only one NumTests')`.", 2040125313], + [68, 33, 56, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666314887], + [72, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2996818306], + [74, 16, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2994324997], + [74, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 28477231], + [77, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [80, 35, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 28477231], + [85, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [85, 46, 32, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4287820135], + [92, 54, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [92, 76, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [93, 9, 79, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4278541846], + [96, 5, 50, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2013261673], + [96, 37, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 23595754], + [99, 15, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [99, 15, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1142659194], + [100, 5, 9, "Layout/IndentationWidth: Use 2 (not 9) spaces for indentation.", 3994155397], + [100, 72, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [101, 12, 4, "Layout/ElseAlignment: Align `else` with `html`.", 2087423834], + [103, 12, 3, "Layout/EndAlignment: `end` at 103, 11 is not aligned with `html = if` at 99, 4.", 193405706] + ], + "test/test_message.rb:4119381851": [ + [2, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [3, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046940385], + [4, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [5, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2413211883], + [15, 22, 43, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 552081404], + [35, 28, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2733724944], + [38, 16, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2905502384], + [39, 39, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1394670314], + [42, 47, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3552000793], + [46, 7, 33, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.to_post_args)`.", 413283512], + [50, 7, 28, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.to_args)`.", 2055665823], + [54, 20, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [59, 15, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [59, 16, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [59, 25, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [59, 32, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91847809], + [59, 41, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92087849], + [59, 46, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [66, 20, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [70, 18, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 762442776], + [71, 7, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4281280724], + [85, 20, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [85, 47, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [89, 41, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [93, 41, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [97, 29, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2932903186], + [97, 54, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [102, 32, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [107, 7, 48, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?(BARE_NS, 'foo'))`.", 3119967287], + [107, 48, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [111, 7, 51, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?(OPENID1_NS, 'foo'))`.", 1208712875], + [111, 51, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [115, 7, 51, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?(OPENID2_NS, 'foo'))`.", 3751556904], + [115, 51, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [119, 7, 50, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?('urn:xxx', 'foo'))`.", 2090867210], + [119, 39, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [119, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [129, 30, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [133, 33, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [137, 33, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [141, 21, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 182817611], + [141, 48, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [151, 7, 38, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args(BARE_NS))`.", 1424704293], + [155, 7, 41, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args(OPENID1_NS))`.", 2427332345], + [159, 7, 41, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args(OPENID2_NS))`.", 2316760730], + [163, 7, 40, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args('urn:xxx'))`.", 4287660664], + [163, 36, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [168, 36, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [168, 37, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2164944045], + [168, 51, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1493534686], + [168, 59, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [174, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2234701176], + [174, 35, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3609166039], + [175, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3915806952], + [175, 9, 36, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4137041471], + [175, 36, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 934841105], + [177, 7, 33, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args(ns))`.", 4096729230], + [177, 7, 33, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4096729230], + [179, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 833111946], + [195, 28, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [200, 31, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2164944045], + [200, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1493534686], + [205, 13, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1444904344], + [206, 15, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3434567873], + [207, 7, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2486169547], + [209, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1874416747], + [225, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [230, 31, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2164944045], + [230, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1493534686], + [235, 13, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1991153268], + [236, 7, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3787609424], + [252, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [256, 7, 34, "Minitest/RefuteFalse: Prefer using `refute(@m.is_openid1)`.", 4103735530], + [260, 7, 34, "Minitest/RefuteFalse: Prefer using `refute(@m.is_openid2)`.", 4103735369], + [265, 33, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [274, 36, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [274, 37, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [274, 37, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [274, 54, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [275, 37, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [275, 37, 29, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 553636153], + [275, 55, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [275, 66, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [280, 20, 10, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2385648303], + [281, 20, 47, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2344611173], + [285, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [285, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [289, 51, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [294, 10, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [294, 11, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [294, 11, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [294, 28, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [295, 11, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [295, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [296, 11, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 6781232], + [296, 34, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [297, 11, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 779335583], + [297, 37, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3274182602], + [298, 11, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2764437898], + [298, 11, 45, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3499700945], + [298, 11, 47, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 1538336396], + [298, 44, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1033688349], + [298, 56, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [300, 7, 65, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1709430128], + [300, 20, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [300, 58, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3385233831], + [301, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3274182602], + [301, 49, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3911829544], + [302, 20, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1033688349], + [302, 53, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3075950557], + [307, 7, 70, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3813631904], + [307, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3112758124], + [307, 51, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3385233831], + [307, 65, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3112758124], + [311, 20, 80, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2896167638], + [311, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [311, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [311, 22, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [311, 39, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [312, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [312, 22, 29, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 553636153], + [312, 40, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [312, 51, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [313, 20, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3012966978], + [317, 20, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [318, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [319, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018058566], + [319, 38, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2115374466], + [320, 27, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [320, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [321, 7, 264, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3305068313], + [321, 20, 233, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1280730208], + [321, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [321, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [321, 22, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [321, 39, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [322, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [322, 40, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [323, 22, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3097418282], + [323, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2115374466], + [324, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [324, 31, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [325, 22, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 319904884], + [325, 22, 37, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3227903659], + [325, 42, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [325, 59, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [325, 63, 15, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3012966978], + [329, 20, 66, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3815234358], + [329, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [329, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [329, 22, 17, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3770288989], + [329, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [330, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [330, 22, 22, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 252180526], + [330, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [330, 44, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [331, 20, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3136218085], + [335, 20, 31, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 789502262], + [336, 20, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1238001097], + [340, 20, 42, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3639300187], + [340, 20, 42, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3639300187], + [341, 20, 17, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 184133140], + [345, 18, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 762442776], + [348, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2725281500], + [349, 20, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [351, 7, 114, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2276794839], + [351, 20, 63, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3366733692], + [351, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [351, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [351, 40, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [351, 50, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [351, 69, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [351, 81, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [352, 20, 16, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3814467512], + [360, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [360, 57, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [364, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [364, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [368, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [368, 58, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [372, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [376, 29, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [376, 40, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [380, 7, 50, "Minitest/AssertTruthy: Prefer using `assert(@m.has_key?(OPENID_NS, 'mode'))`.", 1818343444], + [380, 49, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [384, 7, 49, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?(BARE_NS, 'mode'))`.", 1578372466], + [384, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [388, 7, 51, "Minitest/AssertTruthy: Prefer using `assert(@m.has_key?(OPENID1_NS, 'mode'))`.", 346586725], + [388, 50, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [392, 7, 52, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?(OPENID2_NS, 'mode'))`.", 718496205], + [392, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [396, 7, 51, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?('urn:xxx', 'mode'))`.", 2004541231], + [396, 39, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [396, 50, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [400, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [400, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [404, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [408, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [408, 40, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [412, 33, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [412, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [416, 33, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [420, 21, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 182817611], + [420, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [424, 20, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 330236732], + [424, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [424, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [424, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [424, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [424, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [424, 63, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [425, 20, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4268880498], + [429, 7, 38, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args(BARE_NS))`.", 1424704293], + [433, 20, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 330236732], + [433, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [433, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [433, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [433, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [433, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [433, 63, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [434, 20, 23, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3474730211], + [438, 7, 41, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args(OPENID2_NS))`.", 2316760730], + [442, 7, 40, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args('urn:xxx'))`.", 4287660664], + [442, 36, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [448, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 292369016], + [448, 35, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3434567873], + [449, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2058743626], + [449, 9, 41, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2435277656], + [449, 36, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1521413332], + [451, 7, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3363869617], + [455, 7, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4108245612], + [459, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [459, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [459, 51, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [459, 60, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [459, 71, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [459, 82, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [467, 41, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [467, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [467, 52, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [467, 61, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [467, 72, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [467, 83, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [475, 28, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [479, 13, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2464949536], + [480, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 982389487], + [481, 7, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2486169547], + [483, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1874416747], + [503, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [507, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 316666463], + [508, 15, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1439458303], + [510, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1874416747], + [512, 7, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2486169547], + [532, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129287151], + [536, 7, 33, "Minitest/AssertTruthy: Prefer using `assert(@m.is_openid1)`.", 1385749217], + [540, 7, 34, "Minitest/RefuteFalse: Prefer using `refute(@m.is_openid2)`.", 4103735369], + [549, 18, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3541160330], + [550, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [550, 40, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3473527167], + [550, 65, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [551, 40, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3473527167], + [552, 7, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 97380905], + [556, 9, 20, "Minitest/TestMethodName: Test method name should start with `test_` prefix.", 151140574], + [559, 7, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 870184713], + [559, 20, 35, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 323913017], + [559, 40, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [559, 49, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018058566], + [564, 7, 50, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3448622216], + [572, 36, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [572, 37, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [572, 37, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [572, 54, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [573, 37, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [573, 55, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [574, 37, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [574, 37, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1167724454], + [574, 62, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [578, 20, 128, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3874096429], + [578, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [578, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [578, 22, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [578, 39, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [579, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [579, 40, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [580, 22, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [580, 22, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1167724454], + [580, 47, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [581, 20, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3012966978], + [585, 20, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [586, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [587, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018058566], + [587, 38, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2115374466], + [588, 27, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [588, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [589, 7, 312, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3020847961], + [589, 20, 281, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3492229450], + [589, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [589, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [589, 22, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [589, 39, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [590, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [590, 40, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [591, 22, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3097418282], + [591, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2115374466], + [592, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [592, 31, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [593, 22, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [594, 22, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 319904884], + [594, 22, 37, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3227903659], + [594, 42, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [594, 59, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [594, 63, 15, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3012966978], + [598, 20, 107, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3499129037], + [598, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [598, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [598, 22, 17, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3770288989], + [598, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [599, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [599, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [600, 22, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [600, 22, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2290182001], + [600, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [601, 20, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3136218085], + [605, 20, 49, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 868569292], + [606, 20, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1238001097], + [610, 20, 91, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 470515792], + [610, 20, 91, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 470515792], + [611, 20, 17, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 184133140], + [615, 18, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 762442776], + [618, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2725281500], + [619, 20, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [621, 7, 185, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2432008081], + [621, 20, 134, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3333059757], + [621, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [621, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [621, 22, 26, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1049996844], + [621, 40, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [622, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [622, 41, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [623, 22, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [623, 22, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2185530048], + [623, 49, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [624, 20, 16, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3814467512], + [632, 36, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [632, 37, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [632, 37, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [632, 54, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [633, 37, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [633, 55, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [634, 37, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [634, 37, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1167825989], + [634, 62, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [635, 27, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [635, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [647, 44, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91716306], + [654, 21, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [654, 28, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91716306], + [661, 21, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [661, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91716306], + [667, 7, 19, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4285920218], + [671, 20, 167, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 565567243], + [671, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [671, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [671, 22, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [671, 39, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [672, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [672, 40, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [673, 22, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [674, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [674, 22, 16, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3451765737], + [674, 31, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [674, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [674, 42, 15, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3012966978], + [678, 20, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [679, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [680, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018058566], + [680, 38, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2115374466], + [681, 7, 305, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 709325516], + [681, 20, 274, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2393503706], + [681, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [681, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [681, 22, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3662970090], + [681, 39, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [682, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [682, 40, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [683, 22, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [684, 22, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 319904884], + [685, 22, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3097418282], + [685, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2115374466], + [686, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [686, 22, 16, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3451765737], + [686, 31, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [686, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [686, 42, 15, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3012966978], + [690, 27, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [691, 7, 152, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3237932739], + [691, 20, 107, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3499129037], + [691, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [691, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [691, 22, 17, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3770288989], + [691, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [692, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [692, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [693, 22, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [693, 22, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2290219986], + [693, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [694, 20, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3136218085], + [698, 27, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [699, 7, 96, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 389050517], + [699, 20, 49, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 715101487], + [700, 20, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1238001097], + [704, 24, 24, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1095726796], + [704, 24, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1095726796], + [705, 24, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1923594516], + [705, 24, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1923594516], + [706, 24, 37, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1396651357], + [707, 24, 11, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4265971607], + [707, 24, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4265971607], + [707, 24, 11, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4265971607], + [710, 30, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339971], + [712, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 409824133], + [720, 18, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 762442776], + [723, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2725281500], + [724, 20, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [734, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [734, 58, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [738, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [738, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [742, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [746, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [746, 58, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [750, 29, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [750, 40, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [754, 7, 50, "Minitest/AssertTruthy: Prefer using `assert(@m.has_key?(OPENID_NS, 'mode'))`.", 1818343444], + [754, 49, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [758, 7, 49, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?(BARE_NS, 'mode'))`.", 1578372466], + [758, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [762, 7, 52, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?(OPENID1_NS, 'mode'))`.", 681250926], + [762, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [766, 7, 51, "Minitest/AssertTruthy: Prefer using `assert(@m.has_key?(OPENID2_NS, 'mode'))`.", 419458438], + [766, 50, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [770, 7, 51, "Minitest/RefuteFalse: Prefer using `refute(@m.has_key?('urn:xxx', 'mode'))`.", 2004541231], + [770, 39, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1129533230], + [770, 50, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [775, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [775, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [779, 38, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [783, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [787, 20, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [787, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [791, 29, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3257752249], + [791, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [795, 20, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 330236732], + [795, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [795, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [795, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [795, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [795, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [795, 63, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [796, 20, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4268880498], + [800, 20, 20, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1742523791], + [800, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [800, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [800, 31, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [800, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [801, 20, 20, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2664557919], + [805, 7, 60, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args(OPENID1_NS))`.", 1440108275], + [805, 20, 2, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 5861859], + [806, 20, 23, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3474730211], + [810, 20, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 330236732], + [810, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [810, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [810, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [810, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [810, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [810, 63, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [811, 20, 23, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3482676576], + [815, 7, 66, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@m.get_args('urn:loose seal'))`.", 4094190475], + [815, 20, 2, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 5861859], + [816, 20, 29, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3921926875], + [816, 32, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2263937047], + [821, 22, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [821, 23, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085185157], + [821, 31, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085179941], + [821, 37, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085178821], + [821, 45, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085182053], + [821, 49, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [827, 7, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4108245612], + [831, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [831, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [831, 51, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [831, 60, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [831, 71, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [831, 82, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [835, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [835, 39, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92254433], + [835, 48, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [835, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [843, 41, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [843, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [843, 52, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [843, 61, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [843, 72, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 963339893], + [843, 83, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [847, 28, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2904480440], + [852, 15, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92017996], + [853, 7, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2486169547], + [855, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1874416747], + [875, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1771873425], + [882, 42, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4144639799], + [885, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [885, 18, 30, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 310393605], + [886, 18, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4240273967], + [886, 49, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [898, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [898, 38, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [898, 48, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018058566], + [898, 54, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [899, 7, 50, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3733432222], + [899, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018058566], + [899, 49, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [903, 13, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085192580], + [904, 15, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1414860450], + [905, 7, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2486169547], + [907, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1874416747], + [909, 7, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2486169547], + [929, 24, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2909946110], + [933, 12, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2261919648], + [934, 13, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1486022054], + [935, 17, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 812283872], + [936, 17, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 812283715], + [939, 7, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3956757861], + [941, 7, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 181840422], + [946, 33, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [946, 34, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91654033], + [946, 52, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [951, 7, 34, "Minitest/RefuteFalse: Prefer using `refute(@m.is_openid1)`.", 4103735530], + [955, 7, 33, "Minitest/AssertTruthy: Prefer using `assert(@m.is_openid2)`.", 1385749250], + [962, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [963, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [963, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [964, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [964, 30, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2063565054], + [965, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [965, 34, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2986156792], + [966, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [966, 31, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3913682184], + [967, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3862458228], + [967, 9, 42, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 725104594], + [970, 21, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 718798590], + [973, 9, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3667194690], + [973, 22, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 139886388], + [974, 9, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789834347], + [974, 9, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1878364024], + [974, 20, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2261490645], + [977, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90526924], + [982, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 635587538], + [982, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 326052951], + [983, 9, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2014057493], + [983, 22, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1436832301], + [984, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1346626202], + [984, 9, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1512522817], + [984, 21, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035277469], + [989, 20, 15, "Layout/ParameterAlignment: Use one level of indentation for parameters following the first line of a multi-line method definition.", 4204966942], + [997, 9, 129, "Minitest/AssertEqual: Prefer using `assert_equal(form.attributes[k], v, \"Expected '#{v}' for required form attribute '#{k}', got '#{form.attributes[k]}'\")`.", 3023346520], + [997, 9, 129, "Minitest/AssertOperator: Prefer using `assert_operator(form.attributes[k], :==, v, \"Expected '#{v}' for required form attribute '#{k}', got '#{form.attributes[k]}'\")`.", 3023346520], + [997, 16, 23, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3890971049], + [998, 16, 81, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1037296273], + [1008, 9, 119, "Minitest/AssertEqual: Prefer using `assert_equal(form.attributes[k], v, \"Form attribute '#{k}' should be '#{v}', found '#{form.attributes[k]}'\")`.", 728071696], + [1008, 9, 119, "Minitest/AssertOperator: Prefer using `assert_operator(form.attributes[k], :==, v, \"Form attribute '#{k}' should be '#{v}', found '#{form.attributes[k]}'\")`.", 728071696], + [1008, 16, 23, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3890971049], + [1009, 16, 71, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3974141145], + [1014, 47, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1015, 23, 26, "Layout/MultilineOperationIndentation: Use 2 (not 12) spaces for indenting a condition in an `unless` statement spanning multiple lines.", 2752062785], + [1015, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4163977235], + [1015, 50, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1016, 23, 41, "Layout/MultilineOperationIndentation: Use 2 (not 12) spaces for indenting a condition in an `unless` statement spanning multiple lines.", 3946375691], + [1016, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039261821], + [1016, 55, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2923163215], + [1027, 38, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032265122], + [1029, 13, 190, "Minitest/AssertEqual: Prefer using `assert_equal(e.attributes['value'], value, \"Expected value of hidden input '#{e.attributes['name']}' \" +\n \"to be '#{value}', got '#{e.attributes['value']}'\")`.", 3325653372], + [1029, 13, 190, "Minitest/AssertOperator: Prefer using `assert_operator(e.attributes['value'], :==, value, \"Expected value of hidden input '#{e.attributes['name']}' \" +\n \"to be '#{value}', got '#{e.attributes['value']}'\")`.", 3325653372], + [1029, 13, 190, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(e.attributes['value'] == value, \"Expected value of hidden input '#{e.attributes['name']}' \" +\n \"to be '#{value}', got '#{e.attributes['value']}'\")`?", 3325653372], + [1029, 20, 30, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2605044007], + [1029, 33, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [1030, 20, 131, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 154116810], + [1030, 68, 6, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3032265122], + [1030, 80, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [1031, 59, 7, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1594103918], + [1036, 11, 44, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 187315171], + [1040, 11, 174, "Minitest/AssertIncludes: Prefer using `assert_includes(message_.to_post_args.keys, e.attributes['name'], \"Form element for '#{e.attributes['name']}' not in \" +\n 'original message')`.", 2672035956], + [1040, 11, 174, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(message_.to_post_args.keys.include?(e.attributes['name']), \"Form element for '#{e.attributes['name']}' not in \" +\n 'original message')`?", 2672035956], + [1040, 18, 57, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2909386840], + [1040, 18, 57, "Performance/InefficientHashSearch: Use `#key?` instead of `#keys.include?`.", 2909386840], + [1040, 67, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032265122], + [1041, 18, 90, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 532341847], + [1041, 52, 6, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 3032265122], + [1041, 71, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [1042, 18, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1574956311], + [1046, 9, 146, "Minitest/AssertEqual: Prefer using `assert_equal(form.attributes['action'], action_url, \"Expected form 'action' to be '#{action_url}', got '#{form.attributes['action']}'\")`.", 670891994], + [1046, 9, 146, "Minitest/AssertOperator: Prefer using `assert_operator(form.attributes['action'], :==, action_url, \"Expected form 'action' to be '#{action_url}', got '#{form.attributes['action']}'\")`.", 670891994], + [1046, 16, 39, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 453172704], + [1046, 32, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2956022523], + [1047, 16, 82, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 566350714], + [1047, 86, 8, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 2956022523], + [1052, 47, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1053, 23, 26, "Layout/MultilineOperationIndentation: Use 2 (not 12) spaces for indenting a condition in an `unless` statement spanning multiple lines.", 2752062785], + [1053, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4163977235], + [1053, 50, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [1054, 23, 39, "Layout/MultilineOperationIndentation: Use 2 (not 12) spaces for indenting a condition in an `unless` statement spanning multiple lines.", 1149497620], + [1054, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039261821], + [1054, 54, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3846394289], + [1059, 9, 115, "Minitest/AssertEqual: Prefer using `assert_equal(submits.length, 1, \"Expected only one 'input' with type = 'submit', got #{submits.length}\")`.", 3205120719], + [1059, 9, 115, "Minitest/AssertOperator: Prefer using `assert_operator(submits.length, :==, 1, \"Expected only one 'input' with type = 'submit', got #{submits.length}\")`.", 3205120719], + [1059, 16, 19, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 776327073], + [1060, 16, 71, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3020496750], + [1062, 9, 177, "Minitest/AssertEqual: Prefer using `assert_equal(submits[0].attributes['value'], submit_text, \"Expected submit value to be '#{submit_text}', \" +\n \"got '#{submits[0].attributes['value']}'\")`.", 3070590785], + [1062, 9, 177, "Minitest/AssertOperator: Prefer using `assert_operator(submits[0].attributes['value'], :==, submit_text, \"Expected submit value to be '#{submit_text}', \" +\n \"got '#{submits[0].attributes['value']}'\")`.", 3070590785], + [1062, 9, 177, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(submits[0].attributes['value'] == submit_text, \"Expected submit value to be '#{submit_text}', \" +\n \"got '#{submits[0].attributes['value']}'\")`?", 3070590785], + [1062, 16, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1847638894], + [1062, 38, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1594103918], + [1063, 16, 107, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2951559010], + [1063, 65, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [1064, 46, 7, "Style/StringLiteralsInInterpolation: Prefer double-quoted strings inside interpolations.", 1594103918], + [1070, 31, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3500520943], + [1070, 44, 15, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2796655553], + [1071, 31, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2686516691], + [1072, 18, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2087820472], + [1072, 24, 1, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 177608], + [1072, 27, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3500520943], + [1073, 18, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2796655553], + [1073, 35, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2686516691], + [1081, 17, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1346626202], + [1081, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90515603], + [1083, 31, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3500520943], + [1083, 44, 15, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2796655553], + [1084, 31, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2686516691], + [1085, 18, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2087820472], + [1085, 24, 1, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 177608], + [1085, 27, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3500520943], + [1086, 18, 15, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2796655553], + [1086, 35, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2686516691], + [1095, 17, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 635587538], + [1095, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3003939444], + [1096, 17, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2014057493], + [1096, 30, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 268450833], + [1098, 31, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3500520943], + [1098, 44, 9, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3121703976], + [1099, 31, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2686516691], + [1100, 18, 4, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2087820472], + [1100, 24, 1, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 177608], + [1100, 27, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3500520943], + [1101, 18, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3121703976], + [1101, 29, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2686516691], + [1108, 13, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3637342729], + [1109, 7, 6, "Lint/UnderscorePrefixedVariableName: Do not use prefix `_` for a variable that is used.", 3498751916], + [1109, 16, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [1111, 7, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 411489242], + [1117, 16, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1106383717], + [1121, 9, 44, "Minitest/RefuteFalse: Prefer using `refute(nsm.member?(uripat % i))`.", 154326771], + [1124, 7, 84, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4016334492], + [1124, 25, 6, "Lint/UnderscorePrefixedVariableName: Do not use prefix `_` for a variable that is used.", 3498751916], + [1129, 16, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [1130, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1939718458], + [1139, 20, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [1140, 16, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3644585460], + [1147, 54, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3596965063], + [1152, 42, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 804983478], + [1156, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1156, 40, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3911829544], + [1156, 59, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3274182602], + [1156, 67, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1157, 7, 22, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3796388732], + [1164, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1939718458], + [1166, 26, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [1168, 28, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018058566] + ], + "test/test_nonce.rb:1928933667": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3682152042], + [10, 7, 29, "Minitest/AssertMatch: Prefer using `assert_match(nonce, NONCE_RE)`.", 2611712850], + [10, 7, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2611712850], + [11, 7, 24, "Minitest/AssertEqual: Prefer using `assert_equal(nonce.size, 26)`.", 2741654048], + [11, 7, 24, "Minitest/AssertOperator: Prefer using `assert_operator(nonce.size, :==, 26)`.", 2741654048], + [16, 7, 29, "Minitest/AssertMatch: Prefer using `assert_match(nonce, NONCE_RE)`.", 2611712850], + [16, 7, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2611712850], + [17, 7, 24, "Minitest/AssertEqual: Prefer using `assert_equal(nonce.size, 26)`.", 2741654048], + [17, 7, 24, "Minitest/AssertOperator: Prefer using `assert_operator(nonce.size, :==, 26)`.", 2741654048], + [18, 7, 44, "Minitest/AssertMatch: Prefer using `assert_match(/^1970-01-01T00:00:00Z/, nonce)`.", 3870970796], + [22, 11, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3890374212], + [24, 23, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [26, 7, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2488174633], + [33, 7, 33, "Minitest/AssertMatch: Prefer using `assert_match(nonce_str, NONCE_RE)`.", 1507261272], + [33, 7, 33, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1507261272], + [35, 7, 26, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1326115118], + [41, 9, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [42, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1161343966], + [43, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1839578540], + [44, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3180577029], + [45, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 349273735], + [46, 9, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1257841138], + [47, 9, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 354627053], + [47, 9, 9, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 354627053], + [49, 7, 100, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1863951827], + [57, 10, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3890374212], + [60, 10, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3890374212], + [63, 10, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3890374212], + [66, 10, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3890374212], + [69, 10, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3890374212], + [72, 10, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3890380486], + [75, 10, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3890380486], + [78, 9, 24, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3691277562], + [78, 10, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 354627053], + [84, 9, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 162302878] + ], + "test/test_oauth.rb:3783744149": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 558419089], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [4, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1480177078], + [5, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2748495602], + [6, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [18, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1246672322], + [20, 35, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [20, 47, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [21, 9, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 73431459], + [21, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [22, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [26, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [27, 9, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 526934097], + [27, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [31, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [32, 9, 56, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 664624158], + [32, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [36, 9, 41, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.get_extension_args)`.", 1295939071], + [37, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [38, 9, 67, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1811466556], + [38, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [38, 24, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 279448603], + [38, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [38, 48, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [39, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [40, 9, 110, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3435929212], + [40, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [40, 24, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 279448603], + [40, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [40, 50, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911], + [40, 61, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [40, 91, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [44, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [44, 18, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 279448603], + [44, 32, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [44, 44, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911], + [44, 55, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [44, 85, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [46, 9, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 526934097], + [46, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [47, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [52, 9, 25, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3468908612], + [58, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [58, 53, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2607646422], + [58, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [59, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [60, 53, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1365632081], + [61, 53, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2912030834], + [61, 73, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [62, 53, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2873818406], + [62, 53, 47, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3200683552], + [62, 70, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [63, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [67, 9, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3811773137], + [67, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3357144667], + [68, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [76, 9, 22, "Minitest/AssertNil: Prefer using `assert_nil(oauth_req)`.", 4207687874], + [76, 9, 22, "Minitest/AssertPredicate: Prefer using `assert_predicate(oauth_req, :nil?)`.", 4207687874], + [76, 9, 22, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4207687874], + [102, 36, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [102, 52, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [103, 9, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3735402844], + [103, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [104, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [108, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [109, 9, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3900436974], + [109, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [113, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [114, 9, 56, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 664624158], + [114, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [118, 9, 41, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.get_extension_args)`.", 1295939071], + [119, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [120, 9, 76, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 586473475], + [120, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [120, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1044601616], + [120, 43, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [120, 57, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [121, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [122, 9, 140, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3791061865], + [122, 22, 80, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3268349759], + [122, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [122, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1044601616], + [122, 43, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [122, 59, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911], + [122, 70, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [122, 100, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [123, 22, 23, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 405656805], + [127, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [127, 18, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1044601616], + [127, 37, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [127, 53, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911], + [127, 64, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [127, 94, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [129, 9, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3900436974], + [129, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [130, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [135, 9, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3038968047], + [141, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [141, 53, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [141, 63, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [142, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [143, 53, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1365632081], + [144, 53, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 701247385], + [144, 78, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [145, 53, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2873818406], + [145, 53, 47, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3200683552], + [145, 70, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [146, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [148, 11, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1044601616], + [148, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [149, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1401044911], + [149, 11, 41, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 593369833], + [149, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [153, 9, 47, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2391756526], + [153, 22, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [154, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [159, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [159, 53, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [159, 63, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [160, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [161, 53, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1365632081], + [162, 53, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 701247385], + [162, 78, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4029592431], + [163, 53, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2873818406], + [163, 53, 47, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3200683552], + [163, 70, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3569003008], + [164, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [169, 9, 29, "Minitest/AssertNil: Prefer using `assert_nil(req, req.inspect)`.", 1419293160], + [169, 9, 29, "Minitest/AssertPredicate: Prefer using `assert_predicate(req, :nil?, req.inspect)`.", 1419293160], + [169, 9, 29, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(req.nil?, req.inspect)`?", 1419293160], + [169, 9, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1419293160] + ], + "test/test_openid_yadis.rb:3363182315": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [3, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 380634196], + [17, 3, 70, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2241541269], + [21, 3, 727, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 557056937], + [21, 74, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 107223013], + [23, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3094118117], + [24, 5, 125, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 2542762157], + [26, 28, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2733356575], + [30, 5, 293, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 3013004962], + [38, 27, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3130004567], + [40, 20, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340763], + [44, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2902335579], + [48, 17, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [54, 6, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1801837736], + [55, 6, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2957356347], + [56, 6, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2957356347], + [56, 29, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1801837736], + [57, 6, 21, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2957356347], + [57, 6, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2957356347], + [58, 6, 20, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1801837736], + [58, 6, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1801837736], + [59, 6, 28, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 831314958], + [59, 6, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 831314958], + [59, 6, 29, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1663589779], + [63, 3, 152, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 2562815488], + [75, 5, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2787327655], + [76, 5, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3482333731], + [76, 5, 28, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3482333731], + [82, 5, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 655772091], + [83, 5, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2888187211], + [83, 5, 26, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2888187211], + [93, 20, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2246975734], + [96, 35, 5, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 213775992], + [97, 35, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2272531167], + [98, 35, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2474818138], + [127, 9, 68, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2053489883] + ], + "test/test_pape.rb:174711530": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2457518418], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [4, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1480177078], + [5, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3337961901], + [15, 9, 46, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.preferred_auth_policies)`.", 418505596], + [17, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034771041], + [20, 9, 69, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2691599814], + [25, 9, 46, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.preferred_auth_policies)`.", 418505596], + [27, 9, 69, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2829742900], + [29, 9, 69, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2829742900], + [31, 9, 100, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1692042735], + [33, 9, 100, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1692042735], + [37, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [37, 24, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3932791566], + [37, 53, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [37, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [38, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 416558537], + [39, 9, 84, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 995052347], + [39, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [39, 24, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3932791566], + [39, 53, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 416558537], + [39, 65, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [40, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 416678131], + [41, 9, 95, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2274914573], + [41, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [41, 24, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3932791566], + [41, 53, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3802096447], + [41, 76, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [43, 9, 141, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3772676353], + [43, 22, 81, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 295265399], + [43, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [43, 24, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3932791566], + [43, 53, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3802096447], + [43, 78, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1656633178], + [43, 96, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94505171], + [43, 101, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [44, 22, 23, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 405656805], + [48, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [48, 18, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3932791566], + [48, 18, 52, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3050298298], + [48, 47, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1586453106], + [49, 18, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1656633178], + [49, 18, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2082494816], + [49, 36, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340796], + [49, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [51, 9, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 269935223], + [52, 23, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415965921], + [52, 37, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415824726], + [57, 9, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1641430853], + [58, 9, 46, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.preferred_auth_policies)`.", 418505596], + [63, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [63, 53, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2607646422], + [63, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [64, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [65, 53, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2733359506], + [66, 53, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3089132260], + [66, 88, 23, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2256185229], + [67, 88, 29, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 928143378], + [67, 88, 29, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 928143378], + [67, 124, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [68, 53, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2624252336], + [68, 53, 29, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1690997779], + [68, 76, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3120621605], + [69, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [73, 9, 99, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3613094671], + [82, 9, 21, "Minitest/AssertNil: Prefer using `assert_nil(pape_req)`.", 3237082721], + [82, 9, 21, "Minitest/AssertPredicate: Prefer using `assert_predicate(pape_req, :nil?)`.", 3237082721], + [82, 9, 21, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3237082721], + [88, 36, 23, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2256185229], + [89, 36, 32, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2332918727], + [89, 36, 32, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2332918727], + [90, 9, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 648352755], + [113, 9, 36, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.auth_policies)`.", 4285304966], + [115, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034771041], + [118, 62, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [119, 9, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1003896508], + [120, 22, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [125, 9, 36, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.auth_policies)`.", 4285304966], + [127, 9, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3596016206], + [129, 9, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3596016206], + [131, 9, 90, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 278181909], + [133, 9, 90, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 278181909], + [137, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [137, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [137, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3032063535], + [137, 49, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [138, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 416558537], + [139, 9, 74, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3947093569], + [139, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [139, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [139, 43, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 416558537], + [139, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [140, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 416678131], + [141, 9, 85, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4244962999], + [141, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [141, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [141, 43, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3802096447], + [141, 66, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [142, 26, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [143, 9, 145, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2657786782], + [143, 22, 85, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3057341448], + [143, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [143, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [143, 43, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3802096447], + [143, 68, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [143, 83, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [143, 105, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [144, 22, 23, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 405656805], + [146, 9, 182, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 514223864], + [147, 12, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [147, 13, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [147, 13, 42, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2353541069], + [147, 32, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3802096447], + [147, 57, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [147, 57, 37, "Layout/MultilineHashKeyLineBreaks: Each key in a multi-line hash must start on a separate line.", 3688261642], + [147, 72, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [148, 13, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3918600891], + [148, 13, 24, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1479177643], + [148, 34, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340470], + [148, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [148, 41, 23, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 405656805], + [153, 26, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2519351465], + [158, 32, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1236555755], + [167, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [167, 18, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [167, 18, 42, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3042763264], + [167, 37, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1586453106], + [168, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [168, 18, 37, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3688261642], + [168, 33, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [168, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [170, 9, 52, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2985556253], + [170, 22, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [171, 23, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415965921], + [171, 37, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415824726], + [176, 9, 26, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2941985240], + [177, 9, 36, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.auth_policies)`.", 4285304966], + [181, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [181, 18, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [181, 18, 42, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3042763264], + [181, 37, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1586453106], + [182, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [182, 18, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2029099635], + [182, 33, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 498615602], + [182, 48, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [189, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [189, 18, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [189, 18, 42, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3042763264], + [189, 37, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1586453106], + [190, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [190, 33, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [191, 18, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3918600891], + [191, 18, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2765130124], + [191, 39, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036321777], + [191, 45, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [198, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [198, 18, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [198, 18, 42, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3042763264], + [198, 37, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1586453106], + [199, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [199, 33, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2043283172], + [200, 18, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3918600891], + [200, 18, 24, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1479177672], + [200, 39, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340437], + [200, 42, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [202, 9, 62, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1560133245], + [202, 23, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415965921], + [202, 37, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415824726], + [203, 22, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2043283172], + [208, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [208, 18, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [208, 18, 42, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3042763264], + [208, 37, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1586453106], + [209, 18, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [209, 33, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1602727053], + [210, 18, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3918600891], + [210, 18, 27, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2765130124], + [210, 39, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036321777], + [210, 45, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [212, 9, 62, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1560133245], + [212, 23, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415965921], + [212, 37, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415824726], + [219, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [219, 53, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [219, 63, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [220, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [221, 53, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2733359506], + [222, 53, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1464759966], + [222, 78, 23, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2256185229], + [223, 78, 29, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 928143378], + [223, 78, 29, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 928143378], + [223, 114, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [224, 53, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2937846925], + [224, 53, 42, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 12364448], + [224, 73, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [225, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [227, 11, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1680956532], + [227, 92, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [228, 11, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2476990567], + [228, 11, 37, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3688261642], + [228, 26, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [232, 9, 89, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 214210165], + [233, 22, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [238, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [238, 53, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [238, 63, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [239, 53, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [240, 53, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2733359506], + [241, 53, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1464759966], + [241, 78, 23, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2256185229], + [242, 78, 29, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 928143378], + [242, 78, 29, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 928143378], + [242, 114, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [243, 53, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2937846925], + [243, 53, 42, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 12364448], + [243, 73, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1193520747], + [244, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [249, 9, 29, "Minitest/AssertNil: Prefer using `assert_nil(req, req.inspect)`.", 1419293160], + [249, 9, 29, "Minitest/AssertPredicate: Prefer using `assert_predicate(req, :nil?, req.inspect)`.", 1419293160], + [249, 9, 29, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(req.nil?, req.inspect)`?", 1419293160], + [249, 9, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1419293160] + ], + "test/test_parsehtml.rb:722217357": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1996466898], + [11, 31, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1781468273], + [17, 9, 39, "Minitest/RefuteFalse: Prefer using `refute(reserved_values.member?(found))`.", 2704632914], + [21, 20, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2996346383], + [21, 42, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90458377], + [23, 17, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2996346383], + [24, 9, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3100644711], + [30, 9, 20, "Naming/ClassAndModuleCamelCase: Use CamelCase for classes and modules.", 1514831161], + [32, 32, 44, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3613840706], + [33, 7, 67, "Minitest/AssertEqual: Prefer using `assert_equal('http://bad.com/link', toke.getTag('a').attr_hash['href'])`.", 3503474611], + [33, 7, 67, "Minitest/AssertOperator: Prefer using `assert_operator('http://bad.com/link', :==, toke.getTag('a').attr_hash['href'])`.", 3503474611], + [33, 7, 67, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3503474611], + [33, 14, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1773639616], + [33, 51, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [33, 66, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3025988988], + [38, 7, 75, "Minitest/AssertEqual: Prefer using `assert_equal('http://www.com/foo', toke.getTag('f:table').attr_hash['xmlns:f'])`.", 1463151303], + [38, 7, 75, "Minitest/AssertOperator: Prefer using `assert_operator('http://www.com/foo', :==, toke.getTag('f:table').attr_hash['xmlns:f'])`.", 1463151303], + [38, 7, 75, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1463151303], + [38, 14, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 779781494], + [38, 50, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 122424615], + [38, 71, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 8310973], + [42, 32, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 79041148], + [44, 7, 30, "Minitest/AssertEqual: Prefer using `assert_equal(HTMLComment, t.class)`.", 29413628], + [44, 7, 30, "Minitest/AssertOperator: Prefer using `assert_operator(HTMLComment, :==, t.class)`.", 29413628], + [44, 7, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 29413628], + [45, 7, 37, "Minitest/AssertEqual: Prefer using `assert_equal('comment on me', t.contents)`.", 2487791324], + [45, 7, 37, "Minitest/AssertOperator: Prefer using `assert_operator('comment on me', :==, t.contents)`.", 2487791324], + [45, 14, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2128663999], + [71, 7, 61, "Minitest/AssertEqual: Prefer using `assert_equal('

', toke.getTag('h1', 'h2', 'h3').to_s.downcase)`.", 986157674], + [71, 7, 61, "Minitest/AssertOperator: Prefer using `assert_operator('

', :==, toke.getTag('h1', 'h2', 'h3').to_s.downcase)`.", 986157674], + [71, 14, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3129322750], + [71, 36, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085189148], + [71, 42, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085189119], + [71, 48, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085189086], + [72, 7, 70, "Minitest/AssertEqual: Prefer using `assert_equal(HTMLTag.new(''), toke.getTag('IMG', 'A'))`.", 3086837246], + [72, 7, 70, "Minitest/AssertOperator: Prefer using `assert_operator(HTMLTag.new(''), :==, toke.getTag('IMG', 'A'))`.", 3086837246], + [72, 65, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90591078], + [72, 72, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193336772], + [73, 7, 38, "Minitest/AssertEqual: Prefer using `assert_equal('links', toke.getTrimmedText)`.", 3739004203], + [73, 7, 38, "Minitest/AssertOperator: Prefer using `assert_operator('links', :==, toke.getTrimmedText)`.", 3739004203], + [73, 14, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1197945782], + [74, 26, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90591078], + [74, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193336772], + [74, 48, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [75, 7, 63, "Minitest/AssertEqual: Prefer using `assert_equal('_blank', toke.getTag('IMG', 'A').attr_hash['target'])`.", 325211204], + [75, 7, 63, "Minitest/AssertOperator: Prefer using `assert_operator('_blank', :==, toke.getTag('IMG', 'A').attr_hash['target'])`.", 325211204], + [75, 14, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1599368272], + [75, 38, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 90591078], + [75, 45, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193336772], + [75, 60, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2908810036] + ], + "test/test_responses.rb:2785332104": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3427008040], + [3, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2748495602], + [11, 34, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 530259623], + [16, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2741767349], + [16, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2904344789], + [17, 13, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 701817958], + [17, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 912646790], + [18, 13, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 621032223], + [18, 31, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [19, 13, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 620578999], + [19, 31, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [20, 13, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1006179904], + [20, 32, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91693012], + [21, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [21, 13, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 376400678], + [21, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [23, 42, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2149044978], + [26, 44, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 912646790], + [27, 11, 52, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 893434942], + [27, 24, 38, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2286651726], + [27, 33, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [27, 34, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91847809], + [27, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [27, 48, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92087849], + [27, 57, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [27, 60, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [28, 46, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2904344789], + [29, 11, 47, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2341596065], + [29, 24, 33, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2322686545], + [29, 35, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [29, 36, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [29, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91693012], + [29, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [34, 13, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2741767349], + [34, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2904344789], + [35, 13, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 701817958], + [35, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 912646790], + [36, 13, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 621032223], + [36, 31, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [37, 13, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 620578999], + [37, 31, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [38, 13, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1006179904], + [38, 32, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91693012], + [39, 13, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2058294721], + [39, 27, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2206146453], + [40, 13, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [40, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [41, 13, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [41, 13, 49, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3229683951], + [41, 25, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1647466590], + [44, 26, 22, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1310147319], + [44, 26, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1310147319], + [45, 26, 21, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2834118728], + [45, 26, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2834118728], + [46, 26, 17, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2013015446], + [46, 26, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2013015446], + [46, 26, 17, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2013015446], + [52, 46, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2904344789], + [53, 11, 69, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2471615479], + [53, 24, 55, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 881787975], + [53, 35, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [53, 36, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [53, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91693012], + [53, 57, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91538572], + [53, 66, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2206146453], + [53, 77, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [57, 44, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 912646790], + [58, 11, 18, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4082492372] + ], + "test/test_server.rb:3811315049": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3046940385], + [4, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92337995], + [5, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1480177078], + [6, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3933002043], + [7, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191648330], + [8, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [9, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [10, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2754036930], + [11, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847734175], + [12, 9, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2222937256], + [28, 28, 17, "Performance/StringIdentifierArgument: Use `:got_log_message` instead of `'got_log_message'`.", 798149142], + [28, 28, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 798149142], + [43, 19, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1066751882], + [47, 39, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [47, 39, 30, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1393021092], + [47, 56, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1503878771], + [48, 39, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [48, 60, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2782413682], + [49, 39, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [49, 39, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4148959153], + [50, 37, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [51, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2545186045], + [52, 7, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3056010950], + [54, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [54, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [55, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [55, 9, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4200202801], + [55, 27, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2545186045], + [58, 46, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [60, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3825324526], + [64, 19, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1066751882], + [68, 39, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [68, 39, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1167825989], + [69, 39, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [69, 56, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1503878771], + [70, 39, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [70, 60, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2782413682], + [71, 39, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [71, 62, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2782413682], + [72, 39, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [72, 39, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4148959153], + [73, 37, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [74, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2545186045], + [75, 7, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3056010950], + [77, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [78, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [78, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [79, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [79, 9, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4200202801], + [79, 27, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2545186045], + [82, 46, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [84, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3825324526], + [88, 19, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1066751882], + [88, 52, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [92, 39, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [92, 39, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1167825989], + [93, 39, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [93, 56, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1503878771], + [94, 39, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [94, 60, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2782413682], + [95, 39, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [95, 62, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2782413682], + [96, 39, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [96, 39, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4148959153], + [97, 37, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [98, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2545186045], + [99, 7, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3056010950], + [100, 7, 52, "Minitest/AssertEqual: Prefer using `assert_equal(e.which_encoding, Server::ENCODE_HTML_FORM)`.", 2915605092], + [100, 7, 52, "Minitest/AssertOperator: Prefer using `assert_operator(e.which_encoding, :==, Server::ENCODE_HTML_FORM)`.", 2915605092], + [101, 7, 109, "Minitest/AssertEqual: Prefer using `assert_equal(e.to_form_markup, e.to_message.to_form_markup(\n args.get_arg(OPENID_NS, 'return_to')\n ))`.", 1000938378], + [101, 7, 109, "Minitest/AssertOperator: Prefer using `assert_operator(e.to_form_markup, :==, e.to_message.to_form_markup(\n args.get_arg(OPENID_NS, 'return_to')\n ))`.", 1000938378], + [102, 9, 36, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 1249712169], + [102, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [107, 19, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1066751882], + [107, 52, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [111, 39, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [111, 39, 30, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1393021092], + [111, 56, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1503878771], + [112, 39, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [112, 60, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2782413682], + [113, 39, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [113, 39, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4148959153], + [114, 37, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [115, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2545186045], + [116, 7, 23, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3056010950], + [118, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [118, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [119, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648155146], + [119, 9, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4200202801], + [119, 27, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2545186045], + [122, 7, 46, "Minitest/AssertEqual: Prefer using `assert_equal(e.which_encoding, Server::ENCODE_URL)`.", 1236493083], + [122, 7, 46, "Minitest/AssertOperator: Prefer using `assert_operator(e.which_encoding, :==, Server::ENCODE_URL)`.", 1236493083], + [124, 46, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [126, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3825324526], + [133, 39, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [133, 39, 29, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1955872977], + [133, 56, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 213127718], + [134, 39, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [134, 39, 44, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3643423056], + [134, 60, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2782413682], + [135, 37, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [136, 43, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1714871433], + [137, 7, 24, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2657654983], + [137, 7, 24, "Minitest/RefuteFalse: Prefer using `refute(e.has_return_to)`.", 2657654983], + [139, 7, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 238714842], + [143, 42, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4245718543], + [144, 7, 28, "Minitest/AssertNil: Prefer using `assert_nil(e.get_return_to)`.", 1213245328], + [144, 7, 28, "Minitest/AssertPredicate: Prefer using `assert_predicate(e.get_return_to, :nil?)`.", 1213245328], + [144, 7, 28, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1213245328], + [149, 42, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4245718543], + [150, 7, 29, "Minitest/AssertNil: Prefer using `assert_nil(e.which_encoding)`.", 4124541526], + [150, 7, 29, "Minitest/AssertPredicate: Prefer using `assert_predicate(e.which_encoding, :nil?)`.", 4124541526], + [150, 7, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4124541526], + [156, 21, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 677947260], + [157, 17, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473598058], + [158, 17, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2465241228], + [159, 17, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3824840884], + [160, 23, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2052361250], + [161, 22, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4102359379], + [164, 53, 8, "Performance/StringIdentifierArgument: Use `:decode` instead of `'decode'`.", 3584207753], + [164, 53, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3584207753], + [170, 7, 13, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3296920032], + [175, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035280173], + [175, 19, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3010637896], + [176, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4035716255], + [176, 9, 37, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 302334704], + [176, 32, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1802443369], + [185, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [185, 26, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1262000177], + [186, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2154815178], + [186, 9, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 993152652], + [186, 27, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3924099456], + [195, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [195, 27, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [196, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [197, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [198, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [199, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569265983], + [199, 9, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4131175662], + [204, 9, 35, "Minitest/RefuteFalse: Prefer using `refute(e.to_s.index('values').nil?)`.", 467373897], + [204, 9, 35, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 467373897], + [204, 30, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1065819997], + [212, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [212, 26, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [213, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [214, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [215, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [216, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569265983], + [218, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 762039473], + [218, 9, 33, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1863847240], + [218, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3028237119], + [221, 7, 39, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::CheckIDRequest, r)`.", 3462512927], + [221, 7, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3462512927], + [222, 20, 27, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2702022931], + [222, 28, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [223, 20, 17, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2045143442], + [231, 38, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 732701340], + [231, 47, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1220402807], + [231, 56, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [232, 38, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1220402807], + [232, 47, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2087932467], + [232, 53, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2725934909], + [233, 7, 37, "Minitest/AssertEqual: Prefer using `assert_equal(r.mode, 'checkid_immediate')`.", 3748905788], + [233, 7, 37, "Minitest/AssertOperator: Prefer using `assert_operator(r.mode, :==, 'checkid_immediate')`.", 3748905788], + [233, 7, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3748905788], + [233, 24, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [239, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [240, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [240, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [241, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [242, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [243, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [243, 9, 38, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3469479761], + [245, 7, 151, "Minitest/AssertRaisesCompoundBody: Reduce `assert_raises` block body to contain only the raising code.", 647768387], + [253, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [254, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [254, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [255, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [256, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [257, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [258, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [259, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2379882277], + [259, 9, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1767385396], + [263, 7, 21, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1927906708], + [268, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [269, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [269, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [270, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [271, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [272, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2379882277], + [272, 9, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1767385396], + [276, 10, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [276, 11, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [276, 11, 40, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 3497162556], + [277, 11, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [277, 11, 40, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 960842377], + [277, 32, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 266855851], + [277, 51, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [279, 10, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [279, 11, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [279, 11, 42, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 4012708006], + [279, 34, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 266855851], + [280, 11, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [280, 11, 40, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 960842377], + [280, 11, 42, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2680294612], + [280, 32, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 266855851], + [280, 51, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [286, 9, 22, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 822457045], + [286, 9, 22, "Minitest/RefuteFalse: Prefer using `refute(req.id_select)`.", 822457045], + [292, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [292, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [293, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [294, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [295, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [296, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569265983], + [296, 9, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4131175662], + [299, 7, 39, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::CheckIDRequest, r)`.", 3462512927], + [299, 7, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3462512927], + [300, 20, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3010070437], + [300, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [301, 20, 18, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3053826969], + [309, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [310, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [310, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [311, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [312, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [313, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [314, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [315, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2379882277], + [315, 9, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1767385396], + [318, 7, 39, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::CheckIDRequest, r)`.", 3462512927], + [318, 7, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3462512927], + [319, 20, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3010070437], + [319, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [320, 20, 18, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3053826969], + [329, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [330, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [330, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [331, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [332, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [333, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [334, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2379882277], + [334, 9, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1767385396], + [343, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [344, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [344, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [345, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [346, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [347, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2379882277], + [347, 9, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1767385396], + [350, 7, 39, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::CheckIDRequest, r)`.", 3462512927], + [350, 7, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3462512927], + [351, 20, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3010070437], + [351, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [352, 20, 18, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3053826969], + [362, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [362, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [363, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [364, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [365, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569265983], + [365, 9, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4131175662], + [377, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [378, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [378, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [379, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [380, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [381, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [382, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2379882277], + [382, 9, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1767385396], + [386, 7, 41, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::CheckIDRequest, req)`.", 3170345835], + [386, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3170345835], + [393, 27, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [406, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [407, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [407, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [408, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [409, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [409, 9, 38, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3469479761], + [418, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [418, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [419, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [420, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [421, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [421, 9, 33, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2013833856], + [421, 31, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1277221018], + [434, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [434, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [435, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [436, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [437, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [438, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569265983], + [438, 9, 62, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3632773663], + [438, 32, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1311202246], + [443, 9, 32, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(e.openid_message, e.to_s)`?", 1858530896], + [451, 36, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 732701340], + [451, 45, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1220402807], + [451, 54, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [452, 36, 39, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1311202246], + [452, 36, 39, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1311202246], + [453, 36, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 170962968], + [453, 43, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2725934909], + [459, 36, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 732701340], + [459, 45, 20, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4294267324], + [459, 45, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4294267324], + [459, 67, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [460, 36, 23, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1118065653], + [460, 36, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1118065653], + [461, 36, 5, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 170962968], + [461, 43, 13, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2725934909], + [467, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [467, 26, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [468, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [468, 34, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 303879889], + [469, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [469, 25, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 757573595], + [470, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [470, 28, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4259974695], + [471, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [471, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2598898589], + [472, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [472, 31, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2598898622], + [473, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2954082535], + [473, 36, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2598898527], + [474, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2420408939], + [474, 9, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3435302753], + [474, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2950312524], + [477, 7, 41, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::CheckAuthRequest, r)`.", 467177306], + [477, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 467177306], + [478, 20, 30, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3982562415], + [478, 28, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [479, 20, 16, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 659967190], + [479, 27, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 757573595], + [484, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [484, 26, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [485, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [485, 34, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 303879889], + [486, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [486, 28, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2739490097], + [487, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2420271828], + [487, 25, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2598898589], + [488, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2420408675], + [488, 25, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2598898622], + [489, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2420408939], + [489, 9, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3435302753], + [489, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2950312524], + [498, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [498, 26, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 45746588], + [499, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [499, 34, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 303879889], + [500, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2482661766], + [500, 39, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1857981545], + [501, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [501, 25, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 757573595], + [502, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [502, 28, 40, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4259974695], + [503, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [503, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2598898589], + [504, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [504, 31, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2598898622], + [505, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2954082535], + [505, 36, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2598898527], + [506, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2420408939], + [506, 9, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3435302753], + [506, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2950312524], + [509, 7, 41, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::CheckAuthRequest, r)`.", 467177306], + [509, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 467177306], + [510, 20, 39, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 420814541], + [510, 41, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1857981545], + [515, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [515, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [516, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [516, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [517, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [517, 9, 45, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 430722052], + [517, 40, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3738611747], + [520, 7, 41, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::AssociateRequest, r)`.", 54805120], + [520, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 54805120], + [521, 20, 19, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 535469538], + [521, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [522, 20, 33, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 889286838], + [522, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [523, 20, 25, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1858710238], + [523, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [530, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [530, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [531, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [531, 9, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2621133954], + [531, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [541, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [541, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [542, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [542, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [543, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [543, 9, 51, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3460428400], + [543, 40, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3026489687], + [554, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [554, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [555, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [555, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [556, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [556, 40, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3738611747], + [557, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3700462040], + [558, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 910348845], + [558, 9, 51, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 908134425], + [561, 7, 41, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::AssociateRequest, r)`.", 54805120], + [561, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 54805120], + [562, 20, 19, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 535469538], + [562, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [563, 20, 33, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 889286838], + [563, 44, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [564, 20, 25, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1858710238], + [564, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [574, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [574, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [575, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [575, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [576, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [576, 40, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3738611747], + [577, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3700462040], + [577, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1372489149], + [578, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 910348845], + [578, 9, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2267969033], + [578, 28, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 957180674], + [587, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [587, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [588, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [588, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [589, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [589, 40, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3738611747], + [590, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3700462040], + [590, 9, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 260471011], + [590, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1372489149], + [599, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [599, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [600, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [600, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [601, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [601, 40, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3738611747], + [602, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 910348845], + [602, 9, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1471272694], + [602, 28, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1372489149], + [624, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [624, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [625, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [625, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4053101430], + [626, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [626, 9, 39, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3873421208], + [635, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [635, 9, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4045751462], + [635, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [638, 7, 41, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Server::AssociateRequest, r)`.", 54805120], + [638, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 54805120], + [639, 20, 19, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 535469538], + [639, 28, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [640, 20, 39, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 66061791], + [640, 44, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [641, 20, 25, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1858710238], + [641, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [646, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [646, 34, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [647, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [647, 9, 48, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1252017792], + [647, 40, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2707604295], + [655, 15, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [655, 16, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [655, 16, 27, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1779081296], + [655, 31, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 862571929], + [656, 16, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [656, 16, 28, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4045751462], + [656, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [656, 44, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [661, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 862571929], + [668, 7, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3913868777], + [674, 7, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3913868777], + [681, 33, 8, "Performance/StringIdentifierArgument: Use `:encode` instead of `'encode'`.", 4224763619], + [681, 33, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4224763619], + [682, 22, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4102359379], + [691, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [692, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [694, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [696, 9, 3, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 193419246], + [701, 52, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [701, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2290219986], + [702, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [702, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [703, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [704, 52, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [705, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [705, 52, 32, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1581964121], + [706, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [708, 7, 32, "Minitest/RefuteFalse: Prefer using `refute(response.render_as_form)`.", 25000324], + [709, 7, 53, "Minitest/AssertEqual: Prefer using `assert_equal(response.which_encoding, Server::ENCODE_URL)`.", 2315763837], + [709, 7, 53, "Minitest/AssertOperator: Prefer using `assert_operator(response.which_encoding, :==, Server::ENCODE_URL)`.", 2315763837], + [711, 7, 47, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4026538282], + [711, 42, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [718, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [719, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [721, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [723, 9, 3, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 193419246], + [728, 52, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [728, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2290219986], + [729, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [729, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [730, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [731, 52, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [732, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [732, 52, 38, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4193732044], + [732, 67, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [733, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [736, 7, 57, "Minitest/AssertOperator: Prefer using `assert_operator(response.encode_to_url.length, :>, OPENID1_URL_LIMIT)`.", 2137079623], + [737, 7, 59, "Minitest/AssertEqual: Prefer using `assert_equal(response.which_encoding, Server::ENCODE_HTML_FORM)`.", 2841569858], + [737, 7, 59, "Minitest/AssertOperator: Prefer using `assert_operator(response.which_encoding, :==, Server::ENCODE_HTML_FORM)`.", 2841569858], + [739, 7, 55, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2778336996], + [744, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [745, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [747, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [749, 9, 3, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 193419246], + [754, 52, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [754, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2290219986], + [755, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [755, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [756, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [757, 52, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [758, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [758, 52, 38, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4193732044], + [758, 67, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [759, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [760, 46, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [760, 47, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [760, 56, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [760, 61, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [761, 7, 48, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(/ foo=\"bar\"/ =~ form_markup, form_markup)`?", 1957089571], + [761, 7, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1957089571], + [766, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [767, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [769, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [771, 9, 3, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 193419246], + [776, 52, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [776, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2290219986], + [777, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [777, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [778, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [779, 52, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [780, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [780, 52, 38, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4193732044], + [780, 67, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [781, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [783, 7, 12, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2488722139], + [792, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [793, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [795, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [797, 9, 3, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 193419246], + [803, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [803, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [803, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [804, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [805, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [805, 52, 38, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4193732044], + [805, 67, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [806, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [808, 7, 32, "Minitest/RefuteFalse: Prefer using `refute(response.render_as_form)`.", 25000324], + [809, 7, 57, "Minitest/AssertOperator: Prefer using `assert_operator(response.encode_to_url.length, :>, OPENID1_URL_LIMIT)`.", 2137079623], + [810, 7, 53, "Minitest/AssertEqual: Prefer using `assert_equal(response.which_encoding, Server::ENCODE_URL)`.", 2315763837], + [810, 7, 53, "Minitest/AssertOperator: Prefer using `assert_operator(response.which_encoding, :==, Server::ENCODE_URL)`.", 2315763837], + [812, 7, 69, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2831084200], + [812, 40, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [817, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [818, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [820, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [821, 16, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [826, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [826, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [826, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [827, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [828, 52, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [828, 52, 32, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1581964121], + [829, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [831, 7, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2797848433], + [832, 42, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [834, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [835, 7, 146, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(location.start_with?(request.return_to), format('%s does not start with %s',\n location, request.return_to))`?", 2683527119], + [835, 7, 146, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2683527119], + [835, 14, 39, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3586269412], + [836, 14, 84, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1564650123], + [836, 21, 27, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2724304431], + [836, 21, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2724304431], + [837, 21, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2700611480], + [837, 31, 17, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 871539604], + [841, 7, 26, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 193223076], + [846, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [847, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [849, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [850, 16, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [855, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [855, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 786623363], + [855, 52, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 786623363], + [855, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [856, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [858, 7, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2797848433], + [859, 42, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [864, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [865, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [867, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [868, 16, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [873, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [873, 52, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 786623363], + [873, 52, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 786623363], + [873, 62, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [874, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [876, 7, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1944930512], + [881, 31, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [881, 47, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [885, 9, 40, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 413424971], + [885, 10, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [885, 11, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [885, 36, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3101741185], + [885, 47, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [891, 20, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1150841182], + [896, 46, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3003826091], + [896, 46, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3003826091], + [897, 46, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 754668632], + [897, 46, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 754668632], + [898, 46, 2, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 5862883], + [902, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [902, 52, 20, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 378977955], + [902, 66, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039078867], + [903, 52, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [903, 52, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3895965000], + [903, 75, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 297979103], + [904, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [908, 7, 47, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 237793135], + [909, 20, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1150841182], + [915, 39, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [915, 39, 44, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2815944649], + [915, 39, 44, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2815944649], + [915, 60, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1571819371], + [916, 37, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [917, 43, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 102289089], + [925, 39, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [925, 39, 28, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 4045751462], + [925, 56, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [926, 39, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [926, 39, 44, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2815944649], + [926, 60, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1571819371], + [927, 37, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [929, 66, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1422321228], + [930, 7, 50, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2819623411], + [931, 20, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1150841182], + [941, 44, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3164052141], + [943, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [944, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [946, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [947, 16, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [953, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [953, 53, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 248562579], + [953, 63, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [954, 53, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [955, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [955, 53, 33, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1341151641], + [956, 51, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [959, 33, 8, "Performance/StringIdentifierArgument: Use `:encode` instead of `'encode'`.", 4224763619], + [959, 33, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4224763619], + [963, 22, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2648082212], + [966, 37, 2, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 5859267], + [966, 41, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4223563293], + [967, 37, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3514803799], + [967, 37, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3514803799], + [967, 37, 22, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 2016962611], + [967, 47, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 389098948], + [967, 47, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [971, 7, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2797848433], + [972, 42, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [974, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [976, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1701514406], + [976, 28, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [977, 28, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [978, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [983, 7, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2797848433], + [984, 43, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [986, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [988, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1701514406], + [988, 28, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [989, 28, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [990, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [1002, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 385199414], + [1003, 9, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3723562872], + [1005, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1866789569], + [1006, 16, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193419246], + [1010, 42, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1010, 50, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [1012, 7, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2797848433], + [1013, 43, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [1014, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [1016, 7, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2826799940], + [1016, 7, 36, "Minitest/RefuteFalse: Prefer using `refute(query.has_key?('openid.sig'))`.", 2826799940], + [1016, 7, 36, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2826799940], + [1016, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [1021, 31, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [1021, 47, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [1024, 51, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1024, 52, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1024, 70, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3101741185], + [1024, 81, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1027, 7, 47, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 237793135], + [1028, 20, 23, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1150841182], + [1033, 43, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [1033, 50, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 986533710], + [1042, 22, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 714136661], + [1046, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3509799286], + [1047, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018766398], + [1049, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 749913543], + [1050, 9, 5, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 170962968], + [1056, 29, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2852917526], + [1057, 28, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2852915802], + [1058, 7, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2061673596], + [1058, 7, 34, "Minitest/RefuteFalse: Prefer using `refute(@request.trust_root_valid)`.", 2061673596], + [1062, 29, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4093819203], + [1075, 7, 33, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 68269885], + [1079, 29, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2148131440], + [1080, 28, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2852915802], + [1081, 7, 33, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 68269885], + [1086, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3509799286], + [1089, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 749913543], + [1090, 9, 5, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 170962968], + [1102, 7, 5, "Lint/UnderscorePrefixedVariableName: Do not use prefix `_` for a variable that is used.", 236623619], + [1105, 7, 7, "Naming/VariableName: Use snake_case for variable names.", 4074303232], + [1113, 59, 7, "Naming/VariableName: Use snake_case for variable names.", 4074303232], + [1115, 9, 52, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3212131973], + [1115, 15, 45, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3049753150], + [1116, 7, 79, "Lint/RescueException: Avoid rescuing the `Exception` class. Perhaps you meant to rescue `StandardError`?", 8874920], + [1117, 9, 49, "Minitest/AssertSame: Prefer using `assert_same(e, sentinel, [e, sentinel].inspect)`.", 2912457284], + [1117, 9, 49, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(e.equal?(sentinel), [e, sentinel].inspect)`?", 2912457284], + [1121, 7, 11, "Naming/VariableName: Use snake_case for variable names.", 548879287], + [1132, 20, 11, "Naming/VariableName: Use snake_case for variable names.", 548879287], + [1143, 10, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1144, 9, 29, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3737223631], + [1144, 10, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 245860230], + [1147, 27, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [1149, 9, 19, "Layout/IndentationWidth: Use 2 (not 19) spaces for indentation.", 1735044741], + [1149, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [1150, 26, 4, "Layout/ElseAlignment: Align `else` with `expected_list`.", 2087423834], + [1151, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [1152, 26, 3, "Layout/EndAlignment: `end` at 1152, 25 is not aligned with `expected_list << if` at 1148, 8.", 193405706], + [1157, 9, 135, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1556469033], + [1157, 22, 8, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 573203451], + [1157, 32, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1314690699], + [1158, 22, 82, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 954777080], + [1158, 29, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 697374951], + [1158, 29, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 697374951], + [1159, 29, 1, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 177614], + [1159, 32, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 573203451], + [1159, 42, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1314690699], + [1162, 48, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1679224880], + [1163, 7, 56, "Minitest/AssertEqual: Prefer using `assert_equal(answer.fields.get_openid_namespace, OPENID2_NS)`.", 840360142], + [1163, 7, 56, "Minitest/AssertOperator: Prefer using `assert_operator(answer.fields.get_openid_namespace, :==, OPENID2_NS)`.", 840360142], + [1166, 20, 33, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4205702174], + [1167, 20, 24, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 622147789], + [1168, 20, 34, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3393568532], + [1177, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2033662219], + [1182, 29, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 457244556], + [1184, 21, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1311534521], + [1184, 29, 17, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1359202220], + [1185, 21, 19, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3604674179], + [1191, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2033662219], + [1200, 36, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085279374], + [1206, 21, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1794323614], + [1221, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [1223, 7, 58, "Minitest/AssertEqual: Prefer using `assert_equal(resp.fields.get_arg(OPENID_NS, 'mode'), 'id_res')`.", 1380829661], + [1223, 7, 58, "Minitest/AssertOperator: Prefer using `assert_operator(resp.fields.get_arg(OPENID_NS, 'mode'), :==, 'id_res')`.", 1380829661], + [1223, 7, 58, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1380829661], + [1223, 45, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1223, 56, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [1229, 23, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1231, 7, 58, "Minitest/AssertEqual: Prefer using `assert_equal(resp.fields.get_arg(OPENID_NS, 'mode'), 'cancel')`.", 1447025101], + [1231, 7, 58, "Minitest/AssertOperator: Prefer using `assert_operator(resp.fields.get_arg(OPENID_NS, 'mode'), :==, 'cancel')`.", 1447025101], + [1231, 7, 58, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1447025101], + [1231, 45, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1231, 56, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [1237, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [1248, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [1249, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3913868777], + [1250, 31, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3876881288], + [1252, 20, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3034870887], + [1255, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3569023153], + [1257, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [1261, 7, 53, "Minitest/AssertEqual: Prefer using `assert_equal(m.get_arg(OPENID_NS, 'trust_root'), 'BOGUS')`.", 2598547887], + [1261, 7, 53, "Minitest/AssertOperator: Prefer using `assert_operator(m.get_arg(OPENID_NS, 'trust_root'), :==, 'BOGUS')`.", 2598547887], + [1261, 7, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2598547887], + [1261, 35, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [1261, 52, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3913868777], + [1262, 7, 55, "Minitest/AssertEqual: Prefer using `assert_equal(m.get_arg(OPENID_NS, 'assoc_handle'), 'ASSOC')`.", 2264954203], + [1262, 7, 55, "Minitest/AssertOperator: Prefer using `assert_operator(m.get_arg(OPENID_NS, 'assoc_handle'), :==, 'ASSOC')`.", 2264954203], + [1262, 35, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1262, 54, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3876881288], + [1263, 35, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1263, 44, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [1264, 7, 61, "Minitest/AssertEqual: Prefer using `assert_equal(m.get_arg(OPENID_NS, 'identity'), @request.identity)`.", 1931295217], + [1264, 7, 61, "Minitest/AssertOperator: Prefer using `assert_operator(m.get_arg(OPENID_NS, 'identity'), :==, @request.identity)`.", 1931295217], + [1264, 35, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [1265, 7, 65, "Minitest/AssertEqual: Prefer using `assert_equal(m.get_arg(OPENID_NS, 'claimed_id'), @request.claimed_id)`.", 2879386833], + [1265, 7, 65, "Minitest/AssertOperator: Prefer using `assert_operator(m.get_arg(OPENID_NS, 'claimed_id'), :==, @request.claimed_id)`.", 2879386833], + [1265, 35, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [1266, 7, 63, "Minitest/AssertEqual: Prefer using `assert_equal(m.get_arg(OPENID_NS, 'return_to'), @request.return_to)`.", 3923304977], + [1266, 7, 63, "Minitest/AssertOperator: Prefer using `assert_operator(m.get_arg(OPENID_NS, 'return_to'), :==, @request.return_to)`.", 3923304977], + [1266, 35, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1274, 21, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1794323614], + [1275, 20, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1617026320], + [1285, 21, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1794323614], + [1286, 20, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1617026320], + [1296, 36, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2979212217], + [1317, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1317, 43, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [1318, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [1318, 44, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [1319, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1319, 38, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1320, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1320, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [1329, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1329, 38, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1330, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1330, 43, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2284663885], + [1331, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [1331, 44, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 568782352], + [1340, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1340, 38, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1341, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1341, 43, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2284663885], + [1342, 30, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [1342, 42, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 568782352], + [1350, 19, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1114765365], + [1352, 38, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [1352, 38, 49, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 2584928368], + [1352, 63, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3388159452], + [1353, 38, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 789517483], + [1353, 61, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2204003660], + [1354, 38, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [1354, 59, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1750932606], + [1355, 38, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [1355, 55, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1356, 38, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [1356, 53, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 494421042], + [1357, 38, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [1358, 38, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569265983], + [1358, 38, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3350179228], + [1358, 61, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [1359, 36, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [1361, 7, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2110461533], + [1367, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1367, 38, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1368, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [1368, 44, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1118065653], + [1369, 30, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [1369, 39, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1660241555], + [1370, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1370, 43, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 504025203], + [1371, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1371, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [1372, 30, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [1372, 42, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 594902712], + [1376, 7, 52, "Minitest/AssertEqual: Prefer using `assert_equal(result.trust_root, 'http://trustroot.com/')`.", 114269884], + [1376, 7, 52, "Minitest/AssertOperator: Prefer using `assert_operator(result.trust_root, :==, 'http://trustroot.com/')`.", 114269884], + [1376, 35, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1118065653], + [1382, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1382, 38, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1383, 30, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1442212370], + [1383, 39, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1118065653], + [1384, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 137463464], + [1384, 44, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1660241555], + [1385, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1385, 43, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 504025203], + [1386, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1386, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [1387, 30, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [1387, 42, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 594902712], + [1388, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [1388, 44, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 594902712], + [1392, 7, 52, "Minitest/AssertEqual: Prefer using `assert_equal(result.trust_root, 'http://trustroot.com/')`.", 114269884], + [1392, 7, 52, "Minitest/AssertOperator: Prefer using `assert_operator(result.trust_root, :==, 'http://trustroot.com/')`.", 114269884], + [1392, 35, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1118065653], + [1398, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2033662219], + [1408, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [1411, 20, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1494444439], + [1414, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2033662219], + [1415, 20, 51, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2836963246], + [1417, 20, 40, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 43584800], + [1417, 20, 75, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2083974517], + [1417, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1418, 20, 14, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2136724950], + [1418, 20, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2136724950], + [1426, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [1428, 29, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 449675739], + [1429, 20, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1494444439], + [1432, 7, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2033662219], + [1435, 20, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [1435, 63, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1437, 46, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2858095960], + [1437, 64, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [1438, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 648932297], + [1439, 25, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 158587515], + [1440, 7, 45, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(!usu.index(expected_substr).nil?, usu)`?", 681836848], + [1440, 7, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 681836848], + [1440, 7, 45, "Minitest/RefuteFalse: Prefer using `refute(usu.index(expected_substr).nil?, usu)`.", 681836848], + [1445, 7, 111, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3867715380], + [1445, 20, 97, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2628002221], + [1446, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1446, 22, 18, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 786623363], + [1446, 22, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 786623363], + [1446, 32, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [1447, 20, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [1451, 20, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1363195367], + [1455, 37, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [1458, 61, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1236122734], + [1459, 61, 19, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3188886797], + [1464, 22, 35, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2713653639], + [1465, 22, 42, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 909353513], + [1465, 66, 3, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 193428192], + [1471, 36, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340858], + [1472, 7, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4270365646], + [1474, 7, 105, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4117374530], + [1474, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1474, 29, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [1474, 29, 25, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1135711444], + [1474, 46, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4176286499], + [1475, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [1475, 29, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1167825989], + [1475, 54, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1479, 23, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3232603392], + [1488, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1488, 38, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1489, 30, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 322569067], + [1489, 43, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2745524870], + [1490, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1490, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [1491, 30, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [1491, 42, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 594902712], + [1492, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [1492, 44, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 594902712], + [1496, 20, 47, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 4133387104], + [1496, 39, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2745524870], + [1501, 30, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1501, 38, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1502, 30, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1502, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 832170441], + [1503, 30, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1948187571], + [1503, 42, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 594902712], + [1504, 30, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 794246204], + [1504, 44, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 594902712], + [1514, 22, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1497248604], + [1518, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3509799286], + [1519, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018766398], + [1521, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 749913543], + [1522, 9, 5, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 170962968], + [1526, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1526, 51, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [1527, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018523035], + [1527, 51, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035508657], + [1531, 19, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2296266423], + [1532, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1903458695], + [1532, 53, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2574170836], + [1533, 7, 133, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1343788936], + [1533, 20, 36, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3308949379], + [1533, 20, 119, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 736307409], + [1534, 20, 62, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3797650682], + [1534, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1534, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018523035], + [1534, 22, 16, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 796284844], + [1534, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035508657], + [1535, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1535, 22, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 248562579], + [1535, 32, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [1535, 40, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [1535, 40, 2, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 5858821], + [1537, 20, 36, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1619997019], + [1537, 20, 81, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1993106827], + [1538, 20, 24, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 988844531], + [1538, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1538, 22, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1903458695], + [1538, 34, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2574170836], + [1538, 42, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1542, 19, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037856718], + [1543, 15, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1543, 16, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1520528096], + [1543, 16, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 940829485], + [1543, 27, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 504376971], + [1544, 16, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 838278221], + [1544, 16, 22, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2094670184], + [1544, 27, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2886255107], + [1544, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1546, 7, 133, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1343788936], + [1546, 20, 36, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3308949379], + [1546, 20, 119, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 736307409], + [1547, 20, 62, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3797650682], + [1547, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1547, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018523035], + [1547, 22, 16, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 796284844], + [1547, 32, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035508657], + [1548, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [1548, 22, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 248562579], + [1548, 32, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 691350387], + [1548, 40, 1, "Layout/ExtraSpacing: Unnecessary spacing detected.", 177541], + [1548, 40, 2, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 5858821], + [1557, 7, 8, "Naming/VariableName: Use snake_case for variable names.", 3407076265], + [1562, 47, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [1586, 23, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3005341511], + [1588, 43, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [1588, 43, 28, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 141188090], + [1588, 59, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1527765779], + [1589, 43, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91847809], + [1589, 52, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1020552657], + [1590, 43, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92087849], + [1590, 43, 15, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2449727128], + [1590, 52, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3018202743], + [1591, 41, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [1606, 7, 87, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3334118852], + [1606, 20, 24, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2035538501], + [1606, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1606, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [1606, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039078867], + [1606, 42, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1607, 20, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3469844402], + [1614, 7, 88, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3440579503], + [1614, 20, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1486736654], + [1614, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1614, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [1614, 36, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 967974776], + [1614, 43, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1615, 20, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3469844402], + [1630, 7, 1, "Lint/UselessAssignment: Useless assignment to variable - `r`.", 177623], + [1632, 7, 88, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3440579503], + [1632, 20, 25, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1486736654], + [1632, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1632, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [1632, 36, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 967974776], + [1632, 43, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1633, 20, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3469844402], + [1637, 36, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 129692131], + [1639, 7, 146, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 559422262], + [1639, 20, 28, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3469844402], + [1639, 20, 132, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3144910905], + [1640, 20, 83, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4039574002], + [1640, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1640, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [1640, 22, 20, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 378977955], + [1640, 36, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039078867], + [1641, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [1641, 22, 36, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2495144628], + [1641, 45, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 129692131], + [1641, 58, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1646, 22, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3498470604], + [1647, 36, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3498470604], + [1650, 7, 68, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3863692366], + [1650, 20, 54, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3542805630], + [1650, 51, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1650, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [1650, 66, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3039078867], + [1650, 72, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1665, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1670, 56, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1674, 7, 49, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3747855532], + [1674, 20, 35, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1824413564], + [1674, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [1674, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1675, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1676, 7, 28, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('mac_key'))`.", 1135258782], + [1676, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [1677, 20, 35, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1002435172], + [1677, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [1677, 46, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [1678, 23, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [1679, 23, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [1681, 43, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [1682, 47, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [1683, 39, 24, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1069010166], + [1683, 56, 6, "Performance/StringIdentifierArgument: Use `:sha1` instead of `'sha1'`.", 3036224142], + [1683, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3036224142], + [1684, 39, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2088323153], + [1684, 45, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4050801125], + [1685, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1206981146], + [1689, 53, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [1694, 56, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [1698, 7, 51, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1192804044], + [1698, 20, 37, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 2511289244], + [1698, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [1698, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [1699, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1700, 7, 28, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('mac_key'))`.", 1135258782], + [1700, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [1701, 20, 37, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 730051716], + [1701, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [1701, 46, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [1702, 23, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [1703, 23, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [1705, 43, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [1706, 47, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [1707, 39, 26, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 216492438], + [1707, 56, 8, "Performance/StringIdentifierArgument: Use `:sha256` instead of `'sha256'`.", 3618363438], + [1707, 56, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3618363438], + [1708, 39, 4, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2088323153], + [1708, 45, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4050801125], + [1709, 7, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1206981146], + [1715, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1715, 24, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2423346872], + [1715, 24, 34, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1275492858], + [1715, 47, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1716, 24, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [1716, 24, 36, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2556715042], + [1716, 49, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [1716, 60, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1719, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1719, 26, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2423346872], + [1719, 26, 38, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 77956150], + [1719, 49, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2307920840], + [1720, 26, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [1720, 26, 36, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2556715042], + [1720, 51, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [1720, 62, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1725, 9, 14, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3796761028], + [1739, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1739, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2423346872], + [1739, 22, 36, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1737234074], + [1739, 45, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [1740, 22, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [1740, 22, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2621133954], + [1740, 47, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [1740, 56, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1743, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1743, 24, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2423346872], + [1743, 24, 36, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2575290064], + [1743, 47, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3830434158], + [1744, 24, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [1744, 24, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2621133954], + [1744, 49, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4235576623], + [1744, 58, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1748, 10, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1748, 11, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2423346872], + [1748, 34, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3005250468], + [1748, 40, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1750, 9, 12, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1955746212], + [1762, 17, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 922742307], + [1763, 19, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2777983614], + [1764, 15, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182807033], + [1767, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 543284365], + [1767, 31, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3644585460], + [1768, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [1768, 9, 32, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 4224167777], + [1768, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [1772, 7, 50, "Performance/RedundantMerge: Use `openid2_args['openid.ns'] = OPENID2_NS` instead of `openid2_args.merge!({ 'openid.ns' => OPENID2_NS })`.", 4214599334], + [1772, 28, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [1772, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [1772, 54, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [1777, 37, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2346531819], + [1777, 50, 5, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 165548477], + [1778, 37, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 798169870], + [1778, 48, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3716925445], + [1781, 45, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1645991854], + [1782, 45, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3782363013], + [1785, 37, 11, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2352250024], + [1785, 50, 5, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 165548477], + [1786, 37, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 798169870], + [1786, 48, 7, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3716925445], + [1789, 45, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1645991854], + [1790, 45, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3782363013], + [1794, 47, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1853815741], + [1802, 30, 105, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 746386304], + [1802, 79, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [1803, 31, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4213211961], + [1803, 57, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2088344197], + [1803, 63, 19, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 1429796060], + [1804, 30, 10, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4014237853], + [1805, 7, 63, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal((0 <= difference and difference <= slop), error_message)`?", 3963220444], + [1805, 7, 63, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3963220444], + [1809, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1813, 20, 35, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1824413564], + [1813, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [1813, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1814, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1816, 34, 15, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2229823993], + [1817, 34, 26, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 962187699], + [1820, 18, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [1822, 7, 33, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('session_type'))`.", 2880155552], + [1822, 24, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [1823, 7, 32, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('enc_mac_key'))`.", 3913805801], + [1823, 24, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [1824, 7, 37, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('dh_server_public'))`.", 2922919089], + [1824, 24, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [1831, 9, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [1832, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [1832, 26, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [1833, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2423346872], + [1833, 32, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1834, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [1834, 9, 40, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1684518507], + [1834, 34, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [1837, 9, 28, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 535788335], + [1840, 7, 36, "Minitest/RefuteFalse: Prefer using `refute(@request.message.is_openid1)`.", 3154563632], + [1842, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1846, 20, 35, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1824413564], + [1846, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [1846, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1847, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1854, 18, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [1857, 20, 41, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1889742477], + [1857, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [1857, 46, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [1858, 7, 32, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('enc_mac_key'))`.", 3913805801], + [1858, 24, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [1859, 7, 37, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('dh_server_public'))`.", 2922919089], + [1859, 24, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [1863, 53, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [1867, 20, 35, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1824413564], + [1867, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [1867, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [1868, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1875, 18, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1359404130], + [1877, 7, 33, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('session_type'))`.", 2880155552], + [1877, 24, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [1878, 7, 32, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('enc_mac_key'))`.", 3913805801], + [1878, 24, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1001558037], + [1879, 7, 37, "Minitest/RefuteFalse: Prefer using `refute(rfg.call('dh_server_public'))`.", 2922919089], + [1879, 24, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2061968077], + [1883, 23, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2805116231], + [1884, 22, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473548801], + [1885, 17, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4166457512], + [1891, 46, 7, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1236122734], + [1892, 46, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3850065743], + [1893, 46, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2460005620], + [1895, 7, 56, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1289540685], + [1895, 20, 42, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1496559517], + [1895, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [1895, 44, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [1896, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [1897, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [1898, 29, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [1902, 17, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4166457512], + [1910, 7, 56, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1289540685], + [1910, 20, 42, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1496559517], + [1910, 29, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [1910, 44, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3832253317], + [1911, 27, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [1912, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [1913, 27, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [1927, 26, 9, "Lint/InheritException: Inherit from `RuntimeError` instead of `Exception`.", 3513723378], + [1935, 44, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155264792], + [1941, 22, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1078711837], + [1950, 7, 45, "Minitest/AssertEqual: Prefer using `assert_equal(@server.decode_request({}), 'BOGUS')`.", 267032484], + [1950, 7, 45, "Minitest/AssertOperator: Prefer using `assert_operator(@server.decode_request({}), :==, 'BOGUS')`.", 267032484], + [1950, 7, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 267032484], + [1950, 44, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3913868777], + [1955, 7, 47, "Minitest/AssertEqual: Prefer using `assert_equal(@server.encode_response(nil), 'BOGUS')`.", 3999292625], + [1955, 7, 47, "Minitest/AssertOperator: Prefer using `assert_operator(@server.encode_response(nil), :==, 'BOGUS')`.", 3999292625], + [1955, 7, 47, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3999292625], + [1955, 46, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3913868777], + [1965, 22, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1078711837], + [1975, 7, 133, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(response.fields.has_key?(OPENID_NS, 'assoc_handle'), format('No assoc_handle here: %s', response.fields.inspect))`?", 254076116], + [1975, 7, 133, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 254076116], + [1975, 14, 51, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4132079924], + [1975, 50, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1976, 14, 59, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2383368192], + [1976, 21, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1666878602], + [1989, 38, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [1989, 38, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1167825989], + [1990, 38, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [1990, 38, 40, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1684518507], + [1990, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [1991, 36, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [1996, 7, 52, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 622821975], + [1996, 50, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [1997, 50, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [1998, 7, 60, "Minitest/RefuteFalse: Prefer using `refute(response.fields.has_key?(OPENID_NS, 'assoc_handle'))`.", 684966742], + [1998, 51, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [1999, 7, 58, "Minitest/RefuteFalse: Prefer using `refute(response.fields.has_key?(OPENID_NS, 'assoc_type'))`.", 777279812], + [1999, 51, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [2000, 7, 60, "Minitest/RefuteFalse: Prefer using `refute(response.fields.has_key?(OPENID_NS, 'session_type'))`.", 2763726903], + [2000, 51, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [2011, 38, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [2011, 38, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1167825989], + [2012, 38, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [2012, 38, 40, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1684518507], + [2012, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [2013, 36, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2018, 50, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1182861117], + [2019, 50, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1835655055], + [2020, 7, 60, "Minitest/RefuteFalse: Prefer using `refute(response.fields.has_key?(OPENID_NS, 'assoc_handle'))`.", 684966742], + [2020, 51, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [2022, 20, 48, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 801272662], + [2022, 20, 82, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 4246418257], + [2022, 55, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2380346415], + [2023, 20, 13, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2821943524], + [2023, 20, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [2024, 20, 50, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2441041093], + [2024, 20, 82, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 4256606889], + [2024, 55, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [2025, 20, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4043085327], + [2025, 20, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [2033, 9, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2312539617], + [2034, 9, 60, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 445439980], + [2034, 70, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [2035, 9, 60, "Layout/MultilineOperationIndentation: Use 2 (not 0) spaces for indenting an expression in an assignment spanning multiple lines.", 1038136246], + [2035, 9, 60, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1038136246], + [2035, 70, 1, "Style/LineEndConcatenation: Use `\\` instead of `+` or `<<` to concatenate those strings.", 177550], + [2036, 9, 58, "Layout/MultilineOperationIndentation: Use 2 (not 0) spaces for indenting an expression in an assignment spanning multiple lines.", 1906966423], + [2036, 9, 58, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906966423], + [2038, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2423346872], + [2038, 32, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2821943524], + [2039, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1705139659], + [2039, 9, 36, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2556715042], + [2039, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4043085327], + [2045, 7, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2802604567], + [2045, 50, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [2053, 40, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 434188188], + [2053, 40, 33, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 628459612], + [2053, 40, 33, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 628459612], + [2053, 58, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 809518918], + [2054, 38, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2063, 38, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3847714639], + [2063, 38, 25, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1167825989], + [2063, 38, 25, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1167825989], + [2064, 36, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2072, 46, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 982539632], + [2072, 57, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3639645159], + [2078, 7, 55, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1203256796], + [2078, 50, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1807068342], + [2105, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2362601682], + [2108, 37, 2, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 5859267], + [2108, 41, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4223563293], + [2109, 37, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3514803799], + [2109, 37, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3514803799], + [2109, 37, 22, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 2016962611], + [2109, 47, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 389098948], + [2109, 47, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [2115, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [2115, 52, 19, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1588894046], + [2115, 61, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2153529083], + [2116, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [2116, 61, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2076224418], + [2117, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91662155], + [2117, 52, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2660026475], + [2117, 61, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2066826790], + [2118, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2120, 7, 103, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 154944688], + [2121, 45, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [2122, 9, 12, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 4223563293], + [2124, 20, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1060697917], + [2124, 20, 99, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 558623656], + [2124, 56, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [2125, 20, 33, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2136464438], + [2125, 20, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2136464438], + [2126, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [2136, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [2136, 52, 19, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1588894046], + [2136, 61, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2153529083], + [2137, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [2137, 61, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2076224418], + [2138, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91662155], + [2138, 61, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2066826790], + [2139, 52, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [2139, 52, 18, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2290219986], + [2140, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2142, 58, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [2143, 7, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1143552350], + [2145, 7, 13, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 878153131], + [2146, 20, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1060697917], + [2146, 20, 102, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 1886253753], + [2146, 56, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [2147, 20, 36, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 17446759], + [2147, 20, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 17446759], + [2148, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [2169, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2362601682], + [2172, 37, 3, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 193347049], + [2172, 42, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4223563293], + [2173, 37, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3514803799], + [2173, 37, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3514803799], + [2173, 37, 22, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 2016962611], + [2173, 47, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 389098948], + [2173, 47, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [2175, 7, 58, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 652078742], + [2180, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [2180, 52, 19, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1588894046], + [2180, 61, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2153529083], + [2181, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [2181, 61, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2076224418], + [2182, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91662155], + [2182, 52, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2660026475], + [2182, 61, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2066826790], + [2183, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2189, 62, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [2190, 7, 24, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2113131453], + [2191, 7, 40, "Minitest/AssertOperator: Prefer using `assert_operator(new_assoc_handle, :!=, assoc_handle)`.", 2268621849], + [2191, 7, 40, "Minitest/RefuteEqual: Prefer using `refute_equal(new_assoc_handle, assoc_handle)`.", 2268621849], + [2194, 45, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [2195, 9, 12, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 4223563293], + [2198, 20, 45, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1060697917], + [2198, 20, 117, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 4121085072], + [2198, 56, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [2199, 20, 51, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1699424398], + [2199, 20, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1699424398], + [2200, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [2203, 7, 117, "Minitest/RefuteFalse: Prefer using `refute(@store.get_association(@_normal_key, assoc_handle), 'expired association is still retrievable.')`.", 1906554596], + [2203, 14, 51, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1770632148], + [2204, 14, 43, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4009043344], + [2204, 14, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4009043344], + [2208, 7, 63, "Minitest/RefuteFalse: Prefer using `refute(@store.get_association(@_normal_key, new_assoc_handle))`.", 2711960116], + [2215, 22, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3288157002], + [2220, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [2220, 52, 19, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1588894046], + [2220, 61, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2153529083], + [2221, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [2221, 61, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2076224418], + [2222, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91662155], + [2222, 52, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2660026475], + [2222, 61, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2066826790], + [2223, 50, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2226, 62, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [2227, 7, 24, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2113131453], + [2228, 7, 40, "Minitest/AssertOperator: Prefer using `assert_operator(new_assoc_handle, :!=, assoc_handle)`.", 2268621849], + [2228, 7, 40, "Minitest/RefuteEqual: Prefer using `refute_equal(new_assoc_handle, assoc_handle)`.", 2268621849], + [2231, 45, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 329410673], + [2232, 9, 12, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 4223563293], + [2236, 9, 106, "Minitest/LiteralAsActualArgument: Replace the literal with the first argument.", 3543859408], + [2236, 45, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3666757975], + [2237, 9, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1699424398], + [2237, 9, 51, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 1699424398], + [2239, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [2243, 7, 63, "Minitest/RefuteFalse: Prefer using `refute(@store.get_association(@_normal_key, new_assoc_handle))`.", 2711960116], + [2248, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 668783355], + [2250, 27, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3514803799], + [2250, 37, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [2256, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2420271828], + [2256, 41, 21, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3704097798], + [2256, 57, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [2257, 41, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2797927162], + [2257, 59, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3292828309], + [2258, 41, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [2259, 41, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [2259, 60, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 712681677], + [2260, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [2260, 41, 46, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 217854155], + [2260, 57, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3276329890], + [2261, 39, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2264, 7, 16, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 113966816], + [2269, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 668783355], + [2271, 27, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3514803799], + [2271, 37, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [2277, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2420271828], + [2277, 41, 21, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 3704097798], + [2277, 57, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [2278, 41, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2797927162], + [2278, 59, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3292828309], + [2279, 41, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [2280, 41, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1399592960], + [2280, 60, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 712681677], + [2281, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [2281, 41, 51, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 308883591], + [2281, 57, 35, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 359760974], + [2282, 39, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2286, 7, 17, "Minitest/RefuteFalse: Prefer using `refute(verified)`.", 111313281], + [2290, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 668783355], + [2292, 41, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [2292, 41, 14, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1152280913], + [2292, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [2293, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1024168013], + [2293, 52, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3292828309], + [2294, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [2294, 41, 46, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2107883130], + [2294, 57, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3523724947], + [2295, 39, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2302, 7, 16, "Minitest/RefuteFalse: Prefer using `refute(verified)`.", 651274144], + [2302, 7, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 651274144], + [2307, 22, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 668783355], + [2309, 27, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3514803799], + [2309, 37, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [2315, 41, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [2315, 41, 14, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 1152280913], + [2315, 50, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [2316, 41, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1024168013], + [2316, 52, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3292828309], + [2317, 41, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2419595695], + [2317, 41, 46, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2898652270], + [2317, 57, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1134463943], + [2318, 39, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [2325, 7, 16, "Minitest/RefuteFalse: Prefer using `refute(verified)`.", 651274144], + [2325, 7, 16, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 651274144], + [2331, 7, 12, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2186388042], + [2331, 7, 12, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2186388042], + [2332, 7, 39, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1039400969], + [2341, 7, 13, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1777349675], + [2341, 7, 13, "Minitest/RefuteFalse: Prefer using `refute(assoc)`.", 1777349675], + [2341, 7, 13, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1777349675], + [2345, 12, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 712109411], + [2346, 7, 86, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4146724539], + [2355, 7, 96, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4126768778], + [2369, 7, 95, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 916032897], + [2377, 7, 92, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 619629903], + [2384, 22, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2249265357], + [2385, 43, 8, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 308967862], + [2385, 53, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4223563293], + [2386, 43, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3514803799], + [2386, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3514803799], + [2386, 53, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 389098948], + [2386, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [2396, 22, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4137206568], + [2397, 43, 2, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 5859267], + [2397, 47, 12, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4223563293], + [2398, 43, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3514803799], + [2398, 43, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3514803799], + [2398, 53, 11, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 389098948], + [2398, 53, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [2403, 9, 13, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 878153131], + [2405, 9, 13, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 878153131], + [2408, 9, 14, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 168107178], + [2408, 9, 14, "Minitest/RefuteFalse: Prefer using `refute(assoc)`.", 168107178], + [2417, 44, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1920394204], + [2421, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [2421, 22, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [2421, 22, 28, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 4045751462], + [2421, 39, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3996287345], + [2422, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2423346872], + [2422, 22, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1275492858], + [2422, 45, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [2422, 56, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [2427, 7, 24, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3115487756], + [2428, 42, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1473517757], + [2429, 7, 15, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1326264429], + [2430, 38, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 309987210], + [2431, 7, 32, "Minitest/AssertKindOf: Prefer using `assert_kind_of(Association, assoc)`.", 2131418342], + [2431, 7, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2131418342], + [2433, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [2433, 24, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2562976305], + [2433, 24, 32, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 4224167777], + [2433, 41, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [2434, 24, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 966247324], + [2434, 46, 36, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3344704839], + [2435, 24, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1325864746], + [2436, 24, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2749623588], + [2436, 24, 38, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1066996387], + [2436, 45, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3044246337], + [2436, 62, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [2443, 20, 47, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1883560664], + [2444, 20, 44, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4262693787], + [2444, 58, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088] + ], + "test/test_sreg.rb:2999362992": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2456996725], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [4, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1480177078], + [10, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [10, 23, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2955010254], + [11, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 152993488], + [11, 23, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4042102324], + [12, 9, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 289239021], + [12, 22, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085166211], + [13, 9, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 595520346], + [13, 21, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337160], + [14, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1875033617], + [14, 23, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2227488217], + [15, 9, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1168115721], + [15, 20, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3749288336], + [16, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91538572], + [16, 18, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1793132933], + [17, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 746505975], + [17, 9, 21, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3444242356], + [17, 23, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1166730981], + [29, 71, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3644585460], + [35, 11, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1330659053], + [35, 11, 40, "Minitest/RefuteFalse: Prefer using `refute(OpenID.supports_sreg?(endpoint))`.", 1330659053], + [41, 11, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1686046188], + [47, 11, 39, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1686046188], + [86, 11, 55, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 294353057], + [86, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [93, 11, 55, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 294353057], + [93, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [101, 11, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2584293208], + [112, 17, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3180118021], + [121, 37, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [121, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [126, 37, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 450853529], + [126, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [133, 11, 32, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2584293208], + [138, 13, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2365872934], + [138, 32, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [139, 13, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3804494721], + [139, 13, 24, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1820838699], + [139, 32, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91538572], + [144, 24, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [144, 58, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [145, 24, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91538572], + [145, 53, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [150, 9, 226, "Minitest/MultipleAssertions: Test case has too many assertions [4/3].", 1634880331], + [152, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.optional)`.", 3242013049], + [152, 11, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3242013049], + [153, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.required)`.", 3195688350], + [158, 9, 343, "Minitest/MultipleAssertions: Test case has too many assertions [4/3].", 1213780446], + [159, 30, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [159, 44, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 595520346], + [159, 55, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1851272583], + [159, 72, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906237766], + [160, 11, 38, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1601583142], + [160, 25, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 595520346], + [161, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [162, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1851272583], + [163, 24, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906237766], + [167, 55, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1167539968], + [171, 47, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [171, 48, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3804494721], + [171, 67, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [171, 77, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [176, 73, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035579718], + [178, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [182, 47, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [182, 48, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2741767349], + [182, 48, 23, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2812331419], + [183, 48, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3804494721], + [183, 48, 29, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1489233706], + [183, 67, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [183, 77, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [187, 11, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2270989676], + [188, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [196, 11, 21, "Minitest/AssertNil: Prefer using `assert_nil(sreg_req)`.", 2463252966], + [196, 11, 21, "Minitest/AssertPredicate: Prefer using `assert_predicate(sreg_req, :nil?)`.", 2463252966], + [196, 11, 21, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2463252966], + [206, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [206, 38, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1190059743], + [206, 49, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1387958103], + [206, 56, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [211, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [211, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [211, 52, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1387958103], + [211, 59, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [212, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.required)`.", 3195688350], + [212, 11, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3195688350], + [218, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [218, 40, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [218, 54, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1387958103], + [218, 61, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [224, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [224, 38, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 771425937], + [224, 54, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1851272583], + [224, 69, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [225, 11, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 174024167], + [225, 24, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1851272583], + [230, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [230, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [230, 52, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [230, 54, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [231, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.required)`.", 3195688350], + [231, 11, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3195688350], + [236, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [236, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [236, 52, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [236, 54, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [237, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.optional)`.", 3242013049], + [237, 11, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3242013049], + [242, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [242, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [242, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [242, 62, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [243, 11, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2304684113], + [243, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [248, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [248, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [248, 52, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 428249261], + [248, 68, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [249, 11, 46, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1791581903], + [254, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [254, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [254, 52, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1621107057], + [254, 73, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [255, 11, 46, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1791581903], + [261, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [261, 40, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [261, 54, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1621107057], + [261, 75, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [267, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [267, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [267, 52, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [267, 64, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [267, 78, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [267, 88, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [268, 11, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1975268086], + [268, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [269, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.optional)`.", 3242013049], + [275, 39, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [275, 40, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [275, 54, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [275, 66, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [275, 80, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [275, 90, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [281, 37, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [281, 38, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [281, 52, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 428249261], + [281, 70, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [281, 84, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 208865524], + [281, 102, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [282, 11, 46, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1791581903], + [288, 11, 42, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.all_requested_fields)`.", 3400286999], + [288, 11, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3400286999], + [289, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [290, 11, 52, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2401452671], + [290, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [291, 29, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 595520346], + [293, 11, 44, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2404840490], + [298, 11, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1127897652], + [298, 11, 35, "Minitest/RefuteFalse: Prefer using `refute(req.were_fields_requested?)`.", 1127897652], + [299, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [300, 11, 34, "Minitest/AssertPredicate: Prefer using `assert_predicate(req, :were_fields_requested?)`.", 3464281237], + [300, 11, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3464281237], + [305, 11, 78, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4241815295], + [306, 13, 23, "Minitest/RefuteFalse: Prefer using `refute(req.member?(f))`.", 1475778823], + [308, 11, 38, "Minitest/RefuteFalse: Prefer using `refute(req.member?('something else'))`.", 2154492310], + [308, 31, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 608256210], + [309, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [310, 11, 100, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2917560751], + [311, 31, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [315, 9, 887, "Minitest/MultipleAssertions: Test case has too many assertions [8/3].", 1558236157], + [319, 11, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2557981070], + [320, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.required)`.", 3195688350], + [324, 11, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2557981070], + [325, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.required)`.", 3195688350], + [331, 11, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 529143329], + [335, 11, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1420022121], + [336, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.optional)`.", 3242013049], + [341, 61, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [344, 9, 977, "Minitest/MultipleAssertions: Test case has too many assertions [10/3].", 2518763395], + [349, 11, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2557981070], + [350, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.required)`.", 3195688350], + [354, 11, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2557981070], + [355, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.required)`.", 3195688350], + [361, 11, 36, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 529143329], + [365, 11, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1420022121], + [366, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.optional)`.", 3242013049], + [370, 11, 34, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1420022121], + [371, 11, 30, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.optional)`.", 3242013049], + [374, 9, 973, "Minitest/MultipleAssertions: Test case has too many assertions [6/3].", 638550010], + [376, 11, 40, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(req.get_extension_args)`.", 1000985471], + [376, 11, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1000985471], + [378, 29, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [379, 11, 66, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 130887290], + [379, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [379, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [379, 40, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [379, 50, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [381, 29, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1168115721], + [382, 11, 72, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 922569594], + [382, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [382, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [382, 40, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 428249261], + [382, 56, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [384, 29, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 595520346], + [385, 11, 121, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2091806121], + [385, 24, 83, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2157819989], + [385, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [385, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [385, 26, 30, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1720650336], + [385, 40, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 428249261], + [386, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [386, 26, 22, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 643742576], + [386, 40, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 595520346], + [386, 48, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [386, 52, 22, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4038980869], + [388, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91538572], + [389, 11, 125, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3984026380], + [389, 24, 87, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3806909520], + [389, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [389, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [389, 26, 30, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1720650336], + [389, 40, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 428249261], + [390, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [390, 26, 26, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1709699829], + [390, 40, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1417962079], + [390, 52, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [390, 56, 22, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 4038980869], + [392, 28, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1851272583], + [393, 11, 206, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1609599414], + [393, 24, 145, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2941687467], + [393, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [393, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1456237387], + [393, 26, 30, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 1720650336], + [393, 40, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 428249261], + [394, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2815981804], + [394, 40, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1417962079], + [395, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 771425937], + [395, 26, 31, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 2158845488], + [395, 42, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1851272583], + [395, 57, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [396, 24, 22, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 4038980869], + [414, 9, 327, "Minitest/MultipleAssertions: Test case has too many assertions [4/3].", 2962377775], + [416, 11, 48, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2798298992], + [418, 36, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415965921], + [419, 11, 42, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(resp2.get_extension_args)`.", 4197771967], + [419, 11, 42, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4197771967], + [420, 24, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 415965921], + [425, 48, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1006179904], + [425, 48, 34, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 832431171], + [425, 48, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 832431171], + [425, 67, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2032452741], + [426, 46, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [429, 11, 46, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(sreg_resp.get_extension_args)`.", 2611074225], + [429, 11, 46, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2611074225], + [434, 48, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2741767349], + [434, 48, 19, "Layout/FirstHashElementIndentation: Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.", 995501594], + [435, 48, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1006179904], + [435, 48, 34, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 832431171], + [435, 67, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2032452741], + [436, 46, 1, "Layout/FirstHashElementIndentation: Indent the right brace the same as the start of the line where the left brace is.", 177624], + [439, 11, 100, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2511310576], + [439, 24, 33, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 4132567560], + [439, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [439, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [439, 40, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2032452741], + [439, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [440, 24, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1671714315], + [448, 55, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1875033617], + [467, 11, 179, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2852956171], + [467, 24, 149, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 798464828], + [467, 25, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [467, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3926355501], + [467, 26, 24, "Layout/FirstHashElementLineBreak: Add a line break before the first element of a multi-line hash.", 2584089893], + [467, 40, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2955010254], + [468, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1168115721], + [468, 37, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3749288336], + [469, 26, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1875033617], + [469, 26, 30, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 3573346894], + [469, 40, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2227488217], + [469, 56, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [469, 60, 14, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2682933314] + ], + "test/test_stores.rb:2848112587": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2055340646], + [3, 9, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3740769632], + [4, 9, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 776966826], + [5, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2754036930], + [6, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [7, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3682152042], + [8, 9, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4191648330], + [14, 25, 64, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3671555844], + [31, 33, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1585570767], + [31, 41, 6, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2158746291], + [31, 49, 17, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 3475663134], + [31, 68, 8, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 308967862], + [32, 33, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 389098948], + [32, 33, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 389098948], + [49, 9, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4157441164], + [53, 28, 6, "Lint/UselessAssignment: Useless assignment to variable - `issued`.", 1645597496], + [70, 50, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [73, 36, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193338589], + [85, 29, 6, "Lint/UselessAssignment: Useless assignment to variable - `issued`.", 1645597496], + [102, 29, 6, "Lint/UselessAssignment: Useless assignment to variable - `issued`.", 1645597496], + [122, 9, 62, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 636138557], + [122, 9, 62, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 636138557], + [143, 9, 11, "Naming/VariableName: Use snake_case for variable names.", 3460325807], + [144, 9, 11, "Naming/VariableName: Use snake_case for variable names.", 3460325804], + [145, 9, 13, "Naming/VariableName: Use snake_case for variable names.", 2369298702], + [146, 9, 13, "Naming/VariableName: Use snake_case for variable names.", 2369298701], + [149, 47, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [149, 52, 11, "Naming/VariableName: Use snake_case for variable names.", 3460325807], + [150, 47, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340532], + [150, 52, 13, "Naming/VariableName: Use snake_case for variable names.", 2369298702], + [151, 47, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340375], + [151, 52, 13, "Naming/VariableName: Use snake_case for variable names.", 2369298701], + [152, 47, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340470], + [152, 52, 11, "Naming/VariableName: Use snake_case for variable names.", 3460325804], + [155, 9, 51, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1311833160], + [155, 34, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 913889614], + [158, 63, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [161, 9, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3919615708], + [165, 9, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4020453642], + [169, 22, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [193, 9, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3941805004], + [193, 56, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1980376218], + [195, 9, 59, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3941806095], + [195, 56, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1980376313], + [197, 9, 62, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2198473742], + [197, 56, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3391383544], + [201, 9, 53, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2500046652], + [205, 9, 73, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2563588008], + [205, 56, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2166337150], + [207, 9, 73, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4238004139], + [207, 56, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3301162013], + [209, 9, 77, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3622967051], + [209, 9, 77, "Minitest/RefuteFalse: Prefer using `refute(@store.use_nonce(server_url, ts, salt), 'recent_nonce after cleanup')`.", 3622967051], + [209, 57, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4135549020], + [219, 15, 32, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 927935107], + [219, 63, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2776133770], + [221, 33, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2776133770], + [225, 23, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1021102922], + [244, 59, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2226988996], + [249, 9, 27, "Style/SingleLineMethods: Avoid single-line method definitions.", 2799721513], + [251, 9, 27, "Style/SingleLineMethods: Avoid single-line method definitions.", 3632166381], + [259, 22, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1771981058], + [260, 47, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [260, 54, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [260, 86, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 908829581], + [275, 52, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211] + ], + "test/test_trustroot.rb:2895934071": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3577044961], + [10, 18, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3035991420], + [11, 7, 15, "Minitest/RefuteFalse: Prefer using `refute(tr.nil?)`.", 1147745530], + [11, 7, 15, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1147745530], + [12, 7, 40, "Minitest/AssertPredicate: Prefer using `assert_predicate(tr, :sane?, [case_, desc].join(' '))`.", 1145678904], + [12, 7, 40, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(tr.sane?, [case_, desc].join(' '))`?", 1145678904], + [12, 7, 40, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1145678904], + [12, 43, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [13, 7, 80, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(OpenID::TrustRoot::TrustRoot.check_sanity(case_), [case_, desc].join(' '))`?", 1177919530], + [13, 7, 80, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1177919530], + [13, 83, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [14, 21, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 506949819], + [15, 7, 41, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(!tr.sane?, [case_, desc].join(' '))`?", 4136225561], + [15, 7, 41, "Minitest/RefuteFalse: Prefer using `refute(tr.sane?, [case_, desc].join(' '))`.", 4136225561], + [15, 7, 41, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4136225561], + [15, 44, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [16, 7, 81, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(!OpenID::TrustRoot::TrustRoot.check_sanity(case_), [case_, desc].join(' '))`?", 1644726603], + [16, 7, 81, "Minitest/RefuteFalse: Prefer using `refute(OpenID::TrustRoot::TrustRoot.check_sanity(case_), [case_, desc].join(' '))`.", 1644726603], + [16, 7, 81, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1644726603], + [16, 84, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [18, 7, 21, "Minitest/AssertNil: Prefer using `assert_nil(tr, case_)`.", 1808805500], + [18, 7, 21, "Minitest/AssertPredicate: Prefer using `assert_predicate(tr, :nil?, case_)`.", 1808805500], + [18, 7, 21, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(tr.nil?, case_)`?", 1808805500], + [18, 7, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1808805500], + [26, 7, 48, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(actual_match, [trust_root, url].join(' '))`?", 399517224], + [26, 7, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 399517224], + [26, 51, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [27, 7, 62, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 938566281], + [29, 7, 79, "Minitest/AssertWithExpectedArgument: Did you mean to use `assert_equal(!actual_match, [expected_match, actual_match, trust_root, url].join(' '))`?", 4098616377], + [29, 7, 79, "Minitest/RefuteFalse: Prefer using `refute(actual_match, [expected_match, actual_match, trust_root, url].join(' '))`.", 4098616377], + [29, 7, 79, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4098616377], + [29, 82, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193339909], + [30, 7, 63, "Minitest/RefuteFalse: Prefer using `refute(OpenID::TrustRoot::TrustRoot.check_url(trust_root, url))`.", 2029795752], + [30, 7, 63, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2029795752], + [35, 27, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1615896449], + [37, 24, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [38, 5, 22, "Minitest/AssertEqual: Prefer using `assert_equal(parts[0], '')`.", 2716163892], + [38, 5, 22, "Minitest/AssertOperator: Prefer using `assert_operator(parts[0], :==, '')`.", 2716163892], + [38, 5, 22, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2716163892], + [38, 24, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [56, 22, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340392], + [57, 5, 20, "Minitest/AssertEqual: Prefer using `assert_equal(gdat[0], '')`.", 2145009671], + [57, 5, 20, "Minitest/AssertOperator: Prefer using `assert_operator(gdat[0], :==, '')`.", 2145009671], + [57, 5, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2145009671], + [57, 5, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2145009671], + [57, 23, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [58, 5, 43, "Minitest/AssertEqual: Prefer using `assert_equal(gdat.length, (grps.length * 2 + 1))`.", 2715707524], + [58, 5, 43, "Minitest/AssertOperator: Prefer using `assert_operator(gdat.length, :==, (grps.length * 2 + 1))`.", 2715707524], + [58, 5, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2715707524], + [61, 31, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085273599], + [63, 7, 75, "Minitest/AssertEqual: Prefer using `assert_equal(cases.length, n.to_i, 'Number of cases differs from header count')`.", 1723977884], + [63, 7, 75, "Minitest/AssertOperator: Prefer using `assert_operator(cases.length, :==, n.to_i, 'Number of cases differs from header count')`.", 1723977884], + [63, 7, 75, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1723977884], + [63, 38, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3606132555], + [65, 29, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 93773192], + [76, 12, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [77, 12, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2901252714], + [78, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1522008324], + [79, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2303936687], + [80, 9, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2303936687], + [80, 24, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1582823735], + [81, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3549711987], + [81, 30, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3970487071], + [82, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2975592545], + [82, 30, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3970487071], + [83, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2482901458], + [83, 26, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2750197722], + [83, 50, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 48147208], + [85, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1582823735], + [85, 28, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1582823735], + [86, 7, 69, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2923696760], + [86, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2482901458], + [86, 26, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3284879288], + [86, 45, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 48147208], + [91, 59, 19, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2696710415], + [92, 59, 9, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 1228896939], + [93, 7, 40, "Minitest/AssertEqual: Prefer using `assert_equal(expected_result, actual_result)`.", 205297942], + [93, 7, 40, "Minitest/AssertOperator: Prefer using `assert_operator(expected_result, :==, actual_result)`.", 205297942], + [93, 7, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 205297942], + [99, 8, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2063294124], + [99, 31, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2063294124], + [100, 8, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2128548441], + [100, 39, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2128548441], + [101, 8, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4094356802], + [101, 35, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4051393215], + [102, 7, 64, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 551179442], + [102, 8, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 675478985], + [102, 39, 31, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4173308980], + [109, 7, 45, "Minitest/AssertEqual: Prefer using `assert_equal(actual_disco_url, expected_disco_url)`.", 1968014039], + [109, 7, 45, "Minitest/AssertOperator: Prefer using `assert_operator(actual_disco_url, :==, expected_disco_url)`.", 1968014039], + [109, 7, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1968014039], + [109, 7, 45, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1968014039] + ], + "test/test_ui.rb:4091247342": [ + [1, 9, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4064536362], + [2, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2920398136], + [3, 9, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1480177078], + [4, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [14, 9, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2785493272], + [15, 9, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2785345648], + [16, 9, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2785733951], + [17, 9, 32, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1703003320], + [17, 22, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085207193], + [19, 32, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [19, 47, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [20, 9, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2686886827], + [20, 9, 31, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2686886827], + [20, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [21, 9, 28, "Minitest/AssertTruthy: Prefer using `assert(req2.icon)`.", 1362226975], + [21, 9, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1362226975], + [22, 9, 31, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 596939450], + [22, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [26, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [27, 9, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2416757017], + [27, 9, 31, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2416757017], + [27, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [32, 9, 28, "Minitest/AssertTruthy: Prefer using `assert(@req.icon)`.", 2955612781], + [32, 9, 28, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2955612781], + [32, 9, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2955612781], + [36, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [37, 9, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3316560968], + [37, 9, 31, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3316560968], + [37, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [41, 9, 41, "Minitest/AssertEmptyLiteral: Prefer using `assert_empty(@req.get_extension_args)`.", 1295939071], + [42, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [43, 9, 60, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4093031381], + [43, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [43, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [43, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [43, 41, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [45, 9, 76, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1507317735], + [45, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [45, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [45, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [45, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3033241998], + [45, 57, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [46, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [47, 9, 95, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 634691472], + [47, 23, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [47, 24, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [47, 34, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [47, 43, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3033241998], + [47, 59, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3030033825], + [47, 69, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [47, 76, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [51, 17, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [51, 18, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [51, 28, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [51, 37, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3033241998], + [51, 53, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3030033825], + [51, 63, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [51, 70, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [52, 9, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 4089830849], + [53, 9, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2416757017], + [53, 9, 31, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2416757017], + [53, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [54, 9, 28, "Minitest/AssertTruthy: Prefer using `assert(@req.icon)`.", 2955612781], + [54, 9, 28, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2955612781], + [55, 9, 31, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3316560968], + [55, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [60, 9, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2785493272], + [60, 9, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2785493272], + [61, 9, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2785345648], + [62, 9, 20, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2785733951], + [67, 11, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3037566118], + [67, 21, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3155239158], + [68, 11, 4, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2085193496], + [69, 11, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304020842], + [70, 11, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1938409204], + [70, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [71, 11, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1934080860], + [72, 11, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1930737395], + [72, 11, 20, "Style/TrailingCommaInArguments: Put a comma after the last parameter of a multiline method call.", 3109612], + [72, 24, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [76, 15, 39, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 893947235], + [77, 9, 30, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 102598425], + [77, 9, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 102598425], + [77, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1379666127], + [78, 9, 27, "Minitest/AssertTruthy: Prefer using `assert(req.icon)`.", 1321818221], + [78, 9, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1321818221], + [79, 9, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1832226568], + [79, 22, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1126375801], + [86, 18, 42, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 127136280], + [87, 9, 18, "Minitest/AssertNil: Prefer using `assert_nil(ui_req)`.", 992518264], + [87, 9, 18, "Minitest/AssertPredicate: Prefer using `assert_predicate(ui_req, :nil?)`.", 992518264], + [87, 9, 18, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 992518264], + [87, 9, 18, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 992518264] + ], + "test/test_urinorm.rb:899800": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2013616931], + [9, 28, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2829148739], + [18, 22, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3022798919], + [22, 11, 11, "Minitest/UselessAssertion: Useless assertion detected.", 3190231601], + [22, 11, 11, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3190231601], + [24, 17, 30, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 332750211], + [28, 9, 45, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3454384294] + ], + "test/test_util.rb:2297142672": [ + [1, 13, 10, "Style/MagicCommentFormat: Prefer lowercase for magic comment values.", 4204254942], + [3, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [4, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [10, 9, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [14, 9, 40, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 836734663], + [14, 46, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [20, 9, 20, "Minitest/AssertEqual: Prefer using `assert_equal(c, decoded)`.", 2324889549], + [20, 9, 20, "Minitest/AssertOperator: Prefer using `assert_operator(c, :==, decoded)`.", 2324889549], + [20, 9, 20, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2324889549], + [25, 8, 18, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 4123576517], + [25, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3023135536], + [26, 8, 24, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 982481670], + [26, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3104405669], + [27, 8, 16, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1583355460], + [27, 9, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3109164129], + [28, 8, 8, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1086927279], + [28, 9, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [28, 13, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [29, 8, 40, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2057197406], + [29, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3076094355], + [30, 8, 29, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2060115669], + [30, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1106478398], + [31, 8, 36, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1340151620], + [32, 8, 40, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 161281496], + [32, 8, 40, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 161281496], + [38, 8, 3, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 193340004], + [38, 8, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340004], + [39, 8, 7, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4095526385], + [39, 8, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4095526385], + [40, 8, 7, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3937192725], + [40, 8, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3937192725], + [41, 8, 6, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2981209306], + [41, 8, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2981209306], + [42, 8, 11, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2612073491], + [42, 8, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2612073491], + [43, 8, 6, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3128219166], + [43, 8, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3128219166], + [43, 8, 6, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3128219166], + [51, 16, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3596550710], + [54, 10, 12, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2253291250], + [54, 10, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2253291250], + [55, 10, 12, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1410766151], + [56, 10, 6, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2172472331], + [56, 10, 6, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2172472331], + [58, 10, 12, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2244395242], + [58, 10, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2244395242], + [59, 10, 12, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1410725895], + [60, 10, 6, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2172472331], + [60, 10, 6, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2172472331], + [62, 10, 10, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 3475357891], + [62, 10, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3475357891], + [63, 10, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1377885840], + [64, 10, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4074797665], + [64, 10, 15, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4074797665], + [64, 19, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3130600772], + [66, 10, 10, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 3466429147], + [66, 10, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3466429147], + [67, 10, 24, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3971542759], + [67, 20, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [67, 21, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [67, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337735], + [67, 31, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [68, 10, 15, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4074797665], + [68, 10, 15, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 4074797665], + [68, 19, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3130600772], + [70, 10, 17, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 72618736], + [70, 10, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 72618736], + [71, 10, 28, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2481453770], + [72, 10, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 153258488], + [72, 10, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 153258488], + [72, 19, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2450781277], + [74, 10, 10, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 54854059], + [74, 10, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 54854059], + [75, 10, 28, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2522886889], + [76, 10, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 153361819], + [76, 10, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 153361819], + [76, 19, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2450821438], + [78, 10, 18, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 447453348], + [78, 10, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 447453348], + [79, 10, 28, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 113763113], + [80, 10, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1883418267], + [80, 10, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 1883418267], + [80, 19, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 530031422], + [82, 10, 18, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2627320731], + [82, 10, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2627320731], + [83, 10, 36, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2124777257], + [83, 20, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [83, 21, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337735], + [83, 28, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337830], + [83, 33, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337892], + [83, 40, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193337735], + [83, 43, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [84, 10, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 153361819], + [84, 10, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 153361819], + [84, 19, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2450821438], + [86, 10, 20, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2366824738], + [86, 10, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2366824738], + [87, 10, 30, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2615274394], + [87, 20, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 592177459], + [88, 10, 24, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 282393078], + [88, 10, 24, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 282393078], + [88, 19, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 592177459], + [90, 10, 8, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 130556612], + [90, 10, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 130556612], + [91, 10, 22, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3829525069], + [91, 21, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [91, 26, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340920], + [92, 10, 19, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3524555458], + [92, 10, 19, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3524555458], + [92, 19, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1515392359], + [94, 10, 14, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1565836201], + [94, 10, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1565836201], + [95, 10, 32, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 1194410481], + [95, 21, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4069251607], + [96, 10, 52, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3053137968], + [96, 10, 52, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3053137968], + [96, 19, 43, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1806438261], + [98, 10, 10, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2845764490], + [98, 10, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2845764490], + [99, 10, 38, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2316078574], + [99, 21, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2130532320], + [99, 37, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1715704131], + [100, 10, 31, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3060090017], + [100, 10, 31, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3060090017], + [100, 19, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 54041988], + [102, 10, 12, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2281976081], + [102, 10, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2281976081], + [103, 10, 41, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4239216078], + [103, 20, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 592177459], + [104, 10, 32, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3551795181], + [104, 10, 32, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3551795181], + [104, 19, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3400603432], + [106, 10, 12, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 2281976081], + [106, 10, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2281976081], + [107, 10, 41, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 4239216078], + [107, 20, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 592177459], + [108, 10, 32, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3551795181], + [108, 10, 32, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3551795181], + [108, 19, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3400603432], + [110, 10, 19, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 162171693], + [110, 10, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 162171693], + [111, 10, 46, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 2945152057], + [111, 20, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 592177459], + [111, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [111, 39, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91629388], + [111, 48, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91629388], + [111, 53, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [112, 10, 32, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3551795181], + [112, 10, 32, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3551795181], + [112, 19, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3400603432], + [114, 10, 21, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 510607423], + [114, 10, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 510607423], + [115, 10, 65, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 506486844], + [115, 20, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 592177459], + [115, 38, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [115, 39, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91629388], + [115, 48, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91629388], + [115, 55, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1755174635], + [115, 66, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029764481], + [115, 72, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [116, 10, 43, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3210890748], + [116, 10, 43, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 3210890748], + [116, 19, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1924540761], + [118, 10, 19, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1660976368], + [118, 10, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1660976368], + [119, 10, 68, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 143149722], + [119, 20, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [119, 21, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1387958103], + [119, 32, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1715704131], + [119, 42, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91629388], + [119, 51, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91629388], + [119, 58, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1755174635], + [119, 69, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3029764481], + [119, 75, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [120, 10, 43, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 505843804], + [120, 10, 43, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 505843804], + [120, 19, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1800631417], + [122, 10, 19, "Layout/FirstArrayElementLineBreak: Add a line break before the first element of a multi-line array.", 1954544104], + [122, 10, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1954544104], + [123, 10, 57, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3689911949], + [124, 10, 43, "Layout/ArrayAlignment: Use one level of indentation for elements following the first line of a multi-line array.", 3210890748], + [124, 10, 44, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2880179489], + [124, 19, 34, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1924540761], + [131, 9, 35, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3919615708], + [136, 21, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [136, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91610211], + [136, 31, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91456468], + [136, 36, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [136, 57, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1304859439] + ], + "test/test_xrds.rb:3121506046": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 53893767], + [10, 18, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3997421659], + [11, 21, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 282272535], + [12, 20, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1746319248], + [14, 42, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2414141393], + [27, 9, 17, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3723781485], + [27, 9, 17, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3723781485], + [39, 27, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [46, 9, 40, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2227934859], + [46, 9, 40, "Minitest/RefuteFalse: Prefer using `refute(Yadis.is_xrds?(isnt))`.", 2227934859], + [46, 9, 40, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2227934859], + [47, 9, 32, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1561664952], + [58, 9, 17, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3723781485], + [58, 9, 17, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3723781485], + [59, 9, 31, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2108096054], + [59, 22, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91120491], + [60, 9, 48, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 907377908], + [79, 11, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1819078537], + [79, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3784266648], + [82, 9, 17, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3723781485], + [82, 9, 17, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3723781485], + [83, 9, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2614270702], + [95, 51, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3912890452], + [98, 11, 30, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1819078537], + [98, 24, 9, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3784266648], + [101, 9, 17, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3723781485], + [101, 9, 17, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3723781485], + [102, 9, 21, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 496230409], + [123, 9, 29, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2315410704], + [123, 9, 29, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2315410704], + [125, 9, 43, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1067534810], + [125, 9, 43, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1067534810], + [126, 9, 37, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2323060724], + [126, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2913214279], + [127, 9, 46, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1459537582], + [127, 23, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4129946608], + [127, 36, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4129795847], + [128, 9, 5, "Lint/UselessAssignment: Useless assignment to variable - `types`. Use `_` or `_types` as a variable name to indicate that it won't be used.", 182678350], + [128, 21, 14, "Lint/UselessAssignment: Useless assignment to variable - `result_element`. Use `_` or `_result_element` as a variable name to indicate that it won't be used.", 1272947533], + [129, 9, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2979748629], + [129, 9, 37, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2979748629], + [129, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3194962822], + [130, 9, 5, "Lint/UselessAssignment: Useless assignment to variable - `types`. Use `_` or `_types` as a variable name to indicate that it won't be used.", 182678350], + [130, 21, 14, "Lint/UselessAssignment: Useless assignment to variable - `result_element`. Use `_` or `_result_element` as a variable name to indicate that it won't be used.", 1272947533], + [131, 9, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2096786870], + [131, 9, 37, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2096786870], + [131, 22, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 792835781], + [137, 32, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 91008555], + [138, 9, 56, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 112715029], + [138, 25, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2582233879], + [147, 11, 15, "Style/TrailingCommaInArrayLiteral: Put a comma after the last item of a multiline array.", 2265292785], + [150, 9, 25, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2880394326], + [150, 9, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2880394326], + [151, 9, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2523625686], + [152, 9, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3868208470], + [153, 9, 25, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1485455698], + [161, 54, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 761529858], + [162, 32, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1404598128] + ], + "test/test_xri.rb:3314592255": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2995095577], + [8, 50, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 967220702], + [9, 50, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4130173009], + [10, 50, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2370736898], + [11, 50, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1073776786], + [12, 50, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 356334532], + [13, 50, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3829830982], + [14, 50, 29, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3812144533], + [20, 22, 23, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2138006972], + [20, 22, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2138006972], + [21, 22, 41, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 609747295], + [21, 41, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1860815387], + [26, 22, 21, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3275062427], + [26, 22, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3275062427], + [27, 22, 41, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2145714015], + [27, 41, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3275062427], + [29, 22, 27, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3799693299], + [29, 22, 27, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3799693299], + [30, 22, 45, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 110917897], + [30, 41, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 461125773], + [32, 22, 37, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1056779104], + [32, 22, 37, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1056779104], + [33, 22, 53, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2900639308], + [33, 41, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 904883688], + [39, 22, 16, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1813727572], + [39, 58, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1588688621] + ], + "test/test_xrires.rb:3914469068": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2871107037], + [20, 22, 25, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3500629506], + [22, 24, 41, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 787681545], + [23, 28, 67, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3013271295], + [29, 21, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 500041982], + [30, 29, 11, "Performance/StringIdentifierArgument: Use `:query_url` instead of `'query_url'`.", 3767722427], + [30, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3767722427], + [33, 9, 46, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1084696393], + [33, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 152016609], + [33, 44, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3128219166], + [34, 9, 46, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1155890933], + [34, 44, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3128219166], + [35, 9, 46, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 852736660], + [35, 44, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3128219166], + [37, 9, 62, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2814021296], + [37, 26, 15, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2924150720], + [37, 52, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2171019014], + [38, 9, 54, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 432448237], + [38, 44, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2171019014], + [39, 9, 54, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 713776780], + [39, 44, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2171019014], + [41, 9, 72, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1045616656], + [41, 26, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 799610388], + [41, 57, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 284531666], + [42, 9, 59, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3824273881], + [42, 44, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 284531666], + [43, 9, 59, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2512468504], + [43, 44, 19, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 284531666], + [45, 9, 78, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2899734640], + [45, 26, 23, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3810484397], + [45, 60, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3239081803], + [46, 9, 62, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 285208128], + [46, 44, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3239081803], + [47, 9, 62, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 854815905], + [47, 44, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3239081803], + [50, 20, 47, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1243219811], + [52, 9, 47, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1434789637], + [52, 26, 7, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 152016609], + [52, 44, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3128219166], + [53, 9, 44, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3906225103], + [53, 41, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3128219166], + [59, 21, 33, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 500041982], + [60, 29, 11, "Performance/StringIdentifierArgument: Use `:query_url` instead of `'query_url'`.", 3767722427], + [60, 29, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3767722427], + [63, 9, 56, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3570063273], + [63, 26, 12, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1082638944], + [63, 49, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3286570367], + [64, 9, 51, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 1763884308], + [64, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3286570367], + [65, 9, 51, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 809422165], + [65, 44, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3286570367], + [67, 9, 60, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3488714473], + [67, 26, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2172795392], + [67, 51, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1367347551], + [68, 9, 53, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 95490292], + [68, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1367347551], + [69, 9, 53, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2722534901], + [69, 44, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1367347551] + ], + "test/test_yadis_discovery.rb:2305354371": [ + [1, 9, 18, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1212825145], + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1192794327], + [3, 9, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92337995], + [4, 9, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1906546608], + [5, 9, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2951987467], + [6, 9, 13, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2569813655], + [7, 9, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2855918054], + [16, 5, 438, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1189860280], + [21, 27, 3, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 193340639], + [27, 35, 6, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 2141063537], + [27, 43, 4, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2087730517], + [28, 35, 7, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 643017641], + [40, 9, 5, "Style/InfiniteLoop: Use `Kernel#loop` for infinite loops.", 191284826], + [47, 48, 3, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 193353621], + [47, 53, 2, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 5858789], + [47, 53, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [47, 57, 2, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 5861859], + [48, 48, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 974392568], + [53, 36, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3294717144], + [69, 49, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [72, 11, 17, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3274948509], + [72, 11, 51, "Style/TrailingCommaInHashLiteral: Put a comma after the last item of a multiline hash.", 1017043739], + [72, 41, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 4269826632], + [74, 42, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [82, 15, 28, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3362479006], + [94, 21, 26, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1058932071], + [103, 48, 9, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3673954884], + [104, 48, 11, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3987966091], + [105, 48, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2704914800], + [106, 48, 12, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3363686836], + [107, 48, 8, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 2800676358], + [119, 34, 11, "Performance/StringIdentifierArgument: Use `:ancestors` instead of `'ancestors'`.", 288359141], + [119, 34, 11, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 288359141], + [119, 47, 3, "Style/AndOr: Use `&&` instead of `and`.", 193409806], + [125, 11, 54, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 315198640], + [127, 24, 51, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 1771768602], + [127, 24, 51, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1771768602], + [128, 24, 21, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3188732146], + [128, 47, 24, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2751000549], + [129, 11, 76, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1850137303], + [131, 24, 46, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 3575978222], + [131, 24, 46, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3575978222], + [132, 24, 20, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 808345795], + [132, 46, 23, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2855499892], + [133, 11, 74, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3003744055], + [146, 13, 55, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 4015532116], + [154, 50, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [160, 50, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [160, 55, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside { detected.", 177541], + [160, 56, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1485943929], + [160, 74, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [160, 76, 1, "Layout/SpaceInsideHashLiteralBraces: Space inside } detected.", 177541], + [175, 45, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2174797945], + [176, 33, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2413032521], + [177, 27, 24, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2183207348], + [183, 45, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2174797945], + [184, 51, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2413032521], + [191, 45, 21, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2174797945], + [192, 51, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2413032521], + [193, 31, 22, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 944078397], + [195, 9, 23, "Minitest/RefuteFalse: Prefer using `refute(result.is_xrds)`.", 462657144], + [200, 35, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1868228811], + [201, 11, 31, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 1545761723], + [207, 35, 14, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1868228811], + [208, 11, 37, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 3628297104], + [208, 24, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789] + ], + "test/testutil.rb:1111535143": [ + [1, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1702461967], + [13, 34, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3020570357], + [59, 62, 1, "Layout/LineContinuationSpacing: Use one space in front of backslash.", 177657], + [60, 17, 22, "Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.", 1974406040], + [61, 7, 50, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2614495702], + [79, 12, 27, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 918973603], + [81, 11, 57, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 3543959136], + [110, 13, 20, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 3501475749], + [115, 29, 8, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 1681053474], + [121, 30, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 92008088], + [126, 5, 261, "Style/ClassMethodsDefinitions: Use `class << self` to define a class method.", 1432079004], + [126, 44, 2, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 5858789], + [127, 36, 5, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 94452107], + [127, 56, 6, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 2995304175], + [129, 7, 33, "Style/MethodCallWithArgsParentheses: Use parentheses for method calls with arguments.", 2119277184] + ], + "test/util.rb:3165676623": [ + [2, 9, 10, "Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.", 209039958], + [17, 7, 95, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2974703373], + [17, 20, 14, "Layout/FirstMethodArgumentLineBreak: Add a line break before the first argument of a multi-line method argument list.", 233633100], + [17, 36, 16, "Layout/MultilineMethodArgumentLineBreaks: Each argument in a multi-line method call must start on a separate line.", 2278917617], + [18, 20, 28, "Layout/ArgumentAlignment: Use one level of indentation for arguments following the first line of a multi-line method call.", 3665097354], + [36, 7, 41, "Minitest/EmptyLineBeforeAssertionMethods: Add empty line before assertion.", 2639977785] + ] +} diff --git a/.tool-versions b/.tool-versions index 59511e1d..8649c69a 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -ruby 2.7.8 +ruby 3.2.5 diff --git a/Gemfile b/Gemfile index df13193e..1ab926e0 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,6 @@ -source 'https://rubygems.org' +source "https://rubygems.org" # Specify your gem's dependencies in ruby-openid.gemspec gemspec -gem 'rake' -gem 'byebug' +gem "byebug" diff --git a/Gemfile.lock b/Gemfile.lock index f8d7c71a..b9365624 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -25,13 +25,13 @@ GEM rexml (3.3.6) strscan rspec-block_is_expected (1.0.6) - rubocop (1.64.1) + rubocop (1.65.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) + regexp_parser (>= 2.4, < 3.0) rexml (>= 3.2.5, < 4.0) rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) @@ -50,6 +50,11 @@ GEM version_gem (>= 1.1.2, < 3) rubocop-md (1.2.2) rubocop (>= 1.0) + rubocop-minitest (0.36.0) + rubocop (>= 1.61, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) + rubocop-packaging (0.5.2) + rubocop (>= 1.33, < 2.0) rubocop-performance (1.21.1) rubocop (>= 1.48.1, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) @@ -68,10 +73,10 @@ GEM rubocop-thread_safety (0.5.1) rubocop (>= 0.90.0) ruby-progressbar (1.13.0) - standard (1.37.0) + standard (1.40.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) - rubocop (~> 1.64.0) + rubocop (~> 1.65.0) standard-custom (~> 1.0.0) standard-performance (~> 1.4) standard-custom (1.0.2) @@ -92,17 +97,20 @@ GEM webrick (1.8.1) PLATFORMS - arm64-darwin-22 arm64-darwin-23 + ruby DEPENDENCIES byebug minitest (>= 5) - rake + rake (>= 13) rexml (~> 3.2) rubocop-lts (~> 18.2, >= 18.2.1) + rubocop-minitest (~> 0.36) + rubocop-packaging (~> 0.5, >= 0.5.2) ruby-openid! + standard (>= 1.35.1) webrick (~> 1.8) BUNDLED WITH - 2.4.22 + 2.5.18 diff --git a/Rakefile b/Rakefile old mode 100644 new mode 100755 index cd74a42a..090b39a5 --- a/Rakefile +++ b/Rakefile @@ -3,12 +3,21 @@ require 'bundler/gem_tasks' require 'rake/testtask' -desc "Run tests" +desc 'Run tests' Rake::TestTask.new('test') do |t| t.libs << 'lib' t.libs << 'test' - t.test_files = FileList["test/**/test_*.rb"] + t.test_files = FileList['test/**/test_*.rb'] t.verbose = false end -task :default => :test +begin + require 'rubocop/lts' + Rubocop::Lts.install_tasks +rescue LoadError + task(:rubocop_gradual) do + warn('RuboCop (Gradual) is disabled') + end +end + +task default: %i[test rubocop_gradual] diff --git a/admin/mkassoc b/admin/mkassoc old mode 100644 new mode 100755 index 0c839c01..71b6fed6 --- a/admin/mkassoc +++ b/admin/mkassoc @@ -1,11 +1,11 @@ #!/usr/bin/env ruby -require "openid/consumer/associationmanager" -require "openid/store/memory" +require 'openid/consumer/associationmanager' +require 'openid/store/memory' store = OpenID::Store::Memory.new ARGV.each do |server_url| - unless URI::regexp =~ server_url + unless URI::DEFAULT_PARSER.make_regexp =~ server_url puts "`#{server_url}` will be skipped for invalid URI format." next end diff --git a/bin/bundle b/bin/bundle index 42c7fd7c..50da5fdf 100755 --- a/bin/bundle +++ b/bin/bundle @@ -27,7 +27,7 @@ m = Module.new do bundler_version = nil update_index = nil ARGV.each_with_index do |a, i| - if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN + if update_index && update_index.succ == i && a.match?(Gem::Version::ANCHORED_VERSION_PATTERN) bundler_version = a end next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ diff --git a/examples/README.md b/examples/README.md index 71a2aeac..f416e326 100644 --- a/examples/README.md +++ b/examples/README.md @@ -18,7 +18,7 @@ cd rails_openid Open a web browser to http://localhost:3000/ and follow the instructions. The relevant code to work from when writing your Rails OpenID Relying -Party is: +Party is: rails_openid/app/controllers/consumer_controller.rb @@ -26,12 +26,12 @@ If you are working on an OpenID provider, check out rails_openid/app/controllers/server_controller.rb -Since the library and examples are Apache-licensed, don't be shy about +Since the library and examples are Apache-licensed, don't be shy about copy-and-paste. ## Rails ActiveRecord OpenIDStore plugin For various reasons you may want or need to deploy your ruby openid -consumer/server using an SQL based store. The `active_record_openid_store` +consumer/server using an SQL based store. The `active_record_openid_store` is a plugin that makes using an SQL based store simple. Follow the README inside the plugin's dir for usage. diff --git a/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb b/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb index 28f980f1..72fb1502 100644 --- a/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb +++ b/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb @@ -1,24 +1,24 @@ # Use this migration to create the tables for the ActiveRecord store class AddOpenIdStoreToDb < ActiveRecord::Migration def self.up - create_table "open_id_associations", :force => true do |t| - t.column "server_url", :string, :null => false - t.column "handle", :string, :null => false - t.column "secret", :binary, :null => false - t.column "issued", :integer, :null => false - t.column "lifetime", :integer, :null => false - t.column "assoc_type", :string, :null => false + create_table 'open_id_associations', force: true do |t| + t.column 'server_url', :string, null: false + t.column 'handle', :string, null: false + t.column 'secret', :binary, null: false + t.column 'issued', :integer, null: false + t.column 'lifetime', :integer, null: false + t.column 'assoc_type', :string, null: false end - create_table "open_id_nonces", :force => true do |t| - t.column :server_url, :string, :null => false - t.column :timestamp, :integer, :null => false - t.column :salt, :string, :null => false + create_table 'open_id_nonces', force: true do |t| + t.column :server_url, :string, null: false + t.column :timestamp, :integer, null: false + t.column :salt, :string, null: false end end def self.down - drop_table "open_id_associations" - drop_table "open_id_nonces" + drop_table 'open_id_associations' + drop_table 'open_id_nonces' end end diff --git a/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb b/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb index 273d285b..ef24195f 100644 --- a/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb +++ b/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb @@ -2,25 +2,25 @@ # to the new 2.0 schema. class UpgradeOpenIdStore < ActiveRecord::Migration def self.up - drop_table "open_id_settings" - drop_table "open_id_nonces" - create_table "open_id_nonces", :force => true do |t| - t.column :server_url, :string, :null => false - t.column :timestamp, :integer, :null => false - t.column :salt, :string, :null => false + drop_table 'open_id_settings' + drop_table 'open_id_nonces' + create_table 'open_id_nonces', force: true do |t| + t.column :server_url, :string, null: false + t.column :timestamp, :integer, null: false + t.column :salt, :string, null: false end end def self.down - drop_table "open_id_nonces" - create_table "open_id_nonces", :force => true do |t| - t.column "nonce", :string - t.column "created", :integer + drop_table 'open_id_nonces' + create_table 'open_id_nonces', force: true do |t| + t.column 'nonce', :string + t.column 'created', :integer end - create_table "open_id_settings", :force => true do |t| - t.column "setting", :string - t.column "value", :binary + create_table 'open_id_settings', force: true do |t| + t.column 'setting', :string + t.column 'value', :binary end end end diff --git a/examples/active_record_openid_store/lib/association.rb b/examples/active_record_openid_store/lib/association.rb index 09eda8b5..e432a178 100644 --- a/examples/active_record_openid_store/lib/association.rb +++ b/examples/active_record_openid_store/lib/association.rb @@ -7,4 +7,3 @@ def from_record OpenID::Association.new(handle, secret, Time.at(issued), lifetime, assoc_type) end end - diff --git a/examples/active_record_openid_store/lib/open_id_setting.rb b/examples/active_record_openid_store/lib/open_id_setting.rb index 030e4c25..dd968e42 100644 --- a/examples/active_record_openid_store/lib/open_id_setting.rb +++ b/examples/active_record_openid_store/lib/open_id_setting.rb @@ -1,4 +1,3 @@ class OpenIdSetting < ActiveRecord::Base - validates_uniqueness_of :setting end diff --git a/examples/active_record_openid_store/lib/openid_ar_store.rb b/examples/active_record_openid_store/lib/openid_ar_store.rb index c2436744..a6bf6c61 100644 --- a/examples/active_record_openid_store/lib/openid_ar_store.rb +++ b/examples/active_record_openid_store/lib/openid_ar_store.rb @@ -5,53 +5,53 @@ # not in OpenID module to avoid namespace conflict class ActiveRecordStore < OpenID::Store::Interface def store_association(server_url, assoc) - remove_association(server_url, assoc.handle) - Association.create!(:server_url => server_url, - :handle => assoc.handle, - :secret => assoc.secret, - :issued => assoc.issued.to_i, - :lifetime => assoc.lifetime, - :assoc_type => assoc.assoc_type) + remove_association(server_url, assoc.handle) + Association.create!(server_url: server_url, + handle: assoc.handle, + secret: assoc.secret, + issued: assoc.issued.to_i, + lifetime: assoc.lifetime, + assoc_type: assoc.assoc_type) end - def get_association(server_url, handle=nil) + def get_association(server_url, handle = nil) assocs = if handle.blank? - Association.find_all_by_server_url(server_url) - else - Association.find_all_by_server_url_and_handle(server_url, handle) - end + Association.find_all_by_server_url(server_url) + else + Association.find_all_by_server_url_and_handle(server_url, handle) + end + + if assocs.any? + assocs.reverse.each do |assoc| + a = assoc.from_record + return a unless a.expires_in.zero? - assocs.reverse.each do |assoc| - a = assoc.from_record - if a.expires_in == 0 assoc.destroy - else - return a end - end if assocs.any? - - return nil + end + + nil end - + def remove_association(server_url, handle) Association.delete_all(['server_url = ? AND handle = ?', server_url, handle]) > 0 end - + def use_nonce(server_url, timestamp, salt) return false if Nonce.find_by_server_url_and_timestamp_and_salt(server_url, timestamp, salt) return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew - Nonce.create!(:server_url => server_url, :timestamp => timestamp, :salt => salt) - return true + + Nonce.create!(server_url: server_url, timestamp: timestamp, salt: salt) + true end - + def cleanup_nonces now = Time.now.to_i - Nonce.delete_all(["timestamp > ? OR timestamp < ?", now + OpenID::Nonce.skew, now - OpenID::Nonce.skew]) + Nonce.delete_all(['timestamp > ? OR timestamp < ?', now + OpenID::Nonce.skew, now - OpenID::Nonce.skew]) end def cleanup_associations now = Time.now.to_i - Association.delete_all(['issued + lifetime < ?',now]) + Association.delete_all(['issued + lifetime < ?', now]) end - end diff --git a/examples/active_record_openid_store/test/store_test.rb b/examples/active_record_openid_store/test/store_test.rb index 8e1986c6..38563d51 100644 --- a/examples/active_record_openid_store/test/store_test.rb +++ b/examples/active_record_openid_store/test/store_test.rb @@ -1,12 +1,12 @@ $:.unshift(File.dirname(__FILE__) + '/../lib') require 'test/unit' -RAILS_ENV = "test" +RAILS_ENV = 'test' require File.expand_path(File.join(File.dirname(__FILE__), '../../../../config/environment.rb')) module StoreTestCase @@allowed_handle = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' - @@allowed_nonce = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - + @@allowed_nonce = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + def _gen_nonce OpenID::CryptUtil.random_string(8, @@allowed_nonce) end @@ -15,18 +15,18 @@ def _gen_handle(n) OpenID::CryptUtil.random_string(n, @@allowed_handle) end - def _gen_secret(n, chars=nil) + def _gen_secret(n, chars = nil) OpenID::CryptUtil.random_string(n, chars) end - def _gen_assoc(issued, lifetime=600) + def _gen_assoc(issued, lifetime = 600) secret = _gen_secret(20) handle = _gen_handle(128) OpenID::Association.new(handle, secret, Time.now + issued, lifetime, - 'HMAC-SHA1') + 'HMAC-SHA1') end - - def _check_retrieve(url, handle=nil, expected=nil) + + def _check_retrieve(url, handle = nil, expected = nil) ret_assoc = @store.get_association(url, handle) if expected.nil? @@ -44,8 +44,8 @@ def _check_remove(url, handle, expected) end def test_store - server_url = "http://www.myopenid.com/openid" - assoc = _gen_assoc(issued=0) + server_url = 'http://www.myopenid.com/openid' + assoc = _gen_assoc(0) # Make sure that a missing association returns no result _check_retrieve(server_url) @@ -77,7 +77,7 @@ def test_store @store.store_association(server_url, assoc) # More recent and expires after assoc - assoc2 = _gen_assoc(issued=1) + assoc2 = _gen_assoc(1) @store.store_association(server_url, assoc2) # After storing an association with a different handle, but the @@ -94,7 +94,7 @@ def test_store # More recent, and expires earlier than assoc2 or assoc. Make sure # that we're picking the one with the latest issued date and not # taking into account the expiration. - assoc3 = _gen_assoc(issued=2, lifetime=100) + assoc3 = _gen_assoc(2, 100) @store.store_association(server_url, assoc3) _check_retrieve(server_url, nil, assoc3) @@ -130,83 +130,77 @@ def test_store _check_remove(server_url, assoc.handle, false) _check_remove(server_url, assoc3.handle, false) - assocValid1 = _gen_assoc(-3600, 7200) - assocValid2 = _gen_assoc(-5) - assocExpired1 = _gen_assoc(-7200, 3600) - assocExpired2 = _gen_assoc(-7200, 3600) + assoc_valid_1 = _gen_assoc(-3600, 7200) + assoc_valid_2 = _gen_assoc(-5) + assoc_expired_1 = _gen_assoc(-7200, 3600) + assoc_expired_2 = _gen_assoc(-7200, 3600) @store.cleanup_associations - @store.store_association(server_url + '1', assocValid1) - @store.store_association(server_url + '1', assocExpired1) - @store.store_association(server_url + '2', assocExpired2) - @store.store_association(server_url + '3', assocValid2) + @store.store_association(server_url + '1', assoc_valid_1) + @store.store_association(server_url + '1', assoc_expired_1) + @store.store_association(server_url + '2', assoc_expired_2) + @store.store_association(server_url + '3', assoc_valid_2) - cleaned = @store.cleanup_associations() - assert_equal(2, cleaned, "cleaned up associations") + cleaned = @store.cleanup_associations + assert_equal(2, cleaned, 'cleaned up associations') end - def _check_use_nonce(nonce, expected, server_url, msg='') - stamp, salt = OpenID::Nonce::split_nonce(nonce) + def _check_use_nonce(nonce, expected, server_url, msg = '') + stamp, salt = OpenID::Nonce.split_nonce(nonce) actual = @store.use_nonce(server_url, stamp, salt) assert_equal(expected, actual, msg) end def test_nonce - server_url = "http://www.myopenid.com/openid" - [server_url, ''].each{|url| - nonce1 = OpenID::Nonce::mk_nonce + server_url = 'http://www.myopenid.com/openid' + [server_url, ''].each do |url| + nonce1 = OpenID::Nonce.mk_nonce - _check_use_nonce(nonce1, true, url, "#{url}: nonce allowed by default") - _check_use_nonce(nonce1, false, url, "#{url}: nonce not allowed twice") + _check_use_nonce(nonce1, true, url, "#{url}: nonce allowed by default") + _check_use_nonce(nonce1, false, url, "#{url}: nonce not allowed twice") _check_use_nonce(nonce1, false, url, "#{url}: nonce not allowed third time") - + # old nonces shouldn't pass - old_nonce = OpenID::Nonce::mk_nonce(3600) + old_nonce = OpenID::Nonce.mk_nonce(3600) _check_use_nonce(old_nonce, false, url, "Old nonce #{old_nonce.inspect} passed") - - } + end now = Time.now.to_i - old_nonce1 = OpenID::Nonce::mk_nonce(now - 20000) - old_nonce2 = OpenID::Nonce::mk_nonce(now - 10000) - recent_nonce = OpenID::Nonce::mk_nonce(now - 600) + old_nonce1 = OpenID::Nonce.mk_nonce(now - 20_000) + old_nonce2 = OpenID::Nonce.mk_nonce(now - 10_000) + recent_nonce = OpenID::Nonce.mk_nonce(now - 600) orig_skew = OpenID::Nonce.skew OpenID::Nonce.skew = 0 - count = @store.cleanup_nonces - OpenID::Nonce.skew = 1000000 - ts, salt = OpenID::Nonce::split_nonce(old_nonce1) - assert(@store.use_nonce(server_url, ts, salt), "oldnonce1") - ts, salt = OpenID::Nonce::split_nonce(old_nonce2) - assert(@store.use_nonce(server_url, ts, salt), "oldnonce2") - ts, salt = OpenID::Nonce::split_nonce(recent_nonce) - assert(@store.use_nonce(server_url, ts, salt), "recent_nonce") - - + @store.cleanup_nonces + OpenID::Nonce.skew = 1_000_000 + ts, salt = OpenID::Nonce.split_nonce(old_nonce1) + assert(@store.use_nonce(server_url, ts, salt), 'oldnonce1') + ts, salt = OpenID::Nonce.split_nonce(old_nonce2) + assert(@store.use_nonce(server_url, ts, salt), 'oldnonce2') + ts, salt = OpenID::Nonce.split_nonce(recent_nonce) + assert(@store.use_nonce(server_url, ts, salt), 'recent_nonce') + OpenID::Nonce.skew = 1000 cleaned = @store.cleanup_nonces assert_equal(2, cleaned, "Cleaned #{cleaned} nonces") - OpenID::Nonce.skew = 100000 - ts, salt = OpenID::Nonce::split_nonce(old_nonce1) - assert(@store.use_nonce(server_url, ts, salt), "oldnonce1 after cleanup") - ts, salt = OpenID::Nonce::split_nonce(old_nonce2) - assert(@store.use_nonce(server_url, ts, salt), "oldnonce2 after cleanup") - ts, salt = OpenID::Nonce::split_nonce(recent_nonce) - assert(!@store.use_nonce(server_url, ts, salt), "recent_nonce after cleanup") + OpenID::Nonce.skew = 100_000 + ts, salt = OpenID::Nonce.split_nonce(old_nonce1) + assert(@store.use_nonce(server_url, ts, salt), 'oldnonce1 after cleanup') + ts, salt = OpenID::Nonce.split_nonce(old_nonce2) + assert(@store.use_nonce(server_url, ts, salt), 'oldnonce2 after cleanup') + ts, salt = OpenID::Nonce.split_nonce(recent_nonce) + assert(!@store.use_nonce(server_url, ts, salt), 'recent_nonce after cleanup') OpenID::Nonce.skew = orig_skew - end end - class TestARStore < Test::Unit::TestCase include StoreTestCase - + def setup @store = ActiveRecordStore.new end - end - diff --git a/examples/discover b/examples/discover index ab985a49..60936b89 100755 --- a/examples/discover +++ b/examples/discover @@ -1,32 +1,29 @@ #!/usr/bin/env ruby -require "openid/consumer/discovery" +require 'openid/consumer/discovery' require 'openid/fetchers' -OpenID::fetcher_use_env_http_proxy +OpenID.fetcher_use_env_http_proxy -$names = [[:server_url, "Server URL "], - [:local_id, "Local ID "], - [:canonical_id, "Canonical ID"], - ] +$names = [[:server_url, 'Server URL '], + [:local_id, 'Local ID '], + [:canonical_id, 'Canonical ID']] -def show_services(user_input, normalized, services) +def show_services(_user_input, normalized, services) puts " Claimed identifier: #{normalized}" if services.empty? - puts " No OpenID services found" + puts ' No OpenID services found' puts else - puts " Discovered services:" + puts ' Discovered services:' n = 0 services.each do |service| n += 1 puts " #{n}." $names.each do |meth, name| val = service.send(meth) - if val - printf(" %s: %s\n", name, val) - end + printf(" %s: %s\n", name, val) if val end - puts " Type URIs:" + puts ' Type URIs:' for type_uri in service.type_uris puts " * #{type_uri}" end @@ -36,12 +33,12 @@ def show_services(user_input, normalized, services) end ARGV.each do |openid_identifier| - puts "=" * 50 + puts '=' * 50 puts "Running discovery on #{openid_identifier}" begin normalized_identifier, services = OpenID.discover(openid_identifier) - rescue OpenID::DiscoveryFailure => why - puts "Discovery failed: #{why.message}" + rescue OpenID::DiscoveryFailure => e + puts "Discovery failed: #{e.message}" puts else show_services(openid_identifier, normalized_identifier, services) diff --git a/examples/rails_openid/Gemfile b/examples/rails_openid/Gemfile index 74f8c786..c44e0efe 100644 --- a/examples/rails_openid/Gemfile +++ b/examples/rails_openid/Gemfile @@ -12,8 +12,8 @@ gem 'json' # Gems used only for assets and not required # in production environments by default. group :assets do - gem 'sass-rails', '~> 3.2.3' gem 'coffee-rails', '~> 3.2.1' + gem 'sass-rails', '~> 3.2.3' # See https://github.com/sstephenson/execjs#readme for more supported runtimes # gem 'therubyracer', :platforms => :ruby @@ -38,4 +38,4 @@ gem 'jquery-rails' # To use debugger # gem 'ruby-debug' -gem 'ruby-openid', :require => 'openid' +gem 'ruby-openid', require: 'openid' diff --git a/examples/rails_openid/Rakefile b/examples/rails_openid/Rakefile old mode 100644 new mode 100755 index 7e99b477..1c4668a5 --- a/examples/rails_openid/Rakefile +++ b/examples/rails_openid/Rakefile @@ -2,6 +2,6 @@ # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. -require File.expand_path('../config/application', __FILE__) +require File.expand_path('config/application', __dir__) RailsOpenid::Application.load_tasks diff --git a/examples/rails_openid/app/controllers/consumer_controller.rb b/examples/rails_openid/app/controllers/consumer_controller.rb index 89c3a273..a6b1502b 100644 --- a/examples/rails_openid/app/controllers/consumer_controller.rb +++ b/examples/rails_openid/app/controllers/consumer_controller.rb @@ -1,6 +1,6 @@ require 'pathname' -require "openid" +require 'openid' require 'openid/extensions/sreg' require 'openid/extensions/pape' require 'openid/store/filesystem' @@ -16,98 +16,91 @@ def start begin identifier = params[:openid_identifier] if identifier.nil? - flash[:error] = "Enter an OpenID identifier" - redirect_to :action => 'index' + flash[:error] = 'Enter an OpenID identifier' + redirect_to action: 'index' return end oidreq = consumer.begin(identifier) rescue OpenID::OpenIDError => e flash[:error] = "Discovery failed for #{identifier}: #{e}" - redirect_to :action => 'index' + redirect_to action: 'index' return end if params[:use_sreg] sregreq = OpenID::SReg::Request.new # required fields - sregreq.request_fields(['email','nickname'], true) + sregreq.request_fields(%w[email nickname], true) # optional fields - sregreq.request_fields(['dob', 'fullname'], false) + sregreq.request_fields(%w[dob fullname], false) oidreq.add_extension(sregreq) oidreq.return_to_args['did_sreg'] = 'y' end if params[:use_pape] papereq = OpenID::PAPE::Request.new papereq.add_policy_uri(OpenID::PAPE::AUTH_PHISHING_RESISTANT) - papereq.max_auth_age = 2*60*60 + papereq.max_auth_age = 2 * 60 * 60 oidreq.add_extension(papereq) oidreq.return_to_args['did_pape'] = 'y' end - if params[:force_post] - oidreq.return_to_args['force_post']='x'*2048 - end - return_to = url_for :action => 'complete', :only_path => false - realm = url_for :action => 'index', :id => nil, :only_path => false - + oidreq.return_to_args['force_post'] = 'x' * 2048 if params[:force_post] + return_to = url_for action: 'complete', only_path: false + realm = url_for action: 'index', id: nil, only_path: false + if oidreq.send_redirect?(realm, return_to, params[:immediate]) redirect_to oidreq.redirect_url(realm, return_to, params[:immediate]) else - render :text => oidreq.html_markup(realm, return_to, params[:immediate], {'id' => 'openid_form'}) + render text: oidreq.html_markup(realm, return_to, params[:immediate], { 'id' => 'openid_form' }) end end def complete - # FIXME - url_for some action is not necessarily the current URL. - current_url = url_for(:action => 'complete', :only_path => false) - parameters = params.reject{|k,v|request.path_parameters[k]} - parameters.reject!{|k,v|%w{action controller}.include? k.to_s} + # FIXME: - url_for some action is not necessarily the current URL. + current_url = url_for(action: 'complete', only_path: false) + parameters = params.reject { |k, _v| request.path_parameters[k] } + parameters.reject! { |k, _v| %w[action controller].include? k.to_s } oidresp = consumer.complete(parameters, current_url) case oidresp.status when OpenID::Consumer::FAILURE - if oidresp.display_identifier - flash[:error] = ("Verification of #{oidresp.display_identifier}"\ - " failed: #{oidresp.message}") - else - flash[:error] = "Verification failed: #{oidresp.message}" - end + flash[:error] = if oidresp.display_identifier + "Verification of #{oidresp.display_identifier}"\ + " failed: #{oidresp.message}" + else + "Verification failed: #{oidresp.message}" + end when OpenID::Consumer::SUCCESS - flash[:success] = ("Verification of #{oidresp.display_identifier}"\ - " succeeded.") + flash[:success] = "Verification of #{oidresp.display_identifier}"\ + ' succeeded.' if params[:did_sreg] sreg_resp = OpenID::SReg::Response.from_success_response(oidresp) - sreg_message = "Simple Registration data was requested" + sreg_message = 'Simple Registration data was requested' if sreg_resp.empty? - sreg_message << ", but none was returned." + sreg_message << ', but none was returned.' else - sreg_message << ". The following data were sent:" - sreg_resp.data.each {|k,v| + sreg_message << '. The following data were sent:' + sreg_resp.data.each do |k, v| sreg_message << "
#{k}: #{v}" - } + end end flash[:sreg_results] = sreg_message end if params[:did_pape] pape_resp = OpenID::PAPE::Response.from_success_response(oidresp) - pape_message = "A phishing resistant authentication method was requested" - if pape_resp.auth_policies.member? OpenID::PAPE::AUTH_PHISHING_RESISTANT - pape_message << ", and the server reported one." - else - pape_message << ", but the server did not report one." - end - if pape_resp.auth_time - pape_message << "
Authentication time: #{pape_resp.auth_time} seconds" - end - if pape_resp.nist_auth_level - pape_message << "
NIST Auth Level: #{pape_resp.nist_auth_level}" - end + pape_message = 'A phishing resistant authentication method was requested' + pape_message << if pape_resp.auth_policies.member? OpenID::PAPE::AUTH_PHISHING_RESISTANT + ', and the server reported one.' + else + ', but the server did not report one.' + end + pape_message << "
Authentication time: #{pape_resp.auth_time} seconds" if pape_resp.auth_time + pape_message << "
NIST Auth Level: #{pape_resp.nist_auth_level}" if pape_resp.nist_auth_level flash[:pape_results] = pape_message end when OpenID::Consumer::SETUP_NEEDED - flash[:alert] = "Immediate request failed - Setup Needed" + flash[:alert] = 'Immediate request failed - Setup Needed' when OpenID::Consumer::CANCEL - flash[:alert] = "OpenID transaction cancelled." - else + flash[:alert] = 'OpenID transaction cancelled.' end - redirect_to :action => 'index' + redirect_to action: 'index' end private @@ -118,6 +111,6 @@ def consumer store = OpenID::Store::Filesystem.new(dir) @consumer = OpenID::Consumer.new(session, store) end - return @consumer + @consumer end end diff --git a/examples/rails_openid/app/controllers/login_controller.rb b/examples/rails_openid/app/controllers/login_controller.rb index ff7c257b..71c2dd68 100644 --- a/examples/rails_openid/app/controllers/login_controller.rb +++ b/examples/rails_openid/app/controllers/login_controller.rb @@ -4,17 +4,16 @@ require 'openid' class LoginController < ApplicationController - layout 'server' def base_url - url_for(:controller => 'login', :action => nil, :only_path => false) + url_for(controller: 'login', action: nil, only_path: false) end def index - response.headers['X-XRDS-Location'] = url_for(:controller => "server", - :action => "idp_xrds", - :only_path => false) + response.headers['X-XRDS-Location'] = url_for(controller: 'server', + action: 'idp_xrds', + only_path: false) @base_url = base_url # just show the login page end @@ -24,22 +23,21 @@ def submit # if we get a user, log them in by putting their username in # the session hash. - unless user.nil? + if user.nil? + flash[:error] = "Sorry, couldn't log you in. Try again." + else session[:username] = user unless user.nil? session[:approvals] = [] flash[:notice] = "Your OpenID URL is #{base_url}user/#{user}

Proceed to step 2 below." - else - flash[:error] = "Sorry, couldn't log you in. Try again." end - - redirect_to :action => 'index' + + redirect_to action: 'index' end def logout # delete the username from the session hash session[:username] = nil session[:approvals] = nil - redirect_to :action => 'index' + redirect_to action: 'index' end - end diff --git a/examples/rails_openid/app/controllers/server_controller.rb b/examples/rails_openid/app/controllers/server_controller.rb index 154e780a..0ef696fe 100644 --- a/examples/rails_openid/app/controllers/server_controller.rb +++ b/examples/rails_openid/app/controllers/server_controller.rb @@ -1,13 +1,12 @@ require 'pathname' -require "openid" -require "openid/consumer/discovery" +require 'openid' +require 'openid/consumer/discovery' require 'openid/extensions/sreg' require 'openid/extensions/pape' require 'openid/store/filesystem' class ServerController < ApplicationController - include ServerHelper include OpenID::Server layout nil @@ -17,19 +16,19 @@ def index oidreq = server.decode_request(params) rescue ProtocolError => e # invalid openid request, so just display a page with an error message - render :text => e.to_s, :status => 500 + render text: e.to_s, status: 500 return end # no openid.mode was given unless oidreq - render :text => "This is an OpenID server endpoint." + render text: 'This is an OpenID server endpoint.' return end oidresp = nil - if oidreq.kind_of?(CheckIDRequest) + if oidreq.is_a?(CheckIDRequest) identity = oidreq.identity @@ -48,7 +47,7 @@ def index if oidresp nil - elsif self.is_authorized(identity, oidreq.trust_root) + elsif is_authorized(identity, oidreq.trust_root) oidresp = oidreq.answer(true, nil, identity) # add the sreg response if requested @@ -57,7 +56,7 @@ def index add_pape(oidreq, oidresp) elsif oidreq.immediate - server_url = url_for :action => 'index' + server_url = url_for action: 'index' oidresp = oidreq.answer(false, server_url) else @@ -69,18 +68,16 @@ def index oidresp = server.handle_request(oidreq) end - self.render_response(oidresp) + render_response(oidresp) end - def show_decision_page(oidreq, message="Do you trust this site with your identity?") + def show_decision_page(oidreq, message = 'Do you trust this site with your identity?') session[:last_oidreq] = oidreq @oidreq = oidreq - if message - flash[:notice] = message - end + flash[:notice] = message if message - render :template => 'server/decide', :layout => 'server' + render template: 'server/decide', layout: 'server' end def user_page @@ -96,35 +93,35 @@ def user_page end # content negotiation failed, so just render the user page - xrds_url = url_for(:controller=>'user',:action=>params[:username])+'/xrds' - identity_page = < - - -

OpenID identity page for #{params[:username]}

- -EOS + xrds_url = url_for(controller: 'user', action: params[:username]) + '/xrds' + identity_page = <<~EOS + + + +

OpenID identity page for #{params[:username]}

+ + EOS # Also add the Yadis location header, so that they don't have # to parse the html unless absolutely necessary. response.headers['X-XRDS-Location'] = xrds_url - render :text => identity_page + render text: identity_page end def user_xrds types = [ - OpenID::OPENID_2_0_TYPE, - OpenID::OPENID_1_0_TYPE, - OpenID::SREG_URI, - ] + OpenID::OPENID_2_0_TYPE, + OpenID::OPENID_1_0_TYPE, + OpenID::SREG_URI + ] render_xrds(types) end def idp_xrds types = [ - OpenID::OPENID_IDP_2_0_TYPE, - ] + OpenID::OPENID_IDP_2_0_TYPE + ] render_xrds(types) end @@ -135,19 +132,19 @@ def decision if params[:yes].nil? redirect_to oidreq.cancel_url - return + nil else id_to_send = params[:id_to_send] identity = oidreq.identity if oidreq.id_select - if id_to_send and id_to_send != "" + if id_to_send and id_to_send != '' session[:username] = id_to_send session[:approvals] = [] identity = url_for_user else - msg = "You must enter a username to in order to send " + - "an identifier to the Relying Party." + msg = 'You must enter a username to in order to send ' + + 'an identifier to the Relying Party.' show_decision_page(oidreq, msg) return end @@ -161,7 +158,7 @@ def decision oidresp = oidreq.answer(true, nil, identity) add_sreg(oidreq, oidresp) add_pape(oidreq, oidresp) - return self.render_response(oidresp) + render_response(oidresp) end end @@ -169,45 +166,46 @@ def decision def server if @server.nil? - server_url = url_for :action => 'index', :only_path => false + server_url = url_for action: 'index', only_path: false dir = Pathname.new(RAILS_ROOT).join('db').join('openid-store') store = OpenID::Store::Filesystem.new(dir) @server = Server.new(store, server_url) end - return @server + @server end def approved(trust_root) return false if session[:approvals].nil? - return session[:approvals].member?(trust_root) + + session[:approvals].member?(trust_root) end def is_authorized(identity_url, trust_root) - return (session[:username] and (identity_url == url_for_user) and self.approved(trust_root)) + (session[:username] and (identity_url == url_for_user) and approved(trust_root)) end def render_xrds(types) - type_str = "" + type_str = '' - types.each { |uri| + types.each do |uri| type_str += "#{uri}\n " - } + end - yadis = < - - - - #{type_str} - #{url_for(:controller => 'server', :only_path => false)} - - - -EOS - - render :text => yadis, :content_type => 'application/xrds+xml' + yadis = <<~EOS + + + + + #{type_str} + #{url_for(controller: 'server', only_path: false)} + + + + EOS + + render text: yadis, content_type: 'application/xrds+xml' end def add_sreg(oidreq, oidresp) @@ -215,6 +213,7 @@ def add_sreg(oidreq, oidresp) sregreq = OpenID::SReg::Request.from_openid_request(oidreq) return if sregreq.nil? + # In a real application, this data would be user-specific, # and the user should be asked for permission to release # it. @@ -231,28 +230,25 @@ def add_sreg(oidreq, oidresp) def add_pape(oidreq, oidresp) papereq = OpenID::PAPE::Request.from_openid_request(oidreq) return if papereq.nil? + paperesp = OpenID::PAPE::Response.new paperesp.nist_auth_level = 0 # we don't even do auth at all! oidresp.add_extension(paperesp) end def render_response(oidresp) - if oidresp.needs_signing - signed_response = server.signatory.sign(oidresp) - end + server.signatory.sign(oidresp) if oidresp.needs_signing web_response = server.encode_response(oidresp) case web_response.code when HTTP_OK - render :text => web_response.body, :status => 200 + render text: web_response.body, status: 200 when HTTP_REDIRECT redirect_to web_response.headers['location'] else - render :text => web_response.body, :status => 400 + render text: web_response.body, status: 400 end end - - end diff --git a/examples/rails_openid/app/helpers/server_helper.rb b/examples/rails_openid/app/helpers/server_helper.rb index 409b2104..128bb530 100644 --- a/examples/rails_openid/app/helpers/server_helper.rb +++ b/examples/rails_openid/app/helpers/server_helper.rb @@ -1,9 +1,5 @@ - module ServerHelper - def url_for_user - url_for :controller => 'user', :action => session[:username] + url_for controller: 'user', action: session[:username] end - end - diff --git a/examples/rails_openid/config.ru b/examples/rails_openid/config.ru index 98c1f406..e548f229 100644 --- a/examples/rails_openid/config.ru +++ b/examples/rails_openid/config.ru @@ -1,4 +1,4 @@ # This file is used by Rack-based servers to start the application. -require ::File.expand_path('../config/environment', __FILE__) +require ::File.expand_path('config/environment', __dir__) run RailsOpenid::Application diff --git a/examples/rails_openid/config/application.rb b/examples/rails_openid/config/application.rb index c8928cb3..a02a34fc 100644 --- a/examples/rails_openid/config/application.rb +++ b/examples/rails_openid/config/application.rb @@ -1,10 +1,10 @@ -require File.expand_path('../boot', __FILE__) +require File.expand_path('boot', __dir__) require 'rails/all' if defined?(Bundler) # If you precompile assets before deploying to production, use this line - Bundler.require(*Rails.groups(:assets => %w(development test))) + Bundler.require(*Rails.groups(assets: %w[development test])) # If you want your assets lazily compiled in production, use this line # Bundler.require(:default, :assets, Rails.env) end @@ -34,7 +34,7 @@ class Application < Rails::Application # config.i18n.default_locale = :de # Configure the default encoding used in templates for Ruby 1.9. - config.encoding = "utf-8" + config.encoding = 'utf-8' # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password] diff --git a/examples/rails_openid/config/boot.rb b/examples/rails_openid/config/boot.rb index 4489e586..24efefdb 100644 --- a/examples/rails_openid/config/boot.rb +++ b/examples/rails_openid/config/boot.rb @@ -1,6 +1,6 @@ require 'rubygems' # Set up gems listed in the Gemfile. -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) -require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) diff --git a/examples/rails_openid/config/environment.rb b/examples/rails_openid/config/environment.rb index 15c64627..bdd82113 100644 --- a/examples/rails_openid/config/environment.rb +++ b/examples/rails_openid/config/environment.rb @@ -1,5 +1,5 @@ # Load the rails application -require File.expand_path('../application', __FILE__) +require File.expand_path('application', __dir__) # Initialize the rails application RailsOpenid::Application.initialize! diff --git a/examples/rails_openid/config/environments/test.rb b/examples/rails_openid/config/environments/test.rb index 3642e38e..94978a74 100644 --- a/examples/rails_openid/config/environments/test.rb +++ b/examples/rails_openid/config/environments/test.rb @@ -9,7 +9,7 @@ # Configure static asset server for tests with Cache-Control for performance config.serve_static_assets = true - config.static_cache_control = "public, max-age=3600" + config.static_cache_control = 'public, max-age=3600' # Log error messages when you accidentally call methods on nil config.whiny_nils = true @@ -22,7 +22,7 @@ config.action_dispatch.show_exceptions = false # Disable request forgery protection in test environment - config.action_controller.allow_forgery_protection = false + config.action_controller.allow_forgery_protection = false # Tell Action Mailer not to deliver emails to the real world. # The :test delivery method accumulates sent emails in the diff --git a/examples/rails_openid/config/initializers/session_store.rb b/examples/rails_openid/config/initializers/session_store.rb index 2a000ee0..29b9c860 100644 --- a/examples/rails_openid/config/initializers/session_store.rb +++ b/examples/rails_openid/config/initializers/session_store.rb @@ -1,6 +1,6 @@ # Be sure to restart your server when you modify this file. -RailsOpenid::Application.config.session_store :cookie_store, :key => '_rails_openid_session' +RailsOpenid::Application.config.session_store :cookie_store, key: '_rails_openid_session' # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information diff --git a/examples/rails_openid/config/initializers/wrap_parameters.rb b/examples/rails_openid/config/initializers/wrap_parameters.rb index da4fb076..999df201 100644 --- a/examples/rails_openid/config/initializers/wrap_parameters.rb +++ b/examples/rails_openid/config/initializers/wrap_parameters.rb @@ -5,7 +5,7 @@ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. ActiveSupport.on_load(:action_controller) do - wrap_parameters :format => [:json] + wrap_parameters format: [:json] end # Disable root element in JSON by default. diff --git a/examples/rails_openid/config/routes.rb b/examples/rails_openid/config/routes.rb index 2499c7ad..7939fa73 100644 --- a/examples/rails_openid/config/routes.rb +++ b/examples/rails_openid/config/routes.rb @@ -1,17 +1,16 @@ RailsOpenid::Application.routes.draw do - root :controller => 'login', :action => :index - match 'server/xrds', :controller => 'server', :action => 'idp_xrds' - match 'user/:username', :controller => 'server', :action => 'user_page' - match 'user/:username/xrds', :controller => 'server', :action => 'user_xrds' + root controller: 'login', action: :index + match 'server/xrds', controller: 'server', action: 'idp_xrds' + match 'user/:username', controller: 'server', action: 'user_page' + match 'user/:username/xrds', controller: 'server', action: 'user_xrds' # Allow downloading Web Service WSDL as a file with an extension # instead of a file named 'wsdl' - match ':controller/service.wsdl', :action => 'wsdl' + match ':controller/service.wsdl', action: 'wsdl' # Install the default route as the lowest priority. match ':controller/:action/:id' - # The priority is based upon order of creation: # first created -> highest priority. diff --git a/examples/rails_openid/public/dispatch.fcgi b/examples/rails_openid/public/dispatch.fcgi old mode 100644 new mode 100755 index d02c35b8..66bd9255 --- a/examples/rails_openid/public/dispatch.fcgi +++ b/examples/rails_openid/public/dispatch.fcgi @@ -1,6 +1,6 @@ #!/usr/bin/ruby1.8 -#!/usr/local/bin/ruby +# !/usr/local/bin/ruby # # You may specify the path to the FastCGI crash log (a log of unhandled # exceptions which forced the FastCGI instance to exit, great for debugging) @@ -20,7 +20,7 @@ # # Custom log path, normal GC behavior. # RailsFCGIHandler.process! '/var/log/myapp_fcgi_crash.log' # -require File.dirname(__FILE__) + "/../config/environment" +require File.dirname(__FILE__) + '/../config/environment' require 'fcgi_handler' RailsFCGIHandler.process! diff --git a/examples/rails_openid/public/dispatch.rb b/examples/rails_openid/public/dispatch.rb old mode 100644 new mode 100755 index dfe5dc30..09fe7d34 --- a/examples/rails_openid/public/dispatch.rb +++ b/examples/rails_openid/public/dispatch.rb @@ -1,12 +1,12 @@ #!/usr/bin/ruby1.8 -#!/usr/local/bin/ruby +# !/usr/local/bin/ruby -require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT) +require File.dirname(__FILE__) + '/../config/environment' unless defined?(RAILS_ROOT) # If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like: # "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired -require "dispatcher" +require 'dispatcher' ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun) -Dispatcher.dispatch \ No newline at end of file +Dispatcher.dispatch diff --git a/examples/rails_openid/script/rails b/examples/rails_openid/script/rails index f8da2cff..3c234a25 100755 --- a/examples/rails_openid/script/rails +++ b/examples/rails_openid/script/rails @@ -1,6 +1,6 @@ #!/usr/bin/env ruby # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. -APP_PATH = File.expand_path('../../config/application', __FILE__) -require File.expand_path('../../config/boot', __FILE__) +APP_PATH = File.expand_path('../config/application', __dir__) +require File.expand_path('../config/boot', __dir__) require 'rails/commands' diff --git a/examples/rails_openid/test/functional/login_controller_test.rb b/examples/rails_openid/test/functional/login_controller_test.rb index a21d4382..750f1b0d 100644 --- a/examples/rails_openid/test/functional/login_controller_test.rb +++ b/examples/rails_openid/test/functional/login_controller_test.rb @@ -2,7 +2,10 @@ require 'login_controller' # Re-raise errors caught by the controller. -class LoginController; def rescue_action(e) raise e end; end +class LoginController + def rescue_action(e) + raise e + end; end class LoginControllerTest < Test::Unit::TestCase def setup diff --git a/examples/rails_openid/test/functional/server_controller_test.rb b/examples/rails_openid/test/functional/server_controller_test.rb index 7afd69e6..a7ac95db 100644 --- a/examples/rails_openid/test/functional/server_controller_test.rb +++ b/examples/rails_openid/test/functional/server_controller_test.rb @@ -2,7 +2,10 @@ require 'server_controller' # Re-raise errors caught by the controller. -class ServerController; def rescue_action(e) raise e end; end +class ServerController + def rescue_action(e) + raise e + end; end class ServerControllerTest < Test::Unit::TestCase def setup diff --git a/examples/rails_openid/test/test_helper.rb b/examples/rails_openid/test/test_helper.rb index 8bf1192f..5547de1b 100644 --- a/examples/rails_openid/test/test_helper.rb +++ b/examples/rails_openid/test/test_helper.rb @@ -1,5 +1,5 @@ -ENV["RAILS_ENV"] = "test" -require File.expand_path('../../config/environment', __FILE__) +ENV['RAILS_ENV'] = 'test' +require File.expand_path('../config/environment', __dir__) require 'rails/test_help' class ActiveSupport::TestCase diff --git a/gemfiles/coverage.gemfile b/gemfiles/coverage.gemfile new file mode 100644 index 00000000..e8f3763a --- /dev/null +++ b/gemfiles/coverage.gemfile @@ -0,0 +1,10 @@ +git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } + +source "https://rubygems.org" + +# Root Gemfile is only for local development only. It is not loaded on CI. +# On CI we only need the gemspecs' dependencies (including development dependencies). +# Exceptions, if any, will be found in gemfiles/*.gemfile +gem "kettle-soup-cover", "~> 1.0", ">= 1.0.2" + +gemspec path: "../" diff --git a/gemfiles/style.gemfile b/gemfiles/style.gemfile new file mode 100644 index 00000000..827e16b4 --- /dev/null +++ b/gemfiles/style.gemfile @@ -0,0 +1,10 @@ +git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } + +source "https://rubygems.org" + +# Root Gemfile is only for local development only. It is not loaded on CI. +# On CI we only need the gemspecs' dependencies (including development dependencies). +# Exceptions, if any, will be found in gemfiles/*.gemfile +gem "rubocop-packaging", "~> 0.5", ">= 0.5.2" + +gemspec path: "../" diff --git a/gemfiles/vanilla.gemfile b/gemfiles/vanilla.gemfile index b45c4e83..8a3731da 100644 --- a/gemfiles/vanilla.gemfile +++ b/gemfiles/vanilla.gemfile @@ -1,9 +1,9 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } -source "https://rubygems.org" +source 'https://rubygems.org' # Root Gemfile is only for local development only. It is not loaded on CI. # On CI we only need the gemspecs' dependencies (including development dependencies). # Exceptions, if any, will be found in gemfiles/*.gemfile -gemspec path: "../" +gemspec path: '../' diff --git a/lib/hmac/hmac.rb b/lib/hmac/hmac.rb index e8bfa42b..8d96deca 100644 --- a/lib/hmac/hmac.rb +++ b/lib/hmac/hmac.rb @@ -24,23 +24,24 @@ def initialize(algorithm, block_size, output_length, key) end private + def check_status - unless @status == STATUS_INITIALIZED - raise RuntimeError, - "The underlying hash algorithm has not yet been initialized." - end + return if @status == STATUS_INITIALIZED + + raise 'The underlying hash algorithm has not yet been initialized.' end public + def set_key(key) # If key is longer than the block size, apply hash function # to key and use the result as a real key. key = @algorithm.digest(key) if key.size > @block_size key_xor_ipad = "\x36" * @block_size key_xor_opad = "\x5C" * @block_size - for i in 0 .. key.size - 1 - key_xor_ipad[i] ^= key[i] - key_xor_opad[i] ^= key[i] + for i in 0..key.size - 1 + key_xor_ipad[i] ^= key[i] + key_xor_opad[i] ^= key[i] end @key_xor_ipad = key_xor_ipad @key_xor_opad = key_xor_opad @@ -85,28 +86,25 @@ def hexdigest # These two class methods below are safer than using above # instance methods combinatorially because an instance will have # held a key even if it's no longer in use. - def Base.digest(key, text) - begin - hmac = self.new(key) - hmac.update(text) - hmac.digest - ensure - hmac.reset_key - end + def self.digest(key, text) + hmac = new(key) + hmac.update(text) + hmac.digest + ensure + hmac.reset_key end - def Base.hexdigest(key, text) - begin - hmac = self.new(key) - hmac.update(text) - hmac.hexdigest - ensure - hmac.reset_key - end + def self.hexdigest(key, text) + hmac = new(key) + hmac.update(text) + hmac.hexdigest + ensure + hmac.reset_key end private_class_method :new, :digest, :hexdigest end - STATUS_UNDEFINED, STATUS_INITIALIZED = 0, 1 + STATUS_UNDEFINED = 0 + STATUS_INITIALIZED = 1 end diff --git a/lib/openid/association.rb b/lib/openid/association.rb index 136b254c..dff98173 100644 --- a/lib/openid/association.rb +++ b/lib/openid/association.rb @@ -1,15 +1,14 @@ -require "openid/kvform" -require "openid/util" -require "openid/cryptutil" -require "openid/message" +require 'openid/kvform' +require 'openid/util' +require 'openid/cryptutil' +require 'openid/message' module OpenID - def self.get_secret_size(assoc_type) if assoc_type == 'HMAC-SHA1' - return 20 + 20 elsif assoc_type == 'HMAC-SHA256' - return 32 + 32 else raise ArgumentError("Unsupported association type: #{assoc_type}") end @@ -21,34 +20,34 @@ class Association attr_reader :handle, :secret, :issued, :lifetime, :assoc_type FIELD_ORDER = - [:version, :handle, :secret, :issued, :lifetime, :assoc_type,] + %i[version handle secret issued lifetime assoc_type] # Load a serialized Association def self.deserialize(serialized) parsed = Util.kv_to_seq(serialized) - parsed_fields = parsed.map{|k, v| k.to_sym} + parsed_fields = parsed.map { |k, _v| k.to_sym } if parsed_fields != FIELD_ORDER - raise ProtocolError, 'Unexpected fields in serialized association'\ - " (Expected #{FIELD_ORDER.inspect}, got #{parsed_fields.inspect})" + raise ProtocolError, 'Unexpected fields in serialized association'\ + " (Expected #{FIELD_ORDER.inspect}, got #{parsed_fields.inspect})" end version, handle, secret64, issued_s, lifetime_s, assoc_type = - parsed.map {|field, value| value} + parsed.map { |_field, value| value } if version != '2' - raise ProtocolError, "Attempted to deserialize unsupported version "\ + raise ProtocolError, 'Attempted to deserialize unsupported version '\ "(#{parsed[0][1].inspect})" end - self.new(handle, - Util.from_base64(secret64), - Time.at(issued_s.to_i), - lifetime_s.to_i, - assoc_type) + new(handle, + Util.from_base64(secret64), + Time.at(issued_s.to_i), + lifetime_s.to_i, + assoc_type) end # Create an Association with an issued time of now def self.from_expires_in(expires_in, handle, secret, assoc_type) issued = Time.now - self.new(handle, secret, issued, expires_in, assoc_type) + new(handle, secret, issued, expires_in, assoc_type) end def initialize(handle, secret, issued, lifetime, assoc_type) @@ -63,33 +62,31 @@ def initialize(handle, secret, issued, lifetime, assoc_type) # JanRain OpenID libraries. def serialize data = { - :version => '2', - :handle => handle, - :secret => Util.to_base64(secret), - :issued => issued.to_i.to_s, - :lifetime => lifetime.to_i.to_s, - :assoc_type => assoc_type, + version: '2', + handle: handle, + secret: Util.to_base64(secret), + issued: issued.to_i.to_s, + lifetime: lifetime.to_i.to_s, + assoc_type: assoc_type } Util.assert(data.length == FIELD_ORDER.length) - pairs = FIELD_ORDER.map{|field| [field.to_s, data[field]]} - return Util.seq_to_kv(pairs, true) + pairs = FIELD_ORDER.map { |field| [field.to_s, data[field]] } + Util.seq_to_kv(pairs, true) end # The number of seconds until this association expires - def expires_in(now=nil) - if now.nil? - now = Time.now.to_i - else - now = now.to_i - end + def expires_in(now = nil) + now = if now.nil? + Time.now.to_i + else + now.to_i + end time_diff = (issued.to_i + lifetime) - now - if time_diff < 0 - return 0 - else - return time_diff - end + return 0 if time_diff < 0 + + time_diff end # Generate a signature for a sequence of [key, value] pairs @@ -101,7 +98,7 @@ def sign(pairs) when 'HMAC-SHA256' CryptUtil.hmac_sha256(@secret, kv) else - raise ProtocolError, "Association has unknown type: "\ + raise ProtocolError, 'Association has unknown type: '\ "#{assoc_type.inspect}" end end @@ -110,22 +107,20 @@ def sign(pairs) # given message def make_pairs(message) signed = message.get_arg(OPENID_NS, 'signed') - if signed.nil? - raise ProtocolError, 'Missing signed list' - end + raise ProtocolError, 'Missing signed list' if signed.nil? + signed_fields = signed.split(',', -1) data = message.to_post_args - signed_fields.map {|field| [field, data.fetch('openid.'+field,'')] } + signed_fields.map { |field| [field, data.fetch('openid.' + field, '')] } end # Return whether the message's signature passes def check_message_signature(message) message_sig = message.get_arg(OPENID_NS, 'sig') - if message_sig.nil? - raise ProtocolError, "#{message} has no sig." - end + raise ProtocolError, "#{message} has no sig." if message_sig.nil? + calculated_sig = get_message_signature(message) - return CryptUtil.const_eq(calculated_sig, message_sig) + CryptUtil.const_eq(calculated_sig, message_sig) end # Get the signature for this message @@ -135,40 +130,36 @@ def get_message_signature(message) def ==(other) (other.class == self.class and - other.handle == self.handle and - other.secret == self.secret and + other.handle == handle and + other.secret == secret and # The internals of the time objects seemed to differ # in an opaque way when serializing/unserializing. # I don't think this will be a problem. - other.issued.to_i == self.issued.to_i and + other.issued.to_i == issued.to_i and - other.lifetime == self.lifetime and - other.assoc_type == self.assoc_type) + other.lifetime == lifetime and + other.assoc_type == assoc_type) end # Add a signature (and a signed list) to a message. def sign_message(message) - if (message.has_key?(OPENID_NS, 'sig') or - message.has_key?(OPENID_NS, 'signed')) + if message.has_key?(OPENID_NS, 'sig') or + message.has_key?(OPENID_NS, 'signed') raise ArgumentError, 'Message already has signed list or signature' end extant_handle = message.get_arg(OPENID_NS, 'assoc_handle') - if extant_handle and extant_handle != self.handle - raise ArgumentError, "Message has a different association handle" - end + raise ArgumentError, 'Message has a different association handle' if extant_handle and extant_handle != handle - signed_message = message.copy() - signed_message.set_arg(OPENID_NS, 'assoc_handle', self.handle) - message_keys = signed_message.to_post_args.keys() + signed_message = message.copy + signed_message.set_arg(OPENID_NS, 'assoc_handle', handle) + message_keys = signed_message.to_post_args.keys signed_list = [] - message_keys.each { |k| - if k.start_with?('openid.') - signed_list << k[7..-1] - end - } + message_keys.each do |k| + signed_list << k[7..-1] if k.start_with?('openid.') + end signed_list << 'signed' signed_list.sort! @@ -176,7 +167,7 @@ def sign_message(message) signed_message.set_arg(OPENID_NS, 'signed', signed_list.join(',')) sig = get_message_signature(signed_message) signed_message.set_arg(OPENID_NS, 'sig', sig) - return signed_message + signed_message end end @@ -186,23 +177,23 @@ class AssociationNegotiator def self.get_session_types(assoc_type) case assoc_type when 'HMAC-SHA1' - ['DH-SHA1', 'no-encryption'] + %w[DH-SHA1 no-encryption] when 'HMAC-SHA256' - ['DH-SHA256', 'no-encryption'] + %w[DH-SHA256 no-encryption] else raise ProtocolError, "Unknown association type #{assoc_type.inspect}" end end def self.check_session_type(assoc_type, session_type) - if !get_session_types(assoc_type).include?(session_type) - raise ProtocolError, "Session type #{session_type.inspect} not "\ - "valid for association type #{assoc_type.inspect}" - end + return if get_session_types(assoc_type).include?(session_type) + + raise ProtocolError, "Session type #{session_type.inspect} not "\ + "valid for association type #{assoc_type.inspect}" end def initialize(allowed_types) - self.allowed_types=(allowed_types) + self.allowed_types = (allowed_types) end def copy @@ -216,7 +207,7 @@ def allowed_types=(allowed_types) @allowed_types = allowed_types end - def add_allowed_type(assoc_type, session_type=nil) + def add_allowed_type(assoc_type, session_type = nil) if session_type.nil? session_types = self.class.get_session_types(assoc_type) else @@ -238,12 +229,12 @@ def get_allowed_type end DefaultNegotiator = - AssociationNegotiator.new([['HMAC-SHA1', 'DH-SHA1'], - ['HMAC-SHA1', 'no-encryption'], - ['HMAC-SHA256', 'DH-SHA256'], - ['HMAC-SHA256', 'no-encryption']]) + AssociationNegotiator.new([%w[HMAC-SHA1 DH-SHA1], + %w[HMAC-SHA1 no-encryption], + %w[HMAC-SHA256 DH-SHA256], + %w[HMAC-SHA256 no-encryption]]) EncryptedNegotiator = - AssociationNegotiator.new([['HMAC-SHA1', 'DH-SHA1'], - ['HMAC-SHA256', 'DH-SHA256']]) + AssociationNegotiator.new([%w[HMAC-SHA1 DH-SHA1], + %w[HMAC-SHA256 DH-SHA256]]) end diff --git a/lib/openid/consumer.rb b/lib/openid/consumer.rb index 30019492..dc6f40ba 100644 --- a/lib/openid/consumer.rb +++ b/lib/openid/consumer.rb @@ -1,13 +1,13 @@ -require "openid/consumer/idres.rb" -require "openid/consumer/checkid_request.rb" -require "openid/consumer/associationmanager.rb" -require "openid/consumer/responses.rb" -require "openid/consumer/session" -require "openid/consumer/discovery_manager" -require "openid/consumer/discovery" -require "openid/message" -require "openid/yadis/discovery" -require "openid/store/nonce" +require 'openid/consumer/idres' +require 'openid/consumer/checkid_request' +require 'openid/consumer/associationmanager' +require 'openid/consumer/responses' +require 'openid/consumer/session' +require 'openid/consumer/discovery_manager' +require 'openid/consumer/discovery' +require 'openid/message' +require 'openid/yadis/discovery' +require 'openid/store/nonce' module OpenID # OpenID support for Relying Parties (aka Consumers). @@ -219,12 +219,12 @@ def initialize(session, store) # # Raises DiscoveryFailure when no OpenID server can be found for # this URL. - def begin(openid_identifier, anonymous=false) + def begin(openid_identifier, anonymous = false) manager = discovery_manager(openid_identifier) service = manager.get_next_service(&method(:discover)) if service.nil? - raise DiscoveryFailure.new("No usable OpenID services were found "\ + raise DiscoveryFailure.new('No usable OpenID services were found '\ "for #{openid_identifier.inspect}", nil) else begin_without_discovery(service, anonymous) @@ -254,7 +254,7 @@ def begin_without_discovery(service, anonymous) end self.last_requested_endpoint = service - return checkid_request + checkid_request end # Called to interpret the server's response to an OpenID @@ -290,10 +290,8 @@ def complete(query, current_url) end response = meth.call(message, current_url) cleanup_last_requested_endpoint - if [SUCCESS, CANCEL].member?(response.status) - cleanup_session - end - return response + cleanup_session if [SUCCESS, CANCEL].member?(response.status) + response end protected @@ -330,7 +328,6 @@ def cleanup_session discovery_manager(nil).cleanup(true) end - def discover(identifier) OpenID.discover(identifier) end @@ -348,49 +345,45 @@ def handle_idres(message, current_url) IdResHandler.new(message, current_url, @store, last_requested_endpoint) end - def complete_invalid(message, unused_return_to) + def complete_invalid(message, _unused_return_to) mode = message.get_arg(OPENID_NS, 'mode', '') - return FailureResponse.new(last_requested_endpoint, - "Invalid openid.mode: #{mode}") + FailureResponse.new(last_requested_endpoint, + "Invalid openid.mode: #{mode}") end - def complete_cancel(unused_message, unused_return_to) - return CancelResponse.new(last_requested_endpoint) + def complete_cancel(_unused_message, _unused_return_to) + CancelResponse.new(last_requested_endpoint) end - def complete_error(message, unused_return_to) + def complete_error(message, _unused_return_to) error = message.get_arg(OPENID_NS, 'error') contact = message.get_arg(OPENID_NS, 'contact') reference = message.get_arg(OPENID_NS, 'reference') - return FailureResponse.new(last_requested_endpoint, - error, contact, reference) + FailureResponse.new(last_requested_endpoint, + error, contact, reference) end - def complete_setup_needed(message, unused_return_to) - if message.is_openid1 - return complete_invalid(message, nil) - else - setup_url = message.get_arg(OPENID2_NS, 'user_setup_url') - return SetupNeededResponse.new(last_requested_endpoint, setup_url) - end + def complete_setup_needed(message, _unused_return_to) + return complete_invalid(message, nil) if message.is_openid1 + + setup_url = message.get_arg(OPENID2_NS, 'user_setup_url') + SetupNeededResponse.new(last_requested_endpoint, setup_url) end def complete_id_res(message, current_url) if message.is_openid1 setup_url = message.get_arg(OPENID_NS, 'user_setup_url') - if !setup_url.nil? - return SetupNeededResponse.new(last_requested_endpoint, setup_url) - end + return SetupNeededResponse.new(last_requested_endpoint, setup_url) unless setup_url.nil? end begin idres = handle_idres(message, current_url) - rescue OpenIDError => why - return FailureResponse.new(last_requested_endpoint, why.message) + rescue OpenIDError => e + FailureResponse.new(last_requested_endpoint, e.message) else - return SuccessResponse.new(idres.endpoint, message, - idres.signed_fields) + SuccessResponse.new(idres.endpoint, message, + idres.signed_fields) end end end diff --git a/lib/openid/consumer/associationmanager.rb b/lib/openid/consumer/associationmanager.rb index 9ca0f91a..2e594819 100644 --- a/lib/openid/consumer/associationmanager.rb +++ b/lib/openid/consumer/associationmanager.rb @@ -1,37 +1,34 @@ -require "openid/dh" -require "openid/util" -require "openid/kvpost" -require "openid/cryptutil" -require "openid/protocolerror" -require "openid/association" +require 'openid/dh' +require 'openid/util' +require 'openid/kvpost' +require 'openid/cryptutil' +require 'openid/protocolerror' +require 'openid/association' module OpenID class Consumer - # A superclass for implementing Diffie-Hellman association sessions. class DiffieHellmanSession class << self attr_reader :session_type, :secret_size, :allowed_assoc_types, - :hashfunc + :hashfunc end - def initialize(dh=nil) - if dh.nil? - dh = DiffieHellman.from_defaults - end + def initialize(dh = nil) + dh = DiffieHellman.from_defaults if dh.nil? @dh = dh end # Return the query parameters for requesting an association # using this Diffie-Hellman association session def get_request - args = {'dh_consumer_public' => CryptUtil.num_to_base64(@dh.public)} - if (!@dh.using_default_values?) + args = { 'dh_consumer_public' => CryptUtil.num_to_base64(@dh.public) } + unless @dh.using_default_values? args['dh_modulus'] = CryptUtil.num_to_base64(@dh.modulus) args['dh_gen'] = CryptUtil.num_to_base64(@dh.generator) end - return args + args end # Process the response from a successful association request and @@ -42,8 +39,8 @@ def extract_secret(response) enc_mac_key64 = response.get_arg(OPENID_NS, 'enc_mac_key', NO_DEFAULT) dh_server_public = CryptUtil.base64_to_num(dh_server_public64) enc_mac_key = Util.from_base64(enc_mac_key64) - return @dh.xor_secret(self.class.hashfunc, - dh_server_public, enc_mac_key) + @dh.xor_secret(self.class.hashfunc, + dh_server_public, enc_mac_key) end end @@ -71,15 +68,15 @@ class << self attr_reader :session_type, :allowed_assoc_types end @session_type = 'no-encryption' - @allowed_assoc_types = ['HMAC-SHA1', 'HMAC-SHA256'] + @allowed_assoc_types = %w[HMAC-SHA1 HMAC-SHA256] def get_request - return {} + {} end def extract_secret(response) mac_key64 = response.get_arg(OPENID_NS, 'mac_key', NO_DEFAULT) - return Util.from_base64(mac_key64) + Util.from_base64(mac_key64) end end @@ -95,13 +92,13 @@ def self.create_session(session_type) when 'DH-SHA256' DiffieHellmanSHA256Session.new else - raise ArgumentError, "Unknown association session type: "\ + raise ArgumentError, 'Unknown association session type: '\ "#{session_type.inspect}" end end - def initialize(store, server_url, compatibility_mode=false, - negotiator=nil) + def initialize(store, server_url, compatibility_mode = false, + negotiator = nil) @store = store @server_url = server_url @compatibility_mode = compatibility_mode @@ -109,54 +106,51 @@ def initialize(store, server_url, compatibility_mode=false, end def get_association - if @store.nil? - return nil - end + return nil if @store.nil? assoc = @store.get_association(@server_url) if assoc.nil? || assoc.expires_in <= 0 assoc = negotiate_association - if !assoc.nil? - @store.store_association(@server_url, assoc) - end + @store.store_association(@server_url, assoc) unless assoc.nil? end - return assoc + assoc end def negotiate_association assoc_type, session_type = @negotiator.get_allowed_type begin - return request_association(assoc_type, session_type) - rescue ServerError => why - supported_types = extract_supported_association_type(why, assoc_type) - if !supported_types.nil? + request_association(assoc_type, session_type) + rescue ServerError => e + supported_types = extract_supported_association_type(e, assoc_type) + unless supported_types.nil? # Attempt to create an association from the assoc_type and # session_type that the server told us it supported. assoc_type, session_type = supported_types begin - return request_association(assoc_type, session_type) + request_association(assoc_type, session_type) rescue ServerError => why Util.log("Server #{@server_url} refused its suggested " \ "association type: session_type=#{session_type}, " \ "assoc_type=#{assoc_type}") - return nil + nil end end rescue InvalidOpenIDNamespace Util.log("Server #{@server_url} returned a malformed association " \ - "response. Falling back to check_id mode for this request.") - return nil + 'response. Falling back to check_id mode for this request.') + nil end end protected + def extract_supported_association_type(server_error, assoc_type) # Any error message whose code is not 'unsupported-type' should # be considered a total failure. - if (server_error.error_code != 'unsupported-type' or - server_error.message.is_openid1) - Util.log("Server error when requesting an association from "\ + if server_error.error_code != 'unsupported-type' or + server_error.message.is_openid1 + Util.log('Server error when requesting an association from '\ "#{@server_url}: #{server_error.error_text}") return nil end @@ -173,14 +167,14 @@ def extract_supported_association_type(server_error, assoc_type) if assoc_type.nil? or session_type.nil? Util.log("Server #{@server_url} responded with unsupported "\ - "association session but did not supply a fallback.") - return nil + 'association session but did not supply a fallback.') + nil elsif !@negotiator.allowed?(assoc_type, session_type) - Util.log("Server sent unsupported session/association type: "\ + Util.log('Server sent unsupported session/association type: '\ "session_type=#{session_type}, assoc_type=#{assoc_type}") - return nil + nil else - return [assoc_type, session_type] + [assoc_type, session_type] end end @@ -193,19 +187,18 @@ def request_association(assoc_type, session_type) begin response = OpenID.make_kv_post(args, @server_url) - return extract_association(response, assoc_session) - rescue HTTPStatusError => why - Util.log("Got HTTP status error when requesting association: #{why}") - return nil - rescue Message::KeyNotFound => why - Util.log("Missing required parameter in response from "\ - "#{@server_url}: #{why}") - return nil - - rescue ProtocolError => why + extract_association(response, assoc_session) + rescue HTTPStatusError => e + Util.log("Got HTTP status error when requesting association: #{e}") + nil + rescue Message::KeyNotFound => e + Util.log('Missing required parameter in response from '\ + "#{@server_url}: #{e}") + nil + rescue ProtocolError => e Util.log("Protocol error processing response from #{@server_url}: "\ - "#{why}") - return nil + "#{e}") + nil end end @@ -216,23 +209,21 @@ def create_associate_request(assoc_type, session_type) assoc_session = self.class.create_session(session_type) args = { 'mode' => 'associate', - 'assoc_type' => assoc_type, + 'assoc_type' => assoc_type } - if !@compatibility_mode - args['ns'] = OPENID2_NS - end + args['ns'] = OPENID2_NS unless @compatibility_mode # Leave out the session type if we're in compatibility mode # *and* it's no-encryption. if !@compatibility_mode || - assoc_session.class.session_type != 'no-encryption' + assoc_session.class.session_type != 'no-encryption' args['session_type'] = assoc_session.class.session_type end args.merge!(assoc_session.get_request) message = Message.from_openid_args(args) - return assoc_session, message + [assoc_session, message] end # Given an association response message, extract the OpenID 1.X @@ -256,7 +247,7 @@ def get_openid1_session_type(assoc_response) # warning. if session_type == 'no-encryption' Util.log("WARNING: #{@server_url} sent 'no-encryption'"\ - "for OpenID 1.X") + 'for OpenID 1.X') # Missing or empty session type is the way to flag a # 'no-encryption' response. Change the session type to @@ -266,15 +257,14 @@ def get_openid1_session_type(assoc_response) session_type = 'no-encryption' end - return session_type + session_type end def self.extract_expires_in(message) # expires_in should be a base-10 string. expires_in_str = message.get_arg(OPENID_NS, 'expires_in', NO_DEFAULT) - if !(/\A\d+\Z/ =~ expires_in_str) - raise ProtocolError, "Invalid expires_in field: #{expires_in_str}" - end + raise ProtocolError, "Invalid expires_in field: #{expires_in_str}" unless /\A\d+\Z/ =~ expires_in_str + expires_in_str.to_i end @@ -291,16 +281,16 @@ def extract_association(assoc_response, assoc_session) expires_in = self.class.extract_expires_in(assoc_response) # OpenID 1 has funny association session behaviour. - if assoc_response.is_openid1 - session_type = get_openid1_session_type(assoc_response) - else - session_type = assoc_response.get_arg(OPENID2_NS, 'session_type', + session_type = if assoc_response.is_openid1 + get_openid1_session_type(assoc_response) + else + assoc_response.get_arg(OPENID2_NS, 'session_type', NO_DEFAULT) - end + end # Session type mismatch if assoc_session.class.session_type != session_type - if (assoc_response.is_openid1 and session_type == 'no-encryption') + if assoc_response.is_openid1 and session_type == 'no-encryption' # In OpenID 1, any association request can result in a # 'no-encryption' association response. Setting # assoc_session to a new no-encryption session should @@ -311,15 +301,15 @@ def extract_association(assoc_response, assoc_session) # Any other mismatch, regardless of protocol version # results in the failure of the association session # altogether. - raise ProtocolError, "Session type mismatch. Expected "\ + raise ProtocolError, 'Session type mismatch. Expected '\ "#{assoc_session.class.session_type}, got "\ "#{session_type}" end end # Make sure assoc_type is valid for session_type - if !assoc_session.class.allowed_assoc_types.member?(assoc_type) - raise ProtocolError, "Unsupported assoc_type for session "\ + unless assoc_session.class.allowed_assoc_types.member?(assoc_type) + raise ProtocolError, 'Unsupported assoc_type for session '\ "#{assoc_session.class.session_type} "\ "returned: #{assoc_type}" end @@ -329,15 +319,14 @@ def extract_association(assoc_response, assoc_session) # type. begin secret = assoc_session.extract_secret(assoc_response) - rescue Message::KeyNotFound, ArgumentError => why - raise ProtocolError, "Malformed response for "\ + rescue Message::KeyNotFound, ArgumentError => e + raise ProtocolError, 'Malformed response for '\ "#{assoc_session.class.session_type} "\ - "session: #{why.message}" + "session: #{e.message}" end - - return Association.from_expires_in(expires_in, assoc_handle, secret, - assoc_type) + Association.from_expires_in(expires_in, assoc_handle, secret, + assoc_type) end end end diff --git a/lib/openid/consumer/checkid_request.rb b/lib/openid/consumer/checkid_request.rb index 8e1ac12c..dd6021ec 100644 --- a/lib/openid/consumer/checkid_request.rb +++ b/lib/openid/consumer/checkid_request.rb @@ -1,5 +1,5 @@ -require "openid/message" -require "openid/util" +require 'openid/message' +require 'openid/util' module OpenID class Consumer @@ -14,7 +14,7 @@ class Consumer # the authentication request as a URL or as a form POST. class CheckIDRequest attr_accessor :return_to_args, :message - attr_reader :endpoint + attr_reader :endpoint, :anonymous # Users of this library should not create instances of this # class. Instances of this class are created by the library @@ -27,8 +27,6 @@ def initialize(assoc, endpoint) @anonymous = false end - attr_reader :anonymous - # Set whether this request should be made anonymously. If a # request is anonymous, the identifier will not be sent in the # request. This is only useful if you are making another kind of @@ -38,8 +36,8 @@ def initialize(assoc, endpoint) # with OpenID 1. def anonymous=(is_anonymous) if is_anonymous && @message.is_openid1 - raise ArgumentError, ("OpenID1 requests MUST include the "\ - "identifier in the request") + raise ArgumentError, 'OpenID1 requests MUST include the '\ + 'identifier in the request' end @anonymous = is_anonymous end @@ -74,21 +72,20 @@ def add_extension_arg(namespace, key, value) # engage the user before providing a response. This is the # default case, as the user may need to provide credentials or # approve the request before a positive response can be sent. - def get_message(realm, return_to=nil, immediate=false) + def get_message(realm, return_to = nil, immediate = false) if !return_to.nil? return_to = Util.append_args(return_to, @return_to_args) elsif immediate - raise ArgumentError, ('"return_to" is mandatory when using '\ - '"checkid_immediate"') + raise ArgumentError, '"return_to" is mandatory when using '\ + '"checkid_immediate"' elsif @message.is_openid1 - raise ArgumentError, ('"return_to" is mandatory for OpenID 1 '\ - 'requests') + raise ArgumentError, '"return_to" is mandatory for OpenID 1 '\ + 'requests' elsif @return_to_args.empty? - raise ArgumentError, ('extra "return_to" arguments were specified, '\ - 'but no return_to was specified') + raise ArgumentError, 'extra "return_to" arguments were specified, '\ + 'but no return_to was specified' end - message = @message.copy mode = immediate ? 'checkid_immediate' : 'checkid_setup' @@ -97,11 +94,9 @@ def get_message(realm, return_to=nil, immediate=false) realm_key = message.is_openid1 ? 'trust_root' : 'realm' message.set_arg(OPENID_NS, realm_key, realm) - if !return_to.nil? - message.set_arg(OPENID_NS, 'return_to', return_to) - end + message.set_arg(OPENID_NS, 'return_to', return_to) unless return_to.nil? - if not @anonymous + unless @anonymous if @endpoint.is_op_identifier # This will never happen when we're in OpenID 1 # compatibility mode, as long as is_op_identifier() @@ -116,12 +111,10 @@ def get_message(realm, return_to=nil, immediate=false) # This is true for both OpenID 1 and 2 message.set_arg(OPENID_NS, 'identity', request_identity) - if message.is_openid2 - message.set_arg(OPENID2_NS, 'claimed_id', claimed_id) - end + message.set_arg(OPENID2_NS, 'claimed_id', claimed_id) if message.is_openid2 end - if @assoc && (message.is_openid1 || !['checkid_setup', 'checkid_immediate'].include?(mode)) + if @assoc && (message.is_openid1 || !%w[checkid_setup checkid_immediate].include?(mode)) message.set_arg(OPENID_NS, 'assoc_handle', @assoc.handle) assoc_log_msg = "with assocication #{@assoc.handle}" else @@ -130,7 +123,7 @@ def get_message(realm, return_to=nil, immediate=false) Util.log("Generated #{mode} request to #{@endpoint.server_url} "\ "#{assoc_log_msg}") - return message + message end # Returns a URL with an encoded OpenID request. @@ -141,9 +134,9 @@ def get_message(realm, return_to=nil, immediate=false) # # OpenID 2.0 endpoints also accept POST requests, see # 'send_redirect?' and 'form_markup'. - def redirect_url(realm, return_to=nil, immediate=false) + def redirect_url(realm, return_to = nil, immediate = false) message = get_message(realm, return_to, immediate) - return message.to_url(@endpoint.server_url) + message.to_url(@endpoint.server_url) end # Get html for a form to submit this request to the IDP. @@ -152,20 +145,20 @@ def redirect_url(realm, return_to=nil, immediate=false) # tag. 'accept-charset' and 'enctype' have defaults that can be # overridden. If a value is supplied for 'action' or 'method', # it will be replaced. - def form_markup(realm, return_to=nil, immediate=false, - form_tag_attrs=nil) + def form_markup(realm, return_to = nil, immediate = false, + form_tag_attrs = nil) message = get_message(realm, return_to, immediate) - return message.to_form_markup(@endpoint.server_url, form_tag_attrs) + message.to_form_markup(@endpoint.server_url, form_tag_attrs) end # Get a complete HTML document that autosubmits the request to the IDP # with javascript. This method wraps form_markup - see that method's # documentation for help with the parameters. - def html_markup(realm, return_to=nil, immediate=false, - form_tag_attrs=nil) - Util.auto_submit_html(form_markup(realm, - return_to, - immediate, + def html_markup(realm, return_to = nil, immediate = false, + form_tag_attrs = nil) + Util.auto_submit_html(form_markup(realm, + return_to, + immediate, form_tag_attrs)) end @@ -173,13 +166,11 @@ def html_markup(realm, return_to=nil, immediate=false, # redirect or as a POST (form submission)? # # This takes the same parameters as redirect_url or form_markup - def send_redirect?(realm, return_to=nil, immediate=false) - if @endpoint.compatibility_mode - return true - else - url = redirect_url(realm, return_to, immediate) - return url.length <= OPENID1_URL_LIMIT - end + def send_redirect?(realm, return_to = nil, immediate = false) + return true if @endpoint.compatibility_mode + + url = redirect_url(realm, return_to, immediate) + url.length <= OPENID1_URL_LIMIT end end end diff --git a/lib/openid/consumer/discovery.rb b/lib/openid/consumer/discovery.rb index 8cbfb024..7678f5bd 100644 --- a/lib/openid/consumer/discovery.rb +++ b/lib/openid/consumer/discovery.rb @@ -14,7 +14,6 @@ require 'openid/yadis/xrires' module OpenID - OPENID_1_0_NS = 'http://openid.net/xmlns/1.0' OPENID_IDP_2_0_TYPE = 'http://specs.openid.net/auth/2.0/server' OPENID_2_0_TYPE = 'http://specs.openid.net/auth/2.0/signon' @@ -26,16 +25,15 @@ module OpenID # Object representing an OpenID service endpoint. class OpenIDServiceEndpoint - # OpenID service type URIs, listed in order of preference. The # ordering of this list affects yadis and XRI service discovery. OPENID_TYPE_URIS = [ - OPENID_IDP_2_0_TYPE, + OPENID_IDP_2_0_TYPE, - OPENID_2_0_TYPE, - OPENID_1_1_TYPE, - OPENID_1_0_TYPE, - ] + OPENID_2_0_TYPE, + OPENID_1_1_TYPE, + OPENID_1_0_TYPE + ] # the verified identifier. attr_accessor :claimed_id @@ -58,7 +56,7 @@ def initialize def display_identifier return @display_identifier if @display_identifier - return @claimed_id if @claimed_id.nil? + return @claimed_id if @claimed_id.nil? begin parsed_identifier = URI.parse(@claimed_id) @@ -66,28 +64,26 @@ def display_identifier raise ProtocolError, "Claimed identifier #{claimed_id} is not a valid URI" end - return @claimed_id if not parsed_identifier.fragment + return @claimed_id unless parsed_identifier.fragment disp = parsed_identifier disp.fragment = nil - return disp.to_s + disp.to_s end - def display_identifier=(display_identifier) - @display_identifier = display_identifier - end + attr_writer :display_identifier def uses_extension(extension_uri) - return @type_uris.member?(extension_uri) + @type_uris.member?(extension_uri) end def preferred_namespace - if (@type_uris.member?(OPENID_IDP_2_0_TYPE) or - @type_uris.member?(OPENID_2_0_TYPE)) - return OPENID_2_0_MESSAGE_NS + if @type_uris.member?(OPENID_IDP_2_0_TYPE) or + @type_uris.member?(OPENID_2_0_TYPE) + OPENID_2_0_MESSAGE_NS else - return OPENID_1_0_MESSAGE_NS + OPENID_1_0_MESSAGE_NS end end @@ -97,16 +93,16 @@ def supports_type(type_uri) # I consider C{/server} endpoints to implicitly support C{/signon}. ( @type_uris.member?(type_uri) or - (type_uri == OPENID_2_0_TYPE and is_op_identifier()) - ) + (type_uri == OPENID_2_0_TYPE and is_op_identifier) + ) end def compatibility_mode - return preferred_namespace() != OPENID_2_0_MESSAGE_NS + preferred_namespace != OPENID_2_0_MESSAGE_NS end def is_op_identifier - return @type_uris.member?(OPENID_IDP_2_0_TYPE) + @type_uris.member?(OPENID_IDP_2_0_TYPE) end def parse_service(yadis_url, uri, type_uris, service_element) @@ -116,28 +112,28 @@ def parse_service(yadis_url, uri, type_uris, service_element) @server_url = uri @used_yadis = true - if !is_op_identifier() - # XXX: This has crappy implications for Service elements that - # contain both 'server' and 'signon' Types. But that's a - # pathological configuration anyway, so I don't think I care. - @local_id = OpenID.find_op_local_identifier(service_element, - @type_uris) - @claimed_id = yadis_url - end + return if is_op_identifier + + # XXX: This has crappy implications for Service elements that + # contain both 'server' and 'signon' Types. But that's a + # pathological configuration anyway, so I don't think I care. + @local_id = OpenID.find_op_local_identifier(service_element, + @type_uris) + @claimed_id = yadis_url end def get_local_id # Return the identifier that should be sent as the # openid.identity parameter to the server. if @local_id.nil? and @canonical_id.nil? - return @claimed_id + @claimed_id else - return (@local_id or @canonical_id) + (@local_id or @canonical_id) end end def to_session_value - Hash[*(instance_variables.map{|name| [name, instance_variable_get(name)] }.flatten(1))] + Hash[*instance_variables.map { |name| [name, instance_variable_get(name)] }.flatten(1)] end def ==(other) @@ -147,7 +143,7 @@ def ==(other) def self.from_session_value(value) return value unless value.is_a?(Hash) - self.new.tap do |endpoint| + new.tap do |endpoint| value.each do |name, val| endpoint.instance_variable_set(name, val) end @@ -165,17 +161,18 @@ def self.from_basic_service_endpoint(endpoint) # If any Type URIs match and there is an endpoint URI specified, # then this is an OpenID endpoint if (!type_uris.nil? and !type_uris.empty?) and !endpoint.uri.nil? - openid_endpoint = self.new + openid_endpoint = new openid_endpoint.parse_service( - endpoint.yadis_url, - endpoint.uri, - endpoint.type_uris, - endpoint.service_element) + endpoint.yadis_url, + endpoint.uri, + endpoint.type_uris, + endpoint.service_element + ) else openid_endpoint = nil end - return openid_endpoint + openid_endpoint end def self.from_html(uri, html) @@ -185,30 +182,27 @@ def self.from_html(uri, html) # @rtype: [OpenIDServiceEndpoint] discovery_types = [ - [OPENID_2_0_TYPE, 'openid2.provider', 'openid2.local_id'], - [OPENID_1_1_TYPE, 'openid.server', 'openid.delegate'], - ] + [OPENID_2_0_TYPE, 'openid2.provider', 'openid2.local_id'], + [OPENID_1_1_TYPE, 'openid.server', 'openid.delegate'] + ] link_attrs = OpenID.parse_link_attrs(html) services = [] - discovery_types.each { |type_uri, op_endpoint_rel, local_id_rel| - + discovery_types.each do |type_uri, op_endpoint_rel, local_id_rel| op_endpoint_url = OpenID.find_first_href(link_attrs, op_endpoint_rel) - if !op_endpoint_url - next - end + next unless op_endpoint_url - service = self.new + service = new service.claimed_id = uri service.local_id = OpenID.find_first_href(link_attrs, local_id_rel) service.server_url = op_endpoint_url service.type_uris = [type_uri] services << service - } + end - return services + services end def self.from_xrds(uri, xrds) @@ -217,10 +211,10 @@ def self.from_xrds(uri, xrds) # @rtype: [OpenIDServiceEndpoint] # # @raises L{XRDSError}: When the XRDS does not parse. - return Yadis::apply_filter(uri, xrds, self) + Yadis.apply_filter(uri, xrds, self) end - def self.from_discovery_result(discoveryResult) + def self.from_discovery_result(discovery_result) # Create endpoints from a DiscoveryResult. # # @type discoveryResult: L{DiscoveryResult} @@ -228,14 +222,14 @@ def self.from_discovery_result(discoveryResult) # @rtype: list of L{OpenIDServiceEndpoint} # # @raises L{XRDSError}: When the XRDS does not parse. - if discoveryResult.is_xrds() - meth = self.method('from_xrds') - else - meth = self.method('from_html') - end - - return meth.call(discoveryResult.normalized_uri, - discoveryResult.response_text) + meth = if discovery_result.is_xrds + method('from_xrds') + else + method('from_html') + end + + meth.call(discovery_result.normalized_uri, + discovery_result.response_text) end def self.from_op_endpoint_url(op_endpoint_url) @@ -244,17 +238,17 @@ def self.from_op_endpoint_url(op_endpoint_url) # # @param op_endpoint_url: The URL of the endpoint # @rtype: OpenIDServiceEndpoint - service = self.new + service = new service.server_url = op_endpoint_url service.type_uris = [OPENID_IDP_2_0_TYPE] - return service + service end def to_s - return sprintf("<%s server_url=%s claimed_id=%s " + - "local_id=%s canonical_id=%s used_yadis=%s>", - self.class, @server_url, @claimed_id, - @local_id, @canonical_id, @used_yadis) + format('<%s server_url=%s claimed_id=%s ' + + 'local_id=%s canonical_id=%s used_yadis=%s>', + self.class, @server_url, @claimed_id, + @local_id, @canonical_id, @used_yadis) end end @@ -276,55 +270,54 @@ def self.find_op_local_identifier(service_element, type_uris) # Identifier local_id_tags = [] if type_uris.member?(OPENID_1_1_TYPE) or - type_uris.member?(OPENID_1_0_TYPE) + type_uris.member?(OPENID_1_0_TYPE) # local_id_tags << Yadis::nsTag(OPENID_1_0_NS, 'openid', 'Delegate') service_element.add_namespace('openid', OPENID_1_0_NS) - local_id_tags << "openid:Delegate" + local_id_tags << 'openid:Delegate' end if type_uris.member?(OPENID_2_0_TYPE) # local_id_tags.append(Yadis::nsTag(XRD_NS_2_0, 'xrd', 'LocalID')) service_element.add_namespace('xrd', Yadis::XRD_NS_2_0) - local_id_tags << "xrd:LocalID" + local_id_tags << 'xrd:LocalID' end # Walk through all the matching tags and make sure that they all # have the same value local_id = nil - local_id_tags.each { |local_id_tag| - service_element.each_element(local_id_tag) { |local_id_element| + local_id_tags.each do |local_id_tag| + service_element.each_element(local_id_tag) do |local_id_element| if local_id.nil? local_id = local_id_element.text elsif local_id != local_id_element.text format = 'More than one %s tag found in one service element' - message = sprintf(format, local_id_tag) + message = format(format, local_id_tag) raise DiscoveryFailure.new(message, nil) end - } - } + end + end - return local_id + local_id end def self.normalize_xri(xri) # Normalize an XRI, stripping its scheme if present - m = /^xri:\/\/(.*)/.match(xri) + m = %r{^xri://(.*)}.match(xri) xri = m[1] if m - return xri + xri end def self.normalize_url(url) # Normalize a URL, converting normalization failures to # DiscoveryFailure - begin - normalized = URINorm.urinorm(url) - rescue URI::Error => why - raise DiscoveryFailure.new("Error normalizing #{url}: #{why.message}", nil) - else - defragged = URI::parse(normalized) - defragged.fragment = nil - return defragged.normalize.to_s - end + + normalized = URINorm.urinorm(url) + rescue URI::Error => e + raise DiscoveryFailure.new("Error normalizing #{url}: #{e.message}", nil) + else + defragged = URI.parse(normalized) + defragged.fragment = nil + defragged.normalize.to_s end def self.best_matching_service(service, preferred_types) @@ -335,13 +328,11 @@ def self.best_matching_service(service, preferred_types) # a type that comes earlier in the preferred types list come # before service elements that come later. If a service element # has more than one type, the most preferred one wins. - preferred_types.each_with_index { |value, index| - if service.type_uris.member?(value) - return index - end - } + preferred_types.each_with_index do |value, index| + return index if service.type_uris.member?(value) + end - return preferred_types.length + preferred_types.length end def self.arrange_by_type(service_list, preferred_types) @@ -352,19 +343,19 @@ def self.arrange_by_type(service_list, preferred_types) # comparison will prefer the one with the best matching service prio_services = [] - service_list.each_with_index { |s, index| + service_list.each_with_index do |s, index| prio_services << [best_matching_service(s, preferred_types), index, s] - } + end prio_services.sort! # Now that the services are sorted by priority, remove the sort # keys from the list. - (0...prio_services.length).each { |i| + (0...prio_services.length).each do |i| prio_services[i] = prio_services[i][2] - } + end - return prio_services + prio_services end def self.get_op_or_user_services(openid_services) @@ -382,9 +373,9 @@ def self.get_op_or_user_services(openid_services) OpenIDServiceEndpoint::OPENID_TYPE_URIS) if !op_services.empty? - return op_services + op_services else - return openid_services + openid_services end end @@ -394,7 +385,7 @@ def self.discover_yadis(uri) # # @param uri: normalized identity URL # @type uri: str - # + # # @return: (claimed_id, services) # @rtype: (str, list(OpenIDServiceEndpoint)) # @@ -423,7 +414,7 @@ def self.discover_yadis(uri) # if we got the Yadis content-type or followed the Yadis # header, re-fetch the document without following the Yadis # header, with no Accept header. - return self.discover_no_yadis(uri) + return discover_no_yadis(uri) end # Try to parse the response as HTML. @@ -431,85 +422,82 @@ def self.discover_yadis(uri) openid_services = OpenIDServiceEndpoint.from_html(yadis_url, body) end - return [yadis_url, self.get_op_or_user_services(openid_services)] + [yadis_url, get_op_or_user_services(openid_services)] end def self.discover_xri(iname) endpoints = [] - iname = self.normalize_xri(iname) + iname = normalize_xri(iname) begin - canonical_id, services = Yadis::XRI::ProxyResolver.new().query( iname ) + canonical_id, services = Yadis::XRI::ProxyResolver.new.query(iname) - if canonical_id.nil? - raise Yadis::XRDSError.new(sprintf('No CanonicalID found for XRI %s', iname)) - end + raise Yadis::XRDSError.new(format('No CanonicalID found for XRI %s', iname)) if canonical_id.nil? flt = Yadis.make_filter(OpenIDServiceEndpoint) - services.each { |service_element| + services.each do |service_element| endpoints += flt.get_service_endpoints(iname, service_element) - } - rescue Yadis::XRDSError, Yadis::XRI::XRIHTTPError => why - Util.log('xrds error on ' + iname + ': ' + why.to_s) + end + rescue Yadis::XRDSError, Yadis::XRI::XRIHTTPError => e + Util.log('xrds error on ' + iname + ': ' + e.to_s) end - endpoints.each { |endpoint| + endpoints.each do |endpoint| # Is there a way to pass this through the filter to the endpoint # constructor instead of tacking it on after? endpoint.canonical_id = canonical_id endpoint.claimed_id = canonical_id endpoint.display_identifier = iname - } + end # FIXME: returned xri should probably be in some normal form - return [iname, self.get_op_or_user_services(endpoints)] + [iname, get_op_or_user_services(endpoints)] end def self.discover_no_yadis(uri) http_resp = OpenID.fetch(uri) - if http_resp.code != "200" and http_resp.code != "206" + if http_resp.code != '200' and http_resp.code != '206' raise DiscoveryFailure.new( - "HTTP Response status from identity URL host is not \"200\". "\ - "Got status #{http_resp.code.inspect}", http_resp) + 'HTTP Response status from identity URL host is not "200". '\ + "Got status #{http_resp.code.inspect}", http_resp + ) end claimed_id = http_resp.final_url openid_services = OpenIDServiceEndpoint.from_html( - claimed_id, http_resp.body) - return [claimed_id, openid_services] + claimed_id, http_resp.body + ) + [claimed_id, openid_services] end def self.discover_uri(uri) # Hack to work around URI parsing for URls with *no* scheme. - if uri.index("://").nil? - uri = 'http://' + uri - end + uri = 'http://' + uri if uri.index('://').nil? begin - parsed = URI::parse(uri) - rescue URI::InvalidURIError => why - raise DiscoveryFailure.new("URI is not valid: #{why.message}", nil) + parsed = URI.parse(uri) + rescue URI::InvalidURIError => e + raise DiscoveryFailure.new("URI is not valid: #{e.message}", nil) end - if !parsed.scheme.nil? and !parsed.scheme.empty? - if !['http', 'https'].member?(parsed.scheme) - raise DiscoveryFailure.new( - "URI scheme #{parsed.scheme} is not HTTP or HTTPS", nil) - end + if !parsed.scheme.nil? and !parsed.scheme.empty? && !%w[http https].member?(parsed.scheme) + raise DiscoveryFailure.new( + "URI scheme #{parsed.scheme} is not HTTP or HTTPS", nil + ) end - uri = self.normalize_url(uri) - claimed_id, openid_services = self.discover_yadis(uri) - claimed_id = self.normalize_url(claimed_id) - return [claimed_id, openid_services] + uri = normalize_url(uri) + claimed_id, openid_services = discover_yadis(uri) + claimed_id = normalize_url(claimed_id) + [claimed_id, openid_services] end def self.discover(identifier) - if Yadis::XRI::identifier_scheme(identifier) == :xri + if Yadis::XRI.identifier_scheme(identifier) == :xri discover_xri(identifier) else - return discover_uri(identifier) + discover_uri(identifier) end end end diff --git a/lib/openid/consumer/discovery_manager.rb b/lib/openid/consumer/discovery_manager.rb index 7f13709d..b3312ba3 100644 --- a/lib/openid/consumer/discovery_manager.rb +++ b/lib/openid/consumer/discovery_manager.rb @@ -1,6 +1,5 @@ module OpenID class Consumer - # A set of discovered services, for tracking which providers have # been attempted for an OpenID identifier class DiscoveredServices @@ -30,7 +29,7 @@ def empty? end def to_session_value - services = @services.map{|s| s.respond_to?(:to_session_value) ? s.to_session_value : s } + services = @services.map { |s| s.respond_to?(:to_session_value) ? s.to_session_value : s } current_val = @current.respond_to?(:to_session_value) ? @current.to_session_value : @current { @@ -48,11 +47,11 @@ def ==(other) def self.from_session_value(value) return value unless value.is_a?(Hash) - services = value['services'].map{|s| OpenID::OpenIDServiceEndpoint.from_session_value(s) } + services = value['services'].map { |s| OpenID::OpenIDServiceEndpoint.from_session_value(s) } current = OpenID::OpenIDServiceEndpoint.from_session_value(value['current']) - obj = self.new(value['starting_url'], value['yadis_url'], services) - obj.instance_variable_set("@current", current) + obj = new(value['starting_url'], value['yadis_url'], services) + obj.instance_variable_set('@current', current) obj end end @@ -60,7 +59,7 @@ def self.from_session_value(value) # Manages calling discovery and tracking which endpoints have # already been attempted. class DiscoveryManager - def initialize(session, url, session_key_suffix=nil) + def initialize(session, url, session_key_suffix = nil) @url = url @session = OpenID::Consumer::Session.new(session, DiscoveredServices) @@ -86,10 +85,10 @@ def get_next_service service = nil end - return service + service end - def cleanup(force=false) + def cleanup(force = false) manager = get_manager(force) if !manager.nil? service = manager.current @@ -97,37 +96,32 @@ def cleanup(force=false) else service = nil end - return service + service end protected - def get_manager(force=false) + def get_manager(force = false) manager = load - if force || manager.nil? || manager.for_url?(@url) - return manager - else - return nil - end + return manager if force || manager.nil? || manager.for_url?(@url) + + nil end def create_manager(yadis_url, services) manager = get_manager - if !manager.nil? - raise StandardError, "There is already a manager for #{yadis_url}" - end - if services.empty? - return nil - end + raise StandardError, "There is already a manager for #{yadis_url}" unless manager.nil? + return nil if services.empty? + manager = DiscoveredServices.new(@url, yadis_url, services) store(manager) - return manager + manager end - def destroy_manager(force=false) - if !get_manager(force).nil? - destroy! - end + def destroy_manager(force = false) + return if get_manager(force).nil? + + destroy! end def session_key diff --git a/lib/openid/consumer/html_parse.rb b/lib/openid/consumer/html_parse.rb index cc229943..38329a47 100644 --- a/lib/openid/consumer/html_parse.rb +++ b/lib/openid/consumer/html_parse.rb @@ -1,9 +1,8 @@ -require "openid/yadis/htmltokenizer" +require 'openid/yadis/htmltokenizer' module OpenID - # Stuff to remove before we start looking for tags - REMOVED_RE = / + REMOVED_RE = %r{ # Comments @@ -16,33 +15,36 @@ module OpenID # make sure script is not an XML namespace (?!:) - [^>]*>.*?<\/script> + [^>]*>.*? - /mix + }mix - def OpenID.openid_unescape(s) - s.gsub('&','&').gsub('<','<').gsub('>','>').gsub('"','"') + def self.openid_unescape(s) + s.gsub('&', '&').gsub('<', '<').gsub('>', '>').gsub('"', '"') end - def OpenID.unescape_hash(h) + def self.unescape_hash(h) newh = {} - h.map{|k,v| - newh[k]=openid_unescape(v) - } + h.map do |k, v| + newh[k] = openid_unescape(v) + end newh end - - def OpenID.parse_link_attrs(html) + def self.parse_link_attrs(html) begin - stripped = html.gsub(REMOVED_RE,'') + stripped = html.gsub(REMOVED_RE, '') rescue ArgumentError begin - stripped = html.encode('UTF-8', 'binary', :invalid => :replace, :undef => :replace, :replace => '').gsub(REMOVED_RE,'') + stripped = html.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '').gsub( + REMOVED_RE, '' + ) rescue Encoding::UndefinedConversionError, Encoding::ConverterNotFoundError # needed for a problem in JRuby where it can't handle the conversion. # see details here: https://github.com/jruby/jruby/issues/829 - stripped = html.encode('UTF-8', 'ASCII', :invalid => :replace, :undef => :replace, :replace => '').gsub(REMOVED_RE,'') + stripped = html.encode('UTF-8', 'ASCII', invalid: :replace, undef: :replace, replace: '').gsub( + REMOVED_RE, '' + ) end end parser = HTMLTokenizer.new(stripped) @@ -54,91 +56,80 @@ def OpenID.parse_link_attrs(html) saw_head = false begin - while el = parser.getTag('head', '/head', 'link', 'body', '/body', + while el = parser.getTag('head', '/head', 'link', 'body', '/body', 'html', '/html') - + # we are leaving head or have reached body, so we bail return links if ['/head', 'body', '/body', '/html'].member?(el.tag_name) # enforce html > head > link - if el.tag_name == 'html' - in_html = true - end + in_html = true if el.tag_name == 'html' next unless in_html + if el.tag_name == 'head' if saw_head - return links #only allow one head + return links # only allow one head end + saw_head = true - unless el.to_s[-2] == 47 # tag ends with a /: a short tag - in_head = true - end + in_head = true unless el.to_s[-2] == 47 # tag ends with a /: a short tag end next unless in_head return links if el.tag_name == 'html' - if el.tag_name == 'link' - links << unescape_hash(el.attr_hash) - end - + links << unescape_hash(el.attr_hash) if el.tag_name == 'link' + end rescue Exception # just stop parsing if there's an error end - return links + links end - def OpenID.rel_matches(rel_attr, target_rel) + def self.rel_matches(rel_attr, target_rel) # Does this target_rel appear in the rel_str? # XXX: TESTME - rels = rel_attr.strip().split() - rels.each { |rel| + rels = rel_attr.strip.split + rels.each do |rel| rel = rel.downcase - if rel == target_rel - return true - end - } + return true if rel == target_rel + end - return false + false end - def OpenID.link_has_rel(link_attrs, target_rel) + def self.link_has_rel(link_attrs, target_rel) # Does this link have target_rel as a relationship? # XXX: TESTME rel_attr = link_attrs['rel'] - return (rel_attr and rel_matches(rel_attr, target_rel)) + (rel_attr and rel_matches(rel_attr, target_rel)) end - def OpenID.find_links_rel(link_attrs_list, target_rel) + def self.find_links_rel(link_attrs_list, target_rel) # Filter the list of link attributes on whether it has target_rel # as a relationship. # XXX: TESTME - matchesTarget = lambda { |attrs| link_has_rel(attrs, target_rel) } + matches_target = ->(attrs) { link_has_rel(attrs, target_rel) } result = [] - link_attrs_list.each { |item| - if matchesTarget.call(item) - result << item - end - } + link_attrs_list.each do |item| + result << item if matches_target.call(item) + end - return result + result end - def OpenID.find_first_href(link_attrs_list, target_rel) + def self.find_first_href(link_attrs_list, target_rel) # Return the value of the href attribute for the first link tag in # the list that has target_rel as a relationship. # XXX: TESTME matches = find_links_rel(link_attrs_list, target_rel) - if !matches or matches.empty? - return nil - end + return nil if !matches or matches.empty? first = matches[0] - return first['href'] + first['href'] end end - diff --git a/lib/openid/consumer/idres.rb b/lib/openid/consumer/idres.rb index 6520c164..7b8f8b44 100644 --- a/lib/openid/consumer/idres.rb +++ b/lib/openid/consumer/idres.rb @@ -1,8 +1,8 @@ -require "openid/message" -require "openid/protocolerror" -require "openid/kvpost" -require "openid/consumer/discovery" -require "openid/urinorm" +require 'openid/message' +require 'openid/protocolerror' +require 'openid/kvpost' +require 'openid/consumer/discovery' +require 'openid/urinorm' module OpenID class TypeURIMismatch < ProtocolError @@ -21,26 +21,26 @@ class Consumer # Set the name of the query parameter that this library will use # to thread a nonce through an OpenID 1 transaction. It will be # appended to the return_to URL. - def self.openid1_return_to_nonce_name=(query_arg_name) - @openid1_return_to_nonce_name = query_arg_name + class << self + attr_writer :openid1_return_to_nonce_name end # See openid1_return_to_nonce_name= documentation - def self.openid1_return_to_nonce_name - @openid1_return_to_nonce_name + class << self + attr_reader :openid1_return_to_nonce_name end # Set the name of the query parameter that this library will use # to thread the requested URL through an OpenID 1 transaction (for # use when verifying discovered information). It will be appended # to the return_to URL. - def self.openid1_return_to_claimed_id_name=(query_arg_name) - @openid1_return_to_claimed_id_name = query_arg_name + class << self + attr_writer :openid1_return_to_claimed_id_name end # See openid1_return_to_claimed_id_name= - def self.openid1_return_to_claimed_id_name - @openid1_return_to_claimed_id_name + class << self + attr_reader :openid1_return_to_claimed_id_name end # Handles an openid.mode=id_res response. This object is @@ -48,7 +48,7 @@ def self.openid1_return_to_claimed_id_name class IdResHandler attr_reader :endpoint, :message - def initialize(message, current_url, store=nil, endpoint=nil) + def initialize(message, current_url, store = nil, endpoint = nil) @store = store # Fer the nonce and invalidate_handle @message = message @endpoint = endpoint @@ -60,7 +60,7 @@ def initialize(message, current_url, store=nil, endpoint=nil) end def signed_fields - signed_list.map {|x| 'openid.' + x} + signed_list.map { |x| 'openid.' + x } end protected @@ -85,16 +85,14 @@ def openid_namespace @message.get_openid_namespace end - def fetch(field, default=NO_DEFAULT) + def fetch(field, default = NO_DEFAULT) @message.get_arg(OPENID_NS, field, default) end def signed_list if @signed_list.nil? signed_list_str = fetch('signed', nil) - if signed_list_str.nil? - raise ProtocolError, 'Response missing signed list' - end + raise ProtocolError, 'Response missing signed list' if signed_list_str.nil? @signed_list = signed_list_str.split(',', -1) end @@ -107,26 +105,24 @@ def check_for_fields # actually being used by the rest of the code in # tests. Although, which fields are signed does need to be # checked somewhere. - basic_fields = ['return_to', 'assoc_handle', 'sig', 'signed'] - basic_sig_fields = ['return_to', 'identity'] + basic_fields = %w[return_to assoc_handle sig signed] + basic_sig_fields = %w[return_to identity] case openid_namespace when OPENID2_NS require_fields = basic_fields + ['op_endpoint'] require_sigs = basic_sig_fields + - ['response_nonce', 'claimed_id', 'assoc_handle', 'op_endpoint'] + %w[response_nonce claimed_id assoc_handle op_endpoint] when OPENID1_NS, OPENID11_NS require_fields = basic_fields + ['identity'] require_sigs = basic_sig_fields else - raise RuntimeError, "check_for_fields doesn't know about "\ + raise "check_for_fields doesn't know about "\ "namespace #{openid_namespace.inspect}" end require_fields.each do |field| - if !@message.has_key?(OPENID_NS, field) - raise ProtocolError, "Missing required field #{field}" - end + raise ProtocolError, "Missing required field #{field}" unless @message.has_key?(OPENID_NS, field) end require_sigs.each do |field| @@ -139,20 +135,20 @@ def check_for_fields def verify_return_to begin - msg_return_to = URI.parse(URINorm::urinorm(fetch('return_to'))) + msg_return_to = URI.parse(URINorm.urinorm(fetch('return_to'))) rescue URI::InvalidURIError - raise ProtocolError, ("return_to is not a valid URI") + raise ProtocolError, ('return_to is not a valid URI') end verify_return_to_args(msg_return_to) - if !@current_url.nil? - verify_return_to_base(msg_return_to) - end + return if @current_url.nil? + + verify_return_to_base(msg_return_to) end def verify_return_to_args(msg_return_to) return_to_parsed_query = {} - if !msg_return_to.query.nil? + unless msg_return_to.query.nil? CGI.parse(msg_return_to.query).each_pair do |k, vs| return_to_parsed_query[k] = vs[0] end @@ -163,65 +159,61 @@ def verify_return_to_args(msg_return_to) if msg_val.nil? && !rt_val.nil? raise ProtocolError, "Message missing return_to argument '#{rt_key}'" elsif msg_val != rt_val - raise ProtocolError, ("Parameter '#{rt_key}' value "\ + raise ProtocolError, "Parameter '#{rt_key}' value "\ "#{msg_val.inspect} does not match "\ - "return_to's value #{rt_val.inspect}") + "return_to's value #{rt_val.inspect}" end end @message.get_args(BARE_NS).each_pair do |bare_key, bare_val| rt_val = return_to_parsed_query[bare_key] - if not return_to_parsed_query.has_key? bare_key + unless return_to_parsed_query.has_key? bare_key # This may be caused by your web framework throwing extra # entries in to your parameters hash that were not GET or # POST parameters. For example, Rails has been known to # add "controller" and "action" keys; another server adds # at least a "format" key. - raise ProtocolError, ("Unexpected parameter (not on return_to): "\ - "'#{bare_key}'=#{rt_val.inspect})") - end - if rt_val != bare_val - raise ProtocolError, ("Parameter '#{bare_key}' value "\ - "#{bare_val.inspect} does not match "\ - "return_to's value #{rt_val.inspect}") + raise ProtocolError, 'Unexpected parameter (not on return_to): '\ + "'#{bare_key}'=#{rt_val.inspect})" end + next unless rt_val != bare_val + + raise ProtocolError, "Parameter '#{bare_key}' value "\ + "#{bare_val.inspect} does not match "\ + "return_to's value #{rt_val.inspect}" end end def verify_return_to_base(msg_return_to) begin - app_parsed = URI.parse(URINorm::urinorm(@current_url)) + app_parsed = URI.parse(URINorm.urinorm(@current_url)) rescue URI::InvalidURIError raise ProtocolError, "current_url is not a valid URI: #{@current_url}" end - [:scheme, :host, :port, :path].each do |meth| - if msg_return_to.send(meth) != app_parsed.send(meth) - raise ProtocolError, "return_to #{meth.to_s} does not match" - end + %i[scheme host port path].each do |meth| + raise ProtocolError, "return_to #{meth} does not match" if msg_return_to.send(meth) != app_parsed.send(meth) end end # Raises ProtocolError if the signature is bad def check_signature - if @store.nil? - assoc = nil - else - assoc = @store.get_association(server_url, fetch('assoc_handle')) - end + assoc = if @store.nil? + nil + else + @store.get_association(server_url, fetch('assoc_handle')) + end if assoc.nil? check_auth - else - if assoc.expires_in <= 0 - # XXX: It might be a good idea sometimes to re-start the - # authentication with a new association. Doing it - # automatically opens the possibility for - # denial-of-service by a server that just returns expired - # associations (or really short-lived associations) - raise ProtocolError, "Association with #{server_url} expired" - elsif !assoc.check_message_signature(@message) - raise ProtocolError, "Bad signature in response from #{server_url}" - end + elsif assoc.expires_in <= 0 + raise ProtocolError, "Association with #{server_url} expired" + # XXX: It might be a good idea sometimes to re-start the + # authentication with a new association. Doing it + # automatically opens the possibility for + # denial-of-service by a server that just returns expired + # associations (or really short-lived associations) + elsif !assoc.check_message_signature(@message) + raise ProtocolError, "Bad signature in response from #{server_url}" end end @@ -229,9 +221,9 @@ def check_auth Util.log("Using 'check_authentication' with #{server_url}") begin request = create_check_auth_request - rescue Message::KeyNotFound => why + rescue Message::KeyNotFound => e raise ProtocolError, "Could not generate 'check_authentication' "\ - "request: #{why.message}" + "request: #{e.message}" end response = OpenID.make_kv_post(request, server_url) @@ -243,14 +235,14 @@ def create_check_auth_request signed_list = @message.get_arg(OPENID_NS, 'signed', NO_DEFAULT).split(',') # check that we got all the signed arguments - signed_list.each {|k| + signed_list.each do |k| @message.get_aliased_arg(k, NO_DEFAULT) - } + end ca_message = @message.copy ca_message.set_arg(OPENID_NS, 'mode', 'check_authentication') - return ca_message + ca_message end # Process the response message from a check_authentication @@ -259,7 +251,7 @@ def process_check_auth_response(response) is_valid = response.get_arg(OPENID_NS, 'is_valid', 'false') invalidate_handle = response.get_arg(OPENID_NS, 'invalidate_handle') - if !invalidate_handle.nil? + unless invalidate_handle.nil? Util.log("Received 'invalidate_handle' from server #{server_url}") if @store.nil? Util.log('Unexpectedly got "invalidate_handle" without a store!') @@ -268,10 +260,10 @@ def process_check_auth_response(response) end end - if is_valid != 'true' - raise ProtocolError, ("Server #{server_url} responds that the "\ - "'check_authentication' call is not valid") - end + return unless is_valid != 'true' + + raise ProtocolError, "Server #{server_url} responds that the "\ + "'check_authentication' call is not valid" end def check_nonce @@ -290,9 +282,7 @@ def check_nonce raise StandardError, 'Not reached' end - if nonce.nil? - raise ProtocolError, 'Nonce missing from response' - end + raise ProtocolError, 'Nonce missing from response' if nonce.nil? begin time, extra = Nonce.split_nonce(nonce) @@ -300,25 +290,23 @@ def check_nonce raise ProtocolError, "Malformed nonce: #{nonce.inspect}" end - if !@store.nil? && !@store.use_nonce(server_url, time, extra) - raise ProtocolError, ("Nonce already used or out of range: "\ - "#{nonce.inspect}") - end + return unless !@store.nil? && !@store.use_nonce(server_url, time, extra) + + raise ProtocolError, 'Nonce already used or out of range: '\ + "#{nonce.inspect}" end def verify_discovery_results - begin - case openid_namespace - when OPENID1_NS, OPENID11_NS - verify_discovery_results_openid1 - when OPENID2_NS - verify_discovery_results_openid2 - else - raise StandardError, "Not reached: #{openid_namespace}" - end - rescue Message::KeyNotFound => why - raise ProtocolError, "Missing required field: #{why.message}" + case openid_namespace + when OPENID1_NS, OPENID11_NS + verify_discovery_results_openid1 + when OPENID2_NS + verify_discovery_results_openid2 + else + raise StandardError, "Not reached: #{openid_namespace}" end + rescue Message::KeyNotFound => e + raise ProtocolError, "Missing required field: #{e.message}" end def verify_discovery_results_openid2 @@ -329,11 +317,11 @@ def verify_discovery_results_openid2 to_match.server_url = fetch('op_endpoint') if to_match.claimed_id.nil? && !to_match.local_id.nil? - raise ProtocolError, ('openid.identity is present without '\ - 'openid.claimed_id') + raise ProtocolError, 'openid.identity is present without '\ + 'openid.claimed_id' elsif !to_match.claimed_id.nil? && to_match.local_id.nil? - raise ProtocolError, ('openid.claimed_id is present without '\ - 'openid.identity') + raise ProtocolError, 'openid.claimed_id is present without '\ + 'openid.identity' # This is a response without identifiers, so there's really no # checking that we can do, so return an endpoint that's for @@ -350,18 +338,18 @@ def verify_discovery_results_openid2 else begin verify_discovery_single(@endpoint, to_match) - rescue ProtocolError => why - Util.log("Error attempting to use stored discovery "\ - "information: #{why.message}") - Util.log("Attempting discovery to verify endpoint") + rescue ProtocolError => e + Util.log('Error attempting to use stored discovery '\ + "information: #{e.message}") + Util.log('Attempting discovery to verify endpoint') discover_and_verify(to_match.claimed_id, [to_match]) end end - if @endpoint.claimed_id != to_match.claimed_id - @endpoint = @endpoint.dup - @endpoint.claimed_id = to_match.claimed_id - end + return unless @endpoint.claimed_id != to_match.claimed_id + + @endpoint = @endpoint.dup + @endpoint.claimed_id = to_match.claimed_id end def verify_discovery_results_openid1 @@ -370,11 +358,11 @@ def verify_discovery_results_openid1 if claimed_id.nil? if @endpoint.nil? - raise ProtocolError, ("When using OpenID 1, the claimed ID must "\ - "be supplied, either by passing it through "\ - "as a return_to parameter or by using a "\ - "session, and supplied to the IdResHandler "\ - "when it is constructed.") + raise ProtocolError, 'When using OpenID 1, the claimed ID must '\ + 'be supplied, either by passing it through '\ + 'as a return_to parameter or by using a '\ + 'session, and supplied to the IdResHandler '\ + 'when it is constructed.' else claimed_id = @endpoint.claimed_id end @@ -389,16 +377,16 @@ def verify_discovery_results_openid1 to_match_1_0 = to_match.dup to_match_1_0.type_uris = [OPENID_1_0_TYPE] - if !@endpoint.nil? + unless @endpoint.nil? begin begin verify_discovery_single(@endpoint, to_match) rescue TypeURIMismatch verify_discovery_single(@endpoint, to_match_1_0) end - rescue ProtocolError => why + rescue ProtocolError => e Util.log('Error attempting to use stored discovery information: ' + - why.message) + e.message) Util.log('Attempting discovery to verify endpoint') else return @endpoint @@ -421,13 +409,12 @@ def discover_and_verify(claimed_id, to_match_endpoints) if services.length == 0 # XXX: this might want to be something other than # ProtocolError. In Python, it's DiscoveryFailure - raise ProtocolError, ("No OpenID information found at "\ - "#{claimed_id}") + raise ProtocolError, 'No OpenID information found at '\ + "#{claimed_id}" end verify_discovered_services(claimed_id, services, to_match_endpoints) end - def verify_discovered_services(claimed_id, services, to_match_endpoints) # Search the services resulting from discovery to find one # that matches the information from the assertion @@ -436,8 +423,8 @@ def verify_discovered_services(claimed_id, services, to_match_endpoints) for to_match_endpoint in to_match_endpoints begin verify_discovery_single(endpoint, to_match_endpoint) - rescue ProtocolError => why - failure_messages << why.message + rescue ProtocolError => e + failure_messages << e.message else # It matches, so discover verification has # succeeded. Return this endpoint. @@ -449,21 +436,19 @@ def verify_discovered_services(claimed_id, services, to_match_endpoints) Util.log("Discovery verification failure for #{claimed_id}") failure_messages.each do |failure_message| - Util.log(" * Endpoint mismatch: " + failure_message) + Util.log(' * Endpoint mismatch: ' + failure_message) end # XXX: is DiscoveryFailure in Python OpenID - raise ProtocolError, ("No matching endpoint found after "\ - "discovering #{claimed_id}") + raise ProtocolError, 'No matching endpoint found after '\ + "discovering #{claimed_id}" end def verify_discovery_single(endpoint, to_match) # Every type URI that's in the to_match endpoint has to be # present in the discovered endpoint. for type_uri in to_match.type_uris - if !endpoint.uses_extension(type_uri) - raise TypeURIMismatch.new(type_uri, endpoint) - end + raise TypeURIMismatch.new(type_uri, endpoint) unless endpoint.uses_extension(type_uri) end # Fragments do not influence discovery, so we can't compare a @@ -486,16 +471,16 @@ def verify_discovery_single(endpoint, to_match) end if defragged_claimed_id != endpoint.claimed_id - raise ProtocolError, ("Claimed ID does not match (different "\ - "subjects!), Expected "\ + raise ProtocolError, 'Claimed ID does not match (different '\ + 'subjects!), Expected '\ "#{defragged_claimed_id}, got "\ - "#{endpoint.claimed_id}") + "#{endpoint.claimed_id}" end if to_match.get_local_id != endpoint.get_local_id - raise ProtocolError, ("local_id mismatch. Expected "\ + raise ProtocolError, 'local_id mismatch. Expected '\ "#{to_match.get_local_id}, got "\ - "#{endpoint.get_local_id}") + "#{endpoint.get_local_id}" end # If the server URL is nil, this must be an OpenID 1 @@ -506,18 +491,17 @@ def verify_discovery_single(endpoint, to_match) if to_match.server_url.nil? if to_match.preferred_namespace != OPENID1_NS raise StandardError, - "The code calling this must ensure that OpenID 2 "\ - "responses have a non-none `openid.op_endpoint' and "\ - "that it is set as the `server_url' attribute of the "\ - "`to_match' endpoint." + 'The code calling this must ensure that OpenID 2 '\ + "responses have a non-none `openid.op_endpoint' and "\ + "that it is set as the `server_url' attribute of the "\ + "`to_match' endpoint." end elsif to_match.server_url != endpoint.server_url - raise ProtocolError, ("OP Endpoint mismatch. Expected"\ + raise ProtocolError, 'OP Endpoint mismatch. Expected'\ "#{to_match.server_url}, got "\ - "#{endpoint.server_url}") + "#{endpoint.server_url}" end end - end end end diff --git a/lib/openid/consumer/responses.rb b/lib/openid/consumer/responses.rb index 89a551fb..c01bb955 100644 --- a/lib/openid/consumer/responses.rb +++ b/lib/openid/consumer/responses.rb @@ -18,7 +18,6 @@ class Consumer # URL for the user to login with. SETUP_NEEDED = :setup_needed - module Response attr_reader :endpoint @@ -82,12 +81,10 @@ def signed?(ns_uri, ns_key) # Return the specified signed field if available, otherwise # return default - def get_signed(ns_uri, ns_key, default=nil) - if signed?(ns_uri, ns_key) - return @message.get_arg(ns_uri, ns_key, default) - else - return default - end + def get_signed(ns_uri, ns_key, default = nil) + return @message.get_arg(ns_uri, ns_key, default) if signed?(ns_uri, ns_key) + + default end # Get signed arguments from the response message. Return a dict @@ -96,11 +93,9 @@ def get_signed(ns_uri, ns_key, default=nil) def get_signed_ns(ns_uri) msg_args = @message.get_args(ns_uri) msg_args.each_key do |key| - if !signed?(ns_uri, key) - return nil - end + return nil unless signed?(ns_uri, key) end - return msg_args + msg_args end # Return response arguments in the specified namespace. @@ -120,7 +115,8 @@ class FailureResponse STATUS = FAILURE attr_reader :message, :contact, :reference - def initialize(endpoint, message, contact=nil, reference=nil) + + def initialize(endpoint, message, contact = nil, reference = nil) @endpoint = endpoint @message = message @contact = contact @@ -141,6 +137,7 @@ class SetupNeededResponse STATUS = SETUP_NEEDED attr_reader :setup_url + def initialize(endpoint, setup_url) @endpoint = endpoint @setup_url = setup_url diff --git a/lib/openid/consumer/session.rb b/lib/openid/consumer/session.rb index ade098bb..a94d45b3 100644 --- a/lib/openid/consumer/session.rb +++ b/lib/openid/consumer/session.rb @@ -24,9 +24,9 @@ def keys def to_session_value(val) case val when Array - val.map{|ele| to_session_value(ele) } + val.map { |ele| to_session_value(ele) } when Hash - Hash[*(val.map{|k,v| [k, to_session_value(v)] }.flatten(1))] + Hash[*val.map { |k, v| [k, to_session_value(v)] }.flatten(1)] else val.respond_to?(:to_session_value) ? val.to_session_value : val end diff --git a/lib/openid/cryptutil.rb b/lib/openid/cryptutil.rb index 66c97372..b964d808 100644 --- a/lib/openid/cryptutil.rb +++ b/lib/openid/cryptutil.rb @@ -1,17 +1,17 @@ -require "openid/util" -require "digest/sha1" -require "digest/sha2" +require 'openid/util' +require 'digest/sha1' +require 'digest/sha2' begin - require "openssl" + require 'openssl' rescue LoadError begin # Try loading the ruby-hmac files if they exist - require "hmac-sha1" - require "hmac-sha2" + require 'hmac-sha1' + require 'hmac-sha2' rescue LoadError # Nothing exists use included hmac files - require "hmac/sha1" - require "hmac/sha2" + require 'hmac/sha1' + require 'hmac/sha2' end end @@ -19,7 +19,6 @@ module OpenID # This module contains everything needed to perform low-level # cryptograph and data manipulation tasks. module CryptUtil - # Generate a random number, doing a little extra work to make it # more likely that it's suitable for cryptography. If your system # doesn't have /dev/urandom then this number is not @@ -27,60 +26,56 @@ module CryptUtil # # for more information. max is the largest possible value of such # a random number, where the result will be less than max. - def CryptUtil.rand(max) - Kernel.srand() - return Kernel.rand(max) + def self.rand(max) + Kernel.srand + Kernel.rand(max) end - def CryptUtil.sha1(text) - return Digest::SHA1.digest(text) + def self.sha1(text) + Digest::SHA1.digest(text) end - def CryptUtil.hmac_sha1(key, text) - if defined? OpenSSL - OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, key, text) - else - return HMAC::SHA1.digest(key, text) - end + def self.hmac_sha1(key, text) + return HMAC::SHA1.digest(key, text) unless defined? OpenSSL + + OpenSSL::HMAC.digest(OpenSSL::Digest.new('SHA1'), key, text) end - def CryptUtil.sha256(text) - return Digest::SHA256.digest(text) + def self.sha256(text) + Digest::SHA256.digest(text) end - def CryptUtil.hmac_sha256(key, text) - if defined? OpenSSL - OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, key, text) - else - return HMAC::SHA256.digest(key, text) - end + def self.hmac_sha256(key, text) + return HMAC::SHA256.digest(key, text) unless defined? OpenSSL + + OpenSSL::HMAC.digest(OpenSSL::Digest.new('SHA256'), key, text) end # Generate a random string of the given length, composed of the # specified characters. If chars is nil, generate a string # composed of characters in the range 0..255. - def CryptUtil.random_string(length, chars=nil) - s = "" + def self.random_string(length, chars = nil) + s = '' - unless chars.nil? - length.times { s << chars[rand(chars.length)] } - else + if chars.nil? length.times { s << rand(256).chr } + else + length.times { s << chars[rand(chars.length)] } end - return s + s end # Convert a number to its binary representation; return a string # of bytes. - def CryptUtil.num_to_binary(n) + def self.num_to_binary(n) bits = n.to_s(2) prepend = (8 - bits.length % 8) bits = ('0' * prepend) + bits - return [bits].pack('B*') + [bits].pack('B*') end # Convert a string of bytes into a number. - def CryptUtil.binary_to_num(s) + def self.binary_to_num(s) # taken from openid-ruby 0.0.1 s = "\000" * (4 - (s.length % 4)) + s num = 0 @@ -88,28 +83,27 @@ def CryptUtil.binary_to_num(s) num <<= 32 num |= x end - return num + num end # Encode a number as a base64-encoded byte string. - def CryptUtil.num_to_base64(l) - return OpenID::Util.to_base64(num_to_binary(l)) + def self.num_to_base64(l) + OpenID::Util.to_base64(num_to_binary(l)) end # Decode a base64 byte string to a number. - def CryptUtil.base64_to_num(s) - return binary_to_num(OpenID::Util.from_base64(s)) + def self.base64_to_num(s) + binary_to_num(OpenID::Util.from_base64(s)) end - def CryptUtil.const_eq(s1, s2) - if s1.length != s2.length - return false - end + def self.const_eq(s1, s2) + return false if s1.length != s2.length + result = true s1.length.times do |i| result &= (s1[i] == s2[i]) end - return result + result end end end diff --git a/lib/openid/dh.rb b/lib/openid/dh.rb index 0c15b867..26373980 100644 --- a/lib/openid/dh.rb +++ b/lib/openid/dh.rb @@ -1,8 +1,7 @@ -require "openid/util" -require "openid/cryptutil" +require 'openid/util' +require 'openid/cryptutil' module OpenID - # Encapsulates a Diffie-Hellman key exchange. This class is used # internally by both the consumer and server objects. # @@ -10,23 +9,22 @@ module OpenID # http://en.wikipedia.org/wiki/Diffie-Hellman class DiffieHellman - # From the OpenID specification - @@default_mod = 155172898181473697471232257763715539915724801966915404479707795314057629378541917580651227423698188993727816152646631438561595825688188889951272158842675419950341258706556549803580104870537681476726513255747040765857479291291572334510643245094715007229621094194349783925984760375594985848253359305585439638443 + @@default_mod = 155_172_898_181_473_697_471_232_257_763_715_539_915_724_801_966_915_404_479_707_795_314_057_629_378_541_917_580_651_227_423_698_188_993_727_816_152_646_631_438_561_595_825_688_188_889_951_272_158_842_675_419_950_341_258_706_556_549_803_580_104_870_537_681_476_726_513_255_747_040_765_857_479_291_291_572_334_510_643_245_094_715_007_229_621_094_194_349_783_925_984_760_375_594_985_848_253_359_305_585_439_638_443 @@default_gen = 2 attr_reader :modulus, :generator, :public # A new DiffieHellman object, using the modulus and generator from # the OpenID specification - def DiffieHellman.from_defaults + def self.from_defaults DiffieHellman.new(@@default_mod, @@default_gen) end - def initialize(modulus=nil, generator=nil, priv=nil) + def initialize(modulus = nil, generator = nil, priv = nil) @modulus = modulus.nil? ? @@default_mod : modulus @generator = generator.nil? ? @@default_gen : generator - set_private(priv.nil? ? OpenID::CryptUtil.rand(@modulus-2) + 1 : priv) + set_private(priv.nil? ? OpenID::CryptUtil.rand(@modulus - 2) + 1 : priv) end def get_shared_secret(composite) @@ -37,7 +35,7 @@ def xor_secret(algorithm, composite, secret) dh_shared = get_shared_secret(composite) packed_dh_shared = OpenID::CryptUtil.num_to_binary(dh_shared) hashed_dh_shared = algorithm.call(packed_dh_shared) - return DiffieHellman.strxor(secret, hashed_dh_shared) + DiffieHellman.strxor(secret, hashed_dh_shared) end def using_default_values? @@ -45,45 +43,42 @@ def using_default_values? end private + def set_private(priv) @private = priv @public = DiffieHellman.powermod(@generator, @private, @modulus) end - def DiffieHellman.strxor(s, t) + def self.strxor(s, t) if s.length != t.length raise ArgumentError, "strxor: lengths don't match. " + - "Inputs were #{s.inspect} and #{t.inspect}" + "Inputs were #{s.inspect} and #{t.inspect}" end if String.method_defined? :bytes - s.bytes.to_a.zip(t.bytes.to_a).map{|sb,tb| sb^tb}.pack('C*') + s.bytes.to_a.zip(t.bytes.to_a).map { |sb, tb| sb ^ tb }.pack('C*') else indices = 0...(s.length) - chrs = indices.collect {|i| (s[i]^t[i]).chr} - chrs.join("") + chrs = indices.collect { |i| (s[i] ^ t[i]).chr } + chrs.join('') end end # This code is taken from this post: # # by Eric Lee Green. - def DiffieHellman.powermod(x, n, q) - counter=0 - n_p=n - y_p=1 - z_p=x + def self.powermod(x, n, q) + counter = 0 + n_p = n + y_p = 1 + z_p = x while n_p != 0 - if n_p[0]==1 - y_p=(y_p*z_p) % q - end - n_p = n_p >> 1 + y_p = (y_p * z_p) % q if n_p[0] == 1 + n_p >>= 1 z_p = (z_p * z_p) % q counter += 1 end - return y_p + y_p end - end - end diff --git a/lib/openid/extension.rb b/lib/openid/extension.rb index f0f02bb5..c4d60e45 100644 --- a/lib/openid/extension.rb +++ b/lib/openid/extension.rb @@ -3,7 +3,6 @@ module OpenID # An interface for OpenID extensions. class Extension < Object - def initialize @ns_uri = nil @ns_alias = nil @@ -20,20 +19,20 @@ def get_extension_args # arguments. Returns the message with added extension args. def to_message(message = nil) if message.nil? -# warnings.warn('Passing None to Extension.toMessage is deprecated. ' -# 'Creating a message assuming you want OpenID 2.', -# DeprecationWarning, stacklevel=2) + # warnings.warn('Passing None to Extension.toMessage is deprecated. ' + # 'Creating a message assuming you want OpenID 2.', + # DeprecationWarning, stacklevel=2) Message.new(OPENID2_NS) end message = Message.new if message.nil? - implicit = message.is_openid1() + implicit = message.is_openid1 message.namespaces.add_alias(@ns_uri, @ns_alias, implicit) # XXX python ignores keyerror if m.ns.getAlias(uri) == alias message.update_args(@ns_uri, get_extension_args) - return message + message end end end diff --git a/lib/openid/extensions/ax.rb b/lib/openid/extensions/ax.rb index 0afad1c6..44a8ccdf 100644 --- a/lib/openid/extensions/ax.rb +++ b/lib/openid/extensions/ax.rb @@ -6,16 +6,15 @@ module OpenID module AX - - UNLIMITED_VALUES = "unlimited" + UNLIMITED_VALUES = 'unlimited' MINIMUM_SUPPORTED_ALIAS_LENGTH = 32 # check alias for invalid characters, raise AXError if found def self.check_alias(name) - if name.match(/(,|\.)/) - raise Error, ("Alias #{name.inspect} must not contain a "\ - "comma or period.") - end + return unless name.match(/(,|\.)/) + + raise Error, "Alias #{name.inspect} must not contain a "\ + 'comma or period.' end # Raised when data does not comply with AX 1.0 specification @@ -46,13 +45,13 @@ def initialize # arguments does not match what is expected for this class. def check_mode(ax_args) actual_mode = ax_args ? ax_args['mode'] : nil - if actual_mode != @mode - raise Error, "Expected mode #{mode.inspect}, got #{actual_mode.inspect}" - end + return unless actual_mode != @mode + + raise Error, "Expected mode #{mode.inspect}, got #{actual_mode.inspect}" end def new_args - {'mode' => @mode} + { 'mode' => @mode } end end @@ -85,7 +84,8 @@ def new_args class AttrInfo < Object attr_reader :type_uri, :count, :ns_alias attr_accessor :required - def initialize(type_uri, ns_alias=nil, required=false, count=1) + + def initialize(type_uri, ns_alias = nil, required = false, count = 1) @type_uri = type_uri @count = count @required = required @@ -103,14 +103,15 @@ def wants_unlimited_values? # namespace_map: OpenID::NamespaceMap def self.to_type_uris(namespace_map, alias_list_s) return [] if alias_list_s.nil? - alias_list_s.split(',').inject([]) {|uris, name| + + alias_list_s.split(',').inject([]) do |uris, name| type_uri = namespace_map.get_namespace_uri(name) raise IndexError, "No type defined for attribute name #{name.inspect}" if type_uri.nil? + uris << type_uri - } + end end - # An attribute exchange 'fetch_request' message. This message is # sent by a relying party when it wishes to obtain attributes about # the subject of an OpenID authentication request. @@ -135,6 +136,7 @@ def add(attribute) if @requested_attributes[attribute.type_uri] raise IndexError, "The attribute #{attribute.type_uri} has already been requested" end + @requested_attributes[attribute.type_uri] = attribute end @@ -145,42 +147,36 @@ def get_extension_args required = [] if_available = [] ax_args = new_args - @requested_attributes.each{|type_uri, attribute| - if attribute.ns_alias - name = aliases.add_alias(type_uri, attribute.ns_alias) - else - name = aliases.add(type_uri) - end + @requested_attributes.each do |type_uri, attribute| + name = if attribute.ns_alias + aliases.add_alias(type_uri, attribute.ns_alias) + else + aliases.add(type_uri) + end if attribute.required required << name else if_available << name end - if attribute.count != 1 - ax_args["count.#{name}"] = attribute.count.to_s - end + ax_args["count.#{name}"] = attribute.count.to_s if attribute.count != 1 ax_args["type.#{name}"] = type_uri - } - - unless required.empty? - ax_args['required'] = required.join(',') - end - unless if_available.empty? - ax_args['if_available'] = if_available.join(',') end - return ax_args + + ax_args['required'] = required.join(',') unless required.empty? + ax_args['if_available'] = if_available.join(',') unless if_available.empty? + ax_args end # Get the type URIs for all attributes that have been marked # as required. def get_required_attrs - @requested_attributes.inject([]) {|required, (type_uri, attribute)| + @requested_attributes.inject([]) do |required, (type_uri, attribute)| if attribute.required required << type_uri else required end - } + end end # Extract a FetchRequest from an OpenID message @@ -190,6 +186,7 @@ def self.from_openid_request(oidreq) message = oidreq.message ax_args = message.get_args(NS_URI) return nil if ax_args == {} or ax_args['mode'] != MODE + req = new req.parse_extension_args(ax_args) @@ -199,13 +196,14 @@ def self.from_openid_request(oidreq) if realm.nil? or realm.empty? raise Error, "Cannot validate update_url #{req.update_url.inspect} against absent realm" end + tr = TrustRoot::TrustRoot.parse(realm) unless tr.validate_url(req.update_url) raise Error, "Update URL #{req.update_url.inspect} failed validation against realm #{realm.inspect}" end end - return req + req end def parse_extension_args(ax_args) @@ -213,41 +211,40 @@ def parse_extension_args(ax_args) aliases = NamespaceMap.new - ax_args.each{|k,v| - if k.index('type.') == 0 - name = k[5..-1] - type_uri = v - aliases.add_alias(type_uri, name) - - count_key = 'count.'+name - count_s = ax_args[count_key] - count = 1 - if count_s - if count_s == UNLIMITED_VALUES - count = count_s - else - count = count_s.to_i - if count <= 0 - raise Error, "Invalid value for count #{count_key.inspect}: #{count_s.inspect}" - end - end + ax_args.each do |k, v| + next unless k.index('type.') == 0 + + name = k[5..-1] + type_uri = v + aliases.add_alias(type_uri, name) + + count_key = 'count.' + name + count_s = ax_args[count_key] + count = 1 + if count_s + if count_s == UNLIMITED_VALUES + count = count_s + else + count = count_s.to_i + raise Error, "Invalid value for count #{count_key.inspect}: #{count_s.inspect}" if count <= 0 end - add(AttrInfo.new(type_uri, name, false, count)) end - } + add(AttrInfo.new(type_uri, name, false, count)) + end required = AX.to_type_uris(aliases, ax_args['required']) - required.each{|type_uri| + required.each do |type_uri| @requested_attributes[type_uri].required = true - } + end if_available = AX.to_type_uris(aliases, ax_args['if_available']) all_type_uris = required + if_available - aliases.namespace_uris.each{|type_uri| + aliases.namespace_uris.each do |type_uri| unless all_type_uris.member? type_uri - raise Error, "Type URI #{type_uri.inspect} was in the request but not present in 'required' or 'if_available'" + raise Error, + "Type URI #{type_uri.inspect} was in the request but not present in 'required' or 'if_available'" end - } + end @update_url = ax_args['update_url'] end @@ -262,9 +259,8 @@ def requested_types end def member?(type_uri) - ! @requested_attributes[type_uri].nil? + !@requested_attributes[type_uri].nil? end - end # Abstract class that implements a message that has attribute @@ -272,6 +268,7 @@ def member?(type_uri) # fetch_response and store_request. class KeyValueMessage < AXMessage attr_reader :data + def initialize super() @mode = nil @@ -299,26 +296,26 @@ def _get_extension_kv_args(aliases = nil) ax_args = new_args - @data.each{|type_uri, values| + @data.each do |type_uri, values| name = aliases.add(type_uri) - ax_args['type.'+name] = type_uri + ax_args['type.' + name] = type_uri if values.size > 1 - ax_args['count.'+name] = values.size.to_s + ax_args['count.' + name] = values.size.to_s - values.each_with_index{|value, i| - key = "value.#{name}.#{i+1}" + values.each_with_index do |value, i| + key = "value.#{name}.#{i + 1}" ax_args[key] = value - } + end # for attributes with only a single value, use a # nice shortcut to only show the value w/o the count - else + else values.each do |value| key = "value.#{name}" ax_args[key] = value end end - } - return ax_args + end + ax_args end # Parse attribute exchange key/value arguments into this object. @@ -327,23 +324,23 @@ def parse_extension_args(ax_args) check_mode(ax_args) aliases = NamespaceMap.new - ax_args.each{|k, v| - if k.index('type.') == 0 - type_uri = v - name = k[5..-1] + ax_args.each do |k, v| + next unless k.index('type.') == 0 - AX.check_alias(name) - aliases.add_alias(type_uri,name) - end - } + type_uri = v + name = k[5..-1] - aliases.each{|type_uri, name| - count_s = ax_args['count.'+name] + AX.check_alias(name) + aliases.add_alias(type_uri, name) + end + + aliases.each do |type_uri, name| + count_s = ax_args['count.' + name] count = count_s.to_i if count_s.nil? - value = ax_args['value.'+name] + value = ax_args['value.' + name] if value.nil? - raise IndexError, "Missing #{'value.'+name} in FetchResponse" + raise IndexError, "Missing #{'value.' + name} in FetchResponse" elsif value.empty? values = [] else @@ -352,15 +349,16 @@ def parse_extension_args(ax_args) elsif count_s.to_i == 0 values = [] else - values = (1..count).inject([]){|l,i| + values = (1..count).inject([]) do |l, i| key = "value.#{name}.#{i}" v = ax_args[key] raise IndexError, "Missing #{key} in FetchResponse" if v.nil? + l << v - } + end end @data[type_uri] = values - } + end end # Get a single value for an attribute. If no value was sent @@ -369,11 +367,9 @@ def parse_extension_args(ax_args) def get_single(type_uri, default = nil) values = @data[type_uri] return default if values.empty? - if values.size != 1 - raise Error, "More than one value present for #{type_uri.inspect}" - else - return values[0] - end + raise Error, "More than one value present for #{type_uri.inspect}" if values.size != 1 + + values[0] end # retrieve the list of values for this attribute @@ -390,14 +386,13 @@ def [](type_uri) def count(type_uri) @data[type_uri].size end - end # A fetch_response attribute exchange message class FetchResponse < KeyValueMessage attr_reader :update_url # Use the aliases variable to manually add alias names in the response. - # They'll be returned to the client in the format: + # They'll be returned to the client in the format: # openid.ax.type.email=http://openid.net/schema/contact/internet/email # openid.ax.value.email=guy@example.com attr_accessor :aliases @@ -422,13 +417,13 @@ def get_extension_args(request = nil) # same attributes should be present in each, and the # counts in the response must be no more than the counts # in the request) - @data.keys.each{|type_uri| + @data.keys.each do |type_uri| unless request.member? type_uri raise IndexError, "Response attribute not present in request: #{type_uri.inspect}" end - } + end - request.attributes.each{|attr_info| + request.attributes.each do |attr_info| # Copy the aliases from the request so that reading # the response in light of the request is easier if attr_info.ns_alias.nil? @@ -437,14 +432,12 @@ def get_extension_args(request = nil) @aliases.add_alias(attr_info.type_uri, attr_info.ns_alias) end values = @data[attr_info.type_uri] - if values.empty? # @data defaults to [] - zero_value_types << attr_info - end + zero_value_types << attr_info if values.empty? # @data defaults to [] if attr_info.count != UNLIMITED_VALUES and attr_info.count < values.size raise Error, "More than the number of requested values were specified for #{attr_info.type_uri.inspect}" end - } + end end kv_args = _get_extension_kv_args(@aliases) @@ -453,15 +446,15 @@ def get_extension_args(request = nil) # unique to the fetch_response ax_args = new_args - zero_value_types.each{|attr_info| + zero_value_types.each do |attr_info| name = @aliases.get_alias(attr_info.type_uri) kv_args['type.' + name] = attr_info.type_uri kv_args['count.' + name] = '0' - } + end update_url = (request and request.update_url or @update_url) ax_args['update_url'] = update_url unless update_url.nil? ax_args.update(kv_args) - return ax_args + ax_args end def parse_extension_args(ax_args) @@ -471,26 +464,25 @@ def parse_extension_args(ax_args) # Construct a FetchResponse object from an OpenID library # SuccessResponse object. - def self.from_success_response(success_response, signed=true) - obj = self.new - if signed - ax_args = success_response.get_signed_ns(obj.ns_uri) - else - ax_args = success_response.message.get_args(obj.ns_uri) - end + def self.from_success_response(success_response, signed = true) + obj = new + ax_args = if signed + success_response.get_signed_ns(obj.ns_uri) + else + success_response.message.get_args(obj.ns_uri) + end begin obj.parse_extension_args(ax_args) - return obj + obj rescue Error - return nil + nil end end end # A store request attribute exchange message representation class StoreRequest < KeyValueMessage - MODE = 'store_request' def initialize @@ -505,16 +497,17 @@ def self.from_openid_request(oidreq) message = oidreq.message ax_args = message.get_args(NS_URI) return nil if ax_args.empty? or ax_args['mode'] != MODE + req = new req.parse_extension_args(ax_args) req end - def get_extension_args(aliases=nil) + def get_extension_args(aliases = nil) ax_args = new_args kv_args = _get_extension_kv_args(aliases) ax_args.update(kv_args) - return ax_args + ax_args end end @@ -527,14 +520,13 @@ class StoreResponse < AXMessage def initialize(succeeded = true, error_message = nil) super() - if succeeded and error_message - raise Error, "Error message included in a success response" - end - if succeeded - @mode = SUCCESS_MODE - else - @mode = FAILURE_MODE - end + raise Error, 'Error message included in a success response' if succeeded and error_message + + @mode = if succeeded + SUCCESS_MODE + else + FAILURE_MODE + end @error_message = error_message end @@ -549,10 +541,8 @@ def succeeded? def get_extension_args ax_args = new_args - if !succeeded? and error_message - ax_args['error'] = @error_message - end - return ax_args + ax_args['error'] = @error_message if !succeeded? and error_message + ax_args end end end diff --git a/lib/openid/extensions/oauth.rb b/lib/openid/extensions/oauth.rb index 42349269..f0c2b7e9 100644 --- a/lib/openid/extensions/oauth.rb +++ b/lib/openid/extensions/oauth.rb @@ -5,26 +5,25 @@ require 'openid/extension' module OpenID - module OAuth - NS_URI = "http://specs.openid.net/extensions/oauth/1.0" + NS_URI = 'http://specs.openid.net/extensions/oauth/1.0' # An OAuth token request, sent from a relying # party to a provider class Request < Extension attr_accessor :consumer, :scope, :ns_alias, :ns_uri - def initialize(consumer=nil, scope=nil) + + def initialize(consumer = nil, scope = nil) @ns_alias = 'oauth' @ns_uri = NS_URI @consumer = consumer @scope = scope end - def get_extension_args ns_args = {} - ns_args['consumer'] = @consumer if @consumer + ns_args['consumer'] = @consumer if @consumer ns_args['scope'] = @scope if @scope - return ns_args + ns_args end # Instantiate a Request object from the arguments in a @@ -33,27 +32,26 @@ def get_extension_args def self.from_openid_request(oid_req) oauth_req = new args = oid_req.message.get_args(NS_URI) - if args == {} - return nil - end + return nil if args == {} + oauth_req.parse_extension_args(args) - return oauth_req + oauth_req end # Set the state of this request to be that expressed in these # OAuth arguments def parse_extension_args(args) - @consumer = args["consumer"] - @scope = args["scope"] + @consumer = args['consumer'] + @scope = args['scope'] end - end # A OAuth request token response, sent from a provider # to a relying party class Response < Extension attr_accessor :request_token, :scope - def initialize(request_token=nil, scope=nil) + + def initialize(request_token = nil, scope = nil) @ns_alias = 'oauth' @ns_uri = NS_URI @request_token = request_token @@ -64,28 +62,27 @@ def initialize(request_token=nil, scope=nil) def self.from_success_response(success_response) args = success_response.get_signed_ns(NS_URI) return nil if args.nil? + oauth_resp = new oauth_resp.parse_extension_args(args) - return oauth_resp + oauth_resp end # parse the oauth request arguments into the # internal state of this object # if strict is specified, raise an exception when bad data is # encountered - def parse_extension_args(args, strict=false) - @request_token = args["request_token"] - @scope = args["scope"] + def parse_extension_args(args, _strict = false) + @request_token = args['request_token'] + @scope = args['scope'] end def get_extension_args ns_args = {} ns_args['request_token'] = @request_token if @request_token ns_args['scope'] = @scope if @scope - return ns_args + ns_args end - end end - end diff --git a/lib/openid/extensions/pape.rb b/lib/openid/extensions/pape.rb index 0a7413c1..24f4947d 100644 --- a/lib/openid/extensions/pape.rb +++ b/lib/openid/extensions/pape.rb @@ -5,9 +5,8 @@ require 'openid/extension' module OpenID - module PAPE - NS_URI = "http://specs.openid.net/extensions/pape/1.0" + NS_URI = 'http://specs.openid.net/extensions/pape/1.0' AUTH_MULTI_FACTOR_PHYSICAL = 'http://schemas.openid.net/pape/policies/2007/06/multi-factor-physical' AUTH_MULTI_FACTOR = @@ -19,7 +18,8 @@ module PAPE # party to a provider class Request < Extension attr_accessor :preferred_auth_policies, :max_auth_age, :ns_alias, :ns_uri - def initialize(preferred_auth_policies=[], max_auth_age=nil) + + def initialize(preferred_auth_policies = [], max_auth_age = nil) @ns_alias = 'pape' @ns_uri = NS_URI @preferred_auth_policies = preferred_auth_policies @@ -30,9 +30,9 @@ def initialize(preferred_auth_policies=[], max_auth_age=nil) # This method is intended to be used by the relying party to add # acceptable authentication types to the request. def add_policy_uri(policy_uri) - unless @preferred_auth_policies.member? policy_uri - @preferred_auth_policies << policy_uri - end + return if @preferred_auth_policies.member? policy_uri + + @preferred_auth_policies << policy_uri end def get_extension_args @@ -40,7 +40,7 @@ def get_extension_args 'preferred_auth_policies' => @preferred_auth_policies.join(' ') } ns_args['max_auth_age'] = @max_auth_age.to_s if @max_auth_age - return ns_args + ns_args end # Instantiate a Request object from the arguments in a @@ -49,11 +49,10 @@ def get_extension_args def self.from_openid_request(oid_req) pape_req = new args = oid_req.message.get_args(NS_URI) - if args == {} - return nil - end + return nil if args == {} + pape_req.parse_extension_args(args) - return pape_req + pape_req end # Set the state of this request to be that expressed in these @@ -62,24 +61,20 @@ def parse_extension_args(args) @preferred_auth_policies = [] policies_str = args['preferred_auth_policies'] if policies_str - policies_str.split(' ').each{|uri| + policies_str.split(' ').each do |uri| add_policy_uri(uri) - } + end end max_auth_age_str = args['max_auth_age'] - if max_auth_age_str - @max_auth_age = max_auth_age_str.to_i - else - @max_auth_age = nil - end + @max_auth_age = (max_auth_age_str.to_i if max_auth_age_str) end # Given a list of authentication policy URIs that a provider # supports, this method returns the subset of those types # that are preferred by the relying party. def preferred_types(supported_types) - @preferred_auth_policies.select{|uri| supported_types.member? uri} + @preferred_auth_policies.select { |uri| supported_types.member? uri } end end @@ -87,7 +82,8 @@ def preferred_types(supported_types) # to a relying party class Response < Extension attr_accessor :ns_alias, :auth_policies, :auth_time, :nist_auth_level - def initialize(auth_policies=[], auth_time=nil, nist_auth_level=nil) + + def initialize(auth_policies = [], auth_time = nil, nist_auth_level = nil) @ns_alias = 'pape' @ns_uri = NS_URI @auth_policies = auth_policies @@ -105,20 +101,19 @@ def add_policy_uri(policy_uri) def self.from_success_response(success_response) args = success_response.get_signed_ns(NS_URI) return nil if args.nil? + pape_resp = new pape_resp.parse_extension_args(args) - return pape_resp + pape_resp end # parse the provider authentication policy arguments into the # internal state of this object # if strict is specified, raise an exception when bad data is # encountered - def parse_extension_args(args, strict=false) + def parse_extension_args(args, strict = false) policies_str = args['auth_policies'] - if policies_str and policies_str != 'none' - @auth_policies = policies_str.split(' ') - end + @auth_policies = policies_str.split(' ') if policies_str and policies_str != 'none' nist_level_str = args['nist_auth_level'] if nist_level_str @@ -128,9 +123,7 @@ def parse_extension_args(args, strict=false) else nist_level = nist_level_str.to_i # if it's zero here we have a bad value - if nist_level == 0 - nist_level = nil - end + nist_level = nil if nist_level == 0 end if nist_level and nist_level >= 0 and nist_level < 5 @nist_auth_level = nist_level @@ -140,40 +133,38 @@ def parse_extension_args(args, strict=false) end auth_time_str = args['auth_time'] - if auth_time_str - # validate time string - if auth_time_str =~ TIME_VALIDATOR - @auth_time = auth_time_str - elsif strict - raise ArgumentError, "auth_time must be in RFC3339 format" - end + return unless auth_time_str + + # validate time string + if auth_time_str =~ TIME_VALIDATOR + @auth_time = auth_time_str + elsif strict + raise ArgumentError, 'auth_time must be in RFC3339 format' end end def get_extension_args ns_args = {} - if @auth_policies.empty? - ns_args['auth_policies'] = 'none' - else - ns_args['auth_policies'] = @auth_policies.join(' ') - end + ns_args['auth_policies'] = if @auth_policies.empty? + 'none' + else + @auth_policies.join(' ') + end if @nist_auth_level unless (0..4).member? @nist_auth_level raise ArgumentError, "nist_auth_level must be an integer 0 through 4, not #{@nist_auth_level.inspect}" end + ns_args['nist_auth_level'] = @nist_auth_level.to_s end if @auth_time - unless @auth_time =~ TIME_VALIDATOR - raise ArgumentError, "auth_time must be in RFC3339 format" - end + raise ArgumentError, 'auth_time must be in RFC3339 format' unless @auth_time =~ TIME_VALIDATOR + ns_args['auth_time'] = @auth_time end - return ns_args + ns_args end - end end - end diff --git a/lib/openid/extensions/sreg.rb b/lib/openid/extensions/sreg.rb index 8dc780eb..89e81b0a 100644 --- a/lib/openid/extensions/sreg.rb +++ b/lib/openid/extensions/sreg.rb @@ -5,15 +5,15 @@ module OpenID module SReg DATA_FIELDS = { - 'fullname'=>'Full Name', - 'nickname'=>'Nickname', - 'dob'=>'Date of Birth', - 'email'=>'E-mail Address', - 'gender'=>'Gender', - 'postcode'=>'Postal Code', - 'country'=>'Country', - 'language'=>'Language', - 'timezone'=>'Time Zone', + 'fullname' => 'Full Name', + 'nickname' => 'Nickname', + 'dob' => 'Date of Birth', + 'email' => 'E-mail Address', + 'gender' => 'Gender', + 'postcode' => 'Postal Code', + 'country' => 'Country', + 'language' => 'Language', + 'timezone' => 'Time Zone' } NS_URI_1_0 = 'http://openid.net/sreg/1.0' @@ -28,9 +28,9 @@ module SReg # raise ArgumentError if fieldname is not in the defined sreg fields def OpenID.check_sreg_field_name(fieldname) - unless DATA_FIELDS.member? fieldname - raise ArgumentError, "#{fieldname} is not a defined simple registration field" - end + return if DATA_FIELDS.member? fieldname + + raise ArgumentError, "#{fieldname} is not a defined simple registration field" end # Does the given endpoint advertise support for simple registration? @@ -43,11 +43,9 @@ def OpenID.supports_sreg?(endpoint) # namespace URIs found in the wild, as well as missing namespace # definitions (for OpenID 1) def OpenID.get_sreg_ns(message) - [NS_URI_1_1, NS_URI_1_0].each{|ns| - if message.namespaces.get_alias(ns) - return ns - end - } + [NS_URI_1_1, NS_URI_1_0].each do |ns| + return ns if message.namespaces.get_alias(ns) + end # try to add an alias, since we didn't find one ns = NS_URI_1_1 begin @@ -55,7 +53,7 @@ def OpenID.get_sreg_ns(message) rescue IndexError raise NamespaceError end - return ns + ns end # The simple registration namespace was not found and could not @@ -76,6 +74,7 @@ class NamespaceError < ArgumentError class Request < Extension attr_reader :optional, :required, :ns_uri attr_accessor :policy_url + def initialize(required = nil, optional = nil, policy_url = nil, ns_uri = NS_URI) super() @@ -85,12 +84,10 @@ def initialize(required = nil, optional = nil, policy_url = nil, ns_uri = NS_URI @required = [] @optional = [] - if required - request_fields(required, true, true) - end - if optional - request_fields(optional, false, true) - end + request_fields(required, true, true) if required + return unless optional + + request_fields(optional, false, true) end # Create a simple registration request that contains the @@ -102,12 +99,13 @@ def self.from_openid_request(request) # Since we're going to mess with namespace URI mapping, don't # mutate the object that was passed in. message = request.message.copy - ns_uri = OpenID::get_sreg_ns(message) + ns_uri = OpenID.get_sreg_ns(message) args = message.get_args(ns_uri) return nil if args == {} - req = new(nil,nil,nil,ns_uri) + + req = new(nil, nil, nil, ns_uri) req.parse_extension_args(args) - return req + req end # Parse the unqualified simple registration request @@ -126,24 +124,20 @@ def self.from_openid_request(request) def parse_extension_args(args, strict = false) required_items = args['required'] unless required_items.nil? or required_items.empty? - required_items.split(',').each{|field_name| - begin - request_field(field_name, true, strict) - rescue ArgumentError - raise if strict - end - } + required_items.split(',').each do |field_name| + request_field(field_name, true, strict) + rescue ArgumentError + raise if strict + end end optional_items = args['optional'] unless optional_items.nil? or optional_items.empty? - optional_items.split(',').each{|field_name| - begin - request_field(field_name, false, strict) - rescue ArgumentError - raise if strict - end - } + optional_items.split(',').each do |field_name| + request_field(field_name, false, strict) + rescue ArgumentError + raise if strict + end end @policy_url = args['policy_url'] end @@ -168,21 +162,19 @@ def were_fields_requested? # added to a request more than once # Raises ArgumentError if the field_name is not a simple registration # field, or if strict is set and a field is added more than once - def request_field(field_name, required=false, strict=false) - OpenID::check_sreg_field_name(field_name) + def request_field(field_name, required = false, strict = false) + OpenID.check_sreg_field_name(field_name) if strict - if (@required + @optional).member? field_name - raise ArgumentError, 'That field has already been requested' - end + raise ArgumentError, 'That field has already been requested' if (@required + @optional).member? field_name else return if @required.member? field_name + if @optional.member? field_name - if required - @optional.delete field_name - else - return - end + return unless required + + @optional.delete field_name + end end if required @@ -196,7 +188,8 @@ def request_field(field_name, required=false, strict=false) def request_fields(field_names, required = false, strict = false) raise ArgumentError unless field_names.respond_to?(:each) and field_names[0].is_a?(String) - field_names.each{|fn|request_field(fn, required, strict)} + + field_names.each { |fn| request_field(fn, required, strict) } end # Get a hash of unqualified simple registration arguments @@ -208,13 +201,12 @@ def get_extension_args args['required'] = @required.join(',') unless @required.empty? args['optional'] = @optional.join(',') unless @optional.empty? args['policy_url'] = @policy_url unless @policy_url.nil? - return args + args end def member?(field_name) all_requested_fields.member?(field_name) end - end # Represents the data returned in a simple registration response @@ -224,7 +216,7 @@ def member?(field_name) class Response < Extension attr_reader :ns_uri, :data - def initialize(data = {}, ns_uri=NS_URI) + def initialize(data = {}, ns_uri = NS_URI) @ns_alias = 'sreg' @data = data @ns_uri = ns_uri @@ -234,7 +226,7 @@ def initialize(data = {}, ns_uri=NS_URI) # values and create a Response object containing that data. def self.extract_response(request, data) arf = request.all_requested_fields - resp_data = data.reject{|k,v| !arf.member?(k) || v.nil? } + resp_data = data.reject { |k, v| !arf.member?(k) || v.nil? } new(resp_data, request.ns_uri) end @@ -243,27 +235,27 @@ def self.extract_response(request, data) # If you set the signed_only parameter to false, unsigned data from # the id_res message from the server will be processed. def self.from_success_response(success_response, signed_only = true) - ns_uri = OpenID::get_sreg_ns(success_response.message) + ns_uri = OpenID.get_sreg_ns(success_response.message) if signed_only args = success_response.get_signed_ns(ns_uri) return nil if args.nil? # No signed args, so fail else args = success_response.message.get_args(ns_uri) end - args.reject!{|k,v| !DATA_FIELDS.member?(k) } + args.reject! { |k, _v| !DATA_FIELDS.member?(k) } new(args, ns_uri) end # Get the fields to put in the simple registration namespace # when adding them to an id_res message. def get_extension_args - return @data + @data end # Read-only hashlike interface. # Raises an exception if the field name is bad def [](field_name) - OpenID::check_sreg_field_name(field_name) + OpenID.check_sreg_field_name(field_name) data[field_name] end @@ -274,4 +266,3 @@ def empty? end end end - diff --git a/lib/openid/extensions/ui.rb b/lib/openid/extensions/ui.rb index b638d6ec..4b8fed5f 100644 --- a/lib/openid/extensions/ui.rb +++ b/lib/openid/extensions/ui.rb @@ -4,12 +4,12 @@ require 'openid/extension' module OpenID - module UI - NS_URI = "http://specs.openid.net/extensions/ui/1.0" + NS_URI = 'http://specs.openid.net/extensions/ui/1.0' class Request < Extension attr_accessor :lang, :icon, :mode, :ns_alias, :ns_uri + def initialize(mode = nil, icon = nil, lang = nil) @ns_alias = 'ui' @ns_uri = NS_URI @@ -23,7 +23,7 @@ def get_extension_args ns_args['lang'] = @lang if @lang ns_args['icon'] = @icon if @icon ns_args['mode'] = @mode if @mode - return ns_args + ns_args end # Instantiate a Request object from the arguments in a @@ -32,22 +32,18 @@ def get_extension_args def self.from_openid_request(oid_req) ui_req = new args = oid_req.message.get_args(NS_URI) - if args == {} - return nil - end + return nil if args == {} + ui_req.parse_extension_args(args) - return ui_req + ui_req end # Set UI extension parameters def parse_extension_args(args) - @lang = args["lang"] - @icon = args["icon"] - @mode = args["mode"] + @lang = args['lang'] + @icon = args['icon'] + @mode = args['mode'] end - end - end - end diff --git a/lib/openid/fetchers.rb b/lib/openid/fetchers.rb index 69e0b4ba..c4cce125 100644 --- a/lib/openid/fetchers.rb +++ b/lib/openid/fetchers.rb @@ -10,35 +10,36 @@ require 'net/http' end -MAX_RESPONSE_KB = 10485760 # 10 MB (can be smaller, I guess) +MAX_RESPONSE_KB = 10_485_760 # 10 MB (can be smaller, I guess) module Net class HTTP def post_connection_check(hostname) check_common_name = true cert = @socket.io.peer_cert - cert.extensions.each { |ext| - next if ext.oid != "subjectAltName" - ext.value.split(/,\s+/).each{ |general_name| + cert.extensions.each do |ext| + next if ext.oid != 'subjectAltName' + + ext.value.split(/,\s+/).each do |general_name| if /\ADNS:(.*)/ =~ general_name check_common_name = false - reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+") + reg = Regexp.escape(::Regexp.last_match(1)).gsub(/\\\*/, '[^.]+') return true if /\A#{reg}\z/i =~ hostname elsif /\AIP Address:(.*)/ =~ general_name check_common_name = false - return true if $1 == hostname + return true if ::Regexp.last_match(1) == hostname end - } - } + end + end if check_common_name - cert.subject.to_a.each{ |oid, value| - if oid == "CN" - reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+") + cert.subject.to_a.each do |oid, value| + if oid == 'CN' + reg = Regexp.escape(value).gsub(/\\\*/, '[^.]+') return true if /\A#{reg}\z/i =~ hostname end - } + end end - raise OpenSSL::SSL::SSLError, "hostname does not match" + raise OpenSSL::SSL::SSLError, 'hostname does not match' end end end @@ -47,15 +48,13 @@ module OpenID # Our HTTPResponse class extends Net::HTTPResponse with an additional # method, final_url. class HTTPResponse - attr_accessor :final_url - - attr_accessor :_response + attr_accessor :final_url, :_response - def self._from_net_response(response, final_url, headers=nil) - me = self.new + def self._from_net_response(response, final_url, _headers = nil) + me = new me._response = response me.final_url = final_url - return me + me end def method_missing(method, *args) @@ -84,17 +83,15 @@ class SSLFetchingError < FetchingError @fetcher = nil - def self.fetch(url, body=nil, headers=nil, - redirect_limit=StandardFetcher::REDIRECT_LIMIT) - return fetcher.fetch(url, body, headers, redirect_limit) + def self.fetch(url, body = nil, headers = nil, + redirect_limit = StandardFetcher::REDIRECT_LIMIT) + fetcher.fetch(url, body, headers, redirect_limit) end def self.fetcher - if @fetcher.nil? - @fetcher = StandardFetcher.new - end + @fetcher = StandardFetcher.new if @fetcher.nil? - return @fetcher + @fetcher end def self.fetcher=(fetcher) @@ -111,79 +108,73 @@ def self.fetcher_use_env_http_proxy @fetcher = StandardFetcher.new(proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password) end - - class StandardFetcher + class StandardFetcher USER_AGENT = "ruby-openid/#{OpenID::VERSION} (#{RUBY_PLATFORM})" REDIRECT_LIMIT = 5 TIMEOUT = ENV['RUBY_OPENID_FETCHER_TIMEOUT'] || 60 - attr_accessor :ca_file - attr_accessor :timeout + attr_accessor :ca_file, :timeout # I can fetch through a HTTP proxy; arguments are as for Net::HTTP::Proxy. - def initialize(proxy_addr=nil, proxy_port=nil, - proxy_user=nil, proxy_pass=nil) + def initialize(proxy_addr = nil, proxy_port = nil, + proxy_user = nil, proxy_pass = nil) @ca_file = nil @proxy = Net::HTTP::Proxy(proxy_addr, proxy_port, proxy_user, proxy_pass) @timeout = TIMEOUT end def supports_ssl?(conn) - return conn.respond_to?(:use_ssl=) + conn.respond_to?(:use_ssl=) end def make_http(uri) http = @proxy.new(uri.host, uri.port) http.read_timeout = @timeout http.open_timeout = @timeout - return http + http end def set_verified(conn, verify) - if verify - conn.verify_mode = OpenSSL::SSL::VERIFY_PEER - else - conn.verify_mode = OpenSSL::SSL::VERIFY_NONE - end + conn.verify_mode = if verify + OpenSSL::SSL::VERIFY_PEER + else + OpenSSL::SSL::VERIFY_NONE + end end def make_connection(uri) conn = make_http(uri) - if !conn.is_a?(Net::HTTP) - raise RuntimeError, sprintf("Expected Net::HTTP object from make_http; got %s", - conn.class) + unless conn.is_a?(Net::HTTP) + raise format('Expected Net::HTTP object from make_http; got %s', + conn.class).to_s end if uri.scheme == 'https' - if supports_ssl?(conn) + raise "SSL support not found; cannot fetch #{uri}" unless supports_ssl?(conn) - conn.use_ssl = true + conn.use_ssl = true - if @ca_file - set_verified(conn, true) - conn.ca_file = @ca_file - else - Util.log("WARNING: making https request to #{uri} without verifying " + - "server certificate; no CA path was specified.") - set_verified(conn, false) - end + if @ca_file + set_verified(conn, true) + conn.ca_file = @ca_file else - raise RuntimeError, "SSL support not found; cannot fetch #{uri}" + Util.log("WARNING: making https request to #{uri} without verifying " + + 'server certificate; no CA path was specified.') + set_verified(conn, false) end + end - return conn + conn end - def fetch(url, body=nil, headers=nil, redirect_limit=REDIRECT_LIMIT) + def fetch(url, body = nil, headers = nil, redirect_limit = REDIRECT_LIMIT) unparsed_url = url.dup - url = URI::parse(url) - if url.nil? - raise FetchingError, "Invalid URL: #{unparsed_url}" - end + url = URI.parse(url) + raise FetchingError, "Invalid URL: #{unparsed_url}" if url.nil? headers ||= {} headers['User-agent'] ||= USER_AGENT @@ -194,64 +185,62 @@ def fetch(url, body=nil, headers=nil, redirect_limit=REDIRECT_LIMIT) whole_body = '' body_size_limitter = lambda do |r| - r.read_body do |partial| # read body now + r.read_body do |partial| # read body now whole_body << partial - if whole_body.length > MAX_RESPONSE_KB - raise FetchingError.new("Response Too Large") - end + raise FetchingError.new('Response Too Large') if whole_body.length > MAX_RESPONSE_KB end whole_body end - response = conn.start { + response = conn.start do # Check the certificate against the URL's hostname - if supports_ssl?(conn) and conn.use_ssl? - conn.post_connection_check(url.host) - end + conn.post_connection_check(url.host) if supports_ssl?(conn) and conn.use_ssl? if body.nil? conn.request_get(url.request_uri, headers, &body_size_limitter) else - headers["Content-type"] ||= "application/x-www-form-urlencoded" + headers['Content-type'] ||= 'application/x-www-form-urlencoded' conn.request_post(url.request_uri, body, headers, &body_size_limitter) end - } - rescue Timeout::Error => why - raise FetchingError, "Error fetching #{url}: #{why}" - rescue RuntimeError => why - raise why - rescue OpenSSL::SSL::SSLError => why - raise SSLFetchingError, "Error connecting to SSL URL #{url}: #{why}" - rescue FetchingError => why - raise why - rescue Exception => why - raise FetchingError, "Error fetching #{url}: #{why}" + end + rescue Timeout::Error => e + raise FetchingError, "Error fetching #{url}: #{e}" + rescue RuntimeError => e + raise e + rescue OpenSSL::SSL::SSLError => e + raise SSLFetchingError, "Error connecting to SSL URL #{url}: #{e}" + rescue FetchingError => e + raise e + rescue Exception => e + raise FetchingError, "Error fetching #{url}: #{e}" end case response when Net::HTTPRedirection if redirect_limit <= 0 raise HTTPRedirectLimitReached.new( - "Too many redirects, not fetching #{response['location']}") + "Too many redirects, not fetching #{response['location']}" + ) end begin - return fetch(response['location'], body, headers, redirect_limit - 1) + fetch(response['location'], body, headers, redirect_limit - 1) rescue HTTPRedirectLimitReached => e raise e - rescue FetchingError => why - raise FetchingError, "Error encountered in redirect from #{url}: #{why}" + rescue FetchingError => e + raise FetchingError, "Error encountered in redirect from #{url}: #{e}" end else response = HTTPResponse._from_net_response(response, unparsed_url) response.body = whole_body setup_encoding(response) - return response + response end end private + def setup_encoding(response) return unless defined?(Encoding.default_external) - return unless charset = response.type_params["charset"] + return unless charset = response.type_params['charset'] begin encoding = Encoding.find(charset) diff --git a/lib/openid/kvform.rb b/lib/openid/kvform.rb index c534d203..dd79f342 100644 --- a/lib/openid/kvform.rb +++ b/lib/openid/kvform.rb @@ -1,12 +1,9 @@ - module OpenID - class KVFormError < Exception end module Util - - def Util.seq_to_kv(seq, strict=false) + def self.seq_to_kv(seq, strict = false) # Represent a sequence of pairs of strings as newline-terminated # key:value pairs. The pairs are generated in the order given. # @@ -15,52 +12,40 @@ def Util.seq_to_kv(seq, strict=false) # returns a string representation of the sequence err = lambda { |msg| msg = "seq_to_kv warning: #{msg}: #{seq.inspect}" - if strict - raise KVFormError, msg - else - Util.log(msg) - end + raise KVFormError, msg if strict + + Util.log(msg) } lines = [] - seq.each { |k, v| - if !k.is_a?(String) + seq.each do |k, v| + unless k.is_a?(String) err.call("Converting key to string: #{k.inspect}") k = k.to_s end - if !k.index("\n").nil? - raise KVFormError, "Invalid input for seq_to_kv: key contains newline: #{k.inspect}" - end + raise KVFormError, "Invalid input for seq_to_kv: key contains newline: #{k.inspect}" unless k.index("\n").nil? - if !k.index(":").nil? - raise KVFormError, "Invalid input for seq_to_kv: key contains colon: #{k.inspect}" - end + raise KVFormError, "Invalid input for seq_to_kv: key contains colon: #{k.inspect}" unless k.index(':').nil? - if k.strip() != k - err.call("Key has whitespace at beginning or end: #{k.inspect}") - end + err.call("Key has whitespace at beginning or end: #{k.inspect}") if k.strip != k - if !v.is_a?(String) + unless v.is_a?(String) err.call("Converting value to string: #{v.inspect}") v = v.to_s end - if !v.index("\n").nil? - raise KVFormError, "Invalid input for seq_to_kv: value contains newline: #{v.inspect}" - end + raise KVFormError, "Invalid input for seq_to_kv: value contains newline: #{v.inspect}" unless v.index("\n").nil? - if v.strip() != v - err.call("Value has whitespace at beginning or end: #{v.inspect}") - end + err.call("Value has whitespace at beginning or end: #{v.inspect}") if v.strip != v - lines << k + ":" + v + "\n" - } + lines << k + ':' + v + "\n" + end - return lines.join("") + lines.join('') end - def Util.kv_to_seq(data, strict=false) + def self.kv_to_seq(data, strict = false) # After one parse, seq_to_kv and kv_to_seq are inverses, with no # warnings: # @@ -68,48 +53,40 @@ def Util.kv_to_seq(data, strict=false) # seq_to_kv(kv_to_seq(seq)) == seq err = lambda { |msg| msg = "kv_to_seq warning: #{msg}: #{data.inspect}" - if strict - raise KVFormError, msg - else - Util.log(msg) - end + raise KVFormError, msg if strict + + Util.log(msg) } lines = data.split("\n") - if data.length == 0 - return [] - end + return [] if data.empty? if data[-1].chr != "\n" - err.call("Does not end in a newline") + err.call('Does not end in a newline') # We don't expect the last element of lines to be an empty # string because split() doesn't behave that way. end pairs = [] line_num = 0 - lines.each { |line| + lines.each do |line| line_num += 1 # Ignore blank lines - if line.strip() == "" - next - end + next if line.strip == '' pair = line.split(':', 2) if pair.length == 2 k, v = pair - k_s = k.strip() + k_s = k.strip if k_s != k msg = "In line #{line_num}, ignoring leading or trailing whitespace in key #{k.inspect}" err.call(msg) end - if k_s.length == 0 - err.call("In line #{line_num}, got empty key") - end + err.call("In line #{line_num}, got empty key") if k_s.empty? - v_s = v.strip() + v_s = v.strip if v_s != v msg = "In line #{line_num}, ignoring leading or trailing whitespace in value #{v.inspect}" err.call(msg) @@ -119,18 +96,18 @@ def Util.kv_to_seq(data, strict=false) else err.call("Line #{line_num} does not contain a colon") end - } + end - return pairs + pairs end - def Util.dict_to_kv(d) - return seq_to_kv(d.entries.sort) + def self.dict_to_kv(d) + seq_to_kv(d.entries.sort) end - def Util.kv_to_dict(s) + def self.kv_to_dict(s) seq = kv_to_seq(s) - return Hash[*seq.flatten] + Hash[*seq.flatten] end end end diff --git a/lib/openid/kvpost.rb b/lib/openid/kvpost.rb index 1495afe7..22f7789d 100644 --- a/lib/openid/kvpost.rb +++ b/lib/openid/kvpost.rb @@ -1,5 +1,5 @@ -require "openid/message" -require "openid/fetchers" +require 'openid/message' +require 'openid/fetchers' module OpenID # Exception that is raised when the server returns a 400 response @@ -18,23 +18,24 @@ def self.from_message(msg) error_text = msg.get_arg(OPENID_NS, 'error', '') error_code = msg.get_arg(OPENID_NS, 'error_code') - return self.new(error_text, error_code, msg) + new(error_text, error_code, msg) end end class KVPostNetworkError < OpenIDError end + class HTTPStatusError < OpenIDError end class Message def self.from_http_response(response, server_url) - msg = self.from_kvform(response.body) + msg = from_kvform(response.body) case response.code.to_i when 200 - return msg + msg when 206 - return msg + msg when 400 raise ServerError.from_message(msg) else @@ -49,10 +50,10 @@ def self.from_http_response(response, server_url) # a response in KV Form def self.make_kv_post(request_message, server_url) begin - http_response = self.fetch(server_url, request_message.to_url_encoded) + http_response = fetch(server_url, request_message.to_url_encoded) rescue Exception - raise KVPostNetworkError.new("Unable to contact OpenID server: #{$!.to_s}") + raise KVPostNetworkError.new("Unable to contact OpenID server: #{$!}") end - return Message.from_http_response(http_response, server_url) + Message.from_http_response(http_response, server_url) end end diff --git a/lib/openid/message.rb b/lib/openid/message.rb index 860b6a8a..747e6e80 100644 --- a/lib/openid/message.rb +++ b/lib/openid/message.rb @@ -2,7 +2,6 @@ require 'openid/kvform' module OpenID - IDENTIFIER_SELECT = 'http://specs.openid.net/auth/2.0/identifier_select' # URI for Simple Registration extension, the only commonly deployed @@ -34,16 +33,16 @@ module OpenID OPENID1_URL_LIMIT = 2047 # All OpenID protocol fields. Used to check namespace aliases. - OPENID_PROTOCOL_FIELDS = [ - 'ns', 'mode', 'error', 'return_to', - 'contact', 'reference', 'signed', - 'assoc_type', 'session_type', - 'dh_modulus', 'dh_gen', - 'dh_consumer_public', 'claimed_id', - 'identity', 'realm', 'invalidate_handle', - 'op_endpoint', 'response_nonce', 'sig', - 'assoc_handle', 'trust_root', 'openid', - ] + OPENID_PROTOCOL_FIELDS = %w[ + ns mode error return_to + contact reference signed + assoc_type session_type + dh_modulus dh_gen + dh_consumer_public claimed_id + identity realm invalidate_handle + op_endpoint response_nonce sig + assoc_handle trust_root openid + ] # Sentinel used for Message implementation to indicate that getArg # should raise an exception instead of returning a default. @@ -64,7 +63,7 @@ class Message attr_reader :namespaces # Raised when key lookup fails - class KeyNotFound < IndexError ; end + class KeyNotFound < IndexError; end # Namespace / alias registration map. See # register_namespace_alias. @@ -75,19 +74,17 @@ class KeyNotFound < IndexError ; end # namespace URI or alias has already been registered with a # different value. This function is required if you want to use a # namespace with an OpenID 1 message. - def Message.register_namespace_alias(namespace_uri, alias_) - if @@registered_aliases[alias_] == namespace_uri - return - end + def self.register_namespace_alias(namespace_uri, alias_) + return if @@registered_aliases[alias_] == namespace_uri if @@registered_aliases.values.include?(namespace_uri) raise NamespaceAliasRegistrationError, - 'Namespace uri #{namespace_uri} already registered' + 'Namespace uri #{namespace_uri} already registered' end if @@registered_aliases.member?(alias_) raise NamespaceAliasRegistrationError, - 'Alias #{alias_} already registered' + 'Alias #{alias_} already registered' end @@registered_aliases[alias_] = namespace_uri @@ -97,12 +94,12 @@ def Message.register_namespace_alias(namespace_uri, alias_) # Raises InvalidNamespaceError if you try to instantiate a Message # with a namespace not in the above allowed list - def initialize(openid_namespace=nil) + def initialize(openid_namespace = nil) @args = {} @namespaces = NamespaceMap.new if openid_namespace implicit = OPENID1_NAMESPACES.member? openid_namespace - self.set_openid_namespace(openid_namespace, implicit) + set_openid_namespace(openid_namespace, implicit) else @openid_ns_uri = nil end @@ -111,13 +108,13 @@ def initialize(openid_namespace=nil) # Construct a Message containing a set of POST arguments. # Raises InvalidNamespaceError if you try to instantiate a Message # with a namespace not in the above allowed list - def Message.from_post_args(args) + def self.from_post_args(args) m = Message.new openid_args = {} - args.each do |key,value| + args.each do |key, value| if value.is_a?(Array) - raise ArgumentError, "Query dict must have one value for each key, " + - "not lists of values. Query is #{args.inspect}" + raise ArgumentError, 'Query dict must have one value for each key, ' + + "not lists of values. Query is #{args.inspect}" end prefix, rest = key.split('.', 2) @@ -130,16 +127,16 @@ def Message.from_post_args(args) end m._from_openid_args(openid_args) - return m + m end # Construct a Message from a parsed KVForm message. # Raises InvalidNamespaceError if you try to instantiate a Message # with a namespace not in the above allowed list - def Message.from_openid_args(openid_args) + def self.from_openid_args(openid_args) m = Message.new m._from_openid_args(openid_args) - return m + m end # Raises InvalidNamespaceError if you try to instantiate a Message @@ -148,7 +145,7 @@ def _from_openid_args(openid_args) ns_args = [] # resolve namespaces - openid_args.each { |rest, value| + openid_args.each do |rest, value| ns_alias, ns_key = rest.split('.', 2) if ns_key.nil? ns_alias = NULL_NAMESPACE @@ -162,64 +159,61 @@ def _from_openid_args(openid_args) else ns_args << [ns_alias, ns_key, value] end - } + end # implicitly set an OpenID 1 namespace - unless get_openid_namespace - set_openid_namespace(OPENID1_NS, true) - end + set_openid_namespace(OPENID1_NS, true) unless get_openid_namespace # put the pairs into the appropriate namespaces - ns_args.each { |ns_alias, ns_key, value| + ns_args.each do |ns_alias, ns_key, value| ns_uri = @namespaces.get_namespace_uri(ns_alias) unless ns_uri ns_uri = _get_default_namespace(ns_alias) - unless ns_uri + if ns_uri + @namespaces.add_alias(ns_uri, ns_alias, true) + else ns_uri = get_openid_namespace ns_key = "#{ns_alias}.#{ns_key}" - else - @namespaces.add_alias(ns_uri, ns_alias, true) end end - self.set_arg(ns_uri, ns_key, value) - } + set_arg(ns_uri, ns_key, value) + end end def _get_default_namespace(mystery_alias) # only try to map an alias to a default if it's an # OpenID 1.x namespace - if is_openid1 - @@registered_aliases[mystery_alias] - end + @@registered_aliases[mystery_alias] if is_openid1 end def set_openid_namespace(openid_ns_uri, implicit) - if !@@allowed_openid_namespaces.include?(openid_ns_uri) + unless @@allowed_openid_namespaces.include?(openid_ns_uri) raise InvalidOpenIDNamespace, "Invalid null namespace: #{openid_ns_uri}" end + @namespaces.add_alias(openid_ns_uri, NULL_NAMESPACE, implicit) @openid_ns_uri = openid_ns_uri end def get_openid_namespace - return @openid_ns_uri + @openid_ns_uri end def is_openid1 - return OPENID1_NAMESPACES.member?(@openid_ns_uri) + OPENID1_NAMESPACES.member?(@openid_ns_uri) end def is_openid2 - return @openid_ns_uri == OPENID2_NS + @openid_ns_uri == OPENID2_NS end # Create a message from a KVForm string - def Message.from_kvform(kvform_string) - return Message.from_openid_args(Util.kv_to_dict(kvform_string)) + def self.from_kvform(kvform_string) + Message.from_openid_args(Util.kv_to_dict(kvform_string)) end def copy - return Marshal.load(Marshal.dump(self)) + Marshal.load(Marshal.dump(self)) end # Return all arguments with "openid." in from of namespaced arguments. @@ -227,51 +221,51 @@ def to_post_args args = {} # add namespace defs to the output - @namespaces.each { |ns_uri, ns_alias| - if @namespaces.implicit?(ns_uri) - next - end - if ns_alias == NULL_NAMESPACE - ns_key = 'openid.ns' - else - ns_key = 'openid.ns.' + ns_alias - end + @namespaces.each do |ns_uri, ns_alias| + next if @namespaces.implicit?(ns_uri) + + ns_key = if ns_alias == NULL_NAMESPACE + 'openid.ns' + else + 'openid.ns.' + ns_alias + end args[ns_key] = ns_uri - } + end - @args.each { |k, value| + @args.each do |k, value| ns_uri, ns_key = k key = get_key(ns_uri, ns_key) args[key] = value - } + end - return args + args end # Return all namespaced arguments, failing if any non-namespaced arguments # exist. def to_args - post_args = self.to_post_args + post_args = to_post_args kvargs = {} - post_args.each { |k,v| + post_args.each do |k, v| if !k.start_with?('openid.') - raise ArgumentError, "This message can only be encoded as a POST, because it contains arguments that are not prefixed with 'openid.'" + raise ArgumentError, + "This message can only be encoded as a POST, because it contains arguments that are not prefixed with 'openid.'" else kvargs[k[7..-1]] = v end - } - return kvargs + end + kvargs end # Generate HTML form markup that contains the values in this # message, to be HTTP POSTed as x-www-form-urlencoded UTF-8. - def to_form_markup(action_url, form_tag_attrs=nil, submit_text='Continue') + def to_form_markup(action_url, form_tag_attrs = nil, submit_text = 'Continue') form_tag_attr_map = {} if form_tag_attrs - form_tag_attrs.each { |name, attr| + form_tag_attrs.each do |name, attr| form_tag_attr_map[name] = attr - } + end end form_tag_attr_map['action'] = action_url @@ -279,63 +273,60 @@ def to_form_markup(action_url, form_tag_attrs=nil, submit_text='Continue') form_tag_attr_map['accept-charset'] = 'UTF-8' form_tag_attr_map['enctype'] = 'application/x-www-form-urlencoded' - markup = "
#{key} not in this message" - else - default - end - } + @args.fetch([namespace, key]) do + raise KeyNotFound, "<#{namespace}>#{key} not in this message" if default == NO_DEFAULT + + default + end end # Get the arguments that are defined for this namespace URI. def get_args(namespace) namespace = _fix_ns(namespace) args = {} - @args.each { |k,v| + @args.each do |k, v| pair_ns, ns_key = k args[ns_key] = v if pair_ns == namespace - } - return args + end + args end # Set multiple key/value pairs in one call. def update_args(namespace, updates) namespace = _fix_ns(namespace) - updates.each {|k,v| set_arg(namespace, k, v)} + updates.each { |k, v| set_arg(namespace, k, v) } end # Set a single argument in this namespace def set_arg(namespace, key, value) namespace = _fix_ns(namespace) @args[[namespace, key].freeze] = value - if namespace != BARE_NS - @namespaces.add(namespace) - end + @namespaces.add(namespace) if namespace != BARE_NS end # Remove a single argument from this namespace. @@ -421,20 +408,17 @@ def ==(other) other.is_a?(self.class) && @args == other.instance_eval { @args } end - def get_aliased_arg(aliased_key, default=nil) - if aliased_key == 'ns' - return get_openid_namespace() - end + def get_aliased_arg(aliased_key, default = nil) + return get_openid_namespace if aliased_key == 'ns' ns_alias, key = aliased_key.split('.', 2) if ns_alias == 'ns' uri = @namespaces.get_namespace_uri(key) - if uri.nil? and default == NO_DEFAULT - raise KeyNotFound, "Namespace #{key} not defined when looking "\ - "for #{aliased_key}" - else - return (uri.nil? ? default : uri) - end + return (uri.nil? ? default : uri) unless uri.nil? and default == NO_DEFAULT + + raise KeyNotFound, "Namespace #{key} not defined when looking "\ + "for #{aliased_key}" + end if key.nil? @@ -449,14 +433,12 @@ def get_aliased_arg(aliased_key, default=nil) ns = get_openid_namespace end - return get_arg(ns, key, default) + get_arg(ns, key, default) end end - # Maintains a bidirectional map between namespace URIs and aliases. class NamespaceMap - def initialize @alias_to_namespace = {} @namespace_to_alias = {} @@ -472,37 +454,39 @@ def get_namespace_uri(namespace_alias) end # Add an alias from this namespace URI to the alias. - def add_alias(namespace_uri, desired_alias, implicit=false) + def add_alias(namespace_uri, desired_alias, implicit = false) # Check that desired_alias is not an openid protocol field as # per the spec. Util.assert(!OPENID_PROTOCOL_FIELDS.include?(desired_alias), - "#{desired_alias} is not an allowed namespace alias") + "#{desired_alias} is not an allowed namespace alias") # check that there is not a namespace already defined for the # desired alias current_namespace_uri = @alias_to_namespace.fetch(desired_alias, nil) if current_namespace_uri and current_namespace_uri != namespace_uri - raise IndexError, "Cannot map #{namespace_uri} to alias #{desired_alias}. #{current_namespace_uri} is already mapped to alias #{desired_alias}" + raise IndexError, + "Cannot map #{namespace_uri} to alias #{desired_alias}. #{current_namespace_uri} is already mapped to alias #{desired_alias}" end # Check that desired_alias does not contain a period as per the # spec. if desired_alias.is_a?(String) - Util.assert(desired_alias.index('.').nil?, - "#{desired_alias} must not contain a dot") + Util.assert(desired_alias.index('.').nil?, + "#{desired_alias} must not contain a dot") end # check that there is not already a (different) alias for this # namespace URI. _alias = @namespace_to_alias[namespace_uri] if _alias and _alias != desired_alias - raise IndexError, "Cannot map #{namespace_uri} to alias #{desired_alias}. It is already mapped to alias #{_alias}" + raise IndexError, + "Cannot map #{namespace_uri} to alias #{desired_alias}. It is already mapped to alias #{_alias}" end @alias_to_namespace[desired_alias] = namespace_uri @namespace_to_alias[namespace_uri] = desired_alias @implicit_namespaces << namespace_uri if implicit - return desired_alias + desired_alias end # Add this namespace URI to the mapping, without caring what alias @@ -532,22 +516,22 @@ def member?(namespace_uri) @namespace_to_alias.has_key?(namespace_uri) end - def each - @namespace_to_alias.each {|k,v| yield k,v} + def each(&block) + @namespace_to_alias.each(&block) end def namespace_uris # Return an iterator over the namespace URIs - return @namespace_to_alias.keys() + @namespace_to_alias.keys end def implicit?(namespace_uri) - return @implicit_namespaces.member?(namespace_uri) + @implicit_namespaces.member?(namespace_uri) end def aliases # Return an iterator over the aliases - return @alias_to_namespace.keys() + @alias_to_namespace.keys end end end diff --git a/lib/openid/protocolerror.rb b/lib/openid/protocolerror.rb index 2aad0e4a..15d9a2b7 100644 --- a/lib/openid/protocolerror.rb +++ b/lib/openid/protocolerror.rb @@ -1,7 +1,6 @@ require 'openid/util' module OpenID - # An error in the OpenID protocol class ProtocolError < OpenIDError end diff --git a/lib/openid/server.rb b/lib/openid/server.rb index 6589495c..8c5f61a6 100644 --- a/lib/openid/server.rb +++ b/lib/openid/server.rb @@ -1,4 +1,3 @@ - require 'openid/cryptutil' require 'openid/util' require 'openid/dh' @@ -10,14 +9,12 @@ require 'time' module OpenID - module Server - HTTP_OK = 200 HTTP_REDIRECT = 302 HTTP_ERROR = 400 - BROWSER_REQUEST_MODES = ['checkid_setup', 'checkid_immediate'] + BROWSER_REQUEST_MODES = %w[checkid_setup checkid_immediate] ENCODE_KVFORM = ['kvform'].freeze ENCODE_URL = ['URL/redirect'].freeze @@ -38,11 +35,9 @@ def initialize end def namespace - if @message.nil? - raise RuntimeError, "Request has no message" - else - return @message.get_openid_namespace - end + raise 'Request has no message' if @message.nil? + + @message.get_openid_namespace end end @@ -51,7 +46,6 @@ def namespace # See OpenID Specs, Verifying Directly with the OpenID Provider # class CheckAuthRequest < OpenIDRequest - # The association handle the response was signed with. attr_accessor :assoc_handle @@ -73,11 +67,11 @@ class CheckAuthRequest < OpenIDRequest # signed:: The signed message # invalidate_handle:: An association handle that the relying # party is checking to see if it is invalid - def initialize(assoc_handle, signed, invalidate_handle=nil) + def initialize(assoc_handle, signed, invalidate_handle = nil) super() - @mode = "check_authentication" - @required_fields = ["identity", "return_to", "response_nonce"].freeze + @mode = 'check_authentication' + @required_fields = %w[identity return_to response_nonce].freeze @sig = nil @assoc_handle = assoc_handle @@ -86,31 +80,29 @@ def initialize(assoc_handle, signed, invalidate_handle=nil) end # Construct me from an OpenID::Message. - def self.from_message(message, op_endpoint=UNUSED) + def self.from_message(message, _op_endpoint = UNUSED) assoc_handle = message.get_arg(OPENID_NS, 'assoc_handle') invalidate_handle = message.get_arg(OPENID_NS, 'invalidate_handle') - signed = message.copy() + signed = message.copy # openid.mode is currently check_authentication because # that's the mode of this request. But the signature # was made on something with a different openid.mode. # http://article.gmane.org/gmane.comp.web.openid.general/537 - if signed.has_key?(OPENID_NS, "mode") - signed.set_arg(OPENID_NS, "mode", "id_res") - end + signed.set_arg(OPENID_NS, 'mode', 'id_res') if signed.has_key?(OPENID_NS, 'mode') - obj = self.new(assoc_handle, signed, invalidate_handle) + obj = new(assoc_handle, signed, invalidate_handle) obj.message = message obj.sig = message.get_arg(OPENID_NS, 'sig') if !obj.assoc_handle or - !obj.sig - msg = sprintf("%s request missing required parameter from message %s", - obj.mode, message) - raise ProtocolError.new(message, msg) + !obj.sig + msg = format('%s request missing required parameter from message %s', + obj.mode, message) + raise ProtocolError.new(message, msg) end - return obj + obj end # Respond to this request. @@ -124,33 +116,33 @@ def answer(signatory) # message cannot be replayed. signatory.invalidate(@assoc_handle, true) response = OpenIDResponse.new(self) - valid_str = is_valid ? "true" : "false" + valid_str = is_valid ? 'true' : 'false' response.fields.set_arg(OPENID_NS, 'is_valid', valid_str) if @invalidate_handle assoc = signatory.get_association(@invalidate_handle, false) - if !assoc + unless assoc response.fields.set_arg( - OPENID_NS, 'invalidate_handle', @invalidate_handle) + OPENID_NS, 'invalidate_handle', @invalidate_handle + ) end end - return response + response end def to_s ih = nil - if @invalidate_handle - ih = sprintf(" invalidate? %s", @invalidate_handle) - else - ih = "" - end + ih = if @invalidate_handle + format(' invalidate? %s', @invalidate_handle) + else + '' + end - s = sprintf("<%s handle: %s sig: %s: signed: %s%s>", - self.class, @assoc_handle, - @sig, @signed, ih) - return s + format('<%s handle: %s sig: %s: signed: %s%s>', + self.class, @assoc_handle, + @sig, @signed, ih) end end @@ -179,15 +171,15 @@ class PlainTextServerSession < BaseServerSession attr_reader :session_type def initialize - super('no-encryption', ['HMAC-SHA1', 'HMAC-SHA256']) + super('no-encryption', %w[HMAC-SHA1 HMAC-SHA256]) end - def self.from_message(unused_request) - return self.new + def self.from_message(_unused_request) + new end def answer(secret) - return {'mac_key' => Util.to_base64(secret)} + { 'mac_key' => Util.to_base64(secret) } end end @@ -197,7 +189,6 @@ def answer(secret) # See OpenID Specs, Section 8: Establishing Associations # class DiffieHellmanSHA1ServerSession < BaseServerSession - # The Diffie-Hellman algorithm values for this request attr_accessor :dh @@ -222,19 +213,19 @@ def initialize(dh, consumer_pubkey) def self.from_message(message) dh_modulus = message.get_arg(OPENID_NS, 'dh_modulus') dh_gen = message.get_arg(OPENID_NS, 'dh_gen') - if ((!dh_modulus and dh_gen) or - (!dh_gen and dh_modulus)) + if (!dh_modulus and dh_gen) or + (!dh_gen and dh_modulus) - if !dh_modulus - missing = 'modulus' - else - missing = 'generator' - end + missing = if !dh_modulus + 'modulus' + else + 'generator' + end raise ProtocolError.new(message, - sprintf('If non-default modulus or generator is ' + - 'supplied, both must be supplied. Missing %s', - missing)) + format('If non-default modulus or generator is ' + + 'supplied, both must be supplied. Missing %s', + missing)) end if dh_modulus or dh_gen @@ -242,29 +233,29 @@ def self.from_message(message) dh_gen = CryptUtil.base64_to_num(dh_gen) dh = DiffieHellman.new(dh_modulus, dh_gen) else - dh = DiffieHellman.from_defaults() + dh = DiffieHellman.from_defaults end consumer_pubkey = message.get_arg(OPENID_NS, 'dh_consumer_public') - if !consumer_pubkey + unless consumer_pubkey raise ProtocolError.new(message, - sprintf("Public key for DH-SHA1 session " + - "not found in message %s", message)) + format('Public key for DH-SHA1 session ' + + 'not found in message %s', message)) end consumer_pubkey = CryptUtil.base64_to_num(consumer_pubkey) - return self.new(dh, consumer_pubkey) + new(dh, consumer_pubkey) end def answer(secret) mac_key = @dh.xor_secret(@hash_func, @consumer_pubkey, secret) - return { - 'dh_server_public' => CryptUtil.num_to_base64(@dh.public), - 'enc_mac_key' => Util.to_base64(mac_key), - } + { + 'dh_server_public' => CryptUtil.num_to_base64(@dh.public), + 'enc_mac_key' => Util.to_base64(mac_key) + } end end @@ -293,7 +284,7 @@ class AssociateRequest < OpenIDRequest @@session_classes = { 'no-encryption' => PlainTextServerSession, 'DH-SHA1' => DiffieHellmanSHA1ServerSession, - 'DH-SHA256' => DiffieHellmanSHA256ServerSession, + 'DH-SHA256' => DiffieHellmanSHA256ServerSession } # Construct me. @@ -305,12 +296,12 @@ def initialize(session, assoc_type) @session = session @assoc_type = assoc_type - @mode = "associate" + @mode = 'associate' end # Construct me from an OpenID Message. - def self.from_message(message, op_endpoint=UNUSED) - if message.is_openid1() + def self.from_message(message, _op_endpoint = UNUSED) + if message.is_openid1 session_type = message.get_arg(OPENID_NS, 'session_type') if session_type == 'no-encryption' Util.log('Received OpenID 1 request with a no-encryption ' + @@ -320,38 +311,38 @@ def self.from_message(message, op_endpoint=UNUSED) end else session_type = message.get_arg(OPENID2_NS, 'session_type') - if !session_type + unless session_type raise ProtocolError.new(message, - "session_type missing from request") + 'session_type missing from request') end end session_class = @@session_classes[session_type] - if !session_class + unless session_class raise ProtocolError.new(message, - sprintf("Unknown session type %s", session_type)) + format('Unknown session type %s', session_type)) end begin session = session_class.from_message(message) - rescue ArgumentError => why + rescue ArgumentError => e # XXX raise ProtocolError.new(message, - sprintf('Error parsing %s session: %s', - session_type, why)) + format('Error parsing %s session: %s', + session_type, e)) end assoc_type = message.get_arg(OPENID_NS, 'assoc_type', 'HMAC-SHA1') - if !session.allowed_assoc_type?(assoc_type) - msg = sprintf('Session type %s does not support association type %s', - session_type, assoc_type) + unless session.allowed_assoc_type?(assoc_type) + msg = format('Session type %s does not support association type %s', + session_type, assoc_type) raise ProtocolError.new(message, msg) end - obj = self.new(session, assoc_type) + obj = new(session, assoc_type) obj.message = message - return obj + obj end # Respond to this request with an association. @@ -363,28 +354,27 @@ def self.from_message(message, op_endpoint=UNUSED) def answer(assoc) response = OpenIDResponse.new(self) response.fields.update_args(OPENID_NS, { - 'expires_in' => sprintf('%d', assoc.expires_in()), - 'assoc_type' => @assoc_type, - 'assoc_handle' => assoc.handle, - }) + 'expires_in' => format('%d', assoc.expires_in), + 'assoc_type' => @assoc_type, + 'assoc_handle' => assoc.handle + }) response.fields.update_args(OPENID_NS, - @session.answer(assoc.secret)) - unless (@session.session_type == 'no-encryption' and - @message.is_openid1) + @session.answer(assoc.secret)) + unless @session.session_type == 'no-encryption' and + @message.is_openid1 response.fields.set_arg( - OPENID_NS, 'session_type', @session.session_type) + OPENID_NS, 'session_type', @session.session_type + ) end - return response + response end # Respond to this request indicating that the association type # or association session type is not supported. - def answer_unsupported(message, preferred_association_type=nil, - preferred_session_type=nil) - if @message.is_openid1() - raise ProtocolError.new(@message) - end + def answer_unsupported(message, preferred_association_type = nil, + preferred_session_type = nil) + raise ProtocolError.new(@message) if @message.is_openid1 response = OpenIDResponse.new(self) response.fields.set_arg(OPENID_NS, 'error_code', 'unsupported-type') @@ -392,15 +382,17 @@ def answer_unsupported(message, preferred_association_type=nil, if preferred_association_type response.fields.set_arg( - OPENID_NS, 'assoc_type', preferred_association_type) + OPENID_NS, 'assoc_type', preferred_association_type + ) end if preferred_session_type response.fields.set_arg( - OPENID_NS, 'session_type', preferred_session_type) + OPENID_NS, 'session_type', preferred_session_type + ) end - return response + response end end @@ -409,7 +401,6 @@ def answer_unsupported(message, preferred_association_type=nil, # This class handles requests for openid modes # +checkid_immediate+ and +checkid_setup+ . class CheckIDRequest < OpenIDRequest - # Provided in smart mode requests, a handle for a previously # established association. nil for dumb mode requests. attr_accessor :assoc_handle @@ -444,8 +435,8 @@ class CheckIDRequest < OpenIDRequest # # Raises #MalformedReturnURL when the +return_to+ URL is not # a URL. - def initialize(identity, return_to, op_endpoint, trust_root=nil, - immediate=false, assoc_handle=nil, claimed_id=nil) + def initialize(identity, return_to, op_endpoint, trust_root = nil, + immediate = false, assoc_handle = nil, claimed_id = nil) @assoc_handle = assoc_handle @identity = identity @claimed_id = (claimed_id or identity) @@ -456,20 +447,20 @@ def initialize(identity, return_to, op_endpoint, trust_root=nil, if immediate @immediate = true - @mode = "checkid_immediate" + @mode = 'checkid_immediate' else @immediate = false - @mode = "checkid_setup" + @mode = 'checkid_setup' end if @return_to and - !TrustRoot::TrustRoot.parse(@return_to) + !TrustRoot::TrustRoot.parse(@return_to) raise MalformedReturnURL.new(nil, @return_to) end - if !trust_root_valid() - raise UntrustedReturnURL.new(nil, @return_to, @trust_root) - end + return if trust_root_valid + + raise UntrustedReturnURL.new(nil, @return_to, @trust_root) end # Construct me from an OpenID message. @@ -488,59 +479,57 @@ def initialize(identity, return_to, op_endpoint, trust_root=nil, # UntrustedReturnURL:: When the +return_to+ URL is # outside the +trust_root+. def self.from_message(message, op_endpoint) - obj = self.allocate + obj = allocate obj.message = message obj.op_endpoint = op_endpoint mode = message.get_arg(OPENID_NS, 'mode') - if mode == "checkid_immediate" + if mode == 'checkid_immediate' obj.immediate = true - obj.mode = "checkid_immediate" + obj.mode = 'checkid_immediate' else obj.immediate = false - obj.mode = "checkid_setup" + obj.mode = 'checkid_setup' end obj.return_to = message.get_arg(OPENID_NS, 'return_to') if message.is_openid1 and !obj.return_to - msg = sprintf("Missing required field 'return_to' from %s", - message) + msg = format("Missing required field 'return_to' from %s", + message) raise ProtocolError.new(message, msg) end obj.identity = message.get_arg(OPENID_NS, 'identity') obj.claimed_id = message.get_arg(OPENID_NS, 'claimed_id') - if message.is_openid1() - if !obj.identity - s = "OpenID 1 message did not contain openid.identity" - raise ProtocolError.new(message, s) - end - else - if obj.identity and not obj.claimed_id - s = ("OpenID 2.0 message contained openid.identity but not " + - "claimed_id") - raise ProtocolError.new(message, s) - elsif obj.claimed_id and not obj.identity - s = ("OpenID 2.0 message contained openid.claimed_id but not " + - "identity") + if message.is_openid1 + unless obj.identity + s = 'OpenID 1 message did not contain openid.identity' raise ProtocolError.new(message, s) end + elsif obj.identity and !obj.claimed_id + s = ('OpenID 2.0 message contained openid.identity but not ' + + 'claimed_id') + raise ProtocolError.new(message, s) + elsif obj.claimed_id and !obj.identity + s = ('OpenID 2.0 message contained openid.claimed_id but not ' + + 'identity') + raise ProtocolError.new(message, s) end # There's a case for making self.trust_root be a TrustRoot # here. But if TrustRoot isn't currently part of the "public" # API, I'm not sure it's worth doing. - if message.is_openid1 - trust_root_param = 'trust_root' - else - trust_root_param = 'realm' - end + trust_root_param = if message.is_openid1 + 'trust_root' + else + 'realm' + end trust_root = message.get_arg(OPENID_NS, trust_root_param) - trust_root = obj.return_to if (trust_root.nil? || trust_root.empty?) + trust_root = obj.return_to if trust_root.nil? || trust_root.empty? obj.trust_root = trust_root if !message.is_openid1 and !obj.return_to and !obj.trust_root - raise ProtocolError.new(message, "openid.realm required when " + - "openid.return_to absent") + raise ProtocolError.new(message, 'openid.realm required when ' + + 'openid.return_to absent') end obj.assoc_handle = message.get_arg(OPENID_NS, 'assoc_handle') @@ -552,7 +541,7 @@ def self.from_message(message, op_endpoint) # return_to URLs, however (particularly ones with wildcards), # so this is still a little sketchy. if obj.return_to and \ - !TrustRoot::TrustRoot.parse(obj.return_to) + !TrustRoot::TrustRoot.parse(obj.return_to) raise MalformedReturnURL.new(message, obj.return_to) end @@ -562,35 +551,27 @@ def self.from_message(message, op_endpoint) # really part of data validation. A request with an invalid # trust_root/return_to is broken regardless of application, # right? - if !obj.trust_root_valid() - raise UntrustedReturnURL.new(message, obj.return_to, obj.trust_root) - end + raise UntrustedReturnURL.new(message, obj.return_to, obj.trust_root) unless obj.trust_root_valid - return obj + obj end # Is the identifier to be selected by the IDP? def id_select # So IDPs don't have to import the constant - return @identity == IDENTIFIER_SELECT + @identity == IDENTIFIER_SELECT end # Is my return_to under my trust_root? def trust_root_valid - if !@trust_root - return true - end + return true unless @trust_root tr = TrustRoot::TrustRoot.parse(@trust_root) - if !tr - raise MalformedTrustRoot.new(@message, @trust_root) - end + raise MalformedTrustRoot.new(@message, @trust_root) unless tr - if @return_to - return tr.validate_url(@return_to) - else - return true - end + return tr.validate_url(@return_to) if @return_to + + true end # Does the relying party publish the return_to URL for this @@ -610,7 +591,7 @@ def trust_root_valid # Returns true if the realm publishes a document with the # return_to URL listed def return_to_verified - return TrustRoot.verify_return_to(@trust_root, @return_to) + TrustRoot.verify_return_to(@trust_root, @return_to) end # Respond to this request. @@ -654,56 +635,50 @@ def return_to_verified # Raises NoReturnToError if the return_to is missing. # # Version 2.0 deprecates +server_url+ and adds +claimed_id+. - def answer(allow, server_url=nil, identity=nil, claimed_id=nil) - if !@return_to - raise NoReturnToError - end + def answer(allow, server_url = nil, identity = nil, claimed_id = nil) + raise NoReturnToError unless @return_to - if !server_url + unless server_url if @message.is_openid2 and !@op_endpoint # In other words, that warning I raised in # Server.__init__? You should pay attention to it now. - raise RuntimeError, ("#{self} should be constructed with "\ - "op_endpoint to respond to OpenID 2.0 "\ - "messages.") + raise "#{self} should be constructed with "\ + 'op_endpoint to respond to OpenID 2.0 '\ + 'messages.' end server_url = @op_endpoint end - if allow - mode = 'id_res' - elsif @message.is_openid1 - if @immediate - mode = 'id_res' - else - mode = 'cancel' - end - else - if @immediate - mode = 'setup_needed' - else - mode = 'cancel' - end - end + mode = if allow + 'id_res' + elsif @message.is_openid1 + if @immediate + 'id_res' + else + 'cancel' + end + elsif @immediate + 'setup_needed' + else + 'cancel' + end response = OpenIDResponse.new(self) if claimed_id and @message.is_openid1 - raise VersionError, ("claimed_id is new in OpenID 2.0 and not "\ - "available for #{@message.get_openid_namespace}") + raise VersionError, 'claimed_id is new in OpenID 2.0 and not '\ + "available for #{@message.get_openid_namespace}" end - if identity and !claimed_id - claimed_id = identity - end + claimed_id = identity if identity and !claimed_id if allow if @identity == IDENTIFIER_SELECT - if !identity - raise ArgumentError, ("This request uses IdP-driven "\ - "identifier selection.You must supply "\ - "an identifier in the response.") + unless identity + raise ArgumentError, 'This request uses IdP-driven '\ + 'identifier selection.You must supply '\ + 'an identifier in the response.' end response_identity = identity @@ -711,31 +686,31 @@ def answer(allow, server_url=nil, identity=nil, claimed_id=nil) elsif @identity if identity and (@identity != identity) - raise ArgumentError, ("Request was for identity #{@identity}, "\ - "cannot reply with identity #{identity}") + raise ArgumentError, "Request was for identity #{@identity}, "\ + "cannot reply with identity #{identity}" end response_identity = @identity response_claimed_id = @claimed_id else if identity - raise ArgumentError, ("This request specified no identity "\ - "and you supplied #{identity}") + raise ArgumentError, 'This request specified no identity '\ + "and you supplied #{identity}" end response_identity = nil end if @message.is_openid1 and !response_identity - raise ArgumentError, ("Request was an OpenID 1 request, so "\ - "response must include an identifier.") + raise ArgumentError, 'Request was an OpenID 1 request, so '\ + 'response must include an identifier.' end response.fields.update_args(OPENID_NS, { - 'mode' => mode, - 'op_endpoint' => server_url, - 'return_to' => @return_to, - 'response_nonce' => Nonce.mk_nonce(), - }) + 'mode' => mode, + 'op_endpoint' => server_url, + 'return_to' => @return_to, + 'response_nonce' => Nonce.mk_nonce + }) if response_identity response.fields.set_arg(OPENID_NS, 'identity', response_identity) @@ -748,8 +723,8 @@ def answer(allow, server_url=nil, identity=nil, claimed_id=nil) response.fields.set_arg(OPENID_NS, 'mode', mode) if @immediate if @message.is_openid1 and !server_url - raise ArgumentError, ("setup_url is required for allow=false "\ - "in OpenID 1.x immediate mode.") + raise ArgumentError, 'setup_url is required for allow=false '\ + 'in OpenID 1.x immediate mode.' end # Make a new request just like me, but with @@ -763,7 +738,7 @@ def answer(allow, server_url=nil, identity=nil, claimed_id=nil) end end - return response + response end def encode_to_url(server_url) @@ -771,18 +746,16 @@ def encode_to_url(server_url) # # server_url:: The URL of the OpenID server to make this # request of. - if !@return_to - raise NoReturnToError - end + raise NoReturnToError unless @return_to # Imported from the alternate reality where these classes are # used in both the client and server code, so Requests are # Encodable too. That's right, code imported from alternate # realities all for the love of you, id_res/user_setup_url. - q = {'mode' => @mode, - 'identity' => @identity, - 'claimed_id' => @claimed_id, - 'return_to' => @return_to} + q = { 'mode' => @mode, + 'identity' => @identity, + 'claimed_id' => @claimed_id, + 'return_to' => @return_to } if @trust_root if @message.is_openid1 @@ -792,13 +765,11 @@ def encode_to_url(server_url) end end - if @assoc_handle - q['assoc_handle'] = @assoc_handle - end + q['assoc_handle'] = @assoc_handle if @assoc_handle response = Message.new(@message.get_openid_namespace) response.update_args(@message.get_openid_namespace, q) - return response.to_url(server_url) + response.to_url(server_url) end def cancel_url @@ -812,26 +783,24 @@ def cancel_url # server so that it knows that the user did make a decision.) # # Returns a URL as a string. - if !@return_to - raise NoReturnToError - end + raise NoReturnToError unless @return_to if @immediate - raise ArgumentError.new("Cancel is not an appropriate response to " + - "immediate mode requests.") + raise ArgumentError.new('Cancel is not an appropriate response to ' + + 'immediate mode requests.') end response = Message.new(@message.get_openid_namespace) response.set_arg(OPENID_NS, 'mode', 'cancel') - return response.to_url(@return_to) + response.to_url(@return_to) end def to_s - return sprintf('<%s id:%s im:%s tr:%s ah:%s>', self.class, - @identity, - @immediate, - @trust_root, - @assoc_handle) + format('<%s id:%s im:%s tr:%s ah:%s>', self.class, + @identity, + @immediate, + @trust_root, + @assoc_handle) end end @@ -864,36 +833,36 @@ def initialize(request) end def to_s - return sprintf("%s for %s: %s", - self.class, - @request.class, - @fields) + format('%s for %s: %s', + self.class, + @request.class, + @fields) end # form_tag_attrs is a hash of attributes to be added to the form # tag. 'accept-charset' and 'enctype' have defaults that can be # overridden. If a value is supplied for 'action' or 'method', - # it will be replaced. + # it will be replaced. # Returns the form markup for this response. - def to_form_markup(form_tag_attrs=nil) - return @fields.to_form_markup(@request.return_to, form_tag_attrs) + def to_form_markup(form_tag_attrs = nil) + @fields.to_form_markup(@request.return_to, form_tag_attrs) end # Wraps the form tag from to_form_markup in a complete HTML document # that uses javascript to autosubmit the form. - def to_html(form_tag_attrs=nil) - return Util.auto_submit_html(to_form_markup(form_tag_attrs)) + def to_html(form_tag_attrs = nil) + Util.auto_submit_html(to_form_markup(form_tag_attrs)) end def render_as_form # Returns true if this response's encoding is # ENCODE_HTML_FORM. Convenience method for server authors. - return self.which_encoding == ENCODE_HTML_FORM + which_encoding == ENCODE_HTML_FORM end def needs_signing # Does this response require signing? - return @fields.get_arg(OPENID_NS, 'mode') == 'id_res' + @fields.get_arg(OPENID_NS, 'mode') == 'id_res' end # implements IEncodable @@ -901,22 +870,20 @@ def needs_signing def which_encoding # How should I be encoded? # returns one of ENCODE_URL or ENCODE_KVFORM. - if BROWSER_REQUEST_MODES.member?(@request.mode) - if @fields.is_openid2 and - encode_to_url.length > OPENID1_URL_LIMIT - return ENCODE_HTML_FORM - else - return ENCODE_URL - end + return ENCODE_KVFORM unless BROWSER_REQUEST_MODES.member?(@request.mode) + + if @fields.is_openid2 and + encode_to_url.length > OPENID1_URL_LIMIT + ENCODE_HTML_FORM else - return ENCODE_KVFORM + ENCODE_URL end end def encode_to_url # Encode a response as a URL for the user agent to GET. # You will generally use this URL with a HTTP redirect. - return @fields.to_url(@request.return_to) + @fields.to_url(@request.return_to) end def add_extension(extension_response) @@ -937,11 +904,11 @@ def encode_to_kvform # # see: OpenID Specs, # Key-Value Colon/Newline format - return @fields.to_kvform + @fields.to_kvform end def copy - return Marshal.load(Marshal.dump(self)) + Marshal.load(Marshal.dump(self)) end end @@ -951,7 +918,6 @@ def copy # I generally come from an #Encoder, either directly or from # #Server.encodeResponse. class WebResponse - # The HTTP code of this response as an integer. attr_accessor :code @@ -961,18 +927,14 @@ class WebResponse # The body of this response. attr_accessor :body - def initialize(code=HTTP_OK, headers=nil, body="") + def initialize(code = HTTP_OK, headers = nil, body = '') # Construct me. # # These parameters are assigned directly as class attributes, # see my class documentation for their # descriptions. @code = code - if headers - @headers = headers - else - @headers = {} - end + @headers = headers || {} @body = body end end @@ -1015,21 +977,21 @@ def initialize(store) # Verify that the signature for some data is valid. def verify(assoc_handle, message) assoc = get_association(assoc_handle, true) - if !assoc - Util.log(sprintf("failed to get assoc with handle %s to verify " + - "message %s", assoc_handle, message)) + unless assoc + Util.log(format('failed to get assoc with handle %s to verify ' + + 'message %s', assoc_handle, message)) return false end begin valid = assoc.check_message_signature(message) - rescue StandardError => ex - Util.log(sprintf("Error in verifying %s with %s: %s", - message, assoc, ex)) + rescue StandardError => e + Util.log(format('Error in verifying %s with %s: %s', + message, assoc, e)) return false end - return valid + valid end # Sign a response. @@ -1050,7 +1012,8 @@ def sign(response) if !assoc or assoc.expires_in <= 0 # fall back to dumb mode signed_response.fields.set_arg( - OPENID_NS, 'invalidate_handle', assoc_handle) + OPENID_NS, 'invalidate_handle', assoc_handle + ) assoc_type = assoc ? assoc.assoc_type : 'HMAC-SHA1' if assoc and assoc.expires_in <= 0 # now do the clean-up that the disabled checkExpiration @@ -1066,33 +1029,34 @@ def sign(response) begin signed_response.fields = assoc.sign_message(signed_response.fields) - rescue KVFormError => err - raise EncodingError, err + rescue KVFormError => e + raise EncodingError, e end - return signed_response + signed_response end # Make a new association. - def create_association(dumb=true, assoc_type='HMAC-SHA1') + def create_association(dumb = true, assoc_type = 'HMAC-SHA1') secret = CryptUtil.random_string(OpenID.get_secret_size(assoc_type)) uniq = Util.to_base64(CryptUtil.random_string(4)) - handle = sprintf('{%s}{%x}{%s}', assoc_type, Time.now.to_i, uniq) + handle = format('{%s}{%x}{%s}', assoc_type, Time.now.to_i, uniq) assoc = Association.from_expires_in( - secret_lifetime, handle, secret, assoc_type) + secret_lifetime, handle, secret, assoc_type + ) - if dumb - key = @@_dumb_key - else - key = @@_normal_key - end + key = if dumb + @@_dumb_key + else + @@_normal_key + end @store.store_association(key, assoc) - return assoc + assoc end # Get the association with the specified handle. - def get_association(assoc_handle, dumb, checkExpiration=true) + def get_association(assoc_handle, dumb, check_expiration = true) # Hmm. We've created an interface that deals almost entirely # with assoc_handles. The only place outside the Signatory # that uses this (and thus the only place that ever sees @@ -1100,37 +1064,35 @@ def get_association(assoc_handle, dumb, checkExpiration=true) # association request, as it must have the association's # secret. - if !assoc_handle - raise ArgumentError.new("assoc_handle must not be None") - end + raise ArgumentError.new('assoc_handle must not be None') unless assoc_handle - if dumb - key = @@_dumb_key - else - key = @@_normal_key - end + key = if dumb + @@_dumb_key + else + @@_normal_key + end assoc = @store.get_association(key, assoc_handle) if assoc and assoc.expires_in <= 0 - Util.log(sprintf("requested %sdumb key %s is expired (by %s seconds)", - (!dumb) ? 'not-' : '', - assoc_handle, assoc.expires_in)) - if checkExpiration + Util.log(format('requested %sdumb key %s is expired (by %s seconds)', + !dumb ? 'not-' : '', + assoc_handle, assoc.expires_in)) + if check_expiration @store.remove_association(key, assoc_handle) assoc = nil end end - return assoc + assoc end # Invalidates the association with the given handle. def invalidate(assoc_handle, dumb) - if dumb - key = @@_dumb_key - else - key = @@_normal_key - end + key = if dumb + @@_dumb_key + else + @@_normal_key + end @store.remove_association(key, assoc_handle) end @@ -1151,34 +1113,31 @@ class Encoder # Raises EncodingError when I can't figure out how to encode # this message. def encode(response) - encode_as = response.which_encoding() + encode_as = response.which_encoding if encode_as == ENCODE_KVFORM wr = @@responseFactory.new(HTTP_OK, nil, - response.encode_to_kvform()) - if response.is_a?(Exception) - wr.code = HTTP_ERROR - end + response.encode_to_kvform) + wr.code = HTTP_ERROR if response.is_a?(Exception) elsif encode_as == ENCODE_URL - location = response.encode_to_url() + location = response.encode_to_url wr = @@responseFactory.new(HTTP_REDIRECT, - {'location' => location}) + { 'location' => location }) elsif encode_as == ENCODE_HTML_FORM wr = @@responseFactory.new(HTTP_OK, nil, - response.to_form_markup()) + response.to_form_markup) else # Can't encode this to a protocol message. You should # probably render it to HTML and show it to the user. raise EncodingError.new(response) end - return wr + wr end end # I encode responses in to WebResponses, signing # them when required. class SigningEncoder < Encoder - attr_accessor :signatory # Create a SigningEncoder given a Signatory @@ -1196,33 +1155,31 @@ def initialize(signatory) def encode(response) # the is_a? is a bit of a kludge... it means there isn't # really an adapter to make the interfaces quite match. - if !response.is_a?(Exception) and response.needs_signing() - if !@signatory + if !response.is_a?(Exception) and response.needs_signing + unless @signatory raise ArgumentError.new( - sprintf("Must have a store to sign this request: %s", - response), response) + format('Must have a store to sign this request: %s', + response), response + ) end - if response.fields.has_key?(OPENID_NS, 'sig') - raise AlreadySigned.new(response) - end + raise AlreadySigned.new(response) if response.fields.has_key?(OPENID_NS, 'sig') response = @signatory.sign(response) end - return super(response) + super(response) end end # I decode an incoming web request in to a OpenIDRequest. class Decoder - @@handlers = { 'checkid_setup' => CheckIDRequest.method('from_message'), 'checkid_immediate' => CheckIDRequest.method('from_message'), 'check_authentication' => CheckAuthRequest.method('from_message'), - 'associate' => AssociateRequest.method('from_message'), - } + 'associate' => AssociateRequest.method('from_message') + } attr_accessor :server @@ -1240,9 +1197,7 @@ def initialize(server) # Raises ProtocolError when the query does not seem to be a valid # OpenID request. def decode(query) - if query.nil? or query.empty? - return nil - end + return nil if query.nil? or query.empty? begin message = Message.from_post_args(query) @@ -1254,22 +1209,22 @@ def decode(query) end mode = message.get_arg(OPENID_NS, 'mode') - if !mode - msg = sprintf("No mode value in message %s", message) + unless mode + msg = format('No mode value in message %s', message) raise ProtocolError.new(message, msg) end - handler = @@handlers.fetch(mode, self.method('default_decoder')) - return handler.call(message, @server.op_endpoint) + handler = @@handlers.fetch(mode, method('default_decoder')) + handler.call(message, @server.op_endpoint) end # Called to decode queries when no handler for that mode is # found. # # This implementation always raises ProtocolError. - def default_decoder(message, server) + def default_decoder(message, _server) mode = message.get_arg(OPENID_NS, 'mode') - msg = sprintf("Unrecognized OpenID mode %s", mode) + msg = format('Unrecognized OpenID mode %s', mode) raise ProtocolError.new(message, msg) end end @@ -1316,7 +1271,7 @@ def initialize(store, op_endpoint) @signatory = @@signatoryClass.new(@store) @encoder = @@encoderClass.new(@signatory) @decoder = @@decoderClass.new(self) - @negotiator = DefaultNegotiator.copy() + @negotiator = DefaultNegotiator.copy @op_endpoint = op_endpoint end @@ -1328,19 +1283,18 @@ def initialize(store, op_endpoint) # or add a method to me for handling that request type. def handle_request(request) begin - handler = self.method('openid_' + request.mode) + handler = method('openid_' + request.mode) rescue NameError - raise RuntimeError.new( - sprintf("%s has no handler for a request of mode %s.", - self, request.mode)) + raise format('%s has no handler for a request of mode %s.', + self, request.mode).to_s end - return handler.call(request) + handler.call(request) end # Handle and respond to check_authentication requests. def openid_check_authentication(request) - return request.answer(@signatory) + request.answer(@signatory) end # Handle and respond to associate requests. @@ -1350,14 +1304,14 @@ def openid_associate(request) if @negotiator.allowed?(assoc_type, session_type) assoc = @signatory.create_association(false, assoc_type) - return request.answer(assoc) + request.answer(assoc) else - message = sprintf('Association type %s is not supported with ' + + message = format('Association type %s is not supported with ' + 'session type %s', assoc_type, session_type) - preferred_assoc_type, preferred_session_type = @negotiator.get_allowed_type() - return request.answer_unsupported(message, - preferred_assoc_type, - preferred_session_type) + preferred_assoc_type, preferred_session_type = @negotiator.get_allowed_type + request.answer_unsupported(message, + preferred_assoc_type, + preferred_session_type) end end @@ -1368,7 +1322,7 @@ def openid_associate(request) # If the query does not seem to be an OpenID request at all, I # return nil. def decode_request(query) - return @decoder.decode(query) + @decoder.decode(query) end # Encode a response to a WebResponse, signing it first if @@ -1379,7 +1333,7 @@ def decode_request(query) # # Raises AlreadySigned When this response is already signed. def encode_response(response) - return @encoder.encode(response) + @encoder.encode(response) end end @@ -1387,11 +1341,10 @@ def encode_response(response) class ProtocolError < Exception # The query that is failing to be a valid OpenID request. attr_accessor :openid_message - attr_accessor :reference - attr_accessor :contact + attr_accessor :reference, :contact # text:: A message about the encountered error. - def initialize(message, text=nil, reference=nil, contact=nil) + def initialize(message, text = nil, reference = nil, contact = nil) @openid_message = message @reference = reference @contact = contact @@ -1401,53 +1354,47 @@ def initialize(message, text=nil, reference=nil, contact=nil) # Get the return_to argument from the request, if any. def get_return_to - if @openid_message.nil? - return nil - else - return @openid_message.get_arg(OPENID_NS, 'return_to') - end + return nil if @openid_message.nil? + + @openid_message.get_arg(OPENID_NS, 'return_to') end # Did this request have a return_to parameter? def has_return_to - return !get_return_to.nil? + !get_return_to.nil? end # Generate a Message object for sending to the relying party, # after encoding. def to_message - namespace = @openid_message.get_openid_namespace() + namespace = @openid_message.get_openid_namespace reply = Message.new(namespace) reply.set_arg(OPENID_NS, 'mode', 'error') - reply.set_arg(OPENID_NS, 'error', self.to_s) + reply.set_arg(OPENID_NS, 'error', to_s) - if @contact - reply.set_arg(OPENID_NS, 'contact', @contact.to_s) - end + reply.set_arg(OPENID_NS, 'contact', @contact.to_s) if @contact - if @reference - reply.set_arg(OPENID_NS, 'reference', @reference.to_s) - end + reply.set_arg(OPENID_NS, 'reference', @reference.to_s) if @reference - return reply + reply end # implements IEncodable def encode_to_url - return to_message().to_url(get_return_to()) + to_message.to_url(get_return_to) end def encode_to_kvform - return to_message().to_kvform() + to_message.to_kvform end def to_form_markup - return to_message().to_form_markup(get_return_to()) + to_message.to_form_markup(get_return_to) end def to_html - return Util.auto_submit_html(to_form_markup) + Util.auto_submit_html(to_form_markup) end # How should I be encoded? @@ -1456,30 +1403,24 @@ def to_html # I cannot be encoded as a protocol message and should be # displayed to the user. def which_encoding - if has_return_to() + if has_return_to if @openid_message.is_openid2 and - encode_to_url().length > OPENID1_URL_LIMIT + encode_to_url.length > OPENID1_URL_LIMIT return ENCODE_HTML_FORM else return ENCODE_URL end end - if @openid_message.nil? - return nil - end + return nil if @openid_message.nil? mode = @openid_message.get_arg(OPENID_NS, 'mode') - if mode - if !BROWSER_REQUEST_MODES.member?(mode) - return ENCODE_KVFORM - end - end + return ENCODE_KVFORM if mode && !BROWSER_REQUEST_MODES.member?(mode) # If your request was so broken that you didn't manage to # include an openid.mode, I'm not going to worry too much # about returning you something you can't parse. - return nil + nil end end @@ -1521,9 +1462,9 @@ def initialize(message, return_to, trust_root) end def to_s - return sprintf("return_to %s not under trust_root %s", - @return_to, - @trust_root) + format('return_to %s not under trust_root %s', + @return_to, + @trust_root) end end diff --git a/lib/openid/store/filesystem.rb b/lib/openid/store/filesystem.rb index cd9a038d..2a7a3dfc 100644 --- a/lib/openid/store/filesystem.rb +++ b/lib/openid/store/filesystem.rb @@ -9,7 +9,7 @@ module OpenID module Store class Filesystem < Interface - @@FILENAME_ALLOWED = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-".split("") + @@FILENAME_ALLOWED = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-'.split('') # Create a Filesystem store instance, putting all data in +directory+. def initialize(directory) @@ -17,28 +17,26 @@ def initialize(directory) @association_dir = File.join(directory, 'associations') @temp_dir = File.join(directory, 'temp') - self.ensure_dir(@nonce_dir) - self.ensure_dir(@association_dir) - self.ensure_dir(@temp_dir) + ensure_dir(@nonce_dir) + ensure_dir(@association_dir) + ensure_dir(@temp_dir) end # Create a unique filename for a given server url and handle. The # filename that is returned will contain the domain name from the # server URL for ease of human inspection of the data dir. def get_association_filename(server_url, handle) - unless server_url.index('://') - raise ArgumentError, "Bad server URL: #{server_url}" - end + raise ArgumentError, "Bad server URL: #{server_url}" unless server_url.index('://') proto, rest = server_url.split('://', 2) - domain = filename_escape(rest.split('/',2)[0]) + domain = filename_escape(rest.split('/', 2)[0]) url_hash = safe64(server_url) - if handle - handle_hash = safe64(handle) - else - handle_hash = '' - end - filename = [proto,domain,url_hash,handle_hash].join('-') + handle_hash = if handle + safe64(handle) + else + '' + end + filename = [proto, domain, url_hash, handle_hash].join('-') File.join(@association_dir, filename) end @@ -59,7 +57,6 @@ def store_association(server_url, association) begin File.rename(tmp, filename) rescue Errno::EEXIST - begin File.unlink(filename) rescue Errno::ENOENT @@ -68,73 +65,66 @@ def store_association(server_url, association) File.rename(tmp, filename) end - - rescue - self.remove_if_present(tmp) + rescue StandardError + remove_if_present(tmp) raise end end # Retrieve an association - def get_association(server_url, handle=nil) + def get_association(server_url, handle = nil) # the filename with empty handle is the prefix for the associations # for a given server url filename = get_association_filename(server_url, handle) - if handle - return _get_association(filename) - end + return _get_association(filename) if handle + assoc_filenames = Dir.glob(filename.to_s + '*') assocs = assoc_filenames.collect do |f| _get_association(f) end - assocs = assocs.find_all { |a| not a.nil? } + assocs = assocs.find_all { |a| !a.nil? } assocs = assocs.sort_by { |a| a.issued } return nil if assocs.empty? - return assocs[-1] + + assocs[-1] end def _get_association(filename) + assoc_file = File.open(filename, 'r') + rescue Errno::ENOENT + nil + else begin - assoc_file = File.open(filename, "r") - rescue Errno::ENOENT + assoc_s = assoc_file.read + ensure + assoc_file.close + end + + begin + association = Association.deserialize(assoc_s) + rescue StandardError + remove_if_present(filename) return nil - else - begin - assoc_s = assoc_file.read - ensure - assoc_file.close - end + end - begin - association = Association.deserialize(assoc_s) - rescue - self.remove_if_present(filename) - return nil - end + # clean up expired associations + return association unless association.expires_in == 0 - # clean up expired associations - if association.expires_in == 0 - self.remove_if_present(filename) - return nil - else - return association - end - end + remove_if_present(filename) + nil end # Remove an association if it exists, otherwise do nothing. def remove_association(server_url, handle) assoc = get_association(server_url, handle) - if assoc.nil? - return false - else - filename = get_association_filename(server_url, handle) - return self.remove_if_present(filename) - end + return false if assoc.nil? + + filename = get_association_filename(server_url, handle) + remove_if_present(filename) end # Return whether the nonce is valid @@ -142,26 +132,27 @@ def use_nonce(server_url, timestamp, salt) return false if (timestamp - Time.now.to_i).abs > Nonce.skew if server_url and !server_url.empty? - proto, rest = server_url.split('://',2) + proto, rest = server_url.split('://', 2) else - proto, rest = '','' + proto = '' + rest = '' end - raise "Bad server URL" unless proto && rest + raise 'Bad server URL' unless proto && rest - domain = filename_escape(rest.split('/',2)[0]) + domain = filename_escape(rest.split('/', 2)[0]) url_hash = safe64(server_url) salt_hash = safe64(salt) - nonce_fn = '%08x-%s-%s-%s-%s'%[timestamp, proto, domain, url_hash, salt_hash] + nonce_fn = format('%08x-%s-%s-%s-%s', timestamp, proto, domain, url_hash, salt_hash) filename = File.join(@nonce_dir, nonce_fn) begin - fd = File.new(filename, File::CREAT | File::EXCL | File::WRONLY, 0200) + fd = File.new(filename, File::CREAT | File::EXCL | File::WRONLY, 0o200) fd.close - return true + true rescue Errno::EEXIST - return false + false end end @@ -173,37 +164,35 @@ def cleanup end def cleanup_associations - association_filenames = Dir[File.join(@association_dir, "*")] + association_filenames = Dir[File.join(@association_dir, '*')] count = 0 association_filenames.each do |af| + f = File.open(af, 'r') + rescue Errno::ENOENT + next + else + begin + assoc_s = f.read + ensure + f.close + end begin - f = File.open(af, 'r') - rescue Errno::ENOENT + association = OpenID::Association.deserialize(assoc_s) + rescue StandardError + remove_if_present(af) next else - begin - assoc_s = f.read - ensure - f.close - end - begin - association = OpenID::Association.deserialize(assoc_s) - rescue StandardError - self.remove_if_present(af) - next - else - if association.expires_in == 0 - self.remove_if_present(af) - count += 1 - end + if association.expires_in == 0 + remove_if_present(af) + count += 1 end end end - return count + count end def cleanup_nonces - nonces = Dir[File.join(@nonce_dir, "*")] + nonces = Dir[File.join(@nonce_dir, '*')] now = Time.now.to_i count = 0 @@ -212,11 +201,11 @@ def cleanup_nonces timestamp = nonce.split('-', 2)[0].to_i(16) nonce_age = (timestamp - now).abs if nonce_age > Nonce.skew - self.remove_if_present(filename) + remove_if_present(filename) count += 1 end end - return count + count end protected @@ -230,11 +219,15 @@ def mktemp # create a safe filename from a url def filename_escape(s) s = '' if s.nil? - s.each_char.flat_map {|c| - @@FILENAME_ALLOWED.include?(c) ? c : c.bytes.map {|b| - "_%02X" % b - } - }.join + s.each_char.flat_map do |c| + if @@FILENAME_ALLOWED.include?(c) + c + else + c.bytes.map do |b| + '_%02X' % b + end + end + end.join end def safe64(s) @@ -243,7 +236,7 @@ def safe64(s) s.gsub!('+', '_') s.gsub!('/', '.') s.gsub!('=', '') - return s + s end # remove file if present in filesystem @@ -253,14 +246,13 @@ def remove_if_present(filename) rescue Errno::ENOENT return false end - return true + true end # ensure that a path exists def ensure_dir(dir_name) - FileUtils::mkdir_p(dir_name) + FileUtils.mkdir_p(dir_name) end end end end - diff --git a/lib/openid/store/interface.rb b/lib/openid/store/interface.rb index 50819f6f..1a3774d9 100644 --- a/lib/openid/store/interface.rb +++ b/lib/openid/store/interface.rb @@ -1,7 +1,6 @@ require 'openid/util' module OpenID - # Stores for Associations and nonces. Used by both the Consumer and # the Server. If you have a database abstraction layer or other # state storage in your application or framework already, you can @@ -13,7 +12,6 @@ module Store # * changed use_nonce to support one-way nonces # * added cleanup_nonces, cleanup_associations, cleanup class Interface < Object - # Put a Association object into storage. # When implementing a store, don't assume that there are any limitations # on the character set of the server_url. In particular, expect to see @@ -26,7 +24,7 @@ def store_association(server_url, association) # the server_url. Returns nil if no such association is found or if # the one matching association is expired. (Is allowed to GC expired # associations when found.) - def get_association(server_url, handle=nil) + def get_association(server_url, handle = nil) raise NotImplementedError end @@ -68,7 +66,7 @@ def cleanup_associations # Not called during normal library operation, this method is for store # admins to keep their storage from filling up with expired data def cleanup - return cleanup_nonces, cleanup_associations + [cleanup_nonces, cleanup_associations] end end end diff --git a/lib/openid/store/memcache.rb b/lib/openid/store/memcache.rb index de52d267..c98633d7 100644 --- a/lib/openid/store/memcache.rb +++ b/lib/openid/store/memcache.rb @@ -8,7 +8,7 @@ module Store class Memcache < Interface attr_accessor :key_prefix - def initialize(cache_client, key_prefix='openid-store:') + def initialize(cache_client, key_prefix = 'openid-store:') @cache_client = cache_client self.key_prefix = key_prefix end @@ -29,13 +29,11 @@ def store_association(server_url, association) # the server_url. Returns nil if no such association is found or if # the one matching association is expired. (Is allowed to GC expired # associations when found.) - def get_association(server_url, handle=nil) + def get_association(server_url, handle = nil) serialized = @cache_client.get(assoc_key(server_url, handle)) - if serialized - return deserialize(serialized) - else - return nil - end + return deserialize(serialized) if serialized + + nil end # If there is a matching association, remove it from the store and @@ -43,10 +41,8 @@ def get_association(server_url, handle=nil) def remove_association(server_url, handle) deleted = delete(assoc_key(server_url, handle)) server_assoc = get_association(server_url) - if server_assoc && server_assoc.handle == handle - deleted = delete(assoc_key(server_url)) | deleted - end - return deleted + deleted = delete(assoc_key(server_url)) | deleted if server_assoc && server_assoc.handle == handle + deleted end # Return true if the nonce has not been used before, and store it @@ -60,42 +56,34 @@ def remove_association(server_url, handle) # the same second unique def use_nonce(server_url, timestamp, salt) return false if (timestamp - Time.now.to_i).abs > Nonce.skew + ts = timestamp.to_s # base 10 seconds since epoch nonce_key = key_prefix + 'N' + server_url + '|' + ts + '|' + salt result = @cache_client.add(nonce_key, '', expiry(Nonce.skew + 5)) - if result.is_a? String - return !!(result =~ /^STORED/) - else - return !!(result) - end + return !!(result =~ /^STORED/) if result.is_a? String + + !!result end - def assoc_key(server_url, assoc_handle=nil) + def assoc_key(server_url, assoc_handle = nil) key = key_prefix + 'A' + server_url - if assoc_handle - key += '|' + assoc_handle - end - return key + key += '|' + assoc_handle if assoc_handle + key end - def cleanup_nonces - end + def cleanup_nonces; end - def cleanup - end + def cleanup; end - def cleanup_associations - end + def cleanup_associations; end protected def delete(key) result = @cache_client.delete(key) - if result.is_a? String - return !!(result =~ /^DELETED/) - else - return !!(result) - end + return !!(result =~ /^DELETED/) if result.is_a? String + + !!result end def serialize(assoc) diff --git a/lib/openid/store/memory.rb b/lib/openid/store/memory.rb index 56a7fec6..4d03e1db 100644 --- a/lib/openid/store/memory.rb +++ b/lib/openid/store/memory.rb @@ -7,7 +7,6 @@ module Store # # You should probably be looking at OpenID::Store::Filesystem class Memory < Interface - def initialize @associations = Hash.new { |hash, key| hash[key] = {} } @nonces = {} @@ -15,61 +14,59 @@ def initialize def store_association(server_url, assoc) assocs = @associations[server_url] - @associations[server_url] = assocs.merge({assoc.handle => deepcopy(assoc)}) + @associations[server_url] = assocs.merge({ assoc.handle => deepcopy(assoc) }) end - def get_association(server_url, handle=nil) + def get_association(server_url, handle = nil) assocs = @associations[server_url] assoc = nil if handle - assoc = assocs[handle] + assocs[handle] else - assoc = assocs.values.sort{|a,b| a.issued <=> b.issued}[-1] + assocs.values.sort { |a, b| a.issued <=> b.issued }[-1] end - - return assoc end def remove_association(server_url, handle) assocs = @associations[server_url] - if assocs.delete(handle) - return true - else - return false - end + return true if assocs.delete(handle) + + false end def use_nonce(server_url, timestamp, salt) return false if (timestamp - Time.now.to_i).abs > Nonce.skew + nonce = [server_url, timestamp, salt].join('') return false if @nonces[nonce] + @nonces[nonce] = timestamp - return true + true end def cleanup_associations count = 0 - @associations.each{|server_url, assocs| - assocs.each{|handle, assoc| + @associations.each do |_server_url, assocs| + assocs.each do |handle, assoc| if assoc.expires_in == 0 assocs.delete(handle) count += 1 end - } - } - return count + end + end + count end def cleanup_nonces count = 0 now = Time.now.to_i - @nonces.each{|nonce, timestamp| + @nonces.each do |nonce, timestamp| if (timestamp - now).abs > Nonce.skew @nonces.delete(nonce) count += 1 end - } - return count + end + count end protected @@ -77,7 +74,6 @@ def cleanup_nonces def deepcopy(o) Marshal.load(Marshal.dump(o)) end - end end end diff --git a/lib/openid/store/nonce.rb b/lib/openid/store/nonce.rb index 55161704..3eaf7fbd 100644 --- a/lib/openid/store/nonce.rb +++ b/lib/openid/store/nonce.rb @@ -4,44 +4,46 @@ module OpenID module Nonce - DEFAULT_SKEW = 60*60*5 + DEFAULT_SKEW = 60 * 60 * 5 TIME_FMT = '%Y-%m-%dT%H:%M:%SZ' TIME_STR_LEN = '0000-00-00T00:00:00Z'.size - @@NONCE_CHRS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + @@NONCE_CHRS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' TIME_VALIDATOR = /\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ/ @skew = DEFAULT_SKEW # The allowed nonce time skew in seconds. Defaults to 5 hours. # Used for checking nonce validity, and by stores' cleanup methods. - def Nonce.skew + def self.skew @skew end - def Nonce.skew=(new_skew) + def self.skew=(new_skew) @skew = new_skew end # Extract timestamp from a nonce string - def Nonce.split_nonce(nonce_str) + def self.split_nonce(nonce_str) timestamp_str = nonce_str[0...TIME_STR_LEN] raise ArgumentError if timestamp_str.size < TIME_STR_LEN raise ArgumentError unless timestamp_str.match(TIME_VALIDATOR) + ts = Time.parse(timestamp_str).to_i raise ArgumentError if ts < 0 - return ts, nonce_str[TIME_STR_LEN..-1] + + [ts, nonce_str[TIME_STR_LEN..-1]] end # Is the timestamp that is part of the specified nonce string # within the allowed clock-skew of the current time? - def Nonce.check_timestamp(nonce_str, allowed_skew=nil, now=nil) + def self.check_timestamp(nonce_str, allowed_skew = nil, now = nil) allowed_skew = skew if allowed_skew.nil? begin - stamp, _ = split_nonce(nonce_str) + stamp, = split_nonce(nonce_str) rescue ArgumentError # bad timestamp return false end - now = Time.now.to_i unless now + now ||= Time.now.to_i # times before this are too old past = now - allowed_skew @@ -49,20 +51,19 @@ def Nonce.check_timestamp(nonce_str, allowed_skew=nil, now=nil) # times newer than this are too far in the future future = now + allowed_skew - return (past <= stamp and stamp <= future) + (past <= stamp and stamp <= future) end # generate a nonce with the specified timestamp (defaults to now) - def Nonce.mk_nonce(time = nil) - salt = CryptUtil::random_string(6, @@NONCE_CHRS) - if time.nil? - t = Time.now.getutc - else - t = Time.at(time).getutc - end + def self.mk_nonce(time = nil) + salt = CryptUtil.random_string(6, @@NONCE_CHRS) + t = if time.nil? + Time.now.getutc + else + Time.at(time).getutc + end time_str = t.strftime(TIME_FMT) - return time_str + salt + time_str + salt end - end end diff --git a/lib/openid/trustroot.rb b/lib/openid/trustroot.rb index 80daec3d..9abad71c 100644 --- a/lib/openid/trustroot.rb +++ b/lib/openid/trustroot.rb @@ -2,7 +2,6 @@ require 'openid/urinorm' module OpenID - class RealmVerificationRedirected < Exception # Attempting to verify this realm resulted in a redirect. def initialize(relying_party_url, rp_url_after_redirects) @@ -11,13 +10,13 @@ def initialize(relying_party_url, rp_url_after_redirects) end def to_s - return "Attempting to verify #{@relying_party_url} resulted in " + + "Attempting to verify #{@relying_party_url} resulted in " + "redirect to #{@rp_url_after_redirects}" end end module TrustRoot - TOP_LEVEL_DOMAINS = %w' + TOP_LEVEL_DOMAINS = %w[ ac ad ae aero af ag ai al am an ao aq ar arpa as asia at au aw ax az ba bb bd be bf bg bh bi biz bj bm bn bo br bs bt bv bw by bz ca cat cc cd cf cg ch ci ck cl cm cn co com coop @@ -35,9 +34,10 @@ module TrustRoot xn--11b5bs3a9aj6g xn--80akhbyknj4f xn--9t4b11yi5a xn--deba0ad xn--g6w251d xn--hgbk6aj7f53bba xn--hlcj6aya9esc7a xn--jxalpdlp xn--kgbechtv xn--zckzah ye - yt yu za zm zw' + yt yu za zm zw + ] - ALLOWED_PROTOCOLS = ['http', 'https'] + ALLOWED_PROTOCOLS = %w[http https] # The URI for relying party discovery, used in realm verification. # @@ -56,54 +56,53 @@ module TrustRoot # # returns the endpoint URL or None if the endpoint is not a # relying party endpoint. - def TrustRoot._extract_return_url(endpoint) - if endpoint.matchTypes([RP_RETURN_TO_URL_TYPE]) - return endpoint.uri - else - return nil - end + def self._extract_return_url(endpoint) + return endpoint.uri if endpoint.matchTypes([RP_RETURN_TO_URL_TYPE]) + + nil end # Is the return_to URL under one of the supplied allowed # return_to URLs? - def TrustRoot.return_to_matches(allowed_return_to_urls, return_to) - allowed_return_to_urls.each { |allowed_return_to| + def self.return_to_matches(allowed_return_to_urls, return_to) + allowed_return_to_urls.each do |allowed_return_to| # A return_to pattern works the same as a realm, except that # it's not allowed to use a wildcard. We'll model this by # parsing it as a realm, and not trying to match it if it has # a wildcard. return_realm = TrustRoot.parse(allowed_return_to) - if (# Parses as a trust root - !return_realm.nil? and + if !return_realm.nil? and - # Does not have a wildcard - !return_realm.wildcard and + # Does not have a wildcard + !return_realm.wildcard and + + # Matches the return_to that we passed in with it + return_realm.validate_url(return_to) # Parses as a trust root - # Matches the return_to that we passed in with it - return_realm.validate_url(return_to) - ) return true end - } + end # No URL in the list matched - return false + false end # Given a relying party discovery URL return a list of return_to # URLs. - def TrustRoot.get_allowed_return_urls(relying_party_url) + def self.get_allowed_return_urls(relying_party_url) rp_url_after_redirects, return_to_urls = services.get_service_endpoints( - relying_party_url, _extract_return_url) + relying_party_url, _extract_return_url + ) if rp_url_after_redirects != relying_party_url # Verification caused a redirect raise RealmVerificationRedirected.new( - relying_party_url, rp_url_after_redirects) + relying_party_url, rp_url_after_redirects + ) end - return return_to_urls + return_to_urls end # Verify that a return_to URL is valid for the given realm. @@ -115,15 +114,11 @@ def TrustRoot.get_allowed_return_urls(relying_party_url) # # raises DiscoveryFailure when Yadis discovery fails returns # true if the return_to URL is valid for the realm - def TrustRoot.verify_return_to(realm_str, return_to, _vrfy=nil) + def self.verify_return_to(realm_str, return_to, _vrfy = nil) # _vrfy parameter is there to make testing easier - if _vrfy.nil? - _vrfy = self.method('get_allowed_return_urls') - end + _vrfy = method('get_allowed_return_urls') if _vrfy.nil? - if !(_vrfy.is_a?(Proc) or _vrfy.is_a?(Method)) - raise ArgumentError, "_vrfy must be a Proc or Method" - end + raise ArgumentError, '_vrfy must be a Proc or Method' unless _vrfy.is_a?(Proc) or _vrfy.is_a?(Method) realm = TrustRoot.parse(realm_str) if realm.nil? @@ -132,45 +127,38 @@ def TrustRoot.verify_return_to(realm_str, return_to, _vrfy=nil) end begin - allowable_urls = _vrfy.call(realm.build_discovery_url()) - rescue RealmVerificationRedirected => err - Util.log(err.to_s) + allowable_urls = _vrfy.call(realm.build_discovery_url) + rescue RealmVerificationRedirected => e + Util.log(e.to_s) return false end - if return_to_matches(allowable_urls, return_to) - return true - else - Util.log("Failed to validate return_to #{return_to} for " + - "realm #{realm_str}, was not in #{allowable_urls}") - return false - end + return true if return_to_matches(allowable_urls, return_to) + + Util.log("Failed to validate return_to #{return_to} for " + + "realm #{realm_str}, was not in #{allowable_urls}") + false end class TrustRoot - attr_reader :unparsed, :proto, :wildcard, :host, :port, :path @@empty_re = Regexp.new('^http[s]*:\/\/\*\/$') - def TrustRoot._build_path(path, query=nil, frag=nil) + def self._build_path(path, query = nil, frag = nil) s = path.dup frag = nil if frag == '' query = nil if query == '' - if query - s << "?" << query - end + s << '?' << query if query - if frag - s << "#" << frag - end + s << '#' << frag if frag - return s + s end - def TrustRoot._parse_url(url) + def self._parse_url(url) begin url = URINorm.urinorm(url) rescue URI::InvalidURIError @@ -187,20 +175,20 @@ def TrustRoot._parse_url(url) parsed.query, parsed.fragment) - return [parsed.scheme || '', parsed.host || '', - parsed.port || '', path || ''] + [parsed.scheme || '', parsed.host || '', + parsed.port || '', path || ''] end - def TrustRoot.parse(trust_root) + def self.parse(trust_root) trust_root = trust_root.dup unparsed = trust_root.dup # look for wildcard - wildcard = (not trust_root.index('://*.').nil?) + wildcard = !trust_root.index('://*.').nil? trust_root.sub!('*.', '') if wildcard # handle http://*/ case - if not wildcard and @@empty_re.match(trust_root) + if !wildcard and @@empty_re.match(trust_root) proto = trust_root.split(':')[0] port = proto == 'http' ? 80 : 443 return new(unparsed, proto, true, '', port, '/') @@ -213,28 +201,25 @@ def TrustRoot.parse(trust_root) return nil if host[0] == '.' # check for URI fragment - if path and !path.index('#').nil? - return nil - end + return nil if path and !path.index('#').nil? + + return nil unless %w[http https].member?(proto) - return nil unless ['http', 'https'].member?(proto) - return new(unparsed, proto, wildcard, host, port, path) + new(unparsed, proto, wildcard, host, port, path) end - def TrustRoot.check_sanity(trust_root_string) + def self.check_sanity(trust_root_string) trust_root = TrustRoot.parse(trust_root_string) - if trust_root.nil? - return false - else - return trust_root.sane? - end + return false if trust_root.nil? + + trust_root.sane? end # quick func for validating a url against a trust root. See the # TrustRoot class if you need more control. def self.check_url(trust_root, url) - tr = self.parse(trust_root) - return (!tr.nil? and tr.validate_url(url)) + tr = parse(trust_root) + (!tr.nil? and tr.validate_url(url)) end # Return a discovery URL for this realm. @@ -248,14 +233,12 @@ def self.check_url(trust_root, url) # Returns the URL upon which relying party discovery should be # run in order to verify the return_to URL def build_discovery_url - if self.wildcard - # Use "www." in place of the star - www_domain = 'www.' + @host - port = (!@port.nil? and ![80, 443].member?(@port)) ? (":" + @port.to_s) : '' - return "#{@proto}://#{www_domain}#{port}#{@path}" - else - return @unparsed - end + return @unparsed unless wildcard + + # Use "www." in place of the star + www_domain = 'www.' + @host + port = (!@port.nil? and ![80, 443].member?(@port)) ? (':' + @port.to_s) : '' + "#{@proto}://#{www_domain}#{port}#{@path}" end def initialize(unparsed, proto, wildcard, host, port, path) @@ -288,16 +271,14 @@ def sane? return false if host_parts.length == 1 - if @wildcard - if tld.length == 2 and host_parts[-2].length <= 3 - # It's a 2-letter tld with a short second to last segment - # so there needs to be more than two segments specified - # (e.g. *.co.uk is insane) - return host_parts.length > 2 - end + if @wildcard && (tld.length == 2 and host_parts[-2].length <= 3) + # It's a 2-letter tld with a short second to last segment + # so there needs to be more than two segments specified + # (e.g. *.co.uk is insane) + return host_parts.length > 2 end - return true + true end def validate_url(url) @@ -311,12 +292,10 @@ def validate_url(url) return false unless host.index('*').nil? if !@wildcard - if host != @host - return false - end - elsif ((@host != '') and - (!host.end_with?('.' + @host)) and - (host != @host)) + return false if host != @host + elsif (@host != '') and + !host.end_with?('.' + @host) and + (host != @host) return false end @@ -326,25 +305,22 @@ def validate_url(url) url_prefix = path[0...path_len] # must be equal up to the length of the path, at least - if trust_prefix != url_prefix - return false - end + return false if trust_prefix != url_prefix # These characters must be on the boundary between the end # of the trust root's path and the start of the URL's path. - if !@path.index('?').nil? - allowed = '&' - else - allowed = '?/' - end + allowed = if !@path.index('?').nil? + '&' + else + '?/' + end return (!allowed.index(@path[-1]).nil? or !allowed.index(path[path_len]).nil?) end - return true + true end end end end - diff --git a/lib/openid/urinorm.rb b/lib/openid/urinorm.rb index 497ded72..308fbb2e 100644 --- a/lib/openid/urinorm.rb +++ b/lib/openid/urinorm.rb @@ -1,11 +1,10 @@ require 'uri' module OpenID - module URINorm - VALID_URI_SCHEMES = ['http','https'].freeze - public - def URINorm.urinorm(uri) + VALID_URI_SCHEMES = %w[http https].freeze + + def self.urinorm(uri) uri = URI.parse(uri) raise URI::InvalidURIError.new('no scheme') unless uri.scheme @@ -20,26 +19,23 @@ def URINorm.urinorm(uri) uri.host = uri.host.downcase uri.path = remove_dot_segments(uri.path) - uri.path = '/' if uri.path.length == 0 + uri.path = '/' if uri.path.empty? uri = uri.normalize.to_s - uri = uri.gsub(PERCENT_ESCAPE_RE) { - sub = $&[1..2].to_i(16).chr - reserved(sub) ? $&.upcase : sub - } - - return uri + uri.gsub(PERCENT_ESCAPE_RE) do + sub = ::Regexp.last_match(0)[1..2].to_i(16).chr + reserved(sub) ? ::Regexp.last_match(0).upcase : sub + end end - private RESERVED_RE = /[A-Za-z0-9._~-]/ PERCENT_ESCAPE_RE = /%[0-9a-zA-Z]{2}/ - def URINorm.reserved(chr) - not RESERVED_RE =~ chr + def self.reserved(chr) + !(RESERVED_RE =~ chr) end - def URINorm.remove_dot_segments(path) + def self.remove_dot_segments(path) result_segments = [] while path.length > 0 @@ -57,7 +53,7 @@ def URINorm.remove_dot_segments(path) elsif path == '/..' path = '/' result_segments.pop if result_segments.length > 0 - elsif path == '..' or path == '.' + elsif ['..', '.'].include?(path) path = '' else i = 0 @@ -69,8 +65,7 @@ def URINorm.remove_dot_segments(path) end end - return result_segments.join('') + result_segments.join('') end end - end diff --git a/lib/openid/util.rb b/lib/openid/util.rb index 12dbfed3..bc2f8375 100644 --- a/lib/openid/util.rb +++ b/lib/openid/util.rb @@ -1,6 +1,6 @@ -require "cgi" -require "uri" -require "logger" +require 'cgi' +require 'uri' +require 'logger' # See OpenID::Consumer or OpenID::Server modules, as well as the store classes module OpenID @@ -14,9 +14,8 @@ class OpenIDError < StandardError end module Util - - BASE64_CHARS = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' \ - 'abcdefghijklmnopqrstuvwxyz0123456789+/') + BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \ + 'abcdefghijklmnopqrstuvwxyz0123456789+/' BASE64_RE = Regexp.compile(" \\A ([#{BASE64_CHARS}]{4})* @@ -24,76 +23,73 @@ module Util [#{BASE64_CHARS}]{3}=)? \\Z", Regexp::EXTENDED) - def Util.assert(value, message=nil) - if not value - raise AssertionError, message or value - end + def self.assert(value, message = nil) + return if value + + raise AssertionError, message or value end - def Util.to_base64(s) - [s].pack('m').gsub("\n", "") + def self.to_base64(s) + [s].pack('m').gsub("\n", '') end - def Util.from_base64(s) + def self.from_base64(s) without_newlines = s.gsub(/[\r\n]+/, '') - if !BASE64_RE.match(without_newlines) - raise ArgumentError, "Malformed input: #{s.inspect}" - end - without_newlines.unpack('m').first + raise ArgumentError, "Malformed input: #{s.inspect}" unless BASE64_RE.match(without_newlines) + + without_newlines.unpack1('m') end - def Util.urlencode(args) + def self.urlencode(args) a = [] args.each do |key, val| if val.nil? - val = '' + val = '' elsif !!val == val - #it's boolean let's convert it to string representation + # it's boolean let's convert it to string representation # or else CGI::escape won't like it val = val.to_s - end + end - a << (CGI::escape(key) + "=" + CGI::escape(val)) + a << (CGI.escape(key) + '=' + CGI.escape(val)) end - a.join("&") + a.join('&') end - def Util.parse_query(qs) + def self.parse_query(qs) query = {} - CGI::parse(qs).each {|k,v| query[k] = v[0]} - return query + CGI.parse(qs).each { |k, v| query[k] = v[0] } + query end - def Util.append_args(url, args) + def self.append_args(url, args) url = url.dup return url if args.length == 0 - if args.respond_to?('each_pair') - args = args.sort - end + args = args.sort if args.respond_to?('each_pair') - url << (url.include?("?") ? "&" : "?") + url << (url.include?('?') ? '&' : '?') url << Util.urlencode(args) end @@logger = Logger.new(STDERR) - @@logger.progname = "OpenID" + @@logger.progname = 'OpenID' - def Util.logger=(logger) + def self.logger=(logger) @@logger = logger end - def Util.logger + def self.logger @@logger end # change the message below to do whatever you like for logging - def Util.log(message) + def self.log(message) logger.info(message) end - def Util.auto_submit_html(form, title='OpenID transaction in progress') - return " + def self.auto_submit_html(form, title = 'OpenID transaction in progress') + " #{title} @@ -113,9 +109,8 @@ def Util.auto_submit_html(form, title='OpenID transaction in progress') ESCAPE_TABLE = { '&' => '&', '<' => '<', '>' => '>', '"' => '"', "'" => ''' } # Modified from ERb's html_encode - def Util.html_encode(str) - str.to_s.gsub(/[&<>"']/) {|s| ESCAPE_TABLE[s] } + def self.html_encode(str) + str.to_s.gsub(/[&<>"']/) { |s| ESCAPE_TABLE[s] } end end - end diff --git a/lib/openid/version.rb b/lib/openid/version.rb index 7a85990d..590a1e65 100644 --- a/lib/openid/version.rb +++ b/lib/openid/version.rb @@ -1,3 +1,3 @@ module OpenID - VERSION = "2.9.2" + VERSION = '2.9.2' end diff --git a/lib/openid/yadis/accept.rb b/lib/openid/yadis/accept.rb index a1657482..31256e4a 100644 --- a/lib/openid/yadis/accept.rb +++ b/lib/openid/yadis/accept.rb @@ -1,39 +1,36 @@ module OpenID - module Yadis - # Generate an accept header value # # [str or (str, float)] -> str def self.generate_accept_header(*elements) parts = [] - elements.each { |element| + elements.each do |element| if element.is_a?(String) - qs = "1.0" + qs = '1.0' mtype = element else mtype, q = element q = q.to_f - if q > 1 or q <= 0 - raise ArgumentError.new("Invalid preference factor: #{q}") - end - qs = sprintf("%0.1f", q) + raise ArgumentError.new("Invalid preference factor: #{q}") if q > 1 or q <= 0 + + qs = format('%0.1f', q) end parts << [qs, mtype] - } + end parts.sort! chunks = [] - parts.each { |q, mtype| - if q == '1.0' - chunks << mtype - else - chunks << sprintf("%s; q=%s", mtype, q) - end - } + parts.each do |q, mtype| + chunks << if q == '1.0' + mtype + else + format('%s; q=%s', mtype, q) + end + end - return chunks.join(', ') + chunks.join(', ') end def self.parse_accept_header(value) @@ -45,8 +42,8 @@ def self.parse_accept_header(value) # str -> [(str, str, float)] chunks = value.split(',', -1).collect { |v| v.strip } accept = [] - chunks.each { |chunk| - parts = chunk.split(";", -1).collect { |s| s.strip } + chunks.each do |chunk| + parts = chunk.split(';', -1).collect { |s| s.strip } mtype = parts.shift if mtype.index('/').nil? @@ -57,24 +54,22 @@ def self.parse_accept_header(value) main, sub = mtype.split('/', 2) q = nil - parts.each { |ext| - if !ext.index('=').nil? + parts.each do |ext| + unless ext.index('=').nil? k, v = ext.split('=', 2) - if k == 'q' - q = v.to_f - end + q = v.to_f if k == 'q' end - } + end q = 1.0 if q.nil? accept << [q, main, sub] - } + end accept.sort! accept.reverse! - return accept.collect { |q, main, sub| [main, sub, q] } + accept.collect { |q, main, sub| [main, sub, q] } end def self.match_types(accept_types, have_types) @@ -89,16 +84,16 @@ def self.match_types(accept_types, have_types) # [('text/html', 1.0), ('text/plain', 0.5)] # # Type signature: ([(str, str, float)], [str]) -> [(str, float)] - if accept_types.nil? or accept_types == [] - # Accept all of them - default = 1 - else - default = 0 - end + default = if accept_types.nil? or accept_types == [] + # Accept all of them + 1 + else + 0 + end match_main = {} match_sub = {} - accept_types.each { |main, sub, q| + accept_types.each do |main, sub, q| if main == '*' default = [default, q].max next @@ -107,26 +102,26 @@ def self.match_types(accept_types, have_types) else match_sub[[main, sub]] = [match_sub.fetch([main, sub], 0), q].max end - } + end accepted_list = [] order_maintainer = 0 - have_types.each { |mtype| + have_types.each do |mtype| main, sub = mtype.split('/', 2) - if match_sub.member?([main, sub]) - q = match_sub[[main, sub]] - else - q = match_main.fetch(main, default) - end + q = if match_sub.member?([main, sub]) + match_sub[[main, sub]] + else + match_main.fetch(main, default) + end if q != 0 accepted_list << [1 - q, order_maintainer, q, mtype] order_maintainer += 1 end - } + end accepted_list.sort! - return accepted_list.collect { |_, _, q, mtype| [mtype, q] } + accepted_list.collect { |_, _, q, mtype| [mtype, q] } end def self.get_acceptable(accept_header, have_types) @@ -138,11 +133,9 @@ def self.get_acceptable(accept_header, have_types) # parse_accept_header # # (str, [str]) -> [str] - accepted = self.parse_accept_header(accept_header) - preferred = self.match_types(accepted, have_types) - return preferred.collect { |mtype, _| mtype } + accepted = parse_accept_header(accept_header) + preferred = match_types(accepted, have_types) + preferred.collect { |mtype, _| mtype } end - end - end diff --git a/lib/openid/yadis/constants.rb b/lib/openid/yadis/constants.rb index 99b58b13..f59197ef 100644 --- a/lib/openid/yadis/constants.rb +++ b/lib/openid/yadis/constants.rb @@ -1,21 +1,16 @@ - require 'openid/yadis/accept' module OpenID - module Yadis - YADIS_HEADER_NAME = 'X-XRDS-Location' YADIS_CONTENT_TYPE = 'application/xrds+xml' # A value suitable for using as an accept header when performing # YADIS discovery, unless the application has special requirements YADIS_ACCEPT_HEADER = generate_accept_header( - ['text/html', 0.3], - ['application/xhtml+xml', 0.5], - [YADIS_CONTENT_TYPE, 1.0] - ) - + ['text/html', 0.3], + ['application/xhtml+xml', 0.5], + [YADIS_CONTENT_TYPE, 1.0] + ) end - end diff --git a/lib/openid/yadis/discovery.rb b/lib/openid/yadis/discovery.rb index 55d6f09b..70de54e9 100644 --- a/lib/openid/yadis/discovery.rb +++ b/lib/openid/yadis/discovery.rb @@ -1,11 +1,9 @@ - require 'openid/util' require 'openid/fetchers' require 'openid/yadis/constants' require 'openid/yadis/parsehtml' module OpenID - # Raised when a error occurs in the discovery process class DiscoveryFailure < OpenIDError attr_accessor :identity_url, :http_response @@ -18,10 +16,8 @@ def initialize(message, http_response) end module Yadis - # Contains the result of performing Yadis discovery on a URI class DiscoveryResult - # The result of following redirects from the request_uri attr_accessor :normalize_uri @@ -50,12 +46,12 @@ def initialize(request_uri) # Was the Yadis protocol's indirection used? def used_yadis_location? - return @normalized_uri != @xrds_uri + @normalized_uri != @xrds_uri end # Is the response text supposed to be an XRDS document? def is_xrds - return (used_yadis_location?() or + (used_yadis_location? or @content_type == YADIS_CONTENT_TYPE) end end @@ -74,14 +70,15 @@ def is_xrds def self.discover(uri) result = DiscoveryResult.new(uri) begin - resp = OpenID.fetch(uri, nil, {'Accept' => YADIS_ACCEPT_HEADER}) + resp = OpenID.fetch(uri, nil, { 'Accept' => YADIS_ACCEPT_HEADER }) rescue Exception raise DiscoveryFailure.new("Failed to fetch identity URL #{uri} : #{$!}", $!) end - if resp.code != "200" and resp.code != "206" + if resp.code != '200' and resp.code != '206' raise DiscoveryFailure.new( - "HTTP Response status from identity URL host is not \"200\"."\ - "Got status #{resp.code.inspect} for #{resp.final_url}", resp) + 'HTTP Response status from identity URL host is not "200".'\ + "Got status #{resp.code.inspect} for #{resp.final_url}", resp + ) end # Note the URL after following redirects @@ -91,27 +88,28 @@ def self.discover(uri) # we already have it result.content_type = resp['content-type'] - result.xrds_uri = self.where_is_yadis?(resp) + result.xrds_uri = where_is_yadis?(resp) if result.xrds_uri and result.used_yadis_location? begin resp = OpenID.fetch(result.xrds_uri) - rescue + rescue StandardError raise DiscoveryFailure.new("Failed to fetch Yadis URL #{result.xrds_uri} : #{$!}", $!) end - if resp.code != "200" and resp.code != "206" - exc = DiscoveryFailure.new( - "HTTP Response status from Yadis host is not \"200\". " + - "Got status #{resp.code.inspect} for #{resp.final_url}", resp) - exc.identity_url = result.normalized_uri - raise exc + if resp.code != '200' and resp.code != '206' + exc = DiscoveryFailure.new( + 'HTTP Response status from Yadis host is not "200". ' + + "Got status #{resp.code.inspect} for #{resp.final_url}", resp + ) + exc.identity_url = result.normalized_uri + raise exc end result.content_type = resp['content-type'] end result.response_text = resp.body - return result + result end # Given a HTTPResponse, return the location of the Yadis @@ -128,8 +126,8 @@ def self.where_is_yadis?(resp) # According to the spec, the content-type header must be an # exact match, or else we have to look for an indirection. - if (!content_type.nil? and !content_type.to_s.empty? and - content_type.split(';', 2)[0].downcase == YADIS_CONTENT_TYPE) + if !content_type.nil? and !content_type.to_s.empty? and + content_type.split(';', 2)[0].downcase == YADIS_CONTENT_TYPE return resp.final_url else # Try the header @@ -145,9 +143,7 @@ def self.where_is_yadis?(resp) end end - return yadis_loc + yadis_loc end - end - end diff --git a/lib/openid/yadis/filters.rb b/lib/openid/yadis/filters.rb index 90f350ea..49566802 100644 --- a/lib/openid/yadis/filters.rb +++ b/lib/openid/yadis/filters.rb @@ -2,7 +2,6 @@ # endpoint information out of a Yadis XRD file using the REXML # XML parser. -# module OpenID module Yadis class BasicServiceEndpoint @@ -31,7 +30,7 @@ def initialize(yadis_url, type_uris, uri, service_element) # that e.g. need to check for the presence of multiple # versions of a single protocol. def match_types(type_uris) - return @type_uris & type_uris + @type_uris & type_uris end # Trivial transform from a basic endpoint to itself. This @@ -40,15 +39,14 @@ def match_types(type_uris) # # If you are subclassing this object, re-implement this function. def self.from_basic_service_endpoint(endpoint) - return endpoint + endpoint end # A hack to make both this class and its instances respond to # this message since Ruby doesn't support static methods. def from_basic_service_endpoint(endpoint) - return self.class.from_basic_service_endpoint(endpoint) + self.class.from_basic_service_endpoint(endpoint) end - end # Take a list of basic filters and makes a filter that @@ -83,33 +81,32 @@ def get_service_endpoints(yadis_url, service_element) # Do an expansion of the service element by xrd:Type and # xrd:URI - Yadis::expand_service(service_element).each { |type_uris, uri, _| + Yadis.expand_service(service_element).each do |type_uris, uri, _| # Create a basic endpoint object to represent this # yadis_url, Service, Type, URI combination endpoint = BasicServiceEndpoint.new( - yadis_url, type_uris, uri, service_element) + yadis_url, type_uris, uri, service_element + ) e = apply_filters(endpoint) - if !e.nil? - endpoints << e - end - } - return endpoints + endpoints << e unless e.nil? + end + endpoints end def apply_filters(endpoint) # Apply filter procs to an endpoint until one of them returns # non-nil. - @filter_procs.each { |filter_proc| + @filter_procs.each do |filter_proc| e = filter_proc.call(endpoint) - if !e.nil? + unless e.nil? # Once one of the filters has returned an endpoint, do not # apply any more. return e end - } + end - return nil + nil end end @@ -126,17 +123,18 @@ def initialize(subfilters) # this filter and return their concatenation. def get_service_endpoints(yadis_url, service_element) endpoints = [] - @subfilters.each { |subfilter| + @subfilters.each do |subfilter| endpoints += subfilter.get_service_endpoints(yadis_url, service_element) - } - return endpoints + end + endpoints end end # Exception raised when something is not able to be turned into a # filter @@filter_type_error = TypeError.new( - 'Expected a filter, an endpoint, a callable or a list of any of these.') + 'Expected a filter, an endpoint, a callable or a list of any of these.' + ) # Convert a filter-convertable thing into a filter # @@ -144,15 +142,11 @@ def get_service_endpoints(yadis_url, service_element) # any of these. def self.make_filter(parts) # Convert the parts into a list, and pass to mk_compound_filter - if parts.nil? - parts = [BasicServiceEndpoint] - end + parts = [BasicServiceEndpoint] if parts.nil? - if parts.is_a?(Array) - return mk_compound_filter(parts) - else - return mk_compound_filter([parts]) - end + return mk_compound_filter(parts) if parts.is_a?(Array) + + mk_compound_filter([parts]) end # Create a filter out of a list of filter-like things @@ -161,15 +155,12 @@ def self.make_filter(parts) # # parts should be a list of things that can be passed to make_filter def self.mk_compound_filter(parts) - - if !parts.respond_to?('each') - raise TypeError, "#{parts.inspect} is not iterable" - end + raise TypeError, "#{parts.inspect} is not iterable" unless parts.respond_to?('each') # Separate into a list of callables and a list of filter objects transformers = [] filters = [] - parts.each { |subfilter| + parts.each do |subfilter| if !subfilter.is_a?(Array) # If it's not an iterable if subfilter.respond_to?('get_service_endpoints') @@ -189,17 +180,13 @@ def self.mk_compound_filter(parts) else filters << mk_compound_filter(subfilter) end - } - - if transformers.length > 0 - filters << TransformFilterMaker.new(transformers) end - if filters.length == 1 - return filters[0] - else - return CompoundFilter.new(filters) - end + filters << TransformFilterMaker.new(transformers) if transformers.length > 0 + + return filters[0] if filters.length == 1 + + CompoundFilter.new(filters) end end end diff --git a/lib/openid/yadis/htmltokenizer.rb b/lib/openid/yadis/htmltokenizer.rb index b2081097..6d99b07b 100644 --- a/lib/openid/yadis/htmltokenizer.rb +++ b/lib/openid/yadis/htmltokenizer.rb @@ -66,33 +66,31 @@ def reset # Look at the next token, but don't actually grab it def peekNextToken - if @cur_pos == @page.length then return nil end + return nil if @cur_pos == @page.length - if ?< == @page[@cur_pos] + if '<' == @page[@cur_pos] # Next token is a tag of some kind if '!--' == @page[(@cur_pos + 1), 3] # Token is a comment tag_end = @page.index('-->', (@cur_pos + 1)) - if tag_end.nil? - raise HTMLTokenizerError, "No end found to started comment:\n#{@page[@cur_pos,80]}" - end + raise HTMLTokenizerError, "No end found to started comment:\n#{@page[@cur_pos, 80]}" if tag_end.nil? + # p @page[@cur_pos .. (tag_end+2)] - HTMLComment.new(@page[@cur_pos .. (tag_end + 2)]) + HTMLComment.new(@page[@cur_pos..(tag_end + 2)]) else # Token is a html tag tag_end = @page.index('>', (@cur_pos + 1)) - if tag_end.nil? - raise HTMLTokenizerError, "No end found to started tag:\n#{@page[@cur_pos,80]}" - end + raise HTMLTokenizerError, "No end found to started tag:\n#{@page[@cur_pos, 80]}" if tag_end.nil? + # p @page[@cur_pos .. tag_end] - HTMLTag.new(@page[@cur_pos .. tag_end]) + HTMLTag.new(@page[@cur_pos..tag_end]) end else # Next token is text text_end = @page.index('<', @cur_pos) text_end = text_end.nil? ? -1 : (text_end - 1) # p @page[@cur_pos .. text_end] - HTMLText.new(@page[@cur_pos .. text_end]) + HTMLText.new(@page[@cur_pos..text_end]) end end @@ -107,9 +105,9 @@ def getNextToken # @page.slice!(0, token.raw.length) @cur_pos += token.raw.length end - #p token - #print token.raw - return token + # p token + # print token.raw + token end # Get a tag from the specified set of desired tags. @@ -117,11 +115,11 @@ def getNextToken # foo = toke.getTag("h1", "h2", "h3") # Will return the next header tag encountered. def getTag(*sought_tags) - sought_tags.collect! {|elm| elm.downcase} + sought_tags.collect! { |elm| elm.downcase } while (tag = getNextToken) - if tag.kind_of?(HTMLTag) and - (0 == sought_tags.length or sought_tags.include?(tag.tag_name)) + if tag.is_a?(HTMLTag) and + (0 == sought_tags.length or sought_tags.include?(tag.tag_name)) break end end @@ -132,24 +130,20 @@ def getTag(*sought_tags) # (if specified) or a specific later tag def getText(until_tag = nil) if until_tag.nil? - if ?< == @page[@cur_pos] + if '<' == @page[@cur_pos] # Next token is a tag, not text - "" + '' else # Next token is text getNextToken.text end else - ret_str = "" + ret_str = '' while (tag = peekNextToken) - if tag.kind_of?(HTMLTag) and tag.tag_name == until_tag - break - end + break if tag.is_a?(HTMLTag) and tag.tag_name == until_tag - if ("" != tag.text) - ret_str << (tag.text + " ") - end + ret_str << (tag.text + ' ') if '' != tag.text getNextToken end @@ -161,9 +155,8 @@ def getText(until_tag = nil) # leading and trailing whitespace, and squeezing multiple # spaces into a single space. def getTrimmedText(until_tag = nil) - getText(until_tag).strip.gsub(/\s+/m, " ") + getText(until_tag).strip.gsub(/\s+/m, ' ') end - end class HTMLTokenizerError < Exception @@ -185,11 +178,11 @@ def to_s # By default tokens have no text representation def text - "" + '' end def trimmed_text - text.strip.gsub(/\s+/m, " ") + text.strip.gsub(/\s+/m, ' ') end # Compare to another based on the raw source @@ -208,12 +201,11 @@ def text # Class representing an HTML comment class HTMLComment < HTMLToken attr_accessor :contents + def initialize(text) super(text) temp_arr = text.scan(/^$/m) - if temp_arr[0].nil? - raise HTMLTokenizerError, "Text passed to HTMLComment.initialize is not a comment" - end + raise HTMLTokenizerError, 'Text passed to HTMLComment.initialize is not a comment' if temp_arr[0].nil? @contents = temp_arr[0][0] end @@ -222,21 +214,20 @@ def initialize(text) # Class representing an HTML tag class HTMLTag < HTMLToken attr_reader :end_tag, :tag_name + def initialize(text) super(text) - if ?< != text[0] or ?> != text[-1] - raise HTMLTokenizerError, "Text passed to HTMLComment.initialize is not a comment" + if '<' != text[0] or '>' != text[-1] + raise HTMLTokenizerError, 'Text passed to HTMLComment.initialize is not a comment' end - @attr_hash = Hash.new + @attr_hash = {} @raw = text tag_name = text.scan(/[\w:-]+/)[0] - if tag_name.nil? - raise HTMLTokenizerError, "Error, tag is nil: #{tag_name}" - end + raise HTMLTokenizerError, "Error, tag is nil: #{tag_name}" if tag_name.nil? - if ?/ == text[1] + if '/' == text[1] # It's an end tag @end_tag = true @tag_name = '/' + tag_name.downcase @@ -253,53 +244,47 @@ def initialize(text) # things go quicker def attr_hash # Lazy initialize == don't build the hash until it's needed - if !@hashed - if !@end_tag + unless @hashed + unless @end_tag # Get the attributes - attr_arr = @raw.scan(/<[\w:-]+\s+(.*?)\/?>/m)[0] - if attr_arr.kind_of?(Array) + attr_arr = @raw.scan(%r{<[\w:-]+\s+(.*?)/?>}m)[0] + if attr_arr.is_a?(Array) # Attributes found, parse them attrs = attr_arr[0] attr_arr = attrs.scan(/\s*([\w:-]+)(?:\s*=\s*("[^"]*"|'[^']*'|([^"'>][^\s>]*)))?/m) # clean up the array by: # * setting all nil elements to true # * removing enclosing quotes - attr_arr.each { - |item| + attr_arr.each do |item| val = if item[1].nil? item[0] elsif '"'[0] == item[1][0] or '\''[0] == item[1][0] - item[1][1 .. -2] + item[1][1..-2] else item[1] end @attr_hash[item[0].downcase] = val - } + end end end @hashed = true end - #p self + # p self @attr_hash end # Get the 'alt' text for a tag, if it exists, or an empty string otherwise def text - if !end_tag + unless end_tag case tag_name when 'img' - if !attr_hash['alt'].nil? - return attr_hash['alt'] - end + return attr_hash['alt'] unless attr_hash['alt'].nil? when 'applet' - if !attr_hash['alt'].nil? - return attr_hash['alt'] - end + return attr_hash['alt'] unless attr_hash['alt'].nil? end end - return '' + '' end end - diff --git a/lib/openid/yadis/parsehtml.rb b/lib/openid/yadis/parsehtml.rb index 877c714b..b096b85d 100644 --- a/lib/openid/yadis/parsehtml.rb +++ b/lib/openid/yadis/parsehtml.rb @@ -1,9 +1,9 @@ -require "openid/yadis/htmltokenizer" +require 'openid/yadis/htmltokenizer' require 'cgi' module OpenID module Yadis - def Yadis.html_yadis_location(html) + def self.html_yadis_location(html) parser = HTMLTokenizer.new(html) # to keep track of whether or not we are in the head element @@ -16,26 +16,21 @@ def Yadis.html_yadis_location(html) # we are leaving head or have reached body, so we bail return nil if ['/head', 'body', '/body'].member?(el.tag_name) - if el.tag_name == 'head' - unless el.to_s[-2] == ?/ # tag ends with a /: a short tag - in_head = true - end + if el.tag_name == 'head' && !(el.to_s[-2] == '/') + in_head = true # tag ends with a /: a short tag end next unless in_head - if el.tag_name == 'script' - unless el.to_s[-2] == ?/ # tag ends with a /: a short tag - parser.getTag('/script') - end + if el.tag_name == 'script' && !(el.to_s[-2] == '/') + parser.getTag('/script') # tag ends with a /: a short tag end return nil if el.tag_name == 'html' - if el.tag_name == 'meta' and (equiv = el.attr_hash['http-equiv']) - if ['x-xrds-location','x-yadis-location'].member?(equiv.downcase) && - el.attr_hash.member?('content') - return CGI::unescapeHTML(el.attr_hash['content']) - end + next unless el.tag_name == 'meta' and (equiv = el.attr_hash['http-equiv']) + if %w[x-xrds-location x-yadis-location].member?(equiv.downcase) && + el.attr_hash.member?('content') + return CGI.unescapeHTML(el.attr_hash['content']) end end rescue HTMLTokenizerError # just stop parsing if there's an error diff --git a/lib/openid/yadis/services.rb b/lib/openid/yadis/services.rb index e3b3e0f6..648c3588 100644 --- a/lib/openid/yadis/services.rb +++ b/lib/openid/yadis/services.rb @@ -1,11 +1,10 @@ - require 'openid/yadis/filters' require 'openid/yadis/discovery' require 'openid/yadis/xrds' module OpenID module Yadis - def Yadis.get_service_endpoints(input_url, flt=nil) + def self.get_service_endpoints(input_url, flt = nil) # Perform the Yadis protocol on the input URL and return an # iterable of resulting endpoint objects. # @@ -17,14 +16,14 @@ def Yadis.get_service_endpoints(input_url, flt=nil) begin endpoints = Yadis.apply_filter(result.normalized_uri, result.response_text, flt) - rescue XRDSError => err - raise DiscoveryFailure.new(err.to_s, nil) + rescue XRDSError => e + raise DiscoveryFailure.new(e.to_s, nil) end - return [result.normalized_uri, endpoints] + [result.normalized_uri, endpoints] end - def Yadis.apply_filter(normalized_uri, xrd_data, flt=nil) + def self.apply_filter(normalized_uri, xrd_data, flt = nil) # Generate an iterable of endpoint objects given this input data, # presumably from the result of performing the Yadis protocol. @@ -32,11 +31,11 @@ def Yadis.apply_filter(normalized_uri, xrd_data, flt=nil) et = Yadis.parseXRDS(xrd_data) endpoints = [] - each_service(et) { |service_element| + each_service(et) do |service_element| endpoints += flt.get_service_endpoints(normalized_uri, service_element) - } + end - return endpoints + endpoints end end end diff --git a/lib/openid/yadis/xrds.rb b/lib/openid/yadis/xrds.rb index e9714720..7c00cddc 100644 --- a/lib/openid/yadis/xrds.rb +++ b/lib/openid/yadis/xrds.rb @@ -6,13 +6,12 @@ module OpenID module Yadis - XRD_NS_2_0 = 'xri://$xrd*($v*2.0)' XRDS_NS = 'xri://$xrds' XRDS_NAMESPACES = { 'xrds' => XRDS_NS, - 'xrd' => XRD_NS_2_0, + 'xrd' => XRD_NS_2_0 } class XRDSError < StandardError; end @@ -22,7 +21,7 @@ class XRDSError < StandardError; end class XRDSFraud < XRDSError end - def Yadis::get_canonical_id(iname, xrd_tree) + def self.get_canonical_id(iname, xrd_tree) # Return the CanonicalID from this XRDS document. # # @param iname: the XRI being resolved. @@ -34,118 +33,109 @@ def Yadis::get_canonical_id(iname, xrd_tree) # @returntype: unicode or None xrd_list = [] - REXML::XPath::match(xrd_tree.root, '/xrds:XRDS/xrd:XRD', XRDS_NAMESPACES).each { |el| + REXML::XPath.match(xrd_tree.root, '/xrds:XRDS/xrd:XRD', XRDS_NAMESPACES).each do |el| xrd_list << el - } + end xrd_list.reverse! cid_elements = [] - if !xrd_list.empty? - xrd_list[0].elements.each { |e| - if !e.respond_to?('name') - next - end - if e.name == 'CanonicalID' - cid_elements << e - end - } + unless xrd_list.empty? + xrd_list[0].elements.each do |e| + next unless e.respond_to?('name') + + cid_elements << e if e.name == 'CanonicalID' + end end cid_element = cid_elements[0] - if !cid_element - return nil - end + return nil unless cid_element - canonicalID = XRI.make_xri(cid_element.text) + canonical_id = XRI.make_xri(cid_element.text) - childID = canonicalID.downcase + child_id = canonical_id.downcase - xrd_list[1..-1].each { |xrd| - parent_sought = childID[0...childID.rindex('!')] + xrd_list[1..-1].each do |xrd| + parent_sought = child_id[0...child_id.rindex('!')] - parent = XRI.make_xri(xrd.elements["CanonicalID"].text) + parent = XRI.make_xri(xrd.elements['CanonicalID'].text) if parent_sought != parent.downcase - raise XRDSFraud.new(sprintf("%s can not come from %s", parent_sought, - parent)) + raise XRDSFraud.new(format('%s can not come from %s', parent_sought, + parent)) end - childID = parent_sought - } + child_id = parent_sought + end root = XRI.root_authority(iname) - if not XRI.provider_is_authoritative(root, childID) - raise XRDSFraud.new(sprintf("%s can not come from root %s", childID, root)) + unless XRI.provider_is_authoritative(root, child_id) + raise XRDSFraud.new(format('%s can not come from root %s', child_id, root)) end - return canonicalID + canonical_id end class XRDSError < StandardError end - def Yadis::parseXRDS(text) + def self.parseXRDS(text) disable_entity_expansion do - if text.nil? - raise XRDSError.new("Not an XRDS document.") - end + raise XRDSError.new('Not an XRDS document.') if text.nil? begin d = REXML::Document.new(text) rescue RuntimeError - raise XRDSError.new("Not an XRDS document. Failed to parse XML.") + raise XRDSError.new('Not an XRDS document. Failed to parse XML.') end - if is_xrds?(d) - return d - else - raise XRDSError.new("Not an XRDS document.") - end + return d if is_xrds?(d) + + raise XRDSError.new('Not an XRDS document.') end end - def Yadis::disable_entity_expansion - _previous_ = REXML::Document::entity_expansion_limit - REXML::Document::entity_expansion_limit = 0 + def self.disable_entity_expansion + _previous_ = REXML::Document.entity_expansion_limit + REXML::Document.entity_expansion_limit = 0 yield ensure - REXML::Document::entity_expansion_limit = _previous_ + REXML::Document.entity_expansion_limit = _previous_ end - def Yadis::is_xrds?(xrds_tree) + def self.is_xrds?(xrds_tree) xrds_root = xrds_tree.root - return (!xrds_root.nil? and + (!xrds_root.nil? and xrds_root.name == 'XRDS' and xrds_root.namespace == XRDS_NS) end - def Yadis::get_yadis_xrd(xrds_tree) + def self.get_yadis_xrd(xrds_tree) REXML::XPath.each(xrds_tree.root, '/xrds:XRDS/xrd:XRD[last()]', - XRDS_NAMESPACES) { |el| + XRDS_NAMESPACES) do |el| return el - } - raise XRDSError.new("No XRD element found.") + end + raise XRDSError.new('No XRD element found.') end # aka iterServices in Python - def Yadis::each_service(xrds_tree, &block) + def self.each_service(xrds_tree, &block) xrd = get_yadis_xrd(xrds_tree) xrd.each_element('Service', &block) end - def Yadis::services(xrds_tree) + def self.services(xrds_tree) s = [] - each_service(xrds_tree) { |service| + each_service(xrds_tree) do |service| s << service - } - return s + end + s end - def Yadis::expand_service(service_element) + def self.expand_service(service_element) es = service_element.elements uris = es.each('URI') { |u| } uris = prio_sort(uris) @@ -156,10 +146,10 @@ def Yadis::expand_service(service_element) end # Sort a list of elements that have priority attributes. - def Yadis::prio_sort(elements) - elements.sort { |a,b| + def self.prio_sort(elements) + elements.sort do |a, b| a.attribute('priority').to_s.to_i <=> b.attribute('priority').to_s.to_i - } + end end end end diff --git a/lib/openid/yadis/xri.rb b/lib/openid/yadis/xri.rb index d0c0ff4f..f1029763 100644 --- a/lib/openid/yadis/xri.rb +++ b/lib/openid/yadis/xri.rb @@ -3,19 +3,18 @@ module OpenID module Yadis module XRI - # The '(' is for cross-reference authorities, and hopefully has a # matching ')' somewhere. - XRI_AUTHORITIES = ["!", "=", "@", "+", "$", "("] + XRI_AUTHORITIES = ['!', '=', '@', '+', '$', '('] def self.identifier_scheme(identifier) - if (!identifier.nil? and - identifier.length > 0 and - (identifier.match('^xri://') or - XRI_AUTHORITIES.member?(identifier[0].chr))) - return :xri + if !identifier.nil? and + identifier.length > 0 and + (identifier.match('^xri://') or + XRI_AUTHORITIES.member?(identifier[0].chr)) + :xri else - return :uri + :uri end end @@ -24,8 +23,8 @@ def self.identifier_scheme(identifier) # than once. XRI Syntax section 2.3.1 def self.to_iri_normal(xri) iri = xri.dup - iri.insert(0, 'xri://') if not iri.match('^xri://') - return escape_for_iri(iri) + iri.insert(0, 'xri://') unless iri.match('^xri://') + escape_for_iri(iri) end # Note this is not not idempotent, so do not apply this more than @@ -34,55 +33,53 @@ def self.escape_for_iri(xri) esc = xri.dup # encode all % esc.gsub!(/%/, '%25') - esc.gsub!(/\((.*?)\)/) { |xref_match| - xref_match.gsub(/[\/\?\#]/) { |char_match| - CGI::escape(char_match) - } - } - return esc + esc.gsub!(/\((.*?)\)/) do |xref_match| + xref_match.gsub(%r{[/?\#]}) do |char_match| + CGI.escape(char_match) + end + end + esc end # Transform an XRI reference to a URI reference. Note this is not # not idempotent, so do not apply this to an identifier more than # once. XRI Syntax section 2.3.1 def self.to_uri_normal(xri) - return iri_to_uri(to_iri_normal(xri)) + iri_to_uri(to_iri_normal(xri)) end # RFC 3987 section 3.1 def self.iri_to_uri(iri) - uri = iri.dup + iri.dup # for char in ucschar or iprivate # convert each char to %HH%HH%HH (as many %HH as octets) - return uri end def self.provider_is_authoritative(provider_id, canonical_id) lastbang = canonical_id.rindex('!') return false unless lastbang + parent = canonical_id[0...lastbang] - return parent == provider_id + parent == provider_id end def self.root_authority(xri) xri = xri[6..-1] if xri.index('xri://') == 0 authority = xri.split('/', 2)[0] - if authority[0].chr == '(' - root = authority[0...authority.index(')')+1] - elsif XRI_AUTHORITIES.member?(authority[0].chr) - root = authority[0].chr - else - root = authority.split(/[!*]/)[0] - end + root = if authority[0].chr == '(' + authority[0...authority.index(')') + 1] + elsif XRI_AUTHORITIES.member?(authority[0].chr) + authority[0].chr + else + authority.split(/[!*]/)[0] + end - self.make_xri(root) + make_xri(root) end def self.make_xri(xri) - if xri.index('xri://') != 0 - xri = 'xri://' + xri - end - return xri + xri = 'xri://' + xri if xri.index('xri://') != 0 + xri end end end diff --git a/lib/openid/yadis/xrires.rb b/lib/openid/yadis/xrires.rb index e2a14dc7..d1dcc899 100644 --- a/lib/openid/yadis/xrires.rb +++ b/lib/openid/yadis/xrires.rb @@ -1,37 +1,29 @@ -require "cgi" -require "openid/yadis/xri" -require "openid/yadis/xrds" -require "openid/fetchers" +require 'cgi' +require 'openid/yadis/xri' +require 'openid/yadis/xrds' +require 'openid/fetchers' module OpenID - module Yadis - module XRI - class XRIHTTPError < StandardError; end class ProxyResolver - DEFAULT_PROXY = 'http://proxy.xri.net/' - def initialize(proxy_url=nil) - if proxy_url - @proxy_url = proxy_url - else - @proxy_url = DEFAULT_PROXY - end + def initialize(proxy_url = nil) + @proxy_url = proxy_url || DEFAULT_PROXY @proxy_url += '/' unless @proxy_url.match('/$') end - def query_url(xri, service_type=nil) + def query_url(xri, service_type = nil) # URI normal form has a leading xri://, but we need to strip # that off again for the QXRI. This is under discussion for # XRI Resolution WD 11. qxri = XRI.to_uri_normal(xri)[6..-1] hxri = @proxy_url + qxri - args = {'_xrd_r' => 'application/xrds+xml'} + args = { '_xrd_r' => 'application/xrds+xml' } if service_type args['_xrd_t'] = service_type else @@ -39,26 +31,24 @@ def query_url(xri, service_type=nil) args['_xrd_r'] += ';sep=false' end - return XRI.append_args(hxri, args) + XRI.append_args(hxri, args) end def query(xri) # these can be query args or http headers, needn't be both. # headers = {'Accept' => 'application/xrds+xml;sep=true'} - canonicalID = nil - - url = self.query_url(xri) - begin - response = OpenID.fetch(url) - rescue - raise XRIHTTPError, "Could not fetch #{xri}, #{$!}" - end - raise XRIHTTPError, "Could not fetch #{xri}" if response.nil? + url = query_url(xri) + begin + response = OpenID.fetch(url) + rescue StandardError + raise XRIHTTPError, "Could not fetch #{xri}, #{$!}" + end + raise XRIHTTPError, "Could not fetch #{xri}" if response.nil? - xrds = Yadis::parseXRDS(response.body) - canonicalID = Yadis::get_canonical_id(xri, xrds) + xrds = Yadis.parseXRDS(response.body) + canonicalID = Yadis.get_canonical_id(xri, xrds) - return canonicalID, Yadis::services(xrds) + [canonicalID, Yadis.services(xrds)] # TODO: # * If we do get hits for multiple service_types, we're almost # certainly going to have duplicated service entries and @@ -69,31 +59,26 @@ def query(xri) def self.urlencode(args) a = [] args.each do |key, val| - a << (CGI::escape(key) + "=" + CGI::escape(val)) + a << (CGI.escape(key) + '=' + CGI.escape(val)) end - a.join("&") + a.join('&') end def self.append_args(url, args) - return url if args.length == 0 + return url if args.empty? # rstrip question marks rstripped = url.dup - while rstripped[-1].chr == '?' - rstripped = rstripped[0...rstripped.length-1] - end + rstripped = rstripped[0...rstripped.length - 1] while rstripped[-1].chr == '?' - if rstripped.index('?') - sep = '&' - else - sep = '?' - end + sep = if rstripped.index('?') + '&' + else + '?' + end - return url + sep + XRI.urlencode(args) + url + sep + XRI.urlencode(args) end - end - end - end diff --git a/ruby-openid.gemspec b/ruby-openid.gemspec index 2ba68ec1..f46fca65 100644 --- a/ruby-openid.gemspec +++ b/ruby-openid.gemspec @@ -1,30 +1,31 @@ -# -*- encoding: utf-8 -*- -require File.expand_path('../lib/openid/version', __FILE__) +require File.expand_path("lib/openid/version", __dir__) Gem::Specification.new do |s| - s.name = 'ruby-openid' - s.author = 'JanRain, Inc' - s.email = 'openid@janrain.com' - s.homepage = 'https://github.com/openid/ruby-openid' - s.summary = 'A library for consuming and serving OpenID identities.' + s.name = "ruby-openid" + s.author = "JanRain, Inc" + s.email = "openid@janrain.com" + s.homepage = "https://github.com/openid/ruby-openid" + s.summary = "A library for consuming and serving OpenID identities." s.version = OpenID::VERSION s.licenses = ["Ruby", "Apache Software License 2.0"] # Files files = Dir.glob("{examples,lib,test}/**/*") - files << 'NOTICE' << 'CHANGELOG.md' - s.files = files.delete_if {|f| f.include?('_darcs') || f.include?('admin')} - s.require_paths = ['lib'] - s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) } - s.test_files = s.files.grep(%r{^(test|spec|features)/}) + files << "NOTICE" << "CHANGELOG.md" + s.files = files.delete_if { |f| f.include?("_darcs") || f.include?("admin") } + s.require_paths = ["lib"] + s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) } # RDoc - s.extra_rdoc_files = ['README.md', 'INSTALL.md', 'LICENSE', 'UPGRADE.md'] - s.rdoc_options << '--main' << 'README.md' + s.extra_rdoc_files = ["README.md", "INSTALL.md", "LICENSE", "UPGRADE.md"] + s.rdoc_options << "--main" << "README.md" - s.add_development_dependency 'minitest', '>= 5' - s.add_development_dependency 'rake', '>= 13' - s.add_development_dependency 'rexml', '~> 3.2' - s.add_development_dependency 'rubocop-lts', '~> 18.2', ">= 18.2.1" - s.add_development_dependency 'webrick', '~> 1.8' + s.add_development_dependency("minitest", ">= 5") + s.add_development_dependency("rake", ">= 13") + s.add_development_dependency("rexml", "~> 3.2") + s.add_development_dependency("rubocop-lts", "~> 18.2", ">= 18.2.1") + s.add_development_dependency("rubocop-minitest", "~> 0.36") + s.add_development_dependency("rubocop-packaging", "~> 0.5", ">= 0.5.2") + s.add_development_dependency("standard", ">= 1.35.1") + s.add_development_dependency("webrick", "~> 1.8") end diff --git a/setup.rb b/setup.rb index 6ecf81c1..f20576be 100644 --- a/setup.rb +++ b/setup.rb @@ -8,21 +8,21 @@ # the GNU LGPL, Lesser General Public License version 2.1. # -unless Enumerable.method_defined?(:map) # Ruby 1.4.6 +unless Enumerable.method_defined?(:map) # Ruby 1.4.6 module Enumerable alias map collect end end -unless File.respond_to?(:read) # Ruby 1.6 +unless File.respond_to?(:read) # Ruby 1.6 def File.read(fname) - open(fname) {|f| + open(fname) do |f| return f.read - } + end end end -unless Errno.const_defined?(:ENOTEMPTY) # Windows? +unless Errno.const_defined?(:ENOTEMPTY) # Windows? module Errno class ENOTEMPTY # We do not raise this exception, implementation is not needed. @@ -31,19 +31,17 @@ class ENOTEMPTY end def File.binread(fname) - open(fname, 'rb') {|f| + open(fname, 'rb') do |f| return f.read - } + end end # for corrupted Windows' stat(2) def File.dir?(path) - File.directory?((path[-1,1] == '/') ? path : path + '/') + File.directory?(path[-1, 1] == '/' ? path : path + '/') end - class ConfigTable - include Enumerable def initialize(rbconfig) @@ -58,23 +56,18 @@ def initialize(rbconfig) @libsrc_pattern = '*.rb' end - attr_accessor :install_prefix - attr_accessor :config_opt + attr_accessor :install_prefix, :config_opt, :libsrc_pattern - attr_writer :verbose + attr_writer :verbose, :no_harm def verbose? @verbose end - attr_writer :no_harm - def no_harm? @no_harm end - attr_accessor :libsrc_pattern - def [](key) lookup(key).resolve(self) end @@ -84,7 +77,7 @@ def []=(key, val) end def names - @items.map {|i| i.name } + @items.map { |i| i.name } end def each(&block) @@ -106,15 +99,15 @@ def add(item) def remove(name) item = lookup(name) - @items.delete_if {|i| i.name == name } - @table.delete_if {|name, i| i.name == name } + @items.delete_if { |i| i.name == name } + @table.delete_if { |name, i| i.name == name } item end def load_script(path, inst = nil) - if File.file?(path) - MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path - end + return unless File.file?(path) + + MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path end def savefile @@ -122,23 +115,21 @@ def savefile end def load_savefile - begin - File.foreach(savefile()) do |line| - k, v = *line.split(/=/, 2) - self[k] = v.strip - end - rescue Errno::ENOENT - setup_rb_error $!.message + "\n#{File.basename($0)} config first" + File.foreach(savefile) do |line| + k, v = *line.split(/=/, 2) + self[k] = v.strip end + rescue Errno::ENOENT + setup_rb_error $!.message + "\n#{File.basename($0)} config first" end def save - @items.each {|i| i.value } - File.open(savefile(), 'w') {|f| + @items.each { |i| i.value } + File.open(savefile, 'w') do |f| @items.each do |i| f.printf "%s=%s\n", i.name, i.value if i.value? and i.value end - } + end end def load_standard_entries @@ -188,20 +179,20 @@ def standard_entries(rbconfig) siterubyver = siteruby siterubyverarch = "$siterubyver/#{c['arch']}" end - parameterize = lambda {|path| + parameterize = lambda { |path| path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix') } - if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg } - makeprog = arg.sub(/'/, '').split(/=/, 2)[1] - else - makeprog = 'make' - end + makeprog = if arg = c['configure_args'].split.detect { |arg| /--with-make-prog=/ =~ arg } + arg.sub(/'/, '').split(/=/, 2)[1] + else + 'make' + end [ ExecItem.new('installdirs', 'std/site/home', 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\ - {|val, table| + do |val, table| case val when 'std' table['rbdir'] = '$librubyver' @@ -215,7 +206,7 @@ def standard_entries(rbconfig) table['rbdir'] = '$libdir/ruby' table['sodir'] = '$libdir/ruby' end - }, + end, PathItem.new('prefix', 'path', c['prefix'], 'path prefix of target environment'), PathItem.new('bindir', 'path', parameterize.call(c['bindir']), @@ -237,7 +228,7 @@ def standard_entries(rbconfig) PathItem.new('librubyverarch', 'path', librubyverarch, 'the directory for standard ruby extensions'), PathItem.new('siteruby', 'path', siteruby, - 'the directory for version-independent aux ruby libraries'), + 'the directory for version-independent aux ruby libraries'), PathItem.new('siterubyver', 'path', siterubyver, 'the directory for aux ruby libraries'), PathItem.new('siterubyverarch', 'path', siterubyverarch, @@ -261,7 +252,7 @@ def standard_entries(rbconfig) private :standard_entries def load_multipackage_entries - multipackage_entries().each do |ent| + multipackage_entries.each do |ent| add ent end end @@ -277,22 +268,22 @@ def multipackage_entries private :multipackage_entries ALIASES = { - 'std-ruby' => 'librubyver', - 'stdruby' => 'librubyver', - 'rubylibdir' => 'librubyver', - 'archdir' => 'librubyverarch', - 'site-ruby-common' => 'siteruby', # For backward compatibility - 'site-ruby' => 'siterubyver', # For backward compatibility - 'bin-dir' => 'bindir', - 'bin-dir' => 'bindir', - 'rb-dir' => 'rbdir', - 'so-dir' => 'sodir', - 'data-dir' => 'datadir', - 'ruby-path' => 'rubypath', - 'ruby-prog' => 'rubyprog', - 'ruby' => 'rubyprog', - 'make-prog' => 'makeprog', - 'make' => 'makeprog' + 'std-ruby' => 'librubyver', + 'stdruby' => 'librubyver', + 'rubylibdir' => 'librubyver', + 'archdir' => 'librubyverarch', + 'site-ruby-common' => 'siteruby', # For backward compatibility + 'site-ruby' => 'siterubyver', # For backward compatibility + 'bin-dir' => 'bindir', + 'bin-dir' => 'bindir', + 'rb-dir' => 'rbdir', + 'so-dir' => 'sodir', + 'data-dir' => 'datadir', + 'ruby-path' => 'rubypath', + 'ruby-prog' => 'rubyprog', + 'ruby' => 'rubyprog', + 'make-prog' => 'makeprog', + 'make' => 'makeprog' } def fixup @@ -306,7 +297,7 @@ def fixup def parse_opt(opt) m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}" - m.to_a[1,2] + m.to_a[1, 2] end def dllext @@ -326,8 +317,7 @@ def initialize(name, template, default, desc) @description = desc end - attr_reader :name - attr_reader :description + attr_reader :name, :description, :value attr_accessor :default alias help_default default @@ -340,12 +330,8 @@ def value? true end - def value - @value - end - def resolve(table) - @value.gsub(%r<\$([^/]+)>) { table[$1] } + @value.gsub(%r{\$([^/]+)}) { table[::Regexp.last_match(1)] } end def set(val) @@ -373,10 +359,11 @@ def help_opt def check(val) return 'yes' unless val + unless /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i =~ val setup_rb_error "config: --#{@name} accepts only yes/no for argument" end - (/\Ay(es)?|\At(rue)/i =~ value) ? 'yes' : 'no' + /\Ay(es)?|\At(rue)/i =~ value ? 'yes' : 'no' end end @@ -388,8 +375,8 @@ def config_type private def check(path) - setup_rb_error "config: --#{@name} requires argument" unless path - path[0,1] == '$' ? path : File.expand_path(path) + setup_rb_error "config: --#{@name} requires argument" unless path + path[0, 1] == '$' ? path : File.expand_path(path) end end @@ -412,9 +399,7 @@ def config_type private def check(val) - unless @ok.include?(val.strip) - setup_rb_error "config: use --#{@name}=#{@template} (#{val})" - end + setup_rb_error "config: use --#{@name}=#{@template} (#{val})" unless @ok.include?(val.strip) val.strip end end @@ -434,17 +419,15 @@ def value? false end - def resolve(table) - setup_rb_error "$#{name()} wrongly used as option value" + def resolve(_table) + setup_rb_error "$#{name} wrongly used as option value" end undef set def evaluate(val, table) v = val.strip.downcase - unless @ok.include?(v) - setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})" - end + setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})" unless @ok.include?(v) @action.call v, table end end @@ -464,9 +447,7 @@ def config_type private def check(val) - unless File.dir?("packages/#{val}") - setup_rb_error "config: no such package: #{val}" - end + setup_rb_error "config: no such package: #{val}" unless File.dir?("packages/#{val}") val end end @@ -519,30 +500,33 @@ def remove_config(name) # For only multipackage def packages - raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer + unless @installer + raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' + end + @installer.packages end # For only multipackage def declare_packages(list) - raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer + unless @installer + raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' + end + @installer.packages = list end end - -end # class ConfigTable - +end # class ConfigTable # This module requires: #verbose?, #no_harm? module FileOperations - def mkdir_p(dirname, prefix = nil) dirname = prefix + File.expand_path(dirname) if prefix - $stderr.puts "mkdir -p #{dirname}" if verbose? + warn "mkdir -p #{dirname}" if verbose? return if no_harm? # Does not check '/', it's too abnormal. - dirs = File.expand_path(dirname).split(%r<(?=/)>) + dirs = File.expand_path(dirname).split(%r{(?=/)}) if /\A[a-z]:\z/i =~ dirs[0] disk = dirs.shift dirs[0] = disk + dirs[0] @@ -554,14 +538,16 @@ def mkdir_p(dirname, prefix = nil) end def rm_f(path) - $stderr.puts "rm -f #{path}" if verbose? + warn "rm -f #{path}" if verbose? return if no_harm? + force_remove_file path end def rm_rf(path) - $stderr.puts "rm -rf #{path}" if verbose? + warn "rm -rf #{path}" if verbose? return if no_harm? + remove_tree path end @@ -579,6 +565,7 @@ def remove_tree0(path) Dir.foreach(path) do |ent| next if ent == '.' next if ent == '..' + entpath = "#{path}/#{ent}" if File.symlink?(entpath) remove_file entpath @@ -599,68 +586,66 @@ def move_file(src, dest) force_remove_file dest begin File.rename src, dest - rescue - File.open(dest, 'wb') {|f| + rescue StandardError + File.open(dest, 'wb') do |f| f.write File.binread(src) - } + end File.chmod File.stat(src).mode, dest File.unlink src end end def force_remove_file(path) - begin - remove_file path - rescue - end + remove_file path + rescue StandardError end def remove_file(path) - File.chmod 0777, path + File.chmod 0o777, path File.unlink path end def install(from, dest, mode, prefix = nil) - $stderr.puts "install #{from} #{dest}" if verbose? + warn "install #{from} #{dest}" if verbose? return if no_harm? realdest = prefix ? prefix + File.expand_path(dest) : dest realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest) str = File.binread(from) - if diff?(str, realdest) - verbose_off { - rm_f realdest if File.exist?(realdest) - } - File.open(realdest, 'wb') {|f| - f.write str - } - File.chmod mode, realdest - - File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| - if prefix - f.puts realdest.sub(prefix, '') - else - f.puts realdest - end - } + return unless diff?(str, realdest) + + verbose_off do + rm_f realdest if File.exist?(realdest) + end + File.open(realdest, 'wb') do |f| + f.write str + end + File.chmod mode, realdest + + File.open("#{objdir_root}/InstalledFiles", 'a') do |f| + if prefix + f.puts realdest.sub(prefix, '') + else + f.puts realdest + end end end def diff?(new_content, path) return true unless File.exist?(path) + new_content != File.binread(path) end def command(*args) - $stderr.puts args.join(' ') if verbose? - system(*args) or raise RuntimeError, - "system(#{args.map{|a| a.inspect }.join(' ')}) failed" + warn args.join(' ') if verbose? + system(*args) or raise "system(#{args.map { |a| a.inspect }.join(' ')}) failed" end def ruby(*args) command config('rubyprog'), *args end - + def make(task = nil) command(*[config('makeprog'), task].compact) end @@ -670,25 +655,22 @@ def extdir?(dir) end def files_of(dir) - Dir.open(dir) {|d| - return d.select {|ent| File.file?("#{dir}/#{ent}") } - } + Dir.open(dir) do |d| + return d.select { |ent| File.file?("#{dir}/#{ent}") } + end end - DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn ) + DIR_REJECT = %w[. .. CVS SCCS RCS CVS.adm .svn] def directories_of(dir) - Dir.open(dir) {|d| - return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT - } + Dir.open(dir) do |d| + return d.select { |ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT + end end - end - # This module requires: #srcdir_root, #objdir_root, #relpath module HookScriptAPI - def get_config(key) @config[key] end @@ -705,15 +687,15 @@ def set_config(key, val) # def curr_srcdir - "#{srcdir_root()}/#{relpath()}" + "#{srcdir_root}/#{relpath}" end def curr_objdir - "#{objdir_root()}/#{relpath()}" + "#{objdir_root}/#{relpath}" end def srcfile(path) - "#{curr_srcdir()}/#{path}" + "#{curr_srcdir}/#{path}" end def srcexist?(path) @@ -723,63 +705,60 @@ def srcexist?(path) def srcdirectory?(path) File.dir?(srcfile(path)) end - + def srcfile?(path) File.file?(srcfile(path)) end def srcentries(path = '.') - Dir.open("#{curr_srcdir()}/#{path}") {|d| - return d.to_a - %w(. ..) - } + Dir.open("#{curr_srcdir}/#{path}") do |d| + return d.to_a - %w[. ..] + end end def srcfiles(path = '.') - srcentries(path).select {|fname| - File.file?(File.join(curr_srcdir(), path, fname)) - } + srcentries(path).select do |fname| + File.file?(File.join(curr_srcdir, path, fname)) + end end def srcdirectories(path = '.') - srcentries(path).select {|fname| - File.dir?(File.join(curr_srcdir(), path, fname)) - } + srcentries(path).select do |fname| + File.dir?(File.join(curr_srcdir, path, fname)) + end end - end - class ToplevelInstaller - Version = '3.4.0' Copyright = 'Copyright (c) 2000-2005 Minero Aoki' TASKS = [ - [ 'all', 'do config, setup, then install' ], - [ 'config', 'saves your configurations' ], - [ 'show', 'shows current configuration' ], - [ 'setup', 'compiles ruby extentions and others' ], - [ 'install', 'installs files' ], - [ 'test', 'run all tests in test/' ], - [ 'clean', "does `make clean' for each extention" ], - [ 'distclean',"does `make distclean' for each extention" ] + ['all', 'do config, setup, then install'], + ['config', 'saves your configurations'], + ['show', 'shows current configuration'], + ['setup', 'compiles ruby extentions and others'], + ['install', 'installs files'], + ['test', 'run all tests in test/'], + ['clean', "does `make clean' for each extention"], + ['distclean', "does `make distclean' for each extention"] ] - def ToplevelInstaller.invoke - config = ConfigTable.new(load_rbconfig()) + def self.invoke + config = ConfigTable.new(load_rbconfig) config.load_standard_entries config.load_multipackage_entries if multipackage? config.fixup - klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller) + klass = (multipackage? ? ToplevelInstallerMulti : ToplevelInstaller) klass.new(File.dirname($0), config).invoke end - def ToplevelInstaller.multipackage? + def self.multipackage? File.dir?(File.dirname($0) + '/packages') end - def ToplevelInstaller.load_rbconfig - if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg } + def self.load_rbconfig + if arg = ARGV.detect { |arg| /\A--rbconfig=/ =~ arg } ARGV.delete(arg) load File.expand_path(arg.split(/=/, 2)[1]) $".push 'rbconfig.rb' @@ -801,12 +780,12 @@ def config(key) end def inspect - "#<#{self.class} #{__id__()}>" + "#<#{self.class} #{__id__}>" end def invoke run_metaconfigs - case task = parsearg_global() + case task = parsearg_global when nil, 'all' parsearg_config init_installers @@ -816,7 +795,7 @@ def invoke else case task when 'config', 'test' - ; + when 'clean', 'distclean' @config.load_savefile if File.exist?(@config.savefile) else @@ -827,7 +806,7 @@ def invoke __send__ "exec_#{task}" end end - + def run_metaconfigs @config.load_script "#{@ardir}/metaconfig" end @@ -883,17 +862,17 @@ def parsearg_global end def valid_task?(t) - valid_task_re() =~ t + valid_task_re =~ t end def valid_task_re - @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/ + @valid_task_re ||= /\A(?:#{TASKS.map { |task, _desc| task }.join('|')})\z/ end def parsearg_no_options - unless ARGV.empty? - setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}" - end + return if ARGV.empty? + + setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}" end alias parsearg_show parsearg_no_options @@ -937,7 +916,7 @@ def parsearg_install @config.no_harm = true when /\A--prefix=/ path = a.split(/=/, 2)[1] - path = File.expand_path(path) unless path[0,1] == '/' + path = File.expand_path(path) unless path[0, 1] == '/' @config.install_prefix = path else setup_rb_error "install: unknown option #{a}" @@ -962,7 +941,7 @@ def print_usage(out) out.printf fmt, ' --verbose', 'output messages verbosely' out.printf fmt, ' --help', 'print this message' out.printf fmt, ' --version', 'print version and quit' - out.printf fmt, ' --copyright', 'print copyright and quit' + out.printf fmt, ' --copyright', 'print copyright and quit' out.puts out.puts 'Tasks:' TASKS.each do |name, desc| @@ -975,11 +954,11 @@ def print_usage(out) @config.each do |item| out.printf fmt, item.help_opt, item.description, item.help_default end - out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's" + out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load', "running ruby's" out.puts out.puts 'Options for INSTALL:' out.printf fmt, '--no-harm', 'only display what to do if given', 'off' - out.printf fmt, '--prefix=path', 'install path prefix', '' + out.printf fmt, '--prefix=path', 'install path prefix', '' out.puts end @@ -989,7 +968,7 @@ def print_usage(out) def exec_config @installer.exec_config - @config.save # must be final + @config.save # must be final end def exec_setup @@ -1017,18 +996,16 @@ def exec_clean def exec_distclean @installer.exec_distclean end - -end # class ToplevelInstaller - +end # class ToplevelInstaller class ToplevelInstallerMulti < ToplevelInstaller - include FileOperations def initialize(ardir_root, config) super @packages = directories_of("#{@ardir}/packages") raise 'no package exists' if @packages.empty? + @root_installer = Installer.new(@config, @ardir, File.expand_path('.')) end @@ -1043,6 +1020,7 @@ def run_metaconfigs def packages=(list) raise 'package list is empty' if list.empty? + list.each do |name| raise "directory packages/#{name} does not exist"\ unless File.dir?("#{@ardir}/packages/#{name}") @@ -1054,21 +1032,21 @@ def init_installers @installers = {} @packages.each do |pack| @installers[pack] = Installer.new(@config, - "#{@ardir}/packages/#{pack}", - "packages/#{pack}") + "#{@ardir}/packages/#{pack}", + "packages/#{pack}") end with = extract_selection(config('with')) without = extract_selection(config('without')) - @selected = @installers.keys.select {|name| - (with.empty? or with.include?(name)) \ - and not without.include?(name) - } + @selected = @installers.keys.select do |name| + (with.empty? or with.include?(name)) \ + and !without.include?(name) + end end def extract_selection(list) a = list.split(/,/) a.each do |name| - setup_rb_error "no such package: #{name}" unless @installers.key?(name) + setup_rb_error "no such package: #{name}" unless @installers.key?(name) end a end @@ -1086,40 +1064,40 @@ def print_usage(f) def exec_config run_hook 'pre-config' - each_selected_installers {|inst| inst.exec_config } + each_selected_installers { |inst| inst.exec_config } run_hook 'post-config' - @config.save # must be final + @config.save # must be final end def exec_setup run_hook 'pre-setup' - each_selected_installers {|inst| inst.exec_setup } + each_selected_installers { |inst| inst.exec_setup } run_hook 'post-setup' end def exec_install run_hook 'pre-install' - each_selected_installers {|inst| inst.exec_install } + each_selected_installers { |inst| inst.exec_install } run_hook 'post-install' end def exec_test run_hook 'pre-test' - each_selected_installers {|inst| inst.exec_test } + each_selected_installers { |inst| inst.exec_test } run_hook 'post-test' end def exec_clean rm_f @config.savefile run_hook 'pre-clean' - each_selected_installers {|inst| inst.exec_clean } + each_selected_installers { |inst| inst.exec_clean } run_hook 'post-clean' end def exec_distclean rm_f @config.savefile run_hook 'pre-distclean' - each_selected_installers {|inst| inst.exec_distclean } + each_selected_installers { |inst| inst.exec_distclean } run_hook 'post-distclean' end @@ -1130,7 +1108,7 @@ def exec_distclean def each_selected_installers Dir.mkdir 'packages' unless File.dir?('packages') @selected.each do |pack| - $stderr.puts "Processing the package `#{pack}' ..." if verbose? + warn "Processing the package `#{pack}' ..." if verbose? Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}") Dir.chdir "packages/#{pack}" yield @installers[pack] @@ -1151,13 +1129,10 @@ def verbose? def no_harm? @config.no_harm? end - -end # class ToplevelInstallerMulti - +end # class ToplevelInstallerMulti class Installer - - FILETYPES = %w( bin lib ext data conf man ) + FILETYPES = %w[bin lib ext data conf man] include FileOperations include HookScriptAPI @@ -1204,12 +1179,11 @@ def no_harm? end def verbose_off - begin - save, @config.verbose = @config.verbose?, false - yield - ensure - @config.verbose = save - end + save = @config.verbose? + @config.verbose = false + yield + ensure + @config.verbose = save end # @@ -1220,28 +1194,23 @@ def exec_config exec_task_traverse 'config' end - def config_dir_bin(rel) - end + def config_dir_bin(rel); end - def config_dir_lib(rel) - end + def config_dir_lib(rel); end - def config_dir_man(rel) - end + def config_dir_man(rel); end - def config_dir_ext(rel) - extconf if extdir?(curr_srcdir()) + def config_dir_ext(_rel) + extconf if extdir?(curr_srcdir) end def extconf - ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt + ruby "#{curr_srcdir}/extconf.rb", *@config.config_opt end - def config_dir_data(rel) - end + def config_dir_data(rel); end - def config_dir_conf(rel) - end + def config_dir_conf(rel); end # # TASK setup @@ -1251,46 +1220,44 @@ def exec_setup exec_task_traverse 'setup' end - def setup_dir_bin(rel) - files_of(curr_srcdir()).each do |fname| - adjust_shebang "#{curr_srcdir()}/#{fname}" + def setup_dir_bin(_rel) + files_of(curr_srcdir).each do |fname| + adjust_shebang "#{curr_srcdir}/#{fname}" end end def adjust_shebang(path) return if no_harm? + tmpfile = File.basename(path) + '.tmp' begin - File.open(path, 'rb') {|r| + File.open(path, 'rb') do |r| first = r.gets return unless File.basename(first.sub(/\A\#!/, '').split[0].to_s) == 'ruby' - $stderr.puts "adjusting shebang: #{File.basename(path)}" if verbose? - File.open(tmpfile, 'wb') {|w| + + warn "adjusting shebang: #{File.basename(path)}" if verbose? + File.open(tmpfile, 'wb') do |w| w.print first.sub(/\A\#!\s*\S+/, '#! ' + config('rubypath')) w.write r.read - } - } + end + end move_file tmpfile, File.basename(path) ensure File.unlink tmpfile if File.exist?(tmpfile) end end - def setup_dir_lib(rel) - end + def setup_dir_lib(rel); end - def setup_dir_man(rel) - end + def setup_dir_man(rel); end - def setup_dir_ext(rel) - make if extdir?(curr_srcdir()) + def setup_dir_ext(_rel) + make if extdir?(curr_srcdir) end - def setup_dir_data(rel) - end + def setup_dir_data(rel); end - def setup_dir_conf(rel) - end + def setup_dir_conf(rel); end # # TASK install @@ -1302,32 +1269,33 @@ def exec_install end def install_dir_bin(rel) - install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755 + install_files targetfiles, "#{config('bindir')}/#{rel}", 0o755 end def install_dir_lib(rel) - install_files rubyscripts(), "#{config('rbdir')}/#{rel}", 0644 + install_files rubyscripts, "#{config('rbdir')}/#{rel}", 0o644 end def install_dir_ext(rel) - return unless extdir?(curr_srcdir()) + return unless extdir?(curr_srcdir) + install_files rubyextentions('.'), "#{config('sodir')}/#{File.dirname(rel)}", - 0555 + 0o555 end def install_dir_data(rel) - install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644 + install_files targetfiles, "#{config('datadir')}/#{rel}", 0o644 end def install_dir_conf(rel) # FIXME: should not remove current config files # (rename previous file to .old/.org) - install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644 + install_files targetfiles, "#{config('sysconfdir')}/#{rel}", 0o644 end def install_dir_man(rel) - install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644 + install_files targetfiles, "#{config('mandir')}/#{rel}", 0o644 end def install_files(list, dest, mode) @@ -1338,57 +1306,56 @@ def install_files(list, dest, mode) end def rubyscripts - glob_select(@config.libsrc_pattern, targetfiles()) + glob_select(@config.libsrc_pattern, targetfiles) end - def rubyextentions(dir) - ents = glob_select("*.#{@config.dllext}", targetfiles()) - if ents.empty? - setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first" - end + def rubyextentions(_dir) + ents = glob_select("*.#{@config.dllext}", targetfiles) + setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first" if ents.empty? ents end def targetfiles - mapdir(existfiles() - hookfiles()) + mapdir(existfiles - hookfiles) end def mapdir(ents) - ents.map {|ent| + ents.map do |ent| if File.exist?(ent) - then ent # objdir - else "#{curr_srcdir()}/#{ent}" # srcdir + then ent # objdir + else + "#{curr_srcdir}/#{ent}" # srcdir end - } + end end # picked up many entries from cvs-1.11.1/src/ignore.c - JUNK_FILES = %w( + JUNK_FILES = %w[ core RCSLOG tags TAGS .make.state .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb *~ *.old *.bak *.BAK *.orig *.rej _$* *$ *.org *.in .* - ) + ] def existfiles - glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.'))) + glob_reject(JUNK_FILES, (files_of(curr_srcdir) | files_of('.'))) end def hookfiles - %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt| - %w( config setup install clean ).map {|t| sprintf(fmt, t) } - }.flatten + %w[pre-%s post-%s pre-%s.rb post-%s.rb].map do |fmt| + %w[config setup install clean].map { |t| format(fmt, t) } + end.flatten end def glob_select(pat, ents) re = globs2re([pat]) - ents.select {|ent| re =~ ent } + ents.select { |ent| re =~ ent } end def glob_reject(pats, ents) re = globs2re(pats) - ents.reject {|ent| re =~ ent } + ents.reject { |ent| re =~ ent } end GLOB2REGEX = { @@ -1400,7 +1367,7 @@ def glob_reject(pats, ents) def globs2re(pats) /\A(?:#{ - pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|') + pats.map { |pat| pat.gsub(/[.$\#*]/) { |ch| GLOB2REGEX[ch] } }.join('|') })\z/ end @@ -1412,10 +1379,10 @@ def globs2re(pats) def exec_test unless File.directory?('test') - $stderr.puts 'no test in this package' if verbose? + warn 'no test in this package' if verbose? return end - $stderr.puts 'Running tests...' if verbose? + warn 'Running tests...' if verbose? Dir.glob './test/**/test_*.rb', &method(:require) end @@ -1429,22 +1396,19 @@ def exec_clean rm_f 'InstalledFiles' end - def clean_dir_bin(rel) - end + def clean_dir_bin(rel); end - def clean_dir_lib(rel) - end + def clean_dir_lib(rel); end + + def clean_dir_ext(_rel) + return unless extdir?(curr_srcdir) - def clean_dir_ext(rel) - return unless extdir?(curr_srcdir()) make 'clean' if File.file?('Makefile') end - def clean_dir_data(rel) - end + def clean_dir_data(rel); end - def clean_dir_conf(rel) - end + def clean_dir_conf(rel); end # # TASK distclean @@ -1456,22 +1420,19 @@ def exec_distclean rm_f 'InstalledFiles' end - def distclean_dir_bin(rel) - end + def distclean_dir_bin(rel); end - def distclean_dir_lib(rel) - end + def distclean_dir_lib(rel); end + + def distclean_dir_ext(_rel) + return unless extdir?(curr_srcdir) - def distclean_dir_ext(rel) - return unless extdir?(curr_srcdir()) make 'distclean' if File.file?('Makefile') end - def distclean_dir_data(rel) - end + def distclean_dir_data(rel); end - def distclean_dir_conf(rel) - end + def distclean_dir_conf(rel); end # # lib @@ -1481,7 +1442,7 @@ def exec_task_traverse(task) run_hook "pre-#{task}" FILETYPES.each do |type| if config('without-ext') == 'yes' and type == 'ext' - $stderr.puts 'skipping ext/* by user option' if verbose? + warn 'skipping ext/* by user option' if verbose? next end traverse task, type, "#{task}_dir_#{type}" @@ -1490,14 +1451,14 @@ def exec_task_traverse(task) end def traverse(task, rel, mid) - dive_into(rel) { + dive_into(rel) do run_hook "pre-#{task}" - __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '') - directories_of(curr_srcdir()).each do |d| + __send__ mid, rel.sub(%r{\A.*?(?:/|\z)}, '') + directories_of(curr_srcdir).each do |d| traverse task, "#{rel}/#{d}", mid end run_hook "post-#{task}" - } + end end def dive_into(rel) @@ -1507,28 +1468,28 @@ def dive_into(rel) Dir.mkdir dir unless File.dir?(dir) prevdir = Dir.pwd Dir.chdir dir - $stderr.puts '---> ' + rel if verbose? + warn '---> ' + rel if verbose? @currdir = rel yield Dir.chdir prevdir - $stderr.puts '<--- ' + rel if verbose? + warn '<--- ' + rel if verbose? @currdir = File.dirname(rel) end def run_hook(id) - path = [ "#{curr_srcdir()}/#{id}", - "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) } + path = ["#{curr_srcdir}/#{id}", + "#{curr_srcdir}/#{id}.rb"].detect { |cand| File.file?(cand) } return unless path + begin instance_eval File.read(path), path, 1 - rescue + rescue StandardError raise if $DEBUG + setup_rb_error "hook #{path} failed:\n" + $!.message end end - -end # class Installer - +end # class Installer class SetupError < StandardError; end @@ -1541,8 +1502,9 @@ def setup_rb_error(msg) ToplevelInstaller.invoke rescue SetupError raise if $DEBUG - $stderr.puts $!.message - $stderr.puts "Try 'ruby #{$0} --help' for detailed usage." + + warn $!.message + warn "Try 'ruby #{$0} --help' for detailed usage." exit 1 end end diff --git a/test/discoverdata.rb b/test/discoverdata.rb index dac5f740..1731578f 100644 --- a/test/discoverdata.rb +++ b/test/discoverdata.rb @@ -1,36 +1,33 @@ - require 'uri' require 'openid/yadis/constants' require 'openid/yadis/discovery' require 'openid/util' module OpenID - module DiscoverData - include TestDataMixin include Util TESTLIST = [ - # success, input_name, id_name, result_name - [true, "equiv", "equiv", "xrds"], - [true, "header", "header", "xrds"], - [true, "lowercase_header", "lowercase_header", "xrds"], - [true, "xrds", "xrds", "xrds"], - [true, "xrds_ctparam", "xrds_ctparam", "xrds_ctparam"], - [true, "xrds_ctcase", "xrds_ctcase", "xrds_ctcase"], - [false, "xrds_html", "xrds_html", "xrds_html"], - [true, "redir_equiv", "equiv", "xrds"], - [true, "redir_header", "header", "xrds"], - [true, "redir_xrds", "xrds", "xrds"], - [false, "redir_xrds_html", "xrds_html", "xrds_html"], - [true, "redir_redir_equiv", "equiv", "xrds"], - [false, "404_server_response", nil, nil], - [false, "404_with_header", nil, nil], - [false, "404_with_meta", nil, nil], - [false, "201_server_response", nil, nil], - [false, "500_server_response", nil, nil], - ] + # success, input_name, id_name, result_name + [true, 'equiv', 'equiv', 'xrds'], + [true, 'header', 'header', 'xrds'], + [true, 'lowercase_header', 'lowercase_header', 'xrds'], + [true, 'xrds', 'xrds', 'xrds'], + [true, 'xrds_ctparam', 'xrds_ctparam', 'xrds_ctparam'], + [true, 'xrds_ctcase', 'xrds_ctcase', 'xrds_ctcase'], + [false, 'xrds_html', 'xrds_html', 'xrds_html'], + [true, 'redir_equiv', 'equiv', 'xrds'], + [true, 'redir_header', 'header', 'xrds'], + [true, 'redir_xrds', 'xrds', 'xrds'], + [false, 'redir_xrds_html', 'xrds_html', 'xrds_html'], + [true, 'redir_redir_equiv', 'equiv', 'xrds'], + [false, '404_server_response', nil, nil], + [false, '404_with_header', nil, nil], + [false, '404_with_meta', nil, nil], + [false, '201_server_response', nil, nil], + [false, '500_server_response', nil, nil] + ] @@example_xrds_file = 'example-xrds.xml' @@default_test_file = 'test1-discover.txt' @@ -39,44 +36,40 @@ module DiscoverData def readTests(filename) data = read_data_file(filename, false) tests = {} - data.split("\f\n", -1).each { |case_| + data.split("\f\n", -1).each do |case_| name, content = case_.split("\n", 2) tests[name] = content - } + end - return tests + tests end def getData(filename, name) - if !@@discover_tests.member?(filename) - @@discover_tests[filename] = readTests(filename) - end + @@discover_tests[filename] = readTests(filename) unless @@discover_tests.member?(filename) file_tests = @@discover_tests[filename] - return file_tests[name] + file_tests[name] end def fillTemplate(test_name, template, base_url, example_xrds) mapping = [ - ['URL_BASE/', base_url], - ['', example_xrds], - ['YADIS_HEADER', Yadis::YADIS_HEADER_NAME], - ['NAME', test_name], - ] + ['URL_BASE/', base_url], + ['', example_xrds], + ['YADIS_HEADER', Yadis::YADIS_HEADER_NAME], + ['NAME', test_name] + ] - mapping.each { |k, v| + mapping.each do |k, v| template = template.gsub(/#{k}/, v) - } + end - return template + template end def generateSample(test_name, base_url, - example_xrds=nil, - filename=@@default_test_file) - if example_xrds.nil? - example_xrds = read_data_file(@@example_xrds_file, false) - end + example_xrds = nil, + filename = @@default_test_file) + example_xrds = read_data_file(@@example_xrds_file, false) if example_xrds.nil? begin template = getData(filename, test_name) @@ -84,11 +77,11 @@ def generateSample(test_name, base_url, raise ArgumentError(filename) end - return fillTemplate(test_name, template, base_url, example_xrds) + fillTemplate(test_name, template, base_url, example_xrds) end def generateResult(base_url, input_name, id_name, result_name, success) - uri = URI::parse(base_url) + uri = URI.parse(base_url) input_url = (uri + input_name).to_s @@ -104,27 +97,25 @@ def generateResult(base_url, input_name, id_name, result_name, success) header_lines = headers.split("\n") ctype = nil - header_lines.each { |header_line| + header_lines.each do |header_line| if header_line.start_with?('Content-Type:') _, ctype = header_line.split(':', 2) - ctype = ctype.strip() + ctype = ctype.strip break else ctype = nil end - } + end id_url = (uri + id_name).to_s result = Yadis::DiscoveryResult.new(input_url) result.normalized_uri = id_url - if success - result.xrds_uri = (uri + result_name).to_s - end + result.xrds_uri = (uri + result_name).to_s if success result.content_type = ctype result.response_text = content - return [input_url, result] + [input_url, result] end end end diff --git a/test/test_accept.rb b/test/test_accept.rb index 97835d58..82528417 100644 --- a/test/test_accept.rb +++ b/test/test_accept.rb @@ -4,21 +4,20 @@ require 'openid/util' module OpenID - class AcceptTest < Minitest::Test include TestDataMixin - def getTestData() + def getTestData # Read the test data off of disk # # () -> [(int, str)] lines = read_data_file('accept.txt') line_no = 1 - return lines.collect { |line| + lines.collect do |line| pair = [line_no, line] line_no += 1 pair - } + end end def chunk(lines) @@ -27,8 +26,8 @@ def chunk(lines) # [(int, str)] -> [[(int, str)]] chunks = [] chunk = [] - lines.each { |lineno, line| - stripped = line.strip() + lines.each do |lineno, line| + stripped = line.strip if (stripped == '') or stripped.start_with?('#') if chunk.length > 0 chunks << chunk @@ -37,13 +36,11 @@ def chunk(lines) else chunk << [lineno, stripped] end - } - - if chunk.length > 0 - chunks << chunk end - return chunks + chunks << chunk if chunk.length > 0 + + chunks end def parseLines(chunk) @@ -52,19 +49,19 @@ def parseLines(chunk) # # [(int, str)] -> {str:(int, str)} items = {} - chunk.each { |lineno, line| + chunk.each do |lineno, line| header, data = line.split(':', 2) header = header.downcase items[header] = [lineno, data.strip] - } - return items + end + items end def parseAvailable(available_text) # Parse an Available: line's data # # str -> [str] - return available_text.split(',', -1).collect { |s| s.strip } + available_text.split(',', -1).collect { |s| s.strip } end def parseExpected(expected_text) @@ -73,7 +70,7 @@ def parseExpected(expected_text) # str -> [(str, float)] expected = [] if expected_text != '' - expected_text.split(',', -1).each { |chunk| + expected_text.split(',', -1).each do |chunk| chunk = chunk.strip mtype, qstuff = chunk.split(';', -1) mtype = mtype.strip @@ -83,17 +80,17 @@ def parseExpected(expected_text) Util.assert(q == 'q') qval = qstr.to_f expected << [mtype, qval] - } + end end - return expected + expected end def test_accept_headers - lines = getTestData() + lines = getTestData chunks = chunk(lines) data_sets = chunks.collect { |chunk| parseLines(chunk) } - data_sets.each { |data| + data_sets.each do |data| lnos = [] lno, header = data['accept'] lnos << lno @@ -101,7 +98,7 @@ def test_accept_headers lnos << lno begin available = parseAvailable(avail_data) - rescue + rescue StandardError print 'On line', lno raise end @@ -110,12 +107,12 @@ def test_accept_headers lnos << lno begin expected = parseExpected(exp_data) - rescue + rescue StandardError print 'On line', lno raise end - sprintf('MatchAcceptTest for lines %s', lnos) + format('MatchAcceptTest for lines %s', lnos) # Test: accepted = Yadis.parse_accept_header(header) @@ -124,7 +121,7 @@ def test_accept_headers assert_equal(Yadis.get_acceptable(header, available), expected.collect { |mtype, _| mtype }) - } + end end def test_generate_accept_header @@ -133,36 +130,33 @@ def test_generate_accept_header # Form: [input_array, expected_header_string] [ - # Empty input list - [[], ""], - # Content type name only; no q value - [["test"], "test"], - # q = 1.0 should be omitted from the header - [[["test", 1.0]], "test"], - # Test conversion of float to string - [["test", ["with_q", 0.8]], "with_q; q=0.8, test"], - # Allow string q values, too - [["test", ["with_q_str", "0.7"]], "with_q_str; q=0.7, test"], - # Test q values out of bounds - [[["test", -1.0]], nil], - [[["test", 1.1]], nil], - # Test sorting of types by q value - [[["middle", 0.5], ["min", 0.1], "max"], - "min; q=0.1, middle; q=0.5, max"], - - ].each { |input, expected_header| - + # Empty input list + [[], ''], + # Content type name only; no q value + [['test'], 'test'], + # q = 1.0 should be omitted from the header + [[['test', 1.0]], 'test'], + # Test conversion of float to string + [['test', ['with_q', 0.8]], 'with_q; q=0.8, test'], + # Allow string q values, too + [['test', ['with_q_str', '0.7']], 'with_q_str; q=0.7, test'], + # Test q values out of bounds + [[['test', -1.0]], nil], + [[['test', 1.1]], nil], + # Test sorting of types by q value + [[['middle', 0.5], ['min', 0.1], 'max'], + 'min; q=0.1, middle; q=0.5, max'] + + ].each do |input, expected_header| if expected_header.nil? - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do Yadis.generate_accept_header(*input) - } + end else assert_equal(expected_header, Yadis.generate_accept_header(*input), [input, expected_header].inspect) end - } + end end - end - end diff --git a/test/test_association.rb b/test/test_association.rb index 0721fee6..fe5d5fe4 100644 --- a/test/test_association.rb +++ b/test/test_association.rb @@ -1,6 +1,6 @@ -require "minitest/autorun" -require "openid/association" -require "openid/protocolerror" +require 'minitest/autorun' +require 'openid/association' +require 'openid/protocolerror' module OpenID class AssociationTestCase < Minitest::Test @@ -16,25 +16,25 @@ def setup end def test_round_trip - assoc2 = Association.deserialize(@assoc.serialize()) - [:handle, :secret, :lifetime, :assoc_type].each do |attr| + assoc2 = Association.deserialize(@assoc.serialize) + %i[handle secret lifetime assoc_type].each do |attr| assert_equal(@assoc.send(attr), assoc2.send(attr)) end end def test_deserialize_failure field_list = Util.kv_to_seq(@assoc.serialize) - kv = Util.seq_to_kv(field_list + [['monkeys', 'funny']]) - assert_raises(ProtocolError) { + kv = Util.seq_to_kv(field_list + [%w[monkeys funny]]) + assert_raises(ProtocolError) do Association.deserialize(kv) - } + end bad_version_list = field_list.dup - bad_version_list[0] = ['version', 'moon'] + bad_version_list[0] = %w[version moon] bad_version_kv = Util.seq_to_kv(bad_version_list) - assert_raises(ProtocolError) { + assert_raises(ProtocolError) do Association.deserialize(bad_version_kv) - } + end end def test_serialization_identity @@ -44,9 +44,9 @@ def test_serialization_identity def test_expires_in # Allow one second of slop - assert(@assoc.expires_in.between?(599,600)) - assert(@assoc.expires_in(Time.now.to_i).between?(599,600)) - assert_equal(0,@assoc.expires_in(Time.now.to_i + 10000),"negative expires_in") + assert(@assoc.expires_in.between?(599, 600)) + assert(@assoc.expires_in(Time.now.to_i).between?(599, 600)) + assert_equal(0, @assoc.expires_in(Time.now.to_i + 10_000), 'negative expires_in') end def test_from_expires_in @@ -59,7 +59,7 @@ def test_from_expires_in # Allow one second of slop here for code execution time assert_in_delta(1, assoc.expires_in, @assoc.expires_in) - [:handle, :secret, :assoc_type].each do |attr| + %i[handle secret assoc_type].each do |attr| assert_equal(@assoc.send(attr), assoc.send(attr)) end @@ -69,21 +69,20 @@ def test_from_expires_in end def test_sign_sha1 - pairs = [['key1', 'value1'], - ['key2', 'value2']] + pairs = [%w[key1 value1], + %w[key2 value2]] [['HMAC-SHA256', "\xfd\xaa\xfe;\xac\xfc*\x988\xad\x05d6-\xeaVy\xd5\xa5Z.<\xa9\xed\x18\x82\\$\x95x\x1c&"], - ['HMAC-SHA1', "\xe0\x1bv\x04\xf1G\xc0\xbb\x7f\x9a\x8b\xe9\xbc\xee}\\\xe5\xbb7*"], - ].each do |assoc_type, expected| - assoc = Association.from_expires_in(3600, "handle", 'very_secret', assoc_type) + ['HMAC-SHA1', "\xe0\x1bv\x04\xf1G\xc0\xbb\x7f\x9a\x8b\xe9\xbc\xee}\\\xe5\xbb7*"]].each do |assoc_type, expected| + assoc = Association.from_expires_in(3600, 'handle', 'very_secret', assoc_type) sig = assoc.sign(pairs) - assert_equal(expected.force_encoding("UTF-8"), sig.force_encoding("UTF-8")) + assert_equal(expected.force_encoding('UTF-8'), sig.force_encoding('UTF-8')) m = Message.new(OPENID2_NS) - pairs.each { |k, v| + pairs.each do |k, v| m.set_arg(OPENID_NS, k, v) - } - m.set_arg(BARE_NS, "not_an_openid_arg", "bogus") + end + m.set_arg(BARE_NS, 'not_an_openid_arg', 'bogus') signed_m = assoc.sign_message(m) assert(signed_m.has_key?(OPENID_NS, 'sig')) @@ -93,40 +92,40 @@ def test_sign_sha1 end def test_sign_message_with_sig - assoc = Association.from_expires_in(3600, "handle", "very_secret", - "HMAC-SHA1") + assoc = Association.from_expires_in(3600, 'handle', 'very_secret', + 'HMAC-SHA1') m = Message.new(OPENID2_NS) m.set_arg(OPENID_NS, 'sig', 'noise') - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do assoc.sign_message(m) - } + end end def test_sign_message_with_signed - assoc = Association.from_expires_in(3600, "handle", "very_secret", - "HMAC-SHA1") + assoc = Association.from_expires_in(3600, 'handle', 'very_secret', + 'HMAC-SHA1') m = Message.new(OPENID2_NS) m.set_arg(OPENID_NS, 'signed', 'fields') - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do assoc.sign_message(m) - } + end end def test_sign_different_assoc_handle - assoc = Association.from_expires_in(3600, "handle", "very_secret", - "HMAC-SHA1") + assoc = Association.from_expires_in(3600, 'handle', 'very_secret', + 'HMAC-SHA1') m = Message.new(OPENID2_NS) m.set_arg(OPENID_NS, 'assoc_handle', 'different') - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do assoc.sign_message(m) - } + end end def test_sign_bad_assoc_type @assoc.instance_eval { @assoc_type = 'Cookies' } - assert_raises(ProtocolError) { + assert_raises(ProtocolError) do @assoc.sign([]) - } + end end def test_make_pairs @@ -135,11 +134,11 @@ def test_make_pairs 'mode' => 'id_res', 'identifier' => '=example', 'signed' => 'identifier,mode', - 'sig' => 'cephalopod', + 'sig' => 'cephalopod' }) - msg.update_args(BARE_NS, {'xey' => 'value'}) + msg.update_args(BARE_NS, { 'xey' => 'value' }) assoc = Association.from_expires_in(3600, '{sha1}', 'very_secret', - "HMAC-SHA1") + 'HMAC-SHA1') pairs = assoc.make_pairs(msg) assert_equal([['identifier', '=example'], ['mode', 'id_res']], pairs) @@ -147,55 +146,51 @@ def test_make_pairs def test_check_message_signature_no_signed m = Message.new(OPENID2_NS) - m.update_args(OPENID2_NS, {'mode' => 'id_res', - 'identifier' => '=example', - 'sig' => 'coyote', - }) + m.update_args(OPENID2_NS, { 'mode' => 'id_res', + 'identifier' => '=example', + 'sig' => 'coyote' }) assoc = Association.from_expires_in(3600, '{sha1}', 'very_secret', - "HMAC-SHA1") - assert_raises(ProtocolError) { + 'HMAC-SHA1') + assert_raises(ProtocolError) do assoc.check_message_signature(m) - } + end end def test_check_message_signature_no_sig m = Message.new(OPENID2_NS) - m.update_args(OPENID2_NS, {'mode' => 'id_res', - 'identifier' => '=example', - 'signed' => 'mode', - }) + m.update_args(OPENID2_NS, { 'mode' => 'id_res', + 'identifier' => '=example', + 'signed' => 'mode' }) assoc = Association.from_expires_in(3600, '{sha1}', 'very_secret', - "HMAC-SHA1") - assert_raises(ProtocolError) { + 'HMAC-SHA1') + assert_raises(ProtocolError) do assoc.check_message_signature(m) - } + end end def test_check_message_signature_bad_sig m = Message.new(OPENID2_NS) - m.update_args(OPENID2_NS, {'mode' => 'id_res', - 'identifier' => '=example', - 'signed' => 'mode', - 'sig' => Util.to_base64('coyote'), - }) + m.update_args(OPENID2_NS, { 'mode' => 'id_res', + 'identifier' => '=example', + 'signed' => 'mode', + 'sig' => Util.to_base64('coyote') }) assoc = Association.from_expires_in(3600, '{sha1}', 'very_secret', - "HMAC-SHA1") + 'HMAC-SHA1') assert(!assoc.check_message_signature(m)) end def test_check_message_signature_good_sig m = Message.new(OPENID2_NS) - m.update_args(OPENID2_NS, {'mode' => 'id_res', - 'identifier' => '=example', - 'signed' => 'mode', - 'sig' => Util.to_base64('coyote'), - }) + m.update_args(OPENID2_NS, { 'mode' => 'id_res', + 'identifier' => '=example', + 'signed' => 'mode', + 'sig' => Util.to_base64('coyote') }) assoc = Association.from_expires_in(3600, '{sha1}', 'very_secret', - "HMAC-SHA1") + 'HMAC-SHA1') class << assoc # Override sign, because it's already tested elsewhere - def sign(pairs) - "coyote" + def sign(_pairs) + 'coyote' end end @@ -211,9 +206,9 @@ def assert_equal_under(item1, item2) end def test_copy - neg = AssociationNegotiator.new([['HMAC-SHA1', 'DH-SHA1']]) + neg = AssociationNegotiator.new([%w[HMAC-SHA1 DH-SHA1]]) neg2 = neg.copy - assert_equal_under(neg, neg2) {|n| n.instance_eval{@allowed_types} } + assert_equal_under(neg, neg2) { |n| n.instance_eval { @allowed_types } } assert(neg.object_id != neg2.object_id) end @@ -233,30 +228,30 @@ def test_add_allowed assert(neg.allowed?('HMAC-SHA1', 'no-encryption')) assert(neg.allowed?('HMAC-SHA256', 'DH-SHA256')) assert(!neg.allowed?('HMAC-SHA256', 'no-encryption')) - assert_equal(neg.get_allowed_type, ['HMAC-SHA1', 'DH-SHA1']) + assert_equal(neg.get_allowed_type, %w[HMAC-SHA1 DH-SHA1]) end def test_bad_assoc_type - assert_raises(ProtocolError) { - AssociationNegotiator.new([['OMG', 'Ponies']]) - } + assert_raises(ProtocolError) do + AssociationNegotiator.new([%w[OMG Ponies]]) + end end def test_bad_session_type - assert_raises(ProtocolError) { - AssociationNegotiator.new([['HMAC-SHA1', 'OMG-Ponies']]) - } + assert_raises(ProtocolError) do + AssociationNegotiator.new([%w[HMAC-SHA1 OMG-Ponies]]) + end end def test_default_negotiator assert_equal(DefaultNegotiator.get_allowed_type, - ['HMAC-SHA1', 'DH-SHA1']) + %w[HMAC-SHA1 DH-SHA1]) assert(DefaultNegotiator.allowed?('HMAC-SHA256', 'no-encryption')) end def test_encrypted_negotiator assert_equal(EncryptedNegotiator.get_allowed_type, - ['HMAC-SHA1', 'DH-SHA1']) + %w[HMAC-SHA1 DH-SHA1]) assert(!EncryptedNegotiator.allowed?('HMAC-SHA256', 'no-encryption')) end end diff --git a/test/test_associationmanager.rb b/test/test_associationmanager.rb index 1d880292..a5cc2327 100644 --- a/test/test_associationmanager.rb +++ b/test/test_associationmanager.rb @@ -1,15 +1,15 @@ -require "minitest/autorun" -require "testutil" -require "openid/consumer/associationmanager" -require "openid/association" -require "openid/dh" -require "openid/util" -require "openid/cryptutil" -require "openid/message" -require "openid/protocolerror" -require "openid/store/memory" -require "util" -require "time" +require 'minitest/autorun' +require 'testutil' +require 'openid/consumer/associationmanager' +require 'openid/association' +require 'openid/dh' +require 'openid/util' +require 'openid/cryptutil' +require 'openid/message' +require 'openid/protocolerror' +require 'openid/store/memory' +require 'util' +require 'time' module OpenID class DHAssocSessionTest < Minitest::Test @@ -17,18 +17,18 @@ def test_sha1_get_request # Initialized without an explicit DH gets defaults sess = Consumer::DiffieHellmanSHA1Session.new assert_equal(['dh_consumer_public'], sess.get_request.keys) - Util::from_base64(sess.get_request['dh_consumer_public']) + Util.from_base64(sess.get_request['dh_consumer_public']) end def test_sha1_get_request_custom_dh - dh = DiffieHellman.new(1299721, 2) + dh = DiffieHellman.new(1_299_721, 2) sess = Consumer::DiffieHellmanSHA1Session.new(dh) req = sess.get_request - assert_equal(['dh_consumer_public', 'dh_modulus', 'dh_gen'].sort, + assert_equal(%w[dh_consumer_public dh_modulus dh_gen].sort, req.keys.sort) assert_equal(dh.modulus, CryptUtil.base64_to_num(req['dh_modulus'])) assert_equal(dh.generator, CryptUtil.base64_to_num(req['dh_gen'])) - Util::from_base64(req['dh_consumer_public']) + Util.from_base64(req['dh_consumer_public']) end end @@ -37,8 +37,8 @@ def setup session_cls = self.class.session_cls # Pre-compute DH with small prime so tests run quickly. - @server_dh = DiffieHellman.new(100389557, 2) - @consumer_dh = DiffieHellman.new(100389557, 2) + @server_dh = DiffieHellman.new(100_389_557, 2) + @consumer_dh = DiffieHellman.new(100_389_557, 2) # base64(btwoc(g ^ xb mod p)) @dh_server_public = CryptUtil.num_to_base64(@server_dh.public) @@ -68,35 +68,35 @@ def test_extract_secret def test_absent_serve_public @msg.set_arg(OPENID_NS, 'enc_mac_key', @enc_mac_key) - assert_raises(Message::KeyNotFound) { + assert_raises(Message::KeyNotFound) do @consumer_session.extract_secret(@msg) - } + end end def test_absent_mac_key @msg.set_arg(OPENID_NS, 'dh_server_public', @dh_server_public) - assert_raises(Message::KeyNotFound) { + assert_raises(Message::KeyNotFound) do @consumer_session.extract_secret(@msg) - } + end end def test_invalid_base64_public @msg.set_arg(OPENID_NS, 'dh_server_public', 'n o t b a s e 6 4.') @msg.set_arg(OPENID_NS, 'enc_mac_key', @enc_mac_key) - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @consumer_session.extract_secret(@msg) - } + end end def test_invalid_base64_mac_key @msg.set_arg(OPENID_NS, 'dh_server_public', @dh_server_public) @msg.set_arg(OPENID_NS, 'enc_mac_key', 'n o t base 64') - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @consumer_session.extract_secret(@msg) - } + end end end @@ -142,7 +142,7 @@ def test_empty_request def test_get_secret secret = 'shhh!' * 4 mac_key = Util.to_base64(secret) - msg = Message.from_openid_args({'mac_key' => mac_key}) + msg = Message.from_openid_args({ 'mac_key' => mac_key }) assert_equal(secret, @sess.extract_secret(msg)) end end @@ -152,9 +152,7 @@ def setup @server_url = 'http://invalid/' @assoc_manager = Consumer::AssociationManager.new(nil, @server_url) class << @assoc_manager - def compatibility_mode=(val) - @compatibility_mode = val - end + attr_writer :compatibility_mode end @assoc_type = 'HMAC-SHA1' end @@ -167,11 +165,11 @@ def test_no_encryption_sends_type assert(session.is_a?(Consumer::NoEncryptionSession)) expected = Message.from_openid_args( - {'ns' => OPENID2_NS, - 'session_type' => session_type, - 'mode' => 'associate', - 'assoc_type' => @assoc_type, - }) + { 'ns' => OPENID2_NS, + 'session_type' => session_type, + 'mode' => 'associate', + 'assoc_type' => @assoc_type } + ) assert_equal(expected, args) end @@ -184,9 +182,8 @@ def test_no_encryption_compatibility session_type) assert(session.is_a?(Consumer::NoEncryptionSession)) - assert_equal(Message.from_openid_args({'mode' => 'associate', - 'assoc_type' => @assoc_type, - }), args) + assert_equal(Message.from_openid_args({ 'mode' => 'associate', + 'assoc_type' => @assoc_type }), args) end def test_dh_sha1_compatibility @@ -196,7 +193,6 @@ def test_dh_sha1_compatibility @assoc_type, session_type) - assert(session.is_a?(Consumer::DiffieHellmanSHA1Session)) # This is a random base-64 value, so just check that it's @@ -206,17 +202,16 @@ def test_dh_sha1_compatibility # OK, session_type is set here and not for no-encryption # compatibility - expected = Message.from_openid_args({'mode' => 'associate', + expected = Message.from_openid_args({ 'mode' => 'associate', 'session_type' => 'DH-SHA1', - 'assoc_type' => @assoc_type, - }) + 'assoc_type' => @assoc_type }) assert_equal(expected, args) end end class TestAssociationManagerExpiresIn < Minitest::Test def expires_in_msg(val) - msg = Message.from_openid_args({'expires_in' => val}) + msg = Message.from_openid_args({ 'expires_in' => val }) Consumer::AssociationManager.extract_expires_in(msg) end @@ -228,19 +223,17 @@ def test_parse_fail '0x00', 'foosball', '1\n', - '100,000,000,000', - ].each do |x| - assert_raises(ProtocolError) {expires_in_msg(x)} + '100,000,000,000'].each do |x| + assert_raises(ProtocolError) { expires_in_msg(x) } end end def test_parse - ['0', - '1', - '1000', - '9999999', - '01', - ].each do |n| + %w[0 + 1 + 1000 + 9999999 + 01].each do |n| assert_equal(n.to_i, expires_in_msg(n)) end end @@ -248,9 +241,9 @@ def test_parse class TestAssociationManagerCreateSession < Minitest::Test def test_invalid - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do Consumer::AssociationManager.create_session('monkeys') - } + end end def test_sha256 @@ -266,7 +259,7 @@ def mk_message(args) Message.from_openid_args(args) end - def call_negotiate(responses, negotiator=nil) + def call_negotiate(responses, negotiator = nil) store = nil compat = self.class::Compat assoc_manager = Consumer::AssociationManager.new(store, @server_url, @@ -274,13 +267,11 @@ def call_negotiate(responses, negotiator=nil) class << assoc_manager attr_accessor :responses - def request_association(assoc_type, session_type) + def request_association(_assoc_type, _session_type) m = @responses.shift - if m.is_a?(Message) - raise ServerError.from_message(m) - else - return m - end + raise ServerError.from_message(m) if m.is_a?(Message) + + m end end assoc_manager.responses = responses @@ -303,42 +294,37 @@ def setup # Test the case where the response to an associate request is a # server error or is otherwise undecipherable. def test_bad_response - assert_log_matches('Server error when requesting an association') { + assert_log_matches('Server error when requesting an association') do assert_nil(call_negotiate([mk_message({})])) - } + end end # Test the case where the association type (assoc_type) returned # in an unsupported-type response is absent. def test_empty_assoc_type - msg = mk_message({'error' => 'Unsupported type', + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', - 'session_type' => 'new-session-type', - }) + 'session_type' => 'new-session-type' }) assert_log_matches('Unsupported association type', "Server #{@server_url} responded with unsupported "\ - "association session but did not supply a fallback." - ) { + 'association session but did not supply a fallback.') do assert_nil(call_negotiate([msg])) - } - + end end # Test the case where the session type (session_type) returned # in an unsupported-type response is absent. def test_empty_session_type - msg = mk_message({'error' => 'Unsupported type', + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', - 'assoc_type' => 'new-assoc-type', - }) + 'assoc_type' => 'new-assoc-type' }) assert_log_matches('Unsupported association type', "Server #{@server_url} responded with unsupported "\ - "association session but did not supply a fallback." - ) { + 'association session but did not supply a fallback.') do assert_nil(call_negotiate([msg])) - } + end end # Test the case where an unsupported-type response specifies a @@ -346,64 +332,60 @@ def test_empty_session_type # allowed by the consumer's SessionNegotiator. def test_not_allowed negotiator = AssociationNegotiator.new([]) - negotiator.instance_eval{ - @allowed_types = [['assoc_bogus', 'session_bogus']] - } - msg = mk_message({'error' => 'Unsupported type', + negotiator.instance_eval do + @allowed_types = [%w[assoc_bogus session_bogus]] + end + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', 'assoc_type' => 'not-allowed', - 'session_type' => 'not-allowed', - }) + 'session_type' => 'not-allowed' }) assert_log_matches('Unsupported association type', - 'Server sent unsupported session/association type:') { + 'Server sent unsupported session/association type:') do assert_nil(call_negotiate([msg], negotiator)) - } + end end # Test the case where an unsupported-type response triggers a # retry to get an association with the new preferred type. def test_unsupported_with_retry - msg = mk_message({'error' => 'Unsupported type', + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', 'assoc_type' => 'HMAC-SHA1', - 'session_type' => 'DH-SHA1', - }) + 'session_type' => 'DH-SHA1' }) - assoc = Association.new('handle', 'secret', Time.now, 10000, 'HMAC-SHA1') + assoc = Association.new('handle', 'secret', Time.now, 10_000, 'HMAC-SHA1') - assert_log_matches('Unsupported association type') { + assert_log_matches('Unsupported association type') do assert_equal(assoc, call_negotiate([msg, assoc])) - } + end end # Test the case where an unsupported-typ response triggers a # retry, but the retry fails and nil is returned instead. def test_unsupported_with_retry_and_fail - msg = mk_message({'error' => 'Unsupported type', + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', 'assoc_type' => 'HMAC-SHA1', - 'session_type' => 'DH-SHA1', - }) + 'session_type' => 'DH-SHA1' }) assert_log_matches('Unsupported association type', - "Server #{@server_url} refused") { + "Server #{@server_url} refused") do assert_nil(call_negotiate([msg, msg])) - } + end end # Test the valid case, wherein an association is returned on the # first attempt to get one. def test_valid - assoc = Association.new('handle', 'secret', Time.now, 10000, 'HMAC-SHA1') + assoc = Association.new('handle', 'secret', Time.now, 10_000, 'HMAC-SHA1') - assert_log_matches() { + assert_log_matches do assert_equal(call_negotiate([assoc]), assoc) - } + end end end - # Tests for the OpenID 1 consumer association session behavior. See # the docs for TestOpenID2SessionNegotiation. Notice that this # class is not a subclass of the OpenID 2 tests. Instead, it uses @@ -422,80 +404,74 @@ def setup end def test_bad_response - assert_log_matches('Server error when requesting an association') { + assert_log_matches('Server error when requesting an association') do response = call_negotiate([mk_message({})]) assert_nil(response) - } + end end def test_empty_assoc_type - msg = mk_message({'error' => 'Unsupported type', + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', - 'session_type' => 'new-session-type', - }) + 'session_type' => 'new-session-type' }) - assert_log_matches('Server error when requesting an association') { + assert_log_matches('Server error when requesting an association') do response = call_negotiate([msg]) assert_nil(response) - } + end end def test_empty_session_type - msg = mk_message({'error' => 'Unsupported type', + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', - 'assoc_type' => 'new-assoc-type', - }) + 'assoc_type' => 'new-assoc-type' }) - assert_log_matches('Server error when requesting an association') { + assert_log_matches('Server error when requesting an association') do response = call_negotiate([msg]) assert_nil(response) - } + end end def test_not_allowed negotiator = AssociationNegotiator.new([]) - negotiator.instance_eval{ - @allowed_types = [['assoc_bogus', 'session_bogus']] - } + negotiator.instance_eval do + @allowed_types = [%w[assoc_bogus session_bogus]] + end - msg = mk_message({'error' => 'Unsupported type', + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', 'assoc_type' => 'not-allowed', - 'session_type' => 'not-allowed', - }) + 'session_type' => 'not-allowed' }) - assert_log_matches('Server error when requesting an association') { + assert_log_matches('Server error when requesting an association') do response = call_negotiate([msg]) assert_nil(response) - } + end end def test_unsupported_with_retry - msg = mk_message({'error' => 'Unsupported type', + msg = mk_message({ 'error' => 'Unsupported type', 'error_code' => 'unsupported-type', 'assoc_type' => 'HMAC-SHA1', - 'session_type' => 'DH-SHA1', - }) + 'session_type' => 'DH-SHA1' }) - assoc = Association.new('handle', 'secret', Time.now, 10000, 'HMAC-SHA1') + assoc = Association.new('handle', 'secret', Time.now, 10_000, 'HMAC-SHA1') - - assert_log_matches('Server error when requesting an association') { + assert_log_matches('Server error when requesting an association') do response = call_negotiate([msg, assoc]) assert_nil(response) - } + end end def test_valid - assoc = Association.new('handle', 'secret', Time.now, 10000, 'HMAC-SHA1') - assert_log_matches() { + assoc = Association.new('handle', 'secret', Time.now, 10_000, 'HMAC-SHA1') + assert_log_matches do response = call_negotiate([assoc]) assert_equal(assoc, response) - } + end end end - class TestExtractAssociation < Minitest::Test include ProtocolErrorMixin @@ -504,7 +480,7 @@ class TestExtractAssociation < Minitest::Test 'expires_in' => '1000', 'assoc_handle' => 'a handle', 'assoc_type' => 'a type', - 'session_type' => 'a session type', + 'session_type' => 'a session type' } def setup @@ -526,29 +502,29 @@ def setup # # In OpenID 1, everything except 'session_type' and 'ns' are # required. - MISSING_FIELD_SETS = ([["no_fields", []]] + + MISSING_FIELD_SETS = ([['no_fields', []]] + (DEFAULTS.keys.map do |f| fields = DEFAULTS.keys fields.delete(f) ["missing_#{f}", fields] end) - ) + ) [OPENID1_NS, OPENID2_NS].each do |ns| MISSING_FIELD_SETS.each do |name, fields| # OpenID 1 is allowed to be missing session_type - if ns != OPENID1_NS and name != 'missing_session_type' - test = lambda do - msg = Message.new(ns) - fields.each do |field| - msg.set_arg(ns, field, DEFAULTS[field]) - end - assert_raises(Message::KeyNotFound) do - @assoc_manager.send(:extract_association, msg, nil) - end + next unless ns != OPENID1_NS and name != 'missing_session_type' + + test = lambda do + msg = Message.new(ns) + fields.each do |field| + msg.set_arg(ns, field, DEFAULTS[field]) + end + assert_raises(Message::KeyNotFound) do + @assoc_manager.send(:extract_association, msg, nil) end - define_method("test_#{name}", test) end + define_method("test_#{name}", test) end end @@ -561,9 +537,10 @@ def assert_session_mismatch(req_type, resp_type, ns) # session_type and no allowed_assoc_types assoc_session_class = Class.new do @session_type = req_type - def self.session_type - @session_type + class << self + attr_reader :session_type end + def self.allowed_assoc_types [] end @@ -578,9 +555,9 @@ def self.allowed_assoc_types # The request type and response type have been chosen to produce # a session type mismatch. - assert_protocol_error('Session type mismatch') { + assert_protocol_error('Session type mismatch') do @assoc_manager.send(:extract_association, msg, assoc_session) - } + end end [['no-encryption', '', OPENID2_NS], @@ -589,9 +566,8 @@ def self.allowed_assoc_types ['no-encryption', 'DH-SHA1', OPENID2_NS], ['DH-SHA1', 'DH-SHA256', OPENID1_NS], ['DH-SHA256', 'DH-SHA1', OPENID1_NS], - ['no-encryption', 'DH-SHA1', OPENID1_NS], - ].each do |req_type, resp_type, ns| - test = lambda { assert_session_mismatch(req_type, resp_type, ns) } + ['no-encryption', 'DH-SHA1', OPENID1_NS]].each do |req_type, resp_type, ns| + test = -> { assert_session_mismatch(req_type, resp_type, ns) } name = "test_mismatch_req_#{req_type}_resp_#{resp_type}_#{ns}" define_method(name, test) end @@ -605,7 +581,7 @@ def test_openid1_no_encryption_fallback 'expires_in' => '1000', 'assoc_handle' => 'a handle', 'assoc_type' => 'HMAC-SHA1', - 'mac_key' => 'X' * 20, + 'mac_key' => 'X' * 20 }) # Should succeed @@ -627,40 +603,36 @@ def do_test(expected_session_type, session_type_value) # that's all this function will use. 'session_type' may be # absent if it's set to None. args = {} - if !session_type_value.nil? - args['session_type'] = session_type_value - end + args['session_type'] = session_type_value unless session_type_value.nil? message = Message.from_openid_args(args) assert(message.is_openid1) assoc_manager = Consumer::AssociationManager.new(nil, SERVER_URL) actual_session_type = assoc_manager.send(:get_openid1_session_type, message) - error_message = ("Returned session type parameter #{session_type_value}"\ - "was expected to yield session type "\ + error_message = "Returned session type parameter #{session_type_value}"\ + 'was expected to yield session type '\ "#{expected_session_type}, but yielded "\ - "#{actual_session_type}") + "#{actual_session_type}" assert_equal(expected_session_type, actual_session_type, error_message) end - [['nil', 'no-encryption', nil], ['empty', 'no-encryption', ''], ['dh_sha1', 'DH-SHA1', 'DH-SHA1'], - ['dh_sha256', 'DH-SHA256', 'DH-SHA256'], - ].each {|name, expected, input| + ['dh_sha256', 'DH-SHA256', 'DH-SHA256']].each do |name, expected, input| # Define a test method that will check what session type will be # used if the OpenID 1 response to an associate call sets the # 'session_type' field to `session_type_value` - test = lambda {assert_log_matches() { do_test(expected, input) } } + test = -> { assert_log_matches { do_test(expected, input) } } define_method("test_#{name}", &test) - } + end # This one's different because it expects log messages def test_explicit_no_encryption - assert_log_matches("WARNING: #{SERVER_URL} sent 'no-encryption'"){ + assert_log_matches("WARNING: #{SERVER_URL} sent 'no-encryption'") do do_test('no-encryption', 'no-encryption') - } + end end end @@ -684,7 +656,7 @@ def setup 'assoc_handle' => @assoc_handle, 'assoc_type' => @assoc_type, 'session_type' => @session_type, - 'ns' => OPENID2_NS, + 'ns' => OPENID2_NS }) assoc_session_cls = Class.new do class << self @@ -692,6 +664,7 @@ class << self end attr_reader :extract_secret_called, :secret + def initialize @extract_secret_called = false @secret = 'shhhhh!' @@ -728,13 +701,13 @@ def test_bad_assoc_type # Make sure that the assoc type in the response is not valid # for the given session. @assoc_session.class.allowed_assoc_types = [] - assert_protocol_error('Unsupported assoc_type for sess') {call_extract} + assert_protocol_error('Unsupported assoc_type for sess') { call_extract } end def test_bad_expires_in # Invalid value for expires_in should cause failure @assoc_response.set_arg(OPENID_NS, 'expires_in', 'forever') - assert_protocol_error('Invalid expires_in') {call_extract} + assert_protocol_error('Invalid expires_in') { call_extract } end end @@ -748,8 +721,8 @@ def setup end def setup_dh - sess, _ = @assoc_manager.send(:create_associate_request, - 'HMAC-SHA1', 'DH-SHA1') + sess, = @assoc_manager.send(:create_associate_request, + 'HMAC-SHA1', 'DH-SHA1') server_dh = DiffieHellman.new cons_dh = sess.instance_variable_get('@dh') @@ -763,12 +736,10 @@ def setup_dh 'assoc_type' => 'HMAC-SHA1', 'assoc_handle' => 'handle', 'expires_in' => '1000', - 'session_type' => 'DH-SHA1', + 'session_type' => 'DH-SHA1' } - if @assoc_manager.instance_variable_get(:@compatibility_mode) - server_resp['ns'] = OPENID2_NS - end - return [sess, Message.from_openid_args(server_resp)] + server_resp['ns'] = OPENID2_NS if @assoc_manager.instance_variable_get(:@compatibility_mode) + [sess, Message.from_openid_args(server_resp)] end def test_success @@ -785,15 +756,15 @@ def test_openid2success # Use openid 1 type in endpoint so _setUpDH checks # compatibility mode state properly @assoc_manager.instance_variable_set('@compatibility_mode', true) - test_success() + test_success end def test_bad_dh_values sess, server_resp = setup_dh server_resp.set_arg(OPENID_NS, 'enc_mac_key', '\x00\x00\x00') - assert_protocol_error('Malformed response for') { + assert_protocol_error('Malformed response for') do @assoc_manager.send(:extract_association, server_resp, sess) - } + end end end @@ -808,7 +779,7 @@ def setup @store = Store::Memory.new @assoc_manager = Consumer::AssociationManager.new(@store, @server_url) @assoc_manager.extend(Const) - @assoc = Association.new('handle', 'secret', Time.now, 10000, + @assoc = Association.new('handle', 'secret', Time.now, 10_000, 'HMAC-SHA1') end @@ -843,16 +814,16 @@ def test_in_store_no_response def test_request_assoc_with_status_error fetcher_class = Class.new do - define_method(:fetch) do |*args| + define_method(:fetch) do |*_args| MockResponse.new(500, '') end end with_fetcher(fetcher_class.new) do - assert_log_matches('Got HTTP status error when requesting') { + assert_log_matches('Got HTTP status error when requesting') do result = @assoc_manager.send(:request_association, 'HMAC-SHA1', 'no-encryption') assert(result.nil?) - } + end end end end @@ -871,14 +842,14 @@ def setup 'session_type' => @session_type, 'assoc_handle' => 'kaboodle', 'expires_in' => '1000', - 'mac_key' => 'X' * 20, + 'mac_key' => 'X' * 20 }) end def make_request kv = @message.to_kvform fetcher_class = Class.new do - define_method(:fetch) do |*args| + define_method(:fetch) do |*_args| MockResponse.new(200, kv) end end @@ -897,19 +868,18 @@ def test_success # causes the method to return nil def test_missing_fields @message.del_arg(OPENID_NS, 'assoc_type') - assert_log_matches('Missing required par') { + assert_log_matches('Missing required par') do assert_nil(make_request) - } + end end # A bad value results in a log message and causes the method to # return nil def test_protocol_error @message.set_arg(OPENID_NS, 'expires_in', 'goats') - assert_log_matches('Protocol error processing') { + assert_log_matches('Protocol error processing') do assert_nil(make_request) - } + end end end - end diff --git a/test/test_ax.rb b/test/test_ax.rb index 84ca7a48..d074778a 100644 --- a/test/test_ax.rb +++ b/test/test_ax.rb @@ -29,8 +29,8 @@ def setup end def test_check_mode - assert_raises(Error) { @bax.do_check_mode({'mode' => 'fetch_request'})} - @bax.do_check_mode({'mode' => @bax.mode}) + assert_raises(Error) { @bax.do_check_mode({ 'mode' => 'fetch_request' }) } + @bax.do_check_mode({ 'mode' => @bax.mode }) end def test_check_mode_new_args @@ -57,23 +57,23 @@ def setup end def test_empty - [nil, ''].each{|empty| + [nil, ''].each do |empty| uris = AX.to_type_uris(@aliases, empty) assert_equal([], uris) - } + end end def test_undefined - assert_raises(IndexError) { + assert_raises(IndexError) do AX.to_type_uris(@aliases, 'http://janrain.com/') - } + end end def test_one uri = 'http://janrain.com/' name = 'openid_hackers' @aliases.add_alias(uri, name) - uris = AX::to_type_uris(@aliases, name) + uris = AX.to_type_uris(@aliases, name) assert_equal([uri], uris) end @@ -100,9 +100,9 @@ def ax_values(ax_args, expected_args) def ax_error(ax_args, error) msg = KeyValueMessage.new - assert_raises(error) { + assert_raises(error) do msg.parse_extension_args(ax_args) - } + end end def test_empty_is_valid @@ -110,28 +110,27 @@ def test_empty_is_valid end def test_missing_value_for_alias_explodes - ax_error({'type.foo'=>'urn:foo'}, IndexError) + ax_error({ 'type.foo' => 'urn:foo' }, IndexError) end def test_count_present_but_not_value - ax_error({'type.foo'=>'urn:foo', 'count.foo' => '1'}, IndexError) + ax_error({ 'type.foo' => 'urn:foo', 'count.foo' => '1' }, IndexError) end def test_invalid_count_value msg = FetchRequest.new - assert_raises(Error) { - msg.parse_extension_args({'type.foo'=>'urn:foo', - 'count.foo' => 'bogus'}) - } + assert_raises(Error) do + msg.parse_extension_args({ 'type.foo' => 'urn:foo', + 'count.foo' => 'bogus' }) + end end def test_request_unlimited_values msg = FetchRequest.new - args = {'mode' => 'fetch_request', - 'required' => 'foo', - 'type.foo' => 'urn:foo', - 'count.foo' => UNLIMITED_VALUES - } + args = { 'mode' => 'fetch_request', + 'required' => 'foo', + 'type.foo' => 'urn:foo', + 'count.foo' => UNLIMITED_VALUES } msg.parse_extension_args(args) foo = msg.attributes[0] assert_equal(UNLIMITED_VALUES, foo.count) @@ -146,78 +145,73 @@ def test_long_alias args = { "type.#{name}" => 'urn:foo', "count.#{name}" => '1', - "value.#{name}.1" => 'first', + "value.#{name}.1" => 'first' } msg.parse_extension_args(args) - assert_equal(['first'],msg['urn:foo']) + assert_equal(['first'], msg['urn:foo']) end def test_invalid_alias types = [ - KeyValueMessage, - FetchRequest - ] + KeyValueMessage, + FetchRequest + ] inputs = [ - {'type.a.b'=>'urn:foo', - 'count.a.b'=>'1'}, - {'type.a,b'=>'urn:foo', - 'count.a,b'=>'1'}, - ] - types.each{|t| - inputs.each{|input| + { 'type.a.b' => 'urn:foo', + 'count.a.b' => '1' }, + { 'type.a,b' => 'urn:foo', + 'count.a,b' => '1' } + ] + types.each do |t| + inputs.each do |input| msg = t.new - assert_raises(Error) {msg.parse_extension_args(input)} - } - } + assert_raises(Error) { msg.parse_extension_args(input) } + end + end end def test_count_present_and_is_zero ax_values( - {'type.foo'=>'urn:foo', - 'count.foo'=>'0', - }, - {'urn:foo'=>[]} - ) + { 'type.foo' => 'urn:foo', + 'count.foo' => '0' }, + { 'urn:foo' => [] } + ) end def test_singleton_empty ax_values( - {'type.foo'=>'urn:foo', - 'value.foo'=>'', - }, - {'urn:foo'=>[]} - ) + { 'type.foo' => 'urn:foo', + 'value.foo' => '' }, + { 'urn:foo' => [] } + ) end def test_double_alias ax_error( - {'type.foo'=>'urn:foo', - 'value.foo'=>'', - 'type.bar'=>'urn:foo', - 'value.bar'=>'', - }, - IndexError - ) + { 'type.foo' => 'urn:foo', + 'value.foo' => '', + 'type.bar' => 'urn:foo', + 'value.bar' => '' }, + IndexError + ) end def test_double_singleton ax_values( - {'type.foo'=>'urn:foo', - 'value.foo'=>'', - 'type.bar'=>'urn:bar', - 'value.bar'=>'', - }, - {'urn:foo'=>[],'urn:bar'=>[]} - ) + { 'type.foo' => 'urn:foo', + 'value.foo' => '', + 'type.bar' => 'urn:bar', + 'value.bar' => '' }, + { 'urn:foo' => [], 'urn:bar' => [] } + ) end def singleton_value ax_values( - {'type.foo'=>'urn:foo', - 'value.foo'=>'something', - }, - {'urn:foo'=>['something']} - ) + { 'type.foo' => 'urn:foo', + 'value.foo' => 'something' }, + { 'urn:foo' => ['something'] } + ) end end @@ -244,7 +238,7 @@ def test_construct def test_add uri = 'mud://puddle' - assert(! @msg.member?(uri)) + assert(!@msg.member?(uri)) a = AttrInfo.new(uri) @msg.add(a) assert(@msg.member?(uri)) @@ -254,7 +248,7 @@ def test_add_twice uri = 'its://raining' a = AttrInfo.new(uri) @msg.add(a) - assert_raises(IndexError) {@msg.add(a)} + assert_raises(IndexError) { @msg.add(a) } end def do_extension_args(expected_args) @@ -270,22 +264,22 @@ def test_get_extension_args_no_alias a = AttrInfo.new('foo://bar') @msg.add(a) ax_args = @msg.get_extension_args - ax_args.each{|k,v| + ax_args.each do |k, v| if v == a.type_uri and k.index('type.') == 0 @name = k[5..-1] break end - } - do_extension_args({'type.'+@name => a.type_uri, - 'if_available' => @name}) + end + do_extension_args({ 'type.' + @name => a.type_uri, + 'if_available' => @name }) end def test_get_extension_args_alias_if_available a = AttrInfo.new('type://of.transportation', 'transport') @msg.add(a) - do_extension_args({'type.'+a.ns_alias => a.type_uri, - 'if_available' => a.ns_alias}) + do_extension_args({ 'type.' + a.ns_alias => a.type_uri, + 'if_available' => a.ns_alias }) end def test_get_extension_args_alias_req @@ -293,8 +287,8 @@ def test_get_extension_args_alias_req 'transport', true) @msg.add(a) - do_extension_args({'type.'+a.ns_alias => a.type_uri, - 'required' => a.ns_alias}) + do_extension_args({ 'type.' + a.ns_alias => a.type_uri, + 'required' => a.ns_alias }) end def test_get_required_attrs_empty @@ -306,7 +300,7 @@ def test_parse_extension_args_extra_type 'mode' => 'fetch_request', 'type.' + @name_a => @type_a } - assert_raises(Error) {@msg.parse_extension_args(args)} + assert_raises(Error) { @msg.parse_extension_args(args) } end def test_parse_extension_args @@ -316,7 +310,7 @@ def test_parse_extension_args 'if_available' => @name_a } @msg.parse_extension_args(args) - assert(@msg.member?(@type_a) ) + assert(@msg.member?(@type_a)) assert_equal([@type_a], @msg.requested_types) ai = @msg.requested_attributes[@type_a] assert(ai.is_a?(AttrInfo)) @@ -379,15 +373,15 @@ def test_from_openid_request_wrong_ax_mode value = 'snarfblat' message = OpenID::Message.from_openid_args({ - 'mode' => 'id_res', - 'ns' => OPENID2_NS, - 'ns.ax' => AXMessage::NS_URI, - 'ax.update_url' => 'http://example.com/realm/update_path', - 'ax.mode' => 'store_request', - 'ax.type.' + name => uri, - 'ax.count.' + name => '1', - 'ax.value.' + name + '.1' => value - }) + 'mode' => 'id_res', + 'ns' => OPENID2_NS, + 'ns.ax' => AXMessage::NS_URI, + 'ax.update_url' => 'http://example.com/realm/update_path', + 'ax.mode' => 'store_request', + 'ax.type.' + name => uri, + 'ax.count.' + name => '1', + 'ax.value.' + name + '.1' => value + }) openid_req = Server::OpenIDRequest.new openid_req.message = message ax_req = FetchRequest.from_openid_request(openid_req) @@ -401,13 +395,13 @@ def test_openid_update_url_verification_error 'realm' => 'http://example.com/realm', 'ns.ax' => AXMessage::NS_URI, 'ax.update_url' => 'http://different.site/path', - 'ax.mode' => 'fetch_request', + 'ax.mode' => 'fetch_request' }) openid_req = Server::OpenIDRequest.new openid_req.message = openid_req_msg - assert_raises(Error) { + assert_raises(Error) do FetchRequest.from_openid_request(openid_req) - } + end end def test_openid_no_realm @@ -416,13 +410,13 @@ def test_openid_no_realm 'ns' => OPENID2_NS, 'ns.ax' => AXMessage::NS_URI, 'ax.update_url' => 'http://different.site/path', - 'ax.mode' => 'fetch_request', + 'ax.mode' => 'fetch_request' }) openid_req = Server::OpenIDRequest.new openid_req.message = openid_req_msg - assert_raises(Error) { + assert_raises(Error) do FetchRequest.from_openid_request(openid_req) - } + end end def test_openid_update_url_verification_success @@ -432,7 +426,7 @@ def test_openid_update_url_verification_success 'realm' => 'http://example.com/realm', 'ns.ax' => AXMessage::NS_URI, 'ax.update_url' => 'http://example.com/realm/update_path', - 'ax.mode' => 'fetch_request', + 'ax.mode' => 'fetch_request' }) openid_req = Server::OpenIDRequest.new openid_req.message = openid_req_msg @@ -447,7 +441,7 @@ def test_openid_update_url_verification_success_return_to 'return_to' => 'http://example.com/realm', 'ns.ax' => AXMessage::NS_URI, 'ax.update_url' => 'http://example.com/realm/update_path', - 'ax.mode' => 'fetch_request', + 'ax.mode' => 'fetch_request' }) openid_req = Server::OpenIDRequest.new openid_req.message = openid_req_msg @@ -459,7 +453,7 @@ def test_add_extension openid_req_msg = Message.from_openid_args({ 'mode' => 'checkid_setup', 'ns' => OPENID2_NS, - 'return_to' => 'http://example.com/realm', + 'return_to' => 'http://example.com/realm' }) e = OpenID::OpenIDServiceEndpoint.new @@ -467,19 +461,19 @@ def test_add_extension openid_req.message = openid_req_msg fr = FetchRequest.new - fr.add(AttrInfo.new("urn:bogus")) + fr.add(AttrInfo.new('urn:bogus')) openid_req.add_extension(fr) expected = { 'mode' => 'fetch_request', 'if_available' => 'ext0', - 'type.ext0' => 'urn:bogus', + 'type.ext0' => 'urn:bogus' } - expected.each { |k,v| + expected.each do |k, v| assert(openid_req.message.get_arg(AXMessage::NS_URI, k) == v) - } + end end end @@ -546,7 +540,7 @@ def test_get_extension_args_single_value_response eargs = { 'mode' => 'fetch_response', 'type.' + @name_a => @type_a, - 'value.' + @name_a => @value_a + 'value.' + @name_a => @value_a } req = FetchRequest.new req.add(AttrInfo.new(@type_a, @name_a)) @@ -560,8 +554,8 @@ def test_get_extension_args_array_value_response eargs = { 'mode' => 'fetch_response', 'type.' + @name_a => @type_a, - 'value.' + @name_a + ".1" => @value_a, - 'value.' + @name_a + ".2" => @value_a1, + 'value.' + @name_a + '.1' => @value_a, + 'value.' + @name_a + '.2' => @value_a1, 'count.' + @name_a => '2' } req = FetchRequest.new @@ -576,7 +570,7 @@ def test_get_extension_args_array_value_response def test_get_extension_args_some_not_request req = FetchRequest.new @msg.add_value(@type_a, @value_a) - assert_raises(IndexError) {@msg.get_extension_args(req)} + assert_raises(IndexError) { @msg.get_extension_args(req) } end def test_get_single_success @@ -589,7 +583,7 @@ def test_get_single_none end def test_get_single_extra - @msg.set_values(@type_a, ['x', 'y']) + @msg.set_values(@type_a, %w[x y]) assert_raises(Error) { @msg.get_single(@type_a) } end @@ -609,7 +603,7 @@ def test_from_unsigned_success_response 'ax.value.' + name + '.1' => value }) - e = OpenID::OpenIDServiceEndpoint.new() + e = OpenID::OpenIDServiceEndpoint.new resp = OpenID::Consumer::SuccessResponse.new(e, m, []) ax_resp = FetchResponse.from_success_response(resp, false) @@ -632,10 +626,10 @@ def test_from_signed_success_response 'ax.count.' + name => '1', 'ax.value.' + name + '.1' => value } - signed_fields = oid_fields.keys.map{|f| "openid.#{f}"} + signed_fields = oid_fields.keys.map { |f| "openid.#{f}" } m = OpenID::Message.from_openid_args(oid_fields) - e = OpenID::OpenIDServiceEndpoint.new() + e = OpenID::OpenIDServiceEndpoint.new resp = OpenID::Consumer::SuccessResponse.new(e, m, signed_fields) ax_resp = FetchResponse.from_success_response(resp, true) @@ -660,15 +654,15 @@ def test_from_signed_success_response_with_unsigned_attributes 'ax.value.' + name + '.1' => value }) - e = OpenID::OpenIDServiceEndpoint.new() + e = OpenID::OpenIDServiceEndpoint.new resp = OpenID::Consumer::SuccessResponse.new(e, m, []) assert_nil FetchResponse.from_success_response(resp, true) end def test_from_empty_success_response - e = OpenID::OpenIDServiceEndpoint.new() - m = OpenID::Message.from_openid_args({'mode' => 'id_res'}) + e = OpenID::OpenIDServiceEndpoint.new + m = OpenID::Message.from_openid_args({ 'mode' => 'id_res' }) resp = OpenID::Consumer::SuccessResponse.new(e, m, []) ax_resp = FetchResponse.from_success_response(resp) assert(ax_resp.nil?) @@ -699,15 +693,15 @@ def test_from_openid_request_wrong_ax_mode value = 'snarfblat' message = OpenID::Message.from_openid_args({ - 'mode' => 'id_res', - 'ns' => OPENID2_NS, - 'ns.ax' => AXMessage::NS_URI, - 'ax.update_url' => 'http://example.com/realm/update_path', - 'ax.mode' => 'fetch_request', - 'ax.type.' + name => uri, - 'ax.count.' + name => '1', - 'ax.value.' + name + '.1' => value - }) + 'mode' => 'id_res', + 'ns' => OPENID2_NS, + 'ns.ax' => AXMessage::NS_URI, + 'ax.update_url' => 'http://example.com/realm/update_path', + 'ax.mode' => 'fetch_request', + 'ax.type.' + name => uri, + 'ax.count.' + name => '1', + 'ax.value.' + name + '.1' => value + }) openid_req = Server::OpenIDRequest.new openid_req.message = message ax_req = StoreRequest.from_openid_request(openid_req) @@ -715,7 +709,7 @@ def test_from_openid_request_wrong_ax_mode end def test_get_extension_args_nonempty - @msg.set_values(@type_a, ['foo','bar']) + @msg.set_values(@type_a, %w[foo bar]) aliases = NamespaceMap.new aliases.add_alias(@type_a, @name_a) eargs = { @@ -723,7 +717,7 @@ def test_get_extension_args_nonempty 'type.' + @name_a => @type_a, 'value.' + @name_a + '.1' => 'foo', 'value.' + @name_a + '.2' => 'bar', - 'count.' + @name_a => '2' + 'count.' + @name_a => '2' } assert_equal(eargs, @msg.get_extension_args(aliases)) end @@ -734,24 +728,24 @@ def test_success msg = StoreResponse.new assert(msg.succeeded?) assert(!msg.error_message) - assert_equal({'mode' => 'store_response_success'}, + assert_equal({ 'mode' => 'store_response_success' }, msg.get_extension_args) end def test_fail_nomsg msg = StoreResponse.new(false) - assert(! msg.succeeded? ) - assert(! msg.error_message ) - assert_equal({'mode' => 'store_response_failure'}, + assert(!msg.succeeded?) + assert(!msg.error_message) + assert_equal({ 'mode' => 'store_response_failure' }, msg.get_extension_args) end def test_fail_msg - reason = "because I said so" + reason = 'because I said so' msg = StoreResponse.new(false, reason) - assert(! msg.succeeded? ) - assert_equal(reason, msg.error_message) - assert_equal({'mode' => 'store_response_failure', 'error' => reason}, + assert(!msg.succeeded?) + assert_equal(reason, msg.error_message) + assert_equal({ 'mode' => 'store_response_failure', 'error' => reason }, msg.get_extension_args) end end diff --git a/test/test_checkid_request.rb b/test/test_checkid_request.rb index 884ba4ae..3a8ee1cb 100644 --- a/test/test_checkid_request.rb +++ b/test/test_checkid_request.rb @@ -1,15 +1,15 @@ -require "minitest/autorun" -require "openid/consumer/checkid_request" -require "openid/message" -require "testutil" -require "util" +require 'minitest/autorun' +require 'openid/consumer/checkid_request' +require 'openid/message' +require 'testutil' +require 'util' module OpenID class Consumer class CheckIDRequest class DummyEndpoint attr_accessor :preferred_namespace, :local_id, :server_url, - :is_op_identifier, :claimed_id + :is_op_identifier, :claimed_id def initialize @preferred_namespace = nil @@ -58,13 +58,13 @@ def assert_openid_key_absent(msg, key) def assert_openid_value_equal(msg, key, expected) actual = msg.get_arg(OPENID_NS, key, NO_DEFAULT) - error_text = ("Expected #{expected.inspect} for openid.#{key} "\ - "but got #{actual.inspect}: #{msg.inspect}") + error_text = "Expected #{expected.inspect} for openid.#{key} "\ + "but got #{actual.inspect}: #{msg.inspect}" assert_equal(expected, actual, error_text) end def assert_anonymous(msg) - ['claimed_id', 'identity'].each do |key| + %w[claimed_id identity].each do |key| assert_openid_key_absent(msg, key) end end @@ -87,9 +87,9 @@ def assert_has_required_fields(msg) def test_check_no_assoc_handle @checkid_req.instance_variable_set('@assoc', nil) - msg = assert_log_matches("Generated checkid") { + msg = assert_log_matches('Generated checkid') do @checkid_req.get_message(@realm, @return_to, immediate) - } + end assert_openid_key_absent(msg, 'assoc_handle') end @@ -98,29 +98,29 @@ def test_add_extension_arg @checkid_req.add_extension_arg('bag:', 'material', 'paper') assert(@checkid_req.message.namespaces.member?('bag:')) assert_equal(@checkid_req.message.get_args('bag:'), - {'color' => 'brown', 'material' => 'paper'}) + { 'color' => 'brown', 'material' => 'paper' }) - msg = assert_log_matches("Generated checkid") { + msg = assert_log_matches('Generated checkid') do @checkid_req.get_message(@realm, @return_to, immediate) - } + end # XXX: this depends on the way that Message assigns # namespaces. Really it doesn't care that it has alias "0", # but that is tested anyway - post_args = msg.to_post_args() + post_args = msg.to_post_args assert_equal('brown', post_args['openid.ext0.color']) assert_equal('paper', post_args['openid.ext0.material']) end def test_standard - msg = assert_log_matches('Generated checkid') { + msg = assert_log_matches('Generated checkid') do @checkid_req.get_message(@realm, @return_to, immediate) - } + end assert_has_identifiers(msg, @endpoint.local_id, @endpoint.claimed_id) end def test_send_redirect? - silence_logging { + silence_logging do url = @checkid_req.redirect_url(@realm, @return_to, immediate) assert(url.length < OPENID1_URL_LIMIT) assert(@checkid_req.send_redirect?(@realm, @return_to, immediate)) @@ -131,7 +131,7 @@ def test_send_redirect? actual = @checkid_req.send_redirect?(@realm, @return_to, immediate) expected = preferred_namespace != OPENID2_NS assert_equal(expected, actual) - } + end end end @@ -173,9 +173,9 @@ def test_set_anonymous_works_for_openid2 def test_user_anonymous_ignores_identfier @checkid_req.anonymous = true - msg = assert_log_matches('Generated checkid') { + msg = assert_log_matches('Generated checkid') do @checkid_req.get_message(@realm, @return_to, immediate) - } + end assert_has_required_fields(msg) assert_anonymous(msg) end @@ -183,26 +183,26 @@ def test_user_anonymous_ignores_identfier def test_op_anonymous_ignores_identifier @endpoint.is_op_identifier = true @checkid_req.anonymous = true - msg = assert_log_matches('Generated checkid') { + msg = assert_log_matches('Generated checkid') do @checkid_req.get_message(@realm, @return_to, immediate) - } + end assert_has_required_fields(msg) assert_anonymous(msg) end def test_op_identifier_sends_identifier_select @endpoint.is_op_identifier = true - msg = assert_log_matches('Generated checkid') { + msg = assert_log_matches('Generated checkid') do @checkid_req.get_message(@realm, @return_to, immediate) - } + end assert_has_required_fields(msg) assert_has_identifiers(msg, IDENTIFIER_SELECT, IDENTIFIER_SELECT) end def test_no_assoc_handle - msg = assert_log_matches("Generated checkid") { + msg = assert_log_matches('Generated checkid') do @checkid_req.get_message(@realm, @return_to, immediate) - } + end assert_openid_key_absent(msg, 'assoc_handle') end end @@ -223,7 +223,7 @@ def expected_mode end # Make sure claimed_is is *absent* in request. - def assert_has_identifiers(msg, op_specific_id, claimed_id) + def assert_has_identifiers(msg, op_specific_id, _claimed_id) assert_openid_value_equal(msg, 'identity', op_specific_id) assert_openid_key_absent(msg, 'claimed_id') end @@ -245,9 +245,9 @@ def assert_has_realm(msg) # OpenID 1 requests MUST NOT be able to set anonymous to true def test_set_anonymous_fails_for_openid1 assert(@checkid_req.message.is_openid1) - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @checkid_req.anonymous = true - } + end @checkid_req.anonymous = false end @@ -257,14 +257,13 @@ def test_set_anonymous_fails_for_openid1 # identifier_select just like OpenID 2. def test_identifier_select @endpoint.is_op_identifier = true - msg = assert_log_matches('Generated checkid') { + msg = assert_log_matches('Generated checkid') do @checkid_req.get_message(@realm, @return_to, immediate) - } + end assert_has_required_fields(msg) assert_equal(IDENTIFIER_SELECT, msg.get_arg(OPENID1_NS, 'identity')) end - end class TestCheckIDRequestOpenID1Immediate < TestCheckIDRequestOpenID1 diff --git a/test/test_consumer.rb b/test/test_consumer.rb index 6b524101..e587cf51 100644 --- a/test/test_consumer.rb +++ b/test/test_consumer.rb @@ -1,6 +1,6 @@ -require "minitest/autorun" -require "testutil" -require "openid/consumer" +require 'minitest/autorun' +require 'testutil' +require 'openid/consumer' module OpenID class Consumer @@ -22,7 +22,7 @@ def test_set_get class TestBegin < Minitest::Test attr_accessor :user_input, :anonymous, :services, - :discovered_identifier, :checkid_request, :service + :discovered_identifier, :checkid_request, :service def setup @discovered_identifier = 'http://discovered/' @@ -42,8 +42,7 @@ def consumer test.assert_equal(test.user_input, identifier) [test.discovered_identifier, test.services] end - consumer.instance_def(:begin_without_discovery) do - |service, sent_anonymous| + consumer.instance_def(:begin_without_discovery) do |service, sent_anonymous| test.assert_equal(test.service, service) test.assert_equal(test.anonymous, sent_anonymous) test.checkid_request @@ -60,13 +59,13 @@ def test_begin def test_begin_failure @services = [] - assert_raises(DiscoveryFailure) { + assert_raises(DiscoveryFailure) do consumer.begin(@user_input, @anonymous) - } + end end def test_begin_fallback - @services = [:service1, :service2] + @services = %i[service1 service2] consumer = self.consumer @service = :service1 consumer.begin(@user_input, @anonymous) @@ -81,6 +80,7 @@ def test_begin_fallback class TestBeginWithoutDiscovery < Minitest::Test attr_reader :assoc + def setup @session = {} @assoc = :assoc @@ -100,7 +100,7 @@ def consumer consumer = Consumer.new(@session, nil) consumer.extend(InstanceDefExtension) - consumer.instance_def(:association_manager) do |service| + consumer.instance_def(:association_manager) do |_service| assoc_manager end consumer @@ -112,7 +112,7 @@ def call_begin_without_discovery assert_equal(@anonymous, result.anonymous) assert_equal(@service, consumer.send(:last_requested_endpoint)) assert_equal(result.instance_variable_get(:@assoc), @assoc) - return result + result end def cid_name @@ -133,9 +133,9 @@ def test_begin_without_openid1 def test_begin_without_openid1_anonymous @anonymous = true - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do call_begin_without_discovery - } + end end def test_begin_without_openid2 @@ -161,29 +161,29 @@ def setup end def test_bad_mode - response = @consumer.complete({'openid.ns' => OPENID2_NS, - 'openid.mode' => 'bad'}, nil) + response = @consumer.complete({ 'openid.ns' => OPENID2_NS, + 'openid.mode' => 'bad' }, nil) assert_equal(FAILURE, response.status) end def test_missing_mode - response = @consumer.complete({'openid.ns' => OPENID2_NS}, nil) + response = @consumer.complete({ 'openid.ns' => OPENID2_NS }, nil) assert_equal(FAILURE, response.status) end def test_cancel - response = @consumer.complete({'openid.mode' => 'cancel'}, nil) + response = @consumer.complete({ 'openid.mode' => 'cancel' }, nil) assert_equal(CANCEL, response.status) end def test_setup_needed_openid1 - response = @consumer.complete({'openid.mode' => 'setup_needed'}, nil) + response = @consumer.complete({ 'openid.mode' => 'setup_needed' }, nil) assert_equal(FAILURE, response.status) end def test_setup_needed_openid2 setup_url = 'http://setup.url/' - args = {'openid.ns' => OPENID2_NS, 'openid.mode' => 'setup_needed', 'openid.user_setup_url' => setup_url} + args = { 'openid.ns' => OPENID2_NS, 'openid.mode' => 'setup_needed', 'openid.user_setup_url' => setup_url } response = @consumer.complete(args, nil) assert_equal(SETUP_NEEDED, response.status) assert_equal(setup_url, response.setup_url) @@ -193,7 +193,7 @@ def test_idres_setup_needed_openid1 setup_url = 'http://setup.url/' args = { 'openid.user_setup_url' => setup_url, - 'openid.mode' => 'id_res', + 'openid.mode' => 'id_res' } response = @consumer.complete(args, nil) assert_equal(SETUP_NEEDED, response.status) @@ -206,7 +206,7 @@ def test_error args = { 'openid.mode' => 'error', 'openid.contact' => contact, - 'openid.reference' => reference, + 'openid.reference' => reference } response = @consumer.complete(args, nil) assert_equal(FAILURE, response.status) @@ -222,7 +222,7 @@ def test_error def test_idres_openid1 args = { - 'openid.mode' => 'id_res', + 'openid.mode' => 'id_res' } endpoint = OpenIDServiceEndpoint.new @@ -230,26 +230,26 @@ def test_idres_openid1 idres = Object.new idres.extend(InstanceDefExtension) - idres.instance_def(:endpoint){endpoint} - idres.instance_def(:signed_fields){:test_signed_fields} + idres.instance_def(:endpoint) { endpoint } + idres.instance_def(:signed_fields) { :test_signed_fields } test = self @consumer.extend(InstanceDefExtension) - @consumer.instance_def(:handle_idres) {|message, return_to| + @consumer.instance_def(:handle_idres) do |message, return_to| test.assert_equal(args, message.to_post_args) test.assert_equal(:test_return_to, return_to) idres - } + end response = @consumer.complete(args, :test_return_to) assert_equal(SUCCESS, response.status, response.message) assert_equal(:test_claimed_id, response.identity_url) assert_equal(endpoint, response.endpoint) - error_message = "In Soviet Russia, id_res handles you!" - @consumer.instance_def(:handle_idres) {|message, return_to| + error_message = 'In Soviet Russia, id_res handles you!' + @consumer.instance_def(:handle_idres) do |_message, _return_to| raise ProtocolError, error_message - } + end response = @consumer.complete(args, :test_return_to) assert_equal(FAILURE, response.status) assert_equal(error_message, response.message) diff --git a/test/test_cryptutil.rb b/test/test_cryptutil.rb index 33c83cf8..0857449f 100644 --- a/test/test_cryptutil.rb +++ b/test/test_cryptutil.rb @@ -1,10 +1,11 @@ # coding: ASCII-8BIT -require "minitest/autorun" -require "openid/cryptutil" -require "pathname" + +require 'minitest/autorun' +require 'openid/cryptutil' +require 'pathname' class CryptUtilTestCase < Minitest::Test - BIG = 2 ** 256 + BIG = 2**256 def test_rand # If this is not true, the rest of our test won't work @@ -28,8 +29,8 @@ def test_rand_doesnt_depend_on_srand end def test_random_binary_convert - (0..500).each do - n = (0..10).inject(0) {|sum, element| sum + OpenID::CryptUtil.rand(BIG) } + 501.times do + n = (0..10).inject(0) { |sum, _element| sum + OpenID::CryptUtil.rand(BIG) } s = OpenID::CryptUtil.num_to_binary n assert(s.is_a?(String)) n_converted_back = OpenID::CryptUtil.binary_to_num(s) @@ -39,14 +40,14 @@ def test_random_binary_convert def test_enumerated_binary_convert { - "\x00" => 0, - "\x01" => 1, - "\x7F" => 127, - "\x00\xFF" => 255, - "\x00\x80" => 128, - "\x00\x81" => 129, - "\x00\x80\x00" => 32768, - "OpenID is cool" => 1611215304203901150134421257416556, + "\x00" => 0, + "\x01" => 1, + "\x7F" => 127, + "\x00\xFF" => 255, + "\x00\x80" => 128, + "\x00\x81" => 129, + "\x00\x80\x00" => 32_768, + 'OpenID is cool' => 1_611_215_304_203_901_150_134_421_257_416_556 }.each do |str, num| num_prime = OpenID::CryptUtil.binary_to_num(str) str_prime = OpenID::CryptUtil.num_to_binary(num) @@ -73,9 +74,9 @@ def test_base64_to_num end def test_base64_to_num_invalid - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do OpenID::CryptUtil.base64_to_num('!@#$') - } + end end def test_num_to_base64 @@ -93,7 +94,7 @@ def test_randomstring end def test_randomstring_population - s1 = OpenID::CryptUtil.random_string(42, "XO") + s1 = OpenID::CryptUtil.random_string(42, 'XO') assert_match(/[XO]{42}/, s1) end diff --git a/test/test_dh.rb b/test/test_dh.rb index 2eba5b40..8a330709 100644 --- a/test/test_dh.rb +++ b/test/test_dh.rb @@ -4,8 +4,8 @@ module OpenID class DiffieHellmanExposed < OpenID::DiffieHellman - def DiffieHellmanExposed.strxor_for_testing(a, b) - return DiffieHellmanExposed.strxor(a, b) + def self.strxor_for_testing(a, b) + DiffieHellmanExposed.strxor(a, b) end end @@ -15,46 +15,46 @@ class DiffieHellmanTestCase < Minitest::Test NUL = "\x00" def test_strxor_success - [#input 1 input 2 expected - [NUL, NUL, NUL ], - ["\x01", NUL, "\x01" ], - ["a", "a", NUL ], - ["a", NUL, "a" ], - ["abc", NUL * 3, "abc" ], - ["x" * 10, NUL * 10, "x" * 10], - ["\x01", "\x02", "\x03" ], - ["\xf0", "\x0f", "\xff" ], - ["\xff", "\x0f", "\xf0" ], + [ # input 1 input 2 expected + [NUL, NUL, NUL], + ["\x01", NUL, "\x01"], + ['a', 'a', NUL], + ['a', NUL, 'a'], + ['abc', NUL * 3, 'abc'], + ['x' * 10, NUL * 10, 'x' * 10], + ["\x01", "\x02", "\x03"], + ["\xf0", "\x0f", "\xff"], + ["\xff", "\x0f", "\xf0"] ].each do |input1, input2, expected| actual = DiffieHellmanExposed.strxor_for_testing(input1, input2) - assert_equal(expected.force_encoding("UTF-8"), actual.force_encoding("UTF-8")) + assert_equal(expected.force_encoding('UTF-8'), actual.force_encoding('UTF-8')) end end def test_strxor_failure [ - ['', 'a' ], - ['foo', 'ba' ], - [NUL * 3, NUL * 4], - [255, 127 ].map{|h| (0..h).map{|i|i.chr}.join('')}, + ['', 'a'], + %w[foo ba], + [NUL * 3, NUL * 4], + [255, 127].map { |h| (0..h).map { |i| i.chr }.join('') } ].each do |aa, bb| - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do DiffieHellmanExposed.strxor(aa, bb) - } + end end end def test_simple_exchange - dh1 = DiffieHellman.from_defaults() - dh2 = DiffieHellman.from_defaults() + dh1 = DiffieHellman.from_defaults + dh2 = DiffieHellman.from_defaults secret1 = dh1.get_shared_secret(dh2.public) secret2 = dh2.get_shared_secret(dh1.public) assert_equal(secret1, secret2) end def test_xor_secret - dh1 = DiffieHellman.from_defaults() - dh2 = DiffieHellman.from_defaults() + dh1 = DiffieHellman.from_defaults + dh2 = DiffieHellman.from_defaults secret = "Shhhhhh! don't tell!" encrypted = dh1.xor_secret((CryptUtil.method :sha1), dh2.public, secret) decrypted = dh2.xor_secret((CryptUtil.method :sha1), dh1.public, encrypted) @@ -62,7 +62,7 @@ def test_xor_secret end def test_dh - dh = DiffieHellman.from_defaults() + dh = DiffieHellman.from_defaults class << dh def set_private_test(priv) set_private(priv) @@ -70,16 +70,16 @@ def set_private_test(priv) end read_data_file('dh.txt', true).each do |line| - priv, pub = line.split(' ').map {|x| x.to_i} + priv, pub = line.split(' ').map { |x| x.to_i } dh.set_private_test(priv) assert_equal(dh.public, pub) end end def test_using_defaults - dh = DiffieHellman.from_defaults() + dh = DiffieHellman.from_defaults assert(dh.using_default_values?) - dh = DiffieHellman.new(3, 2750161) + dh = DiffieHellman.new(3, 2_750_161) assert(!dh.using_default_values?) end end diff --git a/test/test_discover.rb b/test/test_discover.rb index 6122513b..5c495390 100644 --- a/test/test_discover.rb +++ b/test/test_discover.rb @@ -18,11 +18,11 @@ def initialize(test, responses) @responses = responses.dup end - def fetch(url, body=nil, headers=nil, limit=nil) + def fetch(url, body = nil, _headers = nil, _limit = nil) response = @responses.shift @test.assert(body.nil?) @test.assert_equal(response.final_url, url) - return response + response end end @@ -31,33 +31,32 @@ def initialize(*args) super(*args) @responses = [ - [HTTPResponse._from_raw_data(nil, nil, {}, 'http://network.error/')], - [HTTPResponse._from_raw_data(404, nil, {}, 'http://not.found/')], - [HTTPResponse._from_raw_data(400, nil, {}, 'http://bad.request/')], - [HTTPResponse._from_raw_data(500, nil, {}, 'http://server.error/')], - [HTTPResponse._from_raw_data(200, nil, {'x-xrds-location' => 'http://xrds.missing/'}, - 'http://header.found/'), - HTTPResponse._from_raw_data(404, nil, {}, 'http://xrds.missing/')], - ] + [HTTPResponse._from_raw_data(nil, nil, {}, 'http://network.error/')], + [HTTPResponse._from_raw_data(404, nil, {}, 'http://not.found/')], + [HTTPResponse._from_raw_data(400, nil, {}, 'http://bad.request/')], + [HTTPResponse._from_raw_data(500, nil, {}, 'http://server.error/')], + [HTTPResponse._from_raw_data(200, nil, { 'x-xrds-location' => 'http://xrds.missing/' }, + 'http://header.found/'), + HTTPResponse._from_raw_data(404, nil, {}, 'http://xrds.missing/')] + ] end def test_discovery_failure - - @responses.each { |response_set| + @responses.each do |response_set| @url = response_set[0].final_url OpenID.fetcher = SimpleMockFetcher.new(self, response_set) expected_status = response_set[-1].code begin OpenID.discover(@url) - rescue DiscoveryFailure => why - assert_equal(why.http_response.code, expected_status) + rescue DiscoveryFailure => e + assert_equal(e.http_response.code, expected_status) else flunk('Did not raise DiscoveryFailure') end OpenID.fetcher = nil - } + end end end @@ -71,7 +70,7 @@ def initialize(thing_to_raise) @thing_to_raise = thing_to_raise end - def fetch(url, body=nil, headers=nil, limit=nil) + def fetch(_url, _body = nil, _headers = nil, _limit = nil) raise @thing_to_raise end end @@ -87,21 +86,21 @@ def initialize(*args) super(*args) @cases = [ - DidFetch.new(), - Exception.new(), - ArgumentError.new(), - RuntimeError.new(), - ] + DidFetch.new, + Exception.new, + ArgumentError.new, + RuntimeError.new + ] end def test_fetch_exception - @cases.each { |exc| + @cases.each do |exc| OpenID.fetcher = ErrorRaisingFetcher.new(exc) - assert_raises(DiscoveryFailure) { + assert_raises(DiscoveryFailure) do OpenID.discover('http://doesnt.matter/') - } + end OpenID.fetcher = nil - } + end end end @@ -109,13 +108,13 @@ def test_fetch_exception class TestNormalization < Minitest::Test def test_addingProtocol - f = ErrorRaisingFetcher.new(RuntimeError.new()) + f = ErrorRaisingFetcher.new(RuntimeError.new) OpenID.fetcher = f begin OpenID.discover('users.stompy.janrain.com:8000/x') - rescue DiscoveryFailure => why - assert why.to_s.match("Failed to fetch") + rescue DiscoveryFailure => e + assert e.to_s.match('Failed to fetch') rescue RuntimeError end @@ -130,13 +129,9 @@ def initialize(documents) @fetchlog = [] end - def fetch(url, body=nil, headers=nil, limit=nil) + def fetch(url, body = nil, headers = nil, _limit = nil) @fetchlog << [url, body, headers] - if @redirect - final_url = @redirect - else - final_url = url - end + final_url = @redirect || url begin ctype, body = @documents.fetch(url) @@ -148,7 +143,7 @@ def fetch(url, body=nil, headers=nil, limit=nil) status = 200 end - return HTTPResponse._from_raw_data(status, body, {'content-type' => ctype}, final_url) + HTTPResponse._from_raw_data(status, body, { 'content-type' => ctype }, final_url) end end @@ -157,43 +152,43 @@ class BaseTestDiscovery < Minitest::Test def initialize(*args) super(*args) - @id_url = "http://someuser.unittest/" + @id_url = 'http://someuser.unittest/' @documents = {} @fetcher_class = DiscoveryMockFetcher end - def _checkService(s, server_url, claimed_id=nil, - local_id=nil, canonical_id=nil, - types=nil, used_yadis=false, - display_identifier=nil) + def _checkService(s, server_url, claimed_id = nil, + local_id = nil, canonical_id = nil, + types = nil, used_yadis = false, + display_identifier = nil) assert_equal(server_url, s.server_url) if types == ['2.0 OP'] assert(!claimed_id) assert(!local_id) assert(!s.claimed_id) assert(!s.local_id) - assert(!s.get_local_id()) - assert(!s.compatibility_mode()) - assert(s.is_op_identifier()) - assert_equal(s.preferred_namespace(), + assert(!s.get_local_id) + assert(!s.compatibility_mode) + assert(s.is_op_identifier) + assert_equal(s.preferred_namespace, OPENID_2_0_MESSAGE_NS) else assert_equal(claimed_id, s.claimed_id) - assert_equal(local_id, s.get_local_id()) + assert_equal(local_id, s.get_local_id) end if used_yadis - assert(s.used_yadis, "Expected to use Yadis") + assert(s.used_yadis, 'Expected to use Yadis') else assert(!s.used_yadis, - "Expected to use old-style discovery") + 'Expected to use old-style discovery') end openid_types = { '1.1' => OPENID_1_1_TYPE, '1.0' => OPENID_1_0_TYPE, '2.0' => OPENID_2_0_TYPE, - '2.0 OP' => OPENID_IDP_2_0_TYPE, + '2.0 OP' => OPENID_IDP_2_0_TYPE } type_uris = types.collect { |t| openid_types[t] } @@ -223,79 +218,82 @@ def test_blank end end -# def readDataFile(filename): -# module_directory = os.path.dirname(os.path.abspath(__file__)) -# filename = os.path.join( -# module_directory, 'data', 'test_discover', filename) -# return file(filename).read() + # def readDataFile(filename): + # module_directory = os.path.dirname(os.path.abspath(__file__)) + # filename = os.path.join( + # module_directory, 'data', 'test_discover', filename) + # return file(filename).read() class TestDiscovery < BaseTestDiscovery include TestDataMixin def _discover(content_type, data, - expected_services, expected_id=nil) - if expected_id.nil? - expected_id = @id_url - end + expected_services, expected_id = nil) + expected_id = @id_url if expected_id.nil? @documents[@id_url] = [content_type, data] id_url, services = OpenID.discover(@id_url) assert_equal(expected_services, services.length) assert_equal(expected_id, id_url) - return services + services end def test_404 - assert_raises(DiscoveryFailure) { + assert_raises(DiscoveryFailure) do OpenID.discover(@id_url + '/404') - } + end end def test_noOpenID services = _discover('text/plain', - "junk", 0) + 'junk', 0) services = _discover( - 'text/html', - read_data_file('test_discover/openid_no_delegate.html', false), - 1) + 'text/html', + read_data_file('test_discover/openid_no_delegate.html', false), + 1 + ) _checkService( - services[0], - "http://www.myopenid.com/server", - @id_url, - @id_url, - nil, - ['1.1'], - false) + services[0], + 'http://www.myopenid.com/server', + @id_url, + @id_url, + nil, + ['1.1'], + false + ) end def test_malformed_meta_tag - @id_url = "http://user.myopenid.com/" + @id_url = 'http://user.myopenid.com/' services = _discover( - 'text/html', - read_data_file('test_discover/malformed_meta_tag.html', false), - 2) + 'text/html', + read_data_file('test_discover/malformed_meta_tag.html', false), + 2 + ) _checkService( - services[0], - "http://www.myopenid.com/server", - @id_url, - @id_url, - nil, - ['2.0'], - false) + services[0], + 'http://www.myopenid.com/server', + @id_url, + @id_url, + nil, + ['2.0'], + false + ) _checkService( - services[1], - "http://www.myopenid.com/server", - @id_url, - @id_url, - nil, - ['1.1'], - false) + services[1], + 'http://www.myopenid.com/server', + @id_url, + @id_url, + nil, + ['1.1'], + false + ) end def test_html1 @@ -304,7 +302,7 @@ def test_html1 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', @id_url, 'http://smoker.myopenid.com/', nil, @@ -321,14 +319,14 @@ def test_html1Fragment @documents[@id_url] = [content_type, data] expected_id = @id_url - @id_url = @id_url + '#fragment' + @id_url += '#fragment' id_url, services = OpenID.discover(@id_url) assert_equal(expected_services, services.length) assert_equal(expected_id, id_url) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', expected_id, 'http://smoker.myopenid.com/', nil, @@ -342,7 +340,7 @@ def test_html2 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', @id_url, 'http://smoker.myopenid.com/', nil, @@ -352,28 +350,29 @@ def test_html2 def test_html1And2 services = _discover( - 'text/html', - read_data_file('test_discover/openid_1_and_2.html', false), - 2) - - services.zip(['2.0', '1.1']).each { |s, t| - _checkService(s, - "http://www.myopenid.com/server", - @id_url, - 'http://smoker.myopenid.com/', - nil, - [t], - false) - } + 'text/html', + read_data_file('test_discover/openid_1_and_2.html', false), + 2 + ) + + services.zip(['2.0', '1.1']).each do |s, t| + _checkService(s, + 'http://www.myopenid.com/server', + @id_url, + 'http://smoker.myopenid.com/', + nil, + [t], + false) + end end def test_html_utf8 utf8_html = read_data_file('test_discover/openid_utf8.html', false) - utf8_html.force_encoding("UTF-8") if utf8_html.respond_to?(:force_encoding) + utf8_html.force_encoding('UTF-8') if utf8_html.respond_to?(:force_encoding) services = _discover('text/html', utf8_html, 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', @id_url, 'http://smoker.myopenid.com/', nil, @@ -399,7 +398,7 @@ def test_htmlEmptyYadis 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', @id_url, 'http://smoker.myopenid.com/', nil, @@ -413,7 +412,7 @@ def test_yadis1NoDelegate 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', @id_url, @id_url, nil, @@ -427,7 +426,7 @@ def test_yadis2NoLocalID 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', @id_url, @id_url, nil, @@ -441,7 +440,7 @@ def test_yadis2 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', @id_url, 'http://smoker.myopenid.com/', nil, @@ -455,7 +454,7 @@ def test_yadis2OP 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', nil, nil, nil, ['2.0 OP'], true) @@ -468,18 +467,18 @@ def test_yadis2OPDelegate 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', nil, nil, nil, ['2.0 OP'], true) end def test_yadis2BadLocalID - assert_raises(DiscoveryFailure) { + assert_raises(DiscoveryFailure) do _discover('application/xrds+xml', read_data_file('test_discover/yadis_2_bad_local_id.xml', false), 1) - } + end end def test_yadis1And2 @@ -488,7 +487,7 @@ def test_yadis1And2 1) _checkService(services[0], - "http://www.myopenid.com/server", + 'http://www.myopenid.com/server', @id_url, 'http://smoker.myopenid.com/', nil, @@ -497,37 +496,34 @@ def test_yadis1And2 end def test_yadis1And2BadLocalID - assert_raises(DiscoveryFailure) { + assert_raises(DiscoveryFailure) do _discover('application/xrds+xml', read_data_file('test_discover/openid_1_and_2_xrds_bad_delegate.xml', false), 1) - } + end end end class MockFetcherForXRIProxy - - def initialize(documents, proxy_url=Yadis::XRI::ProxyResolver::DEFAULT_PROXY) + def initialize(documents, _proxy_url = Yadis::XRI::ProxyResolver::DEFAULT_PROXY) @documents = documents @fetchlog = [] @proxy_url = nil end - def fetch(url, body=nil, headers=nil, limit=nil) + def fetch(url, body = nil, headers = nil, _limit = nil) @fetchlog << [url, body, headers] - u = URI::parse(url) + u = URI.parse(url) xri = u.path query = u.query if !headers and !query raise ArgumentError.new("No headers or query; you probably didn't " + - "mean to do that.") + 'mean to do that.') end - if xri.start_with?('/') - xri = xri[1..-1] - end + xri = xri[1..-1] if xri.start_with?('/') begin ctype, body = @documents.fetch(xri) @@ -539,13 +535,12 @@ def fetch(url, body=nil, headers=nil, limit=nil) status = 200 end - return HTTPResponse._from_raw_data(status, body, - {'content-type' => ctype}, url) + HTTPResponse._from_raw_data(status, body, + { 'content-type' => ctype }, url) end end class TestXRIDiscovery < BaseTestDiscovery - include TestDataMixin include TestUtil @@ -554,29 +549,29 @@ def initialize(*args) @fetcher_class = MockFetcherForXRIProxy - @documents = {'=smoker' => ['application/xrds+xml', - read_data_file('test_discover/yadis_2entries_delegate.xml', false)], - '=smoker*bad' => ['application/xrds+xml', - read_data_file('test_discover/yadis_another_delegate.xml', false)]} + @documents = { '=smoker' => ['application/xrds+xml', + read_data_file('test_discover/yadis_2entries_delegate.xml', false)], + '=smoker*bad' => ['application/xrds+xml', + read_data_file('test_discover/yadis_another_delegate.xml', false)] } end def test_xri _, services = OpenID.discover_xri('=smoker') _checkService(services[0], - "http://www.myopenid.com/server", - Yadis::XRI.make_xri("=!1000"), + 'http://www.myopenid.com/server', + Yadis::XRI.make_xri('=!1000'), 'http://smoker.myopenid.com/', - Yadis::XRI.make_xri("=!1000"), + Yadis::XRI.make_xri('=!1000'), ['1.0'], true, '=smoker') _checkService(services[1], - "http://www.livejournal.com/openid/server.bml", - Yadis::XRI.make_xri("=!1000"), + 'http://www.livejournal.com/openid/server.bml', + Yadis::XRI.make_xri('=!1000'), 'http://frank.livejournal.com/', - Yadis::XRI.make_xri("=!1000"), + Yadis::XRI.make_xri('=!1000'), ['1.0'], true, '=smoker') @@ -586,38 +581,38 @@ def test_xri_normalize _, services = OpenID.discover_xri('xri://=smoker') _checkService(services[0], - "http://www.myopenid.com/server", - Yadis::XRI.make_xri("=!1000"), + 'http://www.myopenid.com/server', + Yadis::XRI.make_xri('=!1000'), 'http://smoker.myopenid.com/', - Yadis::XRI.make_xri("=!1000"), + Yadis::XRI.make_xri('=!1000'), ['1.0'], true, '=smoker') _checkService(services[1], - "http://www.livejournal.com/openid/server.bml", - Yadis::XRI.make_xri("=!1000"), + 'http://www.livejournal.com/openid/server.bml', + Yadis::XRI.make_xri('=!1000'), 'http://frank.livejournal.com/', - Yadis::XRI.make_xri("=!1000"), + Yadis::XRI.make_xri('=!1000'), ['1.0'], true, '=smoker') end def test_xriNoCanonicalID - silence_logging { + silence_logging do _, services = OpenID.discover_xri('=smoker*bad') assert(services.empty?) - } + end end def test_useCanonicalID # When there is no delegate, the CanonicalID should be used with # XRI. - endpoint = OpenIDServiceEndpoint.new() - endpoint.claimed_id = Yadis::XRI.make_xri("=!1000") - endpoint.canonical_id = Yadis::XRI.make_xri("=!1000") - assert_equal(endpoint.get_local_id, Yadis::XRI.make_xri("=!1000")) + endpoint = OpenIDServiceEndpoint.new + endpoint.claimed_id = Yadis::XRI.make_xri('=!1000') + endpoint.canonical_id = Yadis::XRI.make_xri('=!1000') + assert_equal(endpoint.get_local_id, Yadis::XRI.make_xri('=!1000')) end end @@ -629,15 +624,15 @@ def initialize(*args) @fetcher_class = MockFetcherForXRIProxy - @documents = {'=smoker' => ['application/xrds+xml', - read_data_file('test_discover/yadis_2entries_idp.xml', false)] } + @documents = { '=smoker' => ['application/xrds+xml', + read_data_file('test_discover/yadis_2entries_idp.xml', false)] } end def test_xri _, services = OpenID.discover_xri('=smoker') - assert(!services.empty?, "Expected services, got zero") + assert(!services.empty?, 'Expected services, got zero') assert_equal(services[0].server_url, - "http://www.livejournal.com/openid/server.bml") + 'http://www.livejournal.com/openid/server.bml') end end @@ -646,70 +641,69 @@ def initialize(*args) super(*args) @cases = [ - [OPENID1_NS, []], - [OPENID1_NS, ['http://jyte.com/']], - [OPENID1_NS, [OPENID_1_0_TYPE]], - [OPENID1_NS, [OPENID_1_1_TYPE]], - [OPENID2_NS, [OPENID_2_0_TYPE]], - [OPENID2_NS, [OPENID_IDP_2_0_TYPE]], - [OPENID2_NS, [OPENID_2_0_TYPE, - OPENID_1_0_TYPE]], - [OPENID2_NS, [OPENID_1_0_TYPE, - OPENID_2_0_TYPE]], - ] + [OPENID1_NS, []], + [OPENID1_NS, ['http://jyte.com/']], + [OPENID1_NS, [OPENID_1_0_TYPE]], + [OPENID1_NS, [OPENID_1_1_TYPE]], + [OPENID2_NS, [OPENID_2_0_TYPE]], + [OPENID2_NS, [OPENID_IDP_2_0_TYPE]], + [OPENID2_NS, [OPENID_2_0_TYPE, + OPENID_1_0_TYPE]], + [OPENID2_NS, [OPENID_1_0_TYPE, + OPENID_2_0_TYPE]] + ] end def test_preferred_namespace - - @cases.each { |expected_ns, type_uris| - endpoint = OpenIDServiceEndpoint.new() + @cases.each do |expected_ns, type_uris| + endpoint = OpenIDServiceEndpoint.new endpoint.type_uris = type_uris - actual_ns = endpoint.preferred_namespace() + actual_ns = endpoint.preferred_namespace assert_equal(actual_ns, expected_ns) - } + end end end class TestIsOPIdentifier < Minitest::Test def setup - @endpoint = OpenIDServiceEndpoint.new() + @endpoint = OpenIDServiceEndpoint.new end def test_none - assert(!@endpoint.is_op_identifier()) + assert(!@endpoint.is_op_identifier) end def test_openid1_0 @endpoint.type_uris = [OPENID_1_0_TYPE] - assert(!@endpoint.is_op_identifier()) + assert(!@endpoint.is_op_identifier) end def test_openid1_1 @endpoint.type_uris = [OPENID_1_1_TYPE] - assert(!@endpoint.is_op_identifier()) + assert(!@endpoint.is_op_identifier) end def test_openid2 @endpoint.type_uris = [OPENID_2_0_TYPE] - assert(!@endpoint.is_op_identifier()) + assert(!@endpoint.is_op_identifier) end def test_openid2OP @endpoint.type_uris = [OPENID_IDP_2_0_TYPE] - assert(@endpoint.is_op_identifier()) + assert(@endpoint.is_op_identifier) end def test_multipleMissing @endpoint.type_uris = [OPENID_2_0_TYPE, OPENID_1_0_TYPE] - assert(!@endpoint.is_op_identifier()) + assert(!@endpoint.is_op_identifier) end def test_multiplePresent @endpoint.type_uris = [OPENID_2_0_TYPE, OPENID_1_0_TYPE, OPENID_IDP_2_0_TYPE] - assert(@endpoint.is_op_identifier()) + assert(@endpoint.is_op_identifier) end end @@ -720,7 +714,7 @@ def setup end def test_isOPEndpoint - assert(@endpoint.is_op_identifier()) + assert(@endpoint.is_op_identifier) end def test_noIdentifiers @@ -729,7 +723,7 @@ def test_noIdentifiers end def test_compatibility - assert(!@endpoint.compatibility_mode()) + assert(!@endpoint.compatibility_mode) end def test_canonical_id @@ -746,9 +740,9 @@ def test_discover_function # XXX these were all different tests in python, but they're # combined here so I only have to use with_method_overridden # once. - discoverXRI = Proc.new { |identifier| 'XRI' } + discoverXRI = proc { |_identifier| 'XRI' } - discoverURI = Proc.new { |identifier| 'URI' } + discoverURI = proc { |_identifier| 'URI' } OpenID.extend(OverrideMethodMixin) @@ -765,7 +759,7 @@ def test_discover_function class TestEndpointSupportsType < Minitest::Test def setup - @endpoint = OpenIDServiceEndpoint.new() + @endpoint = OpenIDServiceEndpoint.new end def failUnlessSupportsOnly(*types) @@ -773,19 +767,19 @@ def failUnlessSupportsOnly(*types) OPENID_1_1_TYPE, OPENID_1_0_TYPE, OPENID_2_0_TYPE, - OPENID_IDP_2_0_TYPE].each { |t| + OPENID_IDP_2_0_TYPE].each do |t| if types.member?(t) assert(@endpoint.supports_type(t), - sprintf("Must support %s", t)) + format('Must support %s', t)) else assert(!@endpoint.supports_type(t), - sprintf("Shouldn't support %s", t)) + format("Shouldn't support %s", t)) end - } + end end def test_supportsNothing - failUnlessSupportsOnly() + failUnlessSupportsOnly end def test_openid2 @@ -828,18 +822,17 @@ def test_multipleWithProvider class TestEndpointDisplayIdentifier < Minitest::Test def test_strip_fragment - @endpoint = OpenIDServiceEndpoint.new() + @endpoint = OpenIDServiceEndpoint.new @endpoint.claimed_id = 'http://recycled.invalid/#123' assert_equal 'http://recycled.invalid/', @endpoint.display_identifier end end - class TestNormalizeURL < Minitest::Test def test_no_host - assert_raises(DiscoveryFailure) { - OpenID::normalize_url('http:///too-many.invalid/slashes') - } + assert_raises(DiscoveryFailure) do + OpenID.normalize_url('http:///too-many.invalid/slashes') + end end end end diff --git a/test/test_discovery_manager.rb b/test/test_discovery_manager.rb index e2185e90..330d34d3 100644 --- a/test/test_discovery_manager.rb +++ b/test/test_discovery_manager.rb @@ -5,9 +5,9 @@ module OpenID class TestDiscoveredServices < Minitest::Test def setup - @starting_url = "http://starting.url.com/" - @yadis_url = "http://starting.url.com/xrds" - @services = ["bogus", "not_a_service"] + @starting_url = 'http://starting.url.com/' + @yadis_url = 'http://starting.url.com/xrds' + @services = %w[bogus not_a_service] @disco_services = Consumer::DiscoveredServices.new(@starting_url, @yadis_url, @@ -30,7 +30,7 @@ def test_for_url assert(@disco_services.for_url?(@yadis_url)) assert(!@disco_services.for_url?(nil)) - assert(!@disco_services.for_url?("invalid")) + assert(!@disco_services.for_url?('invalid')) end def test_started @@ -67,9 +67,9 @@ class TestDiscoveryManager < Minitest::Test def setup session = {} @session = OpenID::Consumer::Session.new(session, OpenID::Consumer::DiscoveredServices) - @url = "http://unittest.com/" - @key_suffix = "testing" - @yadis_url = "http://unittest.com/xrds" + @url = 'http://unittest.com/' + @key_suffix = 'testing' + @yadis_url = 'http://unittest.com/xrds' @manager = PassthroughDiscoveryManager.new(session, @url, @key_suffix) @key = @manager.session_key end @@ -77,51 +77,51 @@ def setup def test_construct # Make sure the default session key suffix is not nil. m = Consumer::DiscoveryManager.new(nil, nil) - assert(!m.instance_variable_get("@session_key_suffix").nil?) + assert(!m.instance_variable_get('@session_key_suffix').nil?) - m = Consumer::DiscoveryManager.new(nil, nil, "override") - assert_equal(m.instance_variable_get("@session_key_suffix"), "override") + m = Consumer::DiscoveryManager.new(nil, nil, 'override') + assert_equal(m.instance_variable_get('@session_key_suffix'), 'override') end def test_get_next_service assert_nil(@session[@key]) - next_service = @manager.get_next_service { - [@yadis_url, ["one", "two", "three"]] - } + next_service = @manager.get_next_service do + [@yadis_url, %w[one two three]] + end disco = @session[@key] - assert_equal(disco.current, "one") - assert_equal(next_service, "one") + assert_equal(disco.current, 'one') + assert_equal(next_service, 'one') assert(disco.for_url?(@url)) assert(disco.for_url?(@yadis_url)) # The first two calls to get_next_service should return the # services in @disco. - assert_equal(@manager.get_next_service, "two") - assert_equal(@manager.get_next_service, "three") + assert_equal(@manager.get_next_service, 'two') + assert_equal(@manager.get_next_service, 'three') disco = @session[@key] - assert_equal(disco.current, "three") + assert_equal(disco.current, 'three') # The manager is exhausted and should be deleted and a new one # should be created. - @manager.get_next_service { - [@yadis_url, ["four"]] - } + @manager.get_next_service do + [@yadis_url, ['four']] + end disco2 = @session[@key] - assert_equal(disco2.current, "four") + assert_equal(disco2.current, 'four') # create_manager may return a nil manager, in which case the # next service should be nil. @manager.extend(OpenID::InstanceDefExtension) - @manager.instance_def(:create_manager) do |yadis_url, services| + @manager.instance_def(:create_manager) do |_yadis_url, _services| nil end - result = @manager.get_next_service { |url| - ["unused", []] - } + result = @manager.get_next_service do |_url| + ['unused', []] + end assert_nil(result) end @@ -131,7 +131,7 @@ def test_cleanup assert_nil(@manager.cleanup) # With a manager, it returns the manager's current service. - disco = Consumer::DiscoveredServices.new(@url, @yadis_url, ["one", "two"]) + disco = Consumer::DiscoveredServices.new(@url, @yadis_url, %w[one two]) @session[@key] = disco assert_nil(@manager.cleanup) @@ -139,15 +139,15 @@ def test_cleanup disco.next @session[@key] = disco - assert_equal(@manager.cleanup, "one") + assert_equal(@manager.cleanup, 'one') assert_nil(@session[@key]) # The force parameter should be passed through to get_manager # and destroy_manager. - force_value = "yo" + force_value = 'yo' testcase = self - m = Consumer::DiscoveredServices.new(nil, nil, ["inner"]) + m = Consumer::DiscoveredServices.new(nil, nil, ['inner']) m.next @manager.extend(OpenID::InstanceDefExtension) @@ -160,23 +160,23 @@ def test_cleanup testcase.assert_equal(force, force_value) end - assert_equal("inner", @manager.cleanup(force_value)) + assert_equal('inner', @manager.cleanup(force_value)) end def test_get_manager # get_manager should always return the loaded manager when # forced. - @session[@key] = "bogus" - assert_equal("bogus", @manager.get_manager(true)) + @session[@key] = 'bogus' + assert_equal('bogus', @manager.get_manager(true)) # When not forced, only managers for @url should be returned. - disco = Consumer::DiscoveredServices.new(@url, @yadis_url, ["one"]) + disco = Consumer::DiscoveredServices.new(@url, @yadis_url, ['one']) @session[@key] = disco assert_equal(@manager.get_manager, disco) # Try to get_manager for a manger that doesn't manage @url: - disco2 = Consumer::DiscoveredServices.new("http://not.this.url.com/", - "http://other.yadis.url/", ["one"]) + disco2 = Consumer::DiscoveredServices.new('http://not.this.url.com/', + 'http://other.yadis.url/', ['one']) @session[@key] = disco2 assert_nil(@manager.get_manager) assert_equal(@manager.get_manager(true), disco2) @@ -185,21 +185,20 @@ def test_get_manager def test_create_manager assert(@session[@key].nil?) - services = ["created", "manager"] + services = %w[created manager] returned_disco = @manager.create_manager(@yadis_url, services) stored_disco = @session[@key] assert_equal(stored_disco, returned_disco) assert(stored_disco.for_url?(@yadis_url)) - assert_equal(stored_disco.next, "created") - + assert_equal(stored_disco.next, 'created') # Calling create_manager with a preexisting manager should # result in StandardError. - assert_raises(StandardError) { + assert_raises(StandardError) do @manager.create_manager(@yadis_url, services) - } + end # create_manager should do nothing (and return nil) if given no # services. @@ -214,10 +213,10 @@ class DestroyCalledException < StandardError; end def test_destroy_manager # destroy_manager should remove the manager from the session, # forcibly if necessary. - valid_disco = Consumer::DiscoveredServices.new(@url, @yadis_url, ["serv"]) - invalid_disco = Consumer::DiscoveredServices.new("http://not.mine.com/", - "http://different.url.com/", - ["serv"]) + valid_disco = Consumer::DiscoveredServices.new(@url, @yadis_url, ['serv']) + invalid_disco = Consumer::DiscoveredServices.new('http://not.mine.com/', + 'http://different.url.com/', + ['serv']) @session[@key] = valid_disco @manager.destroy_manager @@ -234,24 +233,25 @@ def test_destroy_manager def test_session_key assert(@manager.session_key.end_with?( - @manager.instance_variable_get("@session_key_suffix"))) + @manager.instance_variable_get('@session_key_suffix') + )) end def test_store - thing = "opaque" + thing = 'opaque' assert(@session[@key].nil?) @manager.store(thing) assert_equal(@session[@key], thing) end def test_load - thing = "opaque" + thing = 'opaque' @session[@key] = thing assert_equal(@manager.load, thing) end def test_destroy! - thing = "opaque" + thing = 'opaque' @manager.store(thing) assert_equal(@manager.load, thing) @manager.destroy! diff --git a/test/test_extension.rb b/test/test_extension.rb index 63e6f73e..e34b28c9 100644 --- a/test/test_extension.rb +++ b/test/test_extension.rb @@ -12,35 +12,37 @@ def initialize end def get_extension_args - return {} + {} end end class ToMessageTest < Minitest::Test - def test_OpenID1 - oid1_msg = Message.new(OPENID1_NS) - ext = DummyExtension.new - ext.to_message(oid1_msg) - namespaces = oid1_msg.namespaces - assert(namespaces.implicit?(DummyExtension::TEST_URI)) - assert_equal( - DummyExtension::TEST_URI, - namespaces.get_namespace_uri(DummyExtension::TEST_ALIAS)) - assert_equal(DummyExtension::TEST_ALIAS, - namespaces.get_alias(DummyExtension::TEST_URI)) - end + def test_OpenID1 + oid1_msg = Message.new(OPENID1_NS) + ext = DummyExtension.new + ext.to_message(oid1_msg) + namespaces = oid1_msg.namespaces + assert(namespaces.implicit?(DummyExtension::TEST_URI)) + assert_equal( + DummyExtension::TEST_URI, + namespaces.get_namespace_uri(DummyExtension::TEST_ALIAS) + ) + assert_equal(DummyExtension::TEST_ALIAS, + namespaces.get_alias(DummyExtension::TEST_URI)) + end - def test_OpenID2 - oid2_msg = Message.new(OPENID2_NS) - ext = DummyExtension.new - ext.to_message(oid2_msg) - namespaces = oid2_msg.namespaces - assert(!namespaces.implicit?(DummyExtension::TEST_URI)) - assert_equal( - DummyExtension::TEST_URI, - namespaces.get_namespace_uri(DummyExtension::TEST_ALIAS)) - assert_equal(DummyExtension::TEST_ALIAS, - namespaces.get_alias(DummyExtension::TEST_URI)) - end + def test_OpenID2 + oid2_msg = Message.new(OPENID2_NS) + ext = DummyExtension.new + ext.to_message(oid2_msg) + namespaces = oid2_msg.namespaces + assert(!namespaces.implicit?(DummyExtension::TEST_URI)) + assert_equal( + DummyExtension::TEST_URI, + namespaces.get_namespace_uri(DummyExtension::TEST_ALIAS) + ) + assert_equal(DummyExtension::TEST_ALIAS, + namespaces.get_alias(DummyExtension::TEST_URI)) + end end end diff --git a/test/test_fetchers.rb b/test/test_fetchers.rb index 1209865d..b8a76f5b 100644 --- a/test/test_fetchers.rb +++ b/test/test_fetchers.rb @@ -1,4 +1,3 @@ -# encoding: utf-8 require 'minitest/autorun' require 'net/http' require 'webrick' @@ -28,10 +27,10 @@ def assert_http_result_is(expected, result) end class BogusFetcher - RESPONSE = "bogus" + RESPONSE = 'bogus' - def fetch(url, body=nil, headers=nil, redirect_limit=5) - return BogusFetcher::RESPONSE + def fetch(_url, _body = nil, _headers = nil, _redirect_limit = 5) + BogusFetcher::RESPONSE end end @@ -43,100 +42,96 @@ class FetcherTestCase < Minitest::Test @@test_header_value = 'marmoset' class ExpectedResponse < Net::HTTPResponse - attr_reader :final_url + attr_reader :final_url, :body - def initialize(code, final_url, body="the expected body", - httpv="1.1", msg=nil) + def initialize(code, final_url, body = 'the expected body', + httpv = '1.1', msg = nil) super(httpv, code, msg) @code = code @body = body @final_url = final_url end - - def body - @body - end end @@cases = [ - # path, status code, expected url (nil = default to path) - ['/success', 200, nil], - ['/notfound', 404, nil], - ['/badreq', 400, nil], - ['/forbidden', 403, nil], - ['/error', 500, nil], - ['/server_error', 503, nil], - ['/301redirect', 200, '/success'], - ['/302redirect', 200, '/success'], - ['/303redirect', 200, '/success'], - ['/307redirect', 200, '/success'], + # path, status code, expected url (nil = default to path) + ['/success', 200, nil], + ['/notfound', 404, nil], + ['/badreq', 400, nil], + ['/forbidden', 403, nil], + ['/error', 500, nil], + ['/server_error', 503, nil], + ['/301redirect', 200, '/success'], + ['/302redirect', 200, '/success'], + ['/303redirect', 200, '/success'], + ['/307redirect', 200, '/success'] ] def _redirect_with_code(code) - lambda { |req, resp| + lambda { |_req, resp| resp.status = code resp['Location'] = _uri_build('/success') } end def _respond_with_code(code) - lambda { |req, resp| + lambda { |_req, resp| resp.status = code - resp.body = "the expected body" + resp.body = 'the expected body' } end def _require_header - lambda { |req, resp| + lambda { |req, _resp| assert_equal @@test_header_value, req[@@test_header_name] assert_match 'ruby-openid', req['User-agent'] } end def _require_post - lambda { |req, resp| + lambda { |req, _resp| assert_equal 'POST', req.request_method assert_equal "postbody\n", req.body } end def _redirect_loop - lambda { |req, resp| + lambda { |_req, resp| @_redirect_counter += 1 resp.status = 302 resp['Location'] = _uri_build('/redirect_loop') resp.body = "Fetched #{@_redirect_counter} times." - assert @_redirect_counter < 10, "Fetched too many times." + assert @_redirect_counter < 10, 'Fetched too many times.' } end - UTF8_PAGE_CONTENT = <<-EOHTML - - UTF-8 - こんにちは - -EOHTML + UTF8_PAGE_CONTENT = <<~EOHTML + + UTF-8 + こんにちは + + EOHTML def _utf8_page - lambda { |req, resp| - resp['Content-Type'] = "text/html; charset=utf-8" + lambda { |_req, resp| + resp['Content-Type'] = 'text/html; charset=utf-8' body = UTF8_PAGE_CONTENT.dup resp.body = body } end def _unencoded_page - lambda { |req, resp| - resp['Content-Type'] = "text/html" - body = "unencoded-body" + lambda { |_req, resp| + resp['Content-Type'] = 'text/html' + body = 'unencoded-body' resp.body = body } end def _badly_encoded_page - lambda { |req, resp| - resp['Content-Type'] = "text/html; charset=wtf" - body = "badly-encoded-body" + lambda { |_req, resp| + resp['Content-Type'] = 'text/html; charset=wtf' + body = 'badly-encoded-body' resp.body = body } end @@ -148,10 +143,10 @@ def setup @fetcher = OpenID::StandardFetcher.new @logfile = StringIO.new @weblog = WEBrick::Log.new(@logfile) - @server = WEBrick::HTTPServer.new(:Port => 0, - :Logger => @weblog, - :AccessLog => []) - @server_thread = Thread.new { + @server = WEBrick::HTTPServer.new(Port: 0, + Logger: @weblog, + AccessLog: []) + @server_thread = Thread.new do @server.mount_proc('/success', _respond_with_code(200)) @server.mount_proc('/301redirect', _redirect_with_code(301)) @server.mount_proc('/302redirect', _redirect_with_code(302)) @@ -163,28 +158,28 @@ def setup @server.mount_proc('/error', _respond_with_code(500)) @server.mount_proc('/server_error', _respond_with_code(503)) @server.mount_proc('/require_header', _require_header) - @server.mount_proc('/redirect_to_reqheader') { |req, resp| + @server.mount_proc('/redirect_to_reqheader') do |_req, resp| resp.status = 302 resp['Location'] = _uri_build('/require_header') - } + end @server.mount_proc('/post', _require_post) @server.mount_proc('/redirect_loop', _redirect_loop) @server.mount_proc('/utf8_page', _utf8_page) @server.mount_proc('/unencoded_page', _unencoded_page) @server.mount_proc('/badly_encoded_page', _badly_encoded_page) @server.start - } + end @uri = _uri_build sleep 0.2 end - def _uri_build(path='/') + def _uri_build(path = '/') u = URI::HTTP.build({ - :host => "localhost", - :port => @server.config[:Port], - :path => path, + host: 'localhost', + port: @server.config[:Port], + path: path }) - return u.to_s + u.to_s end def teardown @@ -196,19 +191,17 @@ def teardown @server_thread.join end -=begin -# XXX This test no longer works since we're not dealing with URI -# objects internally. - def test_final_url_tainted - uri = _uri_build('/301redirect') - result = @fetcher.fetch(uri) - - final_url = URI::parse(result.final_url) - - assert final_url.host.tainted? - assert final_url.path.tainted? - end -=end + # # XXX This test no longer works since we're not dealing with URI + # objects internally. + # def test_final_url_tainted + # uri = _uri_build('/301redirect') + # result = @fetcher.fetch(uri) + # + # final_url = URI::parse(result.final_url) + # + # assert final_url.host.tainted? + # assert final_url.path.tainted? + # end def test_headers headers = { @@ -243,24 +236,24 @@ def test_post def test_redirect_limit @_redirect_counter = 0 uri = _uri_build('/redirect_loop') - assert_raises(OpenID::HTTPRedirectLimitReached) { - @fetcher.fetch(uri, body=nil, headers=nil, redirect_limit=0) - } + assert_raises(OpenID::HTTPRedirectLimitReached) do + @fetcher.fetch(uri, body = nil, headers = nil, redirect_limit = 0) + end end def test_utf8_page uri = _uri_build('/utf8_page') response = @fetcher.fetch(uri) assert_equal(UTF8_PAGE_CONTENT, response.body) - if response.body.respond_to?(:encoding) - assert_equal(Encoding::UTF_8, response.body.encoding) - end + return unless response.body.respond_to?(:encoding) + + assert_equal(Encoding::UTF_8, response.body.encoding) end def test_unencoded_page uri = _uri_build('/unencoded_page') response = @fetcher.fetch(uri) - assert_equal("unencoded-body", response.body) + assert_equal('unencoded-body', response.body) # The actual encoding seems to depend on the server # setting in case it is not defined explicitely # if defined?(Encoding.default_external) @@ -274,40 +267,40 @@ def test_badly_encoded_page end uri = _uri_build('/badly_encoded_page') response = @fetcher.fetch(uri) - assert_equal("badly-encoded-body", response.body) - if defined?(Encoding.default_external) - assert_equal(Encoding::SHIFT_JIS, response.body.encoding) - end + assert_equal('badly-encoded-body', response.body) + return unless defined?(Encoding.default_external) + + assert_equal(Encoding::SHIFT_JIS, response.body.encoding) end def test_cases for path, expected_code, expected_url in @@cases uri = _uri_build(path) - if expected_url.nil? - expected_url = uri - else - expected_url = _uri_build(expected_url) - end + expected_url = if expected_url.nil? + uri + else + _uri_build(expected_url) + end expected = ExpectedResponse.new(expected_code.to_s, expected_url) result = @fetcher.fetch(uri) begin assert_http_result_is expected, result - rescue Minitest::Assertion => err + rescue Minitest::Assertion => e if result.code == '500' && expected_code != 500 # Looks like our WEBrick harness broke. - msg = < why - assert_equal(why.to_s, "SSL support not found; cannot fetch https://someurl.com/") + f.fetch('https://someurl.com/') + flunk('Expected RuntimeError') + rescue RuntimeError => e + assert_equal(e.to_s, 'SSL support not found; cannot fetch https://someurl.com/') end end class FakeConnection < Net::HTTP - attr_reader :use_ssl, :ca_file + attr_accessor :use_ssl, :ca_file def initialize *args super @ca_file = nil end - - def use_ssl=(v) - @use_ssl = v - end - - def ca_file=(ca_file) - @ca_file = ca_file - end end def test_ssl_with_ca_file f = OpenID::StandardFetcher.new - ca_file = "BOGUS" + ca_file = 'BOGUS' f.ca_file = ca_file f.extend(OpenID::InstanceDefExtension) @@ -361,11 +346,11 @@ def test_ssl_with_ca_file testcase = self - f.instance_def(:set_verified) do |conn, verified| + f.instance_def(:set_verified) do |_conn, verified| testcase.assert(verified) end - conn = f.make_connection(URI::parse("https://someurl.com")) + conn = f.make_connection(URI.parse('https://someurl.com')) assert_equal(conn.ca_file, ca_file) end @@ -379,14 +364,14 @@ def test_ssl_without_ca_file testcase = self - f.instance_def(:set_verified) do |conn, verified| + f.instance_def(:set_verified) do |_conn, verified| testcase.assert(!verified) end conn = nil - assert_log_matches(/making https request to https:\/\/someurl.com without verifying/) { - conn = f.make_connection(URI::parse("https://someurl.com")) - } + assert_log_matches(%r{making https request to https://someurl.com without verifying}) do + conn = f.make_connection(URI.parse('https://someurl.com')) + end assert(conn.ca_file.nil?) end @@ -395,30 +380,30 @@ def test_make_http_nil f = OpenID::StandardFetcher.new f.extend(OpenID::InstanceDefExtension) - f.instance_def(:make_http) do |uri| + f.instance_def(:make_http) do |_uri| nil end - assert_raises(RuntimeError) { - f.make_connection(URI::parse("http://example.com/")) - } + assert_raises(RuntimeError) do + f.make_connection(URI.parse('http://example.com/')) + end end def test_make_http_invalid f = OpenID::StandardFetcher.new f.extend(OpenID::InstanceDefExtension) - f.instance_def(:make_http) do |uri| - "not a Net::HTTP object" + f.instance_def(:make_http) do |_uri| + 'not a Net::HTTP object' end - assert_raises(RuntimeError) { - f.make_connection(URI::parse("http://example.com/")) - } + assert_raises(RuntimeError) do + f.make_connection(URI.parse('http://example.com/')) + end end class BrokenSSLConnection - def start(&block) + def start raise OpenSSL::SSL::SSLError end end @@ -427,17 +412,17 @@ def test_sslfetchingerror f = OpenID::StandardFetcher.new f.extend(OpenID::InstanceDefExtension) - f.instance_def(:make_connection) do |uri| + f.instance_def(:make_connection) do |_uri| BrokenSSLConnection.new end - assert_raises(OpenID::SSLFetchingError) { - f.fetch("https://bogus.com/") - } + assert_raises(OpenID::SSLFetchingError) do + f.fetch('https://bogus.com/') + end end class TimeoutConnection - def start(&block) + def start raise Timeout::Error end end @@ -446,13 +431,13 @@ def test_fetchingerror f = OpenID::StandardFetcher.new f.extend(OpenID::InstanceDefExtension) - f.instance_def(:make_connection) do |uri| + f.instance_def(:make_connection) do |_uri| TimeoutConnection.new end - assert_raises(OpenID::FetchingError) { - f.fetch("https://bogus.com/") - } + assert_raises(OpenID::FetchingError) do + f.fetch('https://bogus.com/') + end end class TestingException < OpenID::FetchingError; end @@ -466,11 +451,11 @@ def start yield end - def request_get(*args) + def request_get(*_args) raise TestingException end - def post_connection_check(hostname) + def post_connection_check(_hostname) raise RuntimeError end @@ -489,28 +474,28 @@ def test_post_connection_check_no_support_ssl f = OpenID::StandardFetcher.new f.extend(OpenID::InstanceDefExtension) - f.instance_def(:make_connection) do |uri| + f.instance_def(:make_connection) do |_uri| NoSSLSupportConnection.new end # post_connection_check should not be called. - assert_raises(TestingException) { - f.fetch("https://bogus.com/") - } + assert_raises(TestingException) do + f.fetch('https://bogus.com/') + end end def test_post_connection_check_no_use_ssl f = OpenID::StandardFetcher.new f.extend(OpenID::InstanceDefExtension) - f.instance_def(:make_connection) do |uri| + f.instance_def(:make_connection) do |_uri| NoUseSSLConnection.new end # post_connection_check should not be called. - assert_raises(TestingException) { - f.fetch("https://bogus.com/") - } + assert_raises(TestingException) do + f.fetch('https://bogus.com/') + end end class PostConnectionCheckException < OpenID::FetchingError; end @@ -520,7 +505,7 @@ def use_ssl? true end - def post_connection_check(hostname) + def post_connection_check(_hostname) raise PostConnectionCheckException end end @@ -529,18 +514,18 @@ def test_post_connection_check f = OpenID::StandardFetcher.new f.extend(OpenID::InstanceDefExtension) - f.instance_def(:make_connection) do |uri| + f.instance_def(:make_connection) do |_uri| UseSSLConnection.new end - f.instance_def(:supports_ssl?) do |conn| + f.instance_def(:supports_ssl?) do |_conn| true end # post_connection_check should be called. - assert_raises(PostConnectionCheckException) { - f.fetch("https://bogus.com/") - } + assert_raises(PostConnectionCheckException) do + f.fetch('https://bogus.com/') + end end end @@ -571,15 +556,14 @@ def test_proxy_unreachable # If this tries to connect to the proxy (on port 1), I expect # a 'connection refused' error. If it tries to contact the below # URI first, it will get some other sort of error. - f.fetch("http://unittest.invalid") - rescue OpenID::FetchingError => why + f.fetch('http://unittest.invalid') + rescue OpenID::FetchingError => e # XXX: Is this a translatable string that is going to break? - if why.message =~ /Connection refused/ - return - end - raise why + return if e.message =~ /Connection refused/ + + raise e end - flunk "expected Connection Refused, but it passed." + flunk 'expected Connection Refused, but it passed.' end def test_proxy_env @@ -593,15 +577,15 @@ def test_proxy_env end # These aren't fully automated tests, but if you start a proxy # on port 8888 (tinyproxy's default) and check its logs... -# def test_proxy -# f = OpenID::StandardFetcher.new('127.0.0.1', 8888) -# result = f.fetch("http://www.example.com/") -# assert_match(/RFC.*2606/, result.body) -# end - -# def test_proxy_https -# f = OpenID::StandardFetcher.new('127.0.0.1', 8888) -# result = f.fetch("https://www.myopenid.com/") -# assert_match(/myOpenID/, result.body) -# end + # def test_proxy + # f = OpenID::StandardFetcher.new('127.0.0.1', 8888) + # result = f.fetch("http://www.example.com/") + # assert_match(/RFC.*2606/, result.body) + # end + + # def test_proxy_https + # f = OpenID::StandardFetcher.new('127.0.0.1', 8888) + # result = f.fetch("https://www.myopenid.com/") + # assert_match(/myOpenID/, result.body) + # end end diff --git a/test/test_filters.rb b/test/test_filters.rb index 4817874d..1adf3f3a 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -1,35 +1,35 @@ -require "minitest/autorun" -require "testutil" -require "rexml/document" -require "openid/yadis/xrds" -require "openid/yadis/filters" +require 'minitest/autorun' +require 'testutil' +require 'rexml/document' +require 'openid/yadis/xrds' +require 'openid/yadis/filters' module OpenID class BasicServiceEndpointTest < Minitest::Test def test_match_types # Make sure the match_types operation returns the expected # results with various inputs. - types = ["urn:bogus", "urn:testing"] - yadis_url = "http://yadis/" + types = ['urn:bogus', 'urn:testing'] + yadis_url = 'http://yadis/' no_types_endpoint = Yadis::BasicServiceEndpoint.new(yadis_url, [], nil, nil) some_types_endpoint = Yadis::BasicServiceEndpoint.new(yadis_url, types, nil, nil) assert(no_types_endpoint.match_types([]) == []) - assert(no_types_endpoint.match_types(["urn:absent"]) == []) + assert(no_types_endpoint.match_types(['urn:absent']) == []) assert(some_types_endpoint.match_types([]) == []) - assert(some_types_endpoint.match_types(["urn:absent"]) == []) + assert(some_types_endpoint.match_types(['urn:absent']) == []) assert(some_types_endpoint.match_types(types) == types) assert(some_types_endpoint.match_types([types[1], types[0]]) == types) assert(some_types_endpoint.match_types([types[0]]) == [types[0]]) - assert(some_types_endpoint.match_types(types + ["urn:absent"]) == types) + assert(some_types_endpoint.match_types(types + ['urn:absent']) == types) end def test_from_basic_service_endpoint # Check BasicServiceEndpoint.from_basic_service_endpoint - endpoint = "unused" + endpoint = 'unused' e = Yadis::BasicServiceEndpoint.new(nil, [], nil, nil) assert(Yadis::BasicServiceEndpoint.from_basic_service_endpoint(endpoint) == @@ -42,28 +42,24 @@ def test_from_basic_service_endpoint class TransformFilterMakerTest < Minitest::Test def make_service_element(types, uris) service = REXML::Element.new('Service') - types.each { |type_text| + types.each do |type_text| service.add_element('Type').text = type_text - } - uris.each { |uri_text| + end + uris.each do |uri_text| service.add_element('URI').text = uri_text - } - return service + end + service end + def test_get_service_endpoints - yadis_url = "http://yad.is/" - uri = "http://uri/" - type_uris = ["urn:type1", "urn:type2"] + yadis_url = 'http://yad.is/' + uri = 'http://uri/' + type_uris = ['urn:type1', 'urn:type2'] element = make_service_element(type_uris, [uri]) - filters = [Proc.new { |endpoint| - if endpoint.service_element == element - endpoint - else - nil - end - } - ] + filters = [proc do |endpoint| + endpoint if endpoint.service_element == element + end] tf = Yadis::TransformFilterMaker.new(filters) result = tf.get_service_endpoints(yadis_url, element) @@ -74,58 +70,52 @@ def test_get_service_endpoints def test_empty_transform_filter # A transform filter with no filter procs should return nil. - endpoint = "unused" + endpoint = 'unused' t = Yadis::TransformFilterMaker.new([]) assert(t.apply_filters(endpoint).nil?) end def test_nil_filter # A transform filter with a single nil filter should return nil. - nil_filter = Proc.new { |endpoint| nil } + nil_filter = proc { |_endpoint| nil } t = Yadis::TransformFilterMaker.new([nil_filter]) - endpoint = "unused" + endpoint = 'unused' assert(t.apply_filters(endpoint).nil?) end def test_identity_filter # A transform filter with an identity filter should return the # input. - identity_filter = Proc.new { |endpoint| endpoint } + identity_filter = proc { |endpoint| endpoint } t = Yadis::TransformFilterMaker.new([identity_filter]) - endpoint = "unused" + endpoint = 'unused' assert(t.apply_filters(endpoint) == endpoint) end def test_return_different_endpoint # Make sure the result of the filter is returned, rather than # the input. - returned_endpoint = "returned endpoint" - filter = Proc.new { |endpoint| returned_endpoint } + returned_endpoint = 'returned endpoint' + filter = proc { |_endpoint| returned_endpoint } t = Yadis::TransformFilterMaker.new([filter]) - endpoint = "unused" + endpoint = 'unused' assert(t.apply_filters(endpoint) == returned_endpoint) end def test_multiple_filters # Check filter fallback behavior on different inputs. - odd, odd_result = 45, "odd" - even, even_result = 46, "even" - - filter_odd = Proc.new { |endpoint| - if endpoint % 2 == 1 - odd_result - else - nil - end - } + odd = 45 + odd_result = 'odd' + even = 46 + even_result = 'even' - filter_even = Proc.new { |endpoint| - if endpoint % 2 == 0 - even_result - else - nil - end - } + filter_odd = proc do |endpoint| + odd_result if endpoint.odd? + end + + filter_even = proc do |endpoint| + even_result if endpoint.even? + end t = Yadis::TransformFilterMaker.new([filter_odd, filter_even]) assert(t.apply_filters(odd) == odd_result) @@ -138,24 +128,24 @@ def initialize(data) @data = data end - def get_service_endpoints(yadis_url, service_element) - return @data + def get_service_endpoints(_yadis_url, _service_element) + @data end end class CompoundFilterTest < Minitest::Test def test_get_service_endpoints - first = ["bogus", "test"] - second = ["third"] + first = %w[bogus test] + second = ['third'] all = first + second subfilters = [ - BogusServiceEndpointExtractor.new(first), - BogusServiceEndpointExtractor.new(second), - ] + BogusServiceEndpointExtractor.new(first), + BogusServiceEndpointExtractor.new(second) + ] cf = Yadis::CompoundFilter.new(subfilters) - assert cf.get_service_endpoints("unused", "unused") == all + assert cf.get_service_endpoints('unused', 'unused') == all end end @@ -206,7 +196,7 @@ def test_single_endpoint def test_single_proc # Create a proc that just returns nil for any endpoint - p = Proc.new { |endpoint| nil } + p = proc { |_endpoint| nil } result = Yadis.mk_compound_filter([p]) assert result.is_a?(Yadis::TransformFilterMaker) @@ -230,7 +220,7 @@ def test_multiple_filters_same_type def test_multiple_filters_different_type f1 = Yadis::TransformFilterMaker.new([]) f2 = Yadis::BasicServiceEndpoint.new(nil, [], nil, nil) - f3 = Proc.new { |endpoint| nil } + f3 = proc { |_endpoint| nil } e = Yadis::BasicServiceEndpoint.new(nil, [], nil, nil) f4 = [e] @@ -250,11 +240,11 @@ def test_multiple_filters_different_type def test_filter_type_error # Pass various non-filter objects and make sure the filter # machinery explodes. - [nil, ["bogus"], [1], [nil, "bogus"]].each { |thing| - assert_raises(TypeError) { + [nil, ['bogus'], [1], [nil, 'bogus']].each do |thing| + assert_raises(TypeError) do Yadis.mk_compound_filter(thing) - } - } + end + end end end end diff --git a/test/test_idres.rb b/test/test_idres.rb index e8c6aff1..dcab7610 100644 --- a/test/test_idres.rb +++ b/test/test_idres.rb @@ -1,43 +1,39 @@ -require "minitest/autorun" -require "testutil" -require "util" -require "openid/consumer/idres" -require "openid/protocolerror" -require "openid/store/memory" -require "openid/store/nonce" +require 'minitest/autorun' +require 'testutil' +require 'util' +require 'openid/consumer/idres' +require 'openid/protocolerror' +require 'openid/store/memory' +require 'openid/store/nonce' module OpenID class Consumer class IdResHandler - # Subclass of IdResHandler that doesn't do verification upon # construction. All of the tests call this, except for the ones # explicitly for id_res. class IdResHandler < OpenID::Consumer::IdResHandler - def id_res - end + def id_res; end end class CheckForFieldsTest < Minitest::Test include ProtocolErrorMixin - BASE_FIELDS = ['return_to', 'assoc_handle', 'sig', 'signed'] + BASE_FIELDS = %w[return_to assoc_handle sig signed] OPENID2_FIELDS = BASE_FIELDS + ['op_endpoint'] OPENID1_FIELDS = BASE_FIELDS + ['identity'] - OPENID1_SIGNED = ['return_to', 'identity'] + OPENID1_SIGNED = %w[return_to identity] OPENID2_SIGNED = - OPENID1_SIGNED + ['response_nonce', 'claimed_id', 'assoc_handle', - 'op_endpoint'] + OPENID1_SIGNED + %w[response_nonce claimed_id assoc_handle + op_endpoint] def mkMsg(ns, fields, signed_fields) msg = Message.new(ns) fields.each do |field| msg.set_arg(OPENID_NS, field, "don't care") end - if fields.member?('signed') - msg.set_arg(OPENID_NS, 'signed', signed_fields.join(',')) - end + msg.set_arg(OPENID_NS, 'signed', signed_fields.join(',')) if fields.member?('signed') msg end @@ -45,8 +41,7 @@ def mkMsg(ns, fields, signed_fields) n = 0 [[], ['foo'], - ['bar', 'baz'], - ].each do |signed_fields| + %w[bar baz]].each do |signed_fields| test = lambda do msg = mkMsg(OPENID2_NS, OPENID2_FIELDS, signed_fields) idres = IdResHandler.new(msg, nil) @@ -60,19 +55,18 @@ def mkMsg(ns, fields, signed_fields) # test all missing fields for OpenID 1 and 2 1.times do - [["openid1", OPENID1_NS, OPENID1_FIELDS], - ["openid1", OPENID11_NS, OPENID1_FIELDS], - ["openid2", OPENID2_NS, OPENID2_FIELDS], - ].each_with_index do |(ver, ns, all_fields), i| + [['openid1', OPENID1_NS, OPENID1_FIELDS], + ['openid1', OPENID11_NS, OPENID1_FIELDS], + ['openid2', OPENID2_NS, OPENID2_FIELDS]].each_with_index do |(ver, ns, all_fields), i| all_fields.each do |field| test = lambda do fields = all_fields.dup fields.delete(field) msg = mkMsg(ns, fields, []) idres = IdResHandler.new(msg, nil) - assert_protocol_error("Missing required field #{field}") { + assert_protocol_error("Missing required field #{field}") do idres.send(:check_for_fields) - } + end end define_method("test_#{i}_#{ver}_check_missing_#{field}", test) end @@ -81,10 +75,10 @@ def mkMsg(ns, fields, signed_fields) # Test all missing signed for OpenID 1 and 2 1.times do - [["openid1", OPENID1_NS, OPENID1_FIELDS, OPENID1_SIGNED], - ["openid1", OPENID11_NS, OPENID1_FIELDS, OPENID1_SIGNED], - ["openid2", OPENID2_NS, OPENID2_FIELDS, OPENID2_SIGNED], - ].each_with_index do |(ver, ns, all_fields, signed_fields), i| + [['openid1', OPENID1_NS, OPENID1_FIELDS, OPENID1_SIGNED], + ['openid1', OPENID11_NS, OPENID1_FIELDS, OPENID1_SIGNED], + ['openid2', OPENID2_NS, OPENID2_FIELDS, + OPENID2_SIGNED]].each_with_index do |(ver, ns, all_fields, signed_fields), i| signed_fields.each do |signed_field| test = lambda do fields = signed_fields.dup @@ -93,9 +87,9 @@ def mkMsg(ns, fields, signed_fields) # Make sure the signed field is actually in the request msg.set_arg(OPENID_NS, signed_field, "don't care") idres = IdResHandler.new(msg, nil) - assert_protocol_error("#{signed_field.inspect} not signed") { + assert_protocol_error("#{signed_field.inspect} not signed") do idres.send(:check_for_fields) - } + end end define_method("test_#{i}_#{ver}_check_missing_signed_#{signed_field}", test) end @@ -103,21 +97,20 @@ def mkMsg(ns, fields, signed_fields) end def test_112 - args = {'openid.assoc_handle' => 'fa1f5ff0-cde4-11dc-a183-3714bfd55ca8', - 'openid.claimed_id' => 'http://binkley.lan/user/test01', - 'openid.identity' => 'http://test01.binkley.lan/', - 'openid.mode' => 'id_res', - 'openid.ns' => 'http://specs.openid.net/auth/2.0', - 'openid.ns.pape' => 'http://specs.openid.net/extensions/pape/1.0', - 'openid.op_endpoint' => 'http://binkley.lan/server', - 'openid.pape.auth_policies' => 'none', - 'openid.pape.auth_time' => '2008-01-28T20:42:36Z', - 'openid.pape.nist_auth_level' => '0', - 'openid.response_nonce' => '2008-01-28T21:07:04Z99Q=', - 'openid.return_to' => 'http://binkley.lan:8001/process?janrain_nonce=2008-01-28T21%3A07%3A02Z0tMIKx', - 'openid.sig' => 'YJlWH4U6SroB1HoPkmEKx9AyGGg=', - 'openid.signed' => 'assoc_handle,identity,response_nonce,return_to,claimed_id,op_endpoint,pape.auth_time,ns.pape,pape.nist_auth_level,pape.auth_policies' - } + args = { 'openid.assoc_handle' => 'fa1f5ff0-cde4-11dc-a183-3714bfd55ca8', + 'openid.claimed_id' => 'http://binkley.lan/user/test01', + 'openid.identity' => 'http://test01.binkley.lan/', + 'openid.mode' => 'id_res', + 'openid.ns' => 'http://specs.openid.net/auth/2.0', + 'openid.ns.pape' => 'http://specs.openid.net/extensions/pape/1.0', + 'openid.op_endpoint' => 'http://binkley.lan/server', + 'openid.pape.auth_policies' => 'none', + 'openid.pape.auth_time' => '2008-01-28T20:42:36Z', + 'openid.pape.nist_auth_level' => '0', + 'openid.response_nonce' => '2008-01-28T21:07:04Z99Q=', + 'openid.return_to' => 'http://binkley.lan:8001/process?janrain_nonce=2008-01-28T21%3A07%3A02Z0tMIKx', + 'openid.sig' => 'YJlWH4U6SroB1HoPkmEKx9AyGGg=', + 'openid.signed' => 'assoc_handle,identity,response_nonce,return_to,claimed_id,op_endpoint,pape.auth_time,ns.pape,pape.nist_auth_level,pape.auth_policies' } assert_equal(args['openid.ns'], OPENID2_NS) incoming = Message.from_post_args(args) assert(incoming.is_openid2) @@ -134,9 +127,9 @@ def test_112 def test_no_signed_list msg = Message.new(OPENID2_NS) idres = IdResHandler.new(msg, nil) - assert_protocol_error("Response missing signed") { + assert_protocol_error('Response missing signed') do idres.send(:signed_list) - } + end end def test_success_openid1 @@ -158,51 +151,50 @@ class ReturnToArgsTest < Minitest::Test def check_return_to_args(query) idres = IdResHandler.new(Message.from_post_args(query), nil) class << idres - def verify_return_to_base(unused) - end + def verify_return_to_base(unused); end end idres.send(:verify_return_to) end def assert_bad_args(msg, query) - assert_protocol_error(msg) { + assert_protocol_error(msg) do check_return_to_args(query) - } + end end def test_return_to_args_okay check_return_to_args({ - 'openid.mode' => 'id_res', - 'openid.return_to' => 'http://example.com/?foo=bar', - 'foo' => 'bar', - }) + 'openid.mode' => 'id_res', + 'openid.return_to' => 'http://example.com/?foo=bar', + 'foo' => 'bar' + }) end def test_unexpected_arg_okay - assert_bad_args("Unexpected parameter", { - 'openid.mode' => 'id_res', - 'openid.return_to' => 'http://example.com/', - 'foo' => 'bar', - }) + assert_bad_args('Unexpected parameter', { + 'openid.mode' => 'id_res', + 'openid.return_to' => 'http://example.com/', + 'foo' => 'bar' + }) end def test_return_to_mismatch assert_bad_args('Message missing ret', { - 'openid.mode' => 'id_res', - 'openid.return_to' => 'http://example.com/?foo=bar', - }) + 'openid.mode' => 'id_res', + 'openid.return_to' => 'http://example.com/?foo=bar' + }) assert_bad_args("Parameter 'foo' val", { - 'openid.mode' => 'id_res', - 'openid.return_to' => 'http://example.com/?foo=bar', - 'foo' => 'foos', - }) + 'openid.mode' => 'id_res', + 'openid.return_to' => 'http://example.com/?foo=bar', + 'foo' => 'foos' + }) end end class ReturnToVerifyTest < Minitest::Test def test_bad_return_to - return_to = "http://some.url/path?foo=bar" + return_to = 'http://some.url/path?foo=bar' m = Message.new(OPENID1_NS) m.set_arg(OPENID_NS, 'mode', 'cancel') @@ -213,34 +205,33 @@ def test_bad_return_to # IdResHandler.verify_return_to_args. [ # Scheme only - "https://some.url/path?foo=bar", + 'https://some.url/path?foo=bar', # Authority only - "http://some.url.invalid/path?foo=bar", + 'http://some.url.invalid/path?foo=bar', # Path only - "http://some.url/path_extra?foo=bar", + 'http://some.url/path_extra?foo=bar', # Query args differ - "http://some.url/path?foo=bar2", - "http://some.url/path?foo2=bar", - ].each do |bad| - m.set_arg(OPENID_NS, 'return_to', bad) - idres = IdResHandler.new(m, return_to) - assert_raises(ProtocolError) { - idres.send(:verify_return_to) - } + 'http://some.url/path?foo=bar2', + 'http://some.url/path?foo2=bar' + ].each do |bad| + m.set_arg(OPENID_NS, 'return_to', bad) + idres = IdResHandler.new(m, return_to) + assert_raises(ProtocolError) do + idres.send(:verify_return_to) + end end end def test_good_return_to base = 'http://example.janrain.com/path' - [ [base, {}], - [base + "?another=arg", {'another' => 'arg'}], - [base + "?another=arg#frag", {'another' => 'arg'}], - ['HTTP'+base[4..-1], {}], - [base.sub('com', 'COM'), {}], - ['http://example.janrain.com:80/path', {}], - ['http://example.janrain.com/p%61th', {}], - ['http://example.janrain.com/./path',{}], - ].each do |return_to, args| + [[base, {}], + [base + '?another=arg', { 'another' => 'arg' }], + [base + '?another=arg#frag', { 'another' => 'arg' }], + ['HTTP' + base[4..-1], {}], + [base.sub('com', 'COM'), {}], + ['http://example.janrain.com:80/path', {}], + ['http://example.janrain.com/p%61th', {}], + ['http://example.janrain.com/./path', {}]].each do |return_to, args| args['openid.return_to'] = return_to msg = Message.from_post_args(args) idres = IdResHandler.new(msg, base) @@ -251,6 +242,7 @@ def test_good_return_to class DummyEndpoint attr_accessor :server_url + def initialize(server_url) @server_url = server_url end @@ -268,13 +260,13 @@ def setup @store.store_association(@server_url, @assoc) @message = Message.from_post_args({ - 'openid.mode' => 'id_res', - 'openid.identity' => '=example', - 'openid.sig' => GOODSIG, - 'openid.assoc_handle' => @assoc.handle, - 'openid.signed' => 'mode,identity,assoc_handle,signed', - 'frobboz' => 'banzit', - }) + 'openid.mode' => 'id_res', + 'openid.identity' => '=example', + 'openid.sig' => GOODSIG, + 'openid.assoc_handle' => @assoc.handle, + 'openid.signed' => 'mode,identity,assoc_handle,signed', + 'frobboz' => 'banzit' + }) end def call_idres_method(method_name) @@ -289,7 +281,7 @@ def call_check_sig(&proc) end def no_check_auth(idres) - idres.instance_def(:check_auth) { fail "Called check_auth" } + idres.instance_def(:check_auth) { raise 'Called check_auth' } end def test_sign_good @@ -298,9 +290,9 @@ def test_sign_good def test_bad_sig @message.set_arg(OPENID_NS, 'sig', 'bad sig!') - assert_protocol_error('Bad signature') { + assert_protocol_error('Bad signature') do call_check_sig(&method(:no_check_auth)) - } + end end def test_check_auth_ok @@ -328,40 +320,40 @@ def test_check_auth_ok_no_store def test_expired_assoc @assoc.expires_in = -1 @store.store_association(@server_url, @assoc) - assert_protocol_error('Association with') { + assert_protocol_error('Association with') do call_check_sig(&method(:no_check_auth)) - } + end end def call_check_auth(&proc) - assert_log_matches("Using 'check_authentication'") { + assert_log_matches("Using 'check_authentication'") do call_idres_method(:check_auth, &proc) - } + end end def test_check_auth_create_fail - assert_protocol_error("Could not generate") { + assert_protocol_error('Could not generate') do call_check_auth do |idres| idres.instance_def(:create_check_auth_request) do - raise Message::KeyNotFound, "Testing" + raise Message::KeyNotFound, 'Testing' end end - } + end end def test_check_auth_okay OpenID.extend(OverrideMethodMixin) me = self - send_resp = Proc.new do |req, server_url| + send_resp = proc do |req, _server_url| me.assert_equal(:req, req) :expected_response end OpenID.with_method_overridden(:make_kv_post, send_resp) do call_check_auth do |idres| - idres.instance_def(:create_check_auth_request) { + idres.instance_def(:create_check_auth_request) do :req - } + end idres.instance_def(:process_check_auth_response) do |resp| me.assert_equal(:expected_response, resp) end @@ -372,18 +364,18 @@ def test_check_auth_okay def test_check_auth_process_fail OpenID.extend(OverrideMethodMixin) me = self - send_resp = Proc.new do |req, server_url| + send_resp = proc do |req, _server_url| me.assert_equal(:req, req) :expected_response end OpenID.with_method_overridden(:make_kv_post, send_resp) do - assert_protocol_error("Testing") do + assert_protocol_error('Testing') do call_check_auth do |idres| idres.instance_def(:create_check_auth_request) { :req } idres.instance_def(:process_check_auth_response) do |resp| me.assert_equal(:expected_response, resp) - raise ProtocolError, "Testing" + raise ProtocolError, 'Testing' end end end @@ -392,13 +384,12 @@ def test_check_auth_process_fail 1.times do # Fields from the signed list - ['mode', 'identity', 'assoc_handle' - ].each do |field| + %w[mode identity assoc_handle].each do |field| test = lambda do @message.del_arg(OPENID_NS, field) - assert_raises(Message::KeyNotFound) { + assert_raises(Message::KeyNotFound) do call_idres_method(:create_check_auth_request) {} - } + end end define_method("test_create_check_auth_missing_#{field}", test) end @@ -410,7 +401,6 @@ def test_create_check_auth_request_success expected.set_arg(OPENID_NS, 'mode', 'check_authentication') assert_equal(expected, ca_msg) end - end class CheckAuthResponseTest < Minitest::Test @@ -419,12 +409,12 @@ class CheckAuthResponseTest < Minitest::Test def setup @message = Message.from_openid_args({ - 'is_valid' => 'true', - }) + 'is_valid' => 'true' + }) @assoc = GoodAssoc.new @store = Store::Memory.new @server_url = 'http://invalid/' - @endpoint = DummyEndpoint.new(@server_url) + @endpoint = DummyEndpoint.new(@server_url) @idres = IdResHandler.new(nil, nil, @store, @endpoint) end @@ -433,15 +423,15 @@ def call_process end def test_valid - assert_log_matches() { call_process } + assert_log_matches { call_process } end def test_invalid - ['false', 'monkeys'].each do + %w[false monkeys].each do @message.set_arg(OPENID_NS, 'is_valid', 'false') - assert_protocol_error("Server #{@server_url} responds") { - assert_log_matches() { call_process } - } + assert_protocol_error("Server #{@server_url} responds") do + assert_log_matches { call_process } + end end end @@ -452,13 +442,13 @@ def test_valid_invalidate def test_invalid_invalidate @message.set_arg(OPENID_NS, 'invalidate_handle', 'cheese') - ['false', 'monkeys'].each do + %w[false monkeys].each do @message.set_arg(OPENID_NS, 'is_valid', 'false') - assert_protocol_error("Server #{@server_url} responds") { - assert_log_matches("Received 'invalidate_handle'") { + assert_protocol_error("Server #{@server_url} responds") do + assert_log_matches("Received 'invalidate_handle'") do call_process - } - } + end + end end end @@ -466,9 +456,9 @@ def test_invalidate_no_store @idres.instance_variable_set(:@store, nil) @message.set_arg(OPENID_NS, 'invalidate_handle', 'cheese') assert_log_matches("Received 'invalidate_handle'", - 'Unexpectedly got "invalidate_handle"') { + 'Unexpectedly got "invalidate_handle"') do call_process - } + end end end @@ -480,6 +470,7 @@ def setup @store = Object.new class << @store attr_accessor :nonces, :succeed + def use_nonce(server_url, time, extra) @nonces << [server_url, time, extra] @succeed @@ -489,71 +480,66 @@ def use_nonce(server_url, time, extra) @nonce = Nonce.mk_nonce end - def call_check_nonce(post_args, succeed=false) + def call_check_nonce(post_args, succeed = false) response = Message.from_post_args(post_args) - if !@store.nil? - @store.succeed = succeed - end + @store.succeed = succeed unless @store.nil? idres = IdResHandler.new(response, nil, @store, nil) idres.send(:check_nonce) end def test_openid1_success [{}, - {'openid.ns' => OPENID1_NS}, - {'openid.ns' => OPENID11_NS} - ].each do |args| - call_check_nonce({'rp_nonce' => @nonce}.merge(args), true) + { 'openid.ns' => OPENID1_NS }, + { 'openid.ns' => OPENID11_NS }].each do |args| + call_check_nonce({ 'rp_nonce' => @nonce }.merge(args), true) end end def test_openid1_missing [{}, - {'openid.ns' => OPENID1_NS}, - {'openid.ns' => OPENID11_NS} - ].each do |args| + { 'openid.ns' => OPENID1_NS }, + { 'openid.ns' => OPENID11_NS }].each do |args| assert_protocol_error('Nonce missing') { call_check_nonce(args) } end end def test_openid2_ignore_rp_nonce - assert_protocol_error('Nonce missing') { - call_check_nonce({'rp_nonce' => @nonce, - 'openid.ns' => OPENID2_NS}) - } + assert_protocol_error('Nonce missing') do + call_check_nonce({ 'rp_nonce' => @nonce, + 'openid.ns' => OPENID2_NS }) + end end def test_openid2_success - call_check_nonce({'openid.response_nonce' => @nonce, - 'openid.ns' => OPENID2_NS}, true) + call_check_nonce({ 'openid.response_nonce' => @nonce, + 'openid.ns' => OPENID2_NS }, true) end def test_openid1_ignore_response_nonce [{}, - {'openid.ns' => OPENID1_NS}, - {'openid.ns' => OPENID11_NS} - ].each do |args| - assert_protocol_error('Nonce missing') { - call_check_nonce({'openid.response_nonce' => @nonce}.merge(args)) - } + { 'openid.ns' => OPENID1_NS }, + { 'openid.ns' => OPENID11_NS }].each do |args| + assert_protocol_error('Nonce missing') do + call_check_nonce({ 'openid.response_nonce' => @nonce }.merge(args)) + end end end def test_no_store @store = nil - call_check_nonce({'rp_nonce' => @nonce}) + call_check_nonce({ 'rp_nonce' => @nonce }) end def test_already_used - assert_protocol_error('Nonce already used') { - call_check_nonce({'rp_nonce' => @nonce}, false) - } + assert_protocol_error('Nonce already used') do + call_check_nonce({ 'rp_nonce' => @nonce }, false) + end end def test_malformed_nonce - assert_protocol_error('Malformed nonce') { - call_check_nonce({'rp_nonce' => 'whee!'}) - } + assert_protocol_error('Malformed nonce') do + call_check_nonce({ 'rp_nonce' => 'whee!' }) + end end end @@ -566,7 +552,7 @@ def setup end def call_verify(msg_args) - call_verify_modify(msg_args){} + call_verify_modify(msg_args) {} end def call_verify_modify(msg_args) @@ -579,20 +565,20 @@ def call_verify_modify(msg_args) end def assert_verify_protocol_error(error_prefix, openid_args) - assert_protocol_error(error_prefix) {call_verify(openid_args)} + assert_protocol_error(error_prefix) { call_verify(openid_args) } end def test_openid1_no_local_id @endpoint.claimed_id = 'http://invalid/' - assert_verify_protocol_error("Missing required field: "\ + assert_verify_protocol_error('Missing required field: '\ "<#{OPENID1_NS}>identity", {}) end def test_openid1_no_endpoint @endpoint = nil - assert_raises(ProtocolError) { - call_verify({'identity' => 'snakes on a plane'}) - } + assert_raises(ProtocolError) do + call_verify({ 'identity' => 'snakes on a plane' }) + end end def test_openid1_fallback_1_0 @@ -600,9 +586,9 @@ def test_openid1_fallback_1_0 claimed_id = 'http://claimed.id/' @endpoint = nil resp_mesg = Message.from_openid_args({ - 'ns' => openid1_ns, - 'identity' => claimed_id, - }) + 'ns' => openid1_ns, + 'identity' => claimed_id + }) # Pass the OpenID 1 claimed_id this way since we're # passing None for the endpoint. @@ -616,50 +602,50 @@ def test_openid1_fallback_1_0 expected_endpoint.local_id = nil expected_endpoint.claimed_id = claimed_id - hacked_discover = Proc.new { - |_claimed_id| ['unused', [expected_endpoint]] - } + hacked_discover = proc do |_claimed_id| + ['unused', [expected_endpoint]] + end idres = IdResHandler.new(resp_mesg, nil, nil, @endpoint) - assert_log_matches('Performing discovery') { - OpenID.with_method_overridden(:discover, hacked_discover) { + assert_log_matches('Performing discovery') do + OpenID.with_method_overridden(:discover, hacked_discover) do idres.send(:verify_discovery_results) - } - } + end + end actual_endpoint = idres.instance_variable_get(:@endpoint) assert_equal(actual_endpoint, expected_endpoint) end end def test_openid2_no_op_endpoint - assert_protocol_error("Missing required field: "\ - "<#{OPENID2_NS}>op_endpoint") { - call_verify({'ns'=>OPENID2_NS}) - } + assert_protocol_error('Missing required field: '\ + "<#{OPENID2_NS}>op_endpoint") do + call_verify({ 'ns' => OPENID2_NS }) + end end def test_openid2_local_id_no_claimed assert_verify_protocol_error('openid.identity is present without', - {'ns' => OPENID2_NS, + { 'ns' => OPENID2_NS, 'op_endpoint' => 'Phone Home', - 'identity' => 'Jorge Lius Borges'}) + 'identity' => 'Jorge Lius Borges' }) end def test_openid2_no_local_id_claimed - assert_log_matches() { - assert_protocol_error('openid.claimed_id is present without') { - call_verify({'ns' => OPENID2_NS, + assert_log_matches do + assert_protocol_error('openid.claimed_id is present without') do + call_verify({ 'ns' => OPENID2_NS, 'op_endpoint' => 'Phone Home', - 'claimed_id' => 'Manuel Noriega'}) - } - } + 'claimed_id' => 'Manuel Noriega' }) + end + end end def test_openid2_no_identifiers op_endpoint = 'Phone Home' - result_endpoint = assert_log_matches() { - call_verify({'ns' => OPENID2_NS, - 'op_endpoint' => op_endpoint}) - } + result_endpoint = assert_log_matches do + call_verify({ 'ns' => OPENID2_NS, + 'op_endpoint' => op_endpoint }) + end assert(result_endpoint.is_op_identifier) assert_equal(op_endpoint, result_endpoint.server_url) assert(result_endpoint.claimed_id.nil?) @@ -669,20 +655,19 @@ def test_openid2_no_endpoint_does_disco endpoint = OpenIDServiceEndpoint.new endpoint.claimed_id = 'monkeysoft' @endpoint = nil - result = assert_log_matches('No pre-discovered') { - call_verify_modify({'ns' => OPENID2_NS, + result = assert_log_matches('No pre-discovered') do + call_verify_modify({ 'ns' => OPENID2_NS, 'identity' => 'sour grapes', 'claimed_id' => 'monkeysoft', - 'op_endpoint' => 'Phone Home'}) do |idres| - idres.instance_def(:discover_and_verify) do |claimed_id, endpoints| + 'op_endpoint' => 'Phone Home' }) do |idres| + idres.instance_def(:discover_and_verify) do |_claimed_id, _endpoints| @endpoint = endpoint end end - } + end assert_equal(endpoint, result) end - def test_openid2_mismatched_does_disco @endpoint.claimed_id = 'nothing special, but different' @endpoint.local_id = 'green cheese' @@ -691,16 +676,16 @@ def test_openid2_mismatched_does_disco endpoint.claimed_id = 'monkeysoft' result = assert_log_matches('Error attempting to use stored', - 'Attempting discovery') { - call_verify_modify({'ns' => OPENID2_NS, + 'Attempting discovery') do + call_verify_modify({ 'ns' => OPENID2_NS, 'identity' => 'sour grapes', 'claimed_id' => 'monkeysoft', - 'op_endpoint' => 'Green Cheese'}) do |idres| - idres.instance_def(:discover_and_verify) do |claimed_id, endpoints| + 'op_endpoint' => 'Green Cheese' }) do |idres| + idres.instance_def(:discover_and_verify) do |_claimed_id, _endpoints| @endpoint = endpoint end end - } + end assert(endpoint.equal?(result)) end @@ -714,9 +699,9 @@ def test_verify_discovery_single_claimed_id_mismatch to_match = @endpoint.dup to_match.claimed_id = 'http://something.else/' - e = assert_raises(ProtocolError) { + e = assert_raises(ProtocolError) do idres.send(:verify_discovery_single, @endpoint, to_match) - } + end assert(e.to_s =~ /different subjects/) end @@ -741,18 +726,17 @@ def test_openid2_use_pre_discovered @endpoint.server_url = 'Phone Home' @endpoint.type_uris = [OPENID_2_0_TYPE] - result = assert_log_matches() { - call_verify({'ns' => OPENID2_NS, + result = assert_log_matches do + call_verify({ 'ns' => OPENID2_NS, 'identity' => @endpoint.local_id, 'claimed_id' => @endpoint.claimed_id, - 'op_endpoint' => @endpoint.server_url - }) - } + 'op_endpoint' => @endpoint.server_url }) + end assert(result.equal?(@endpoint)) end def test_openid2_use_pre_discovered_wrong_type - text = "verify failed" + text = 'verify failed' me = self @endpoint.local_id = 'my identity' @@ -761,43 +745,41 @@ def test_openid2_use_pre_discovered_wrong_type @endpoint.type_uris = [OPENID_1_1_TYPE] endpoint = @endpoint - msg = Message.from_openid_args({'ns' => OPENID2_NS, + msg = Message.from_openid_args({ 'ns' => OPENID2_NS, 'identity' => @endpoint.local_id, 'claimed_id' => @endpoint.claimed_id, 'op_endpoint' => - @endpoint.server_url}) + @endpoint.server_url }) idres = IdResHandler.new(msg, nil, nil, @endpoint) idres.extend(InstanceDefExtension) - idres.instance_def(:discover_and_verify) { |claimed_id, to_match| + idres.instance_def(:discover_and_verify) do |claimed_id, to_match| me.assert_equal(endpoint.claimed_id, to_match[0].claimed_id) me.assert_equal(claimed_id, endpoint.claimed_id) raise ProtocolError, text - } + end assert_log_matches('Error attempting to use stored', - 'Attempting discovery') { - assert_protocol_error(text) { + 'Attempting discovery') do + assert_protocol_error(text) do idres.send(:verify_discovery_results) - } - } + end + end end - def test_openid1_use_pre_discovered @endpoint.local_id = 'my identity' @endpoint.claimed_id = 'http://i-am-sam/' @endpoint.server_url = 'Phone Home' @endpoint.type_uris = [OPENID_1_1_TYPE] - result = assert_log_matches() { - call_verify({'ns' => OPENID1_NS, - 'identity' => @endpoint.local_id}) - } + result = assert_log_matches do + call_verify({ 'ns' => OPENID1_NS, + 'identity' => @endpoint.local_id }) + end assert(result.equal?(@endpoint)) end - def test_openid1_use_pre_discovered_wrong_type verified_error = Class.new(Exception) @@ -807,35 +789,35 @@ def test_openid1_use_pre_discovered_wrong_type @endpoint.type_uris = [OPENID_2_0_TYPE] assert_log_matches('Error attempting to use stored', - 'Attempting discovery') { - assert_raises(verified_error) { - call_verify_modify({'ns' => OPENID1_NS, - 'identity' => @endpoint.local_id}) { |idres| - idres.instance_def(:discover_and_verify) do |claimed_id, endpoints| + 'Attempting discovery') do + assert_raises(verified_error) do + call_verify_modify({ 'ns' => OPENID1_NS, + 'identity' => @endpoint.local_id }) do |idres| + idres.instance_def(:discover_and_verify) do |_claimed_id, _endpoints| raise verified_error end - } - } - } + end + end + end end def test_openid2_fragment - claimed_id = "http://unittest.invalid/" - claimed_id_frag = claimed_id + "#fragment" + claimed_id = 'http://unittest.invalid/' + claimed_id_frag = claimed_id + '#fragment' @endpoint.local_id = 'my identity' @endpoint.claimed_id = claimed_id @endpoint.server_url = 'Phone Home' @endpoint.type_uris = [OPENID_2_0_TYPE] - result = assert_log_matches() { - call_verify({'ns' => OPENID2_NS, + result = assert_log_matches do + call_verify({ 'ns' => OPENID2_NS, 'identity' => @endpoint.local_id, 'claimed_id' => claimed_id_frag, - 'op_endpoint' => @endpoint.server_url}) - } + 'op_endpoint' => @endpoint.server_url }) + end - [:local_id, :server_url, :type_uris].each do |sym| + %i[local_id server_url type_uris].each do |sym| assert_equal(@endpoint.send(sym), result.send(sym)) end assert_equal(claimed_id_frag, result.claimed_id) @@ -844,18 +826,18 @@ def test_openid2_fragment def test_endpoint_without_local_id # An endpoint like this with no local_id is generated as a result of # e.g. Yadis discovery with no LocalID tag. - @endpoint.server_url = "http://localhost:8000/openidserver" - @endpoint.claimed_id = "http://localhost:8000/id/id-jo" + @endpoint.server_url = 'http://localhost:8000/openidserver' + @endpoint.claimed_id = 'http://localhost:8000/id/id-jo' to_match = OpenIDServiceEndpoint.new - to_match.server_url = "http://localhost:8000/openidserver" - to_match.claimed_id = "http://localhost:8000/id/id-jo" - to_match.local_id = "http://localhost:8000/id/id-jo" + to_match.server_url = 'http://localhost:8000/openidserver' + to_match.claimed_id = 'http://localhost:8000/id/id-jo' + to_match.local_id = 'http://localhost:8000/id/id-jo' idres = IdResHandler.new(nil, nil) - assert_log_matches() { + assert_log_matches do idres.send(:verify_discovery_single, @endpoint, to_match) - } + end end end @@ -872,14 +854,14 @@ def test_id_res store.store_association(endpoint.server_url, assoc) signed_fields = - [ - 'response_nonce', - 'op_endpoint', - 'assoc_handle', - 'identity', - 'claimed_id', - 'ns', - 'return_to', + %w[ + response_nonce + op_endpoint + assoc_handle + identity + claimed_id + ns + return_to ] return_to = 'http://return.to/' @@ -892,17 +874,16 @@ def test_id_res 'op_endpoint' => endpoint.server_url, 'response_nonce' => Nonce.mk_nonce, 'signed' => signed_fields.join(','), - 'sig' => GOODSIG, + 'sig' => GOODSIG } msg = Message.from_openid_args(args) idres = OpenID::Consumer::IdResHandler.new(msg, return_to, store, endpoint) assert_equal(idres.signed_fields, - signed_fields.map {|f|'openid.' + f}) + signed_fields.map { |f| 'openid.' + f }) end end - class DiscoverAndVerifyTest < Minitest::Test include ProtocolErrorMixin include TestUtil @@ -910,7 +891,7 @@ class DiscoverAndVerifyTest < Minitest::Test def test_no_services me = self - disco = Proc.new do |e| + disco = proc do |e| me.assert_equal(e, :sentinel) [:undefined, []] end diff --git a/test/test_kvform.rb b/test/test_kvform.rb index 69224d85..9c03b94a 100644 --- a/test/test_kvform.rb +++ b/test/test_kvform.rb @@ -10,39 +10,39 @@ class KVFormTests < Minitest::Test def test_kvdict [ - # (kvform, parsed dictionary, expected warnings) - ["", {}, 0], - ["\n \n \n", {}, 0], - ["college:harvey mudd\n", {"college" => "harvey mudd"}, 0], - ["city:claremont\nstate:CA\n", - {"city" => "claremont", "state" => "CA"}, 0], - ["is_valid:true\ninvalidate_handle:{HMAC-SHA1:2398410938412093}\n", - {"is_valid" => "true", - "invalidate_handle" => "{HMAC-SHA1:2398410938412093}"}, 0], - - # Warnings from lines with no colon: - ["x\n", {}, 1], - ["x\nx\n", {}, 2], - ["East is least\n", {}, 1], - - # But not from blank lines (because LJ generates them) - ["x\n\n", {}, 1], - - # Warning from empty key - [":\n", {''=>''}, 1], - [":missing key\n", {''=>'missing key'}, 1], - - # Warnings from leading or trailing whitespace in key or value - [" street:foothill blvd\n", {"street"=>"foothill blvd"}, 1], - ["major: computer science\n", {"major"=>"computer science"}, 1], - [" dorm : east \n", {"dorm"=>"east"}, 2], - - # Warnings from missing trailing newline - ["e^(i*pi)+1:0", {"e^(i*pi)+1" => "0"}, 1], - ["east:west\nnorth:south", {"east"=>"west", "north"=>"south"}, 1], - ].each { |case_| + # (kvform, parsed dictionary, expected warnings) + ['', {}, 0], + ["\n \n \n", {}, 0], + ["college:harvey mudd\n", { 'college' => 'harvey mudd' }, 0], + ["city:claremont\nstate:CA\n", + { 'city' => 'claremont', 'state' => 'CA' }, 0], + ["is_valid:true\ninvalidate_handle:{HMAC-SHA1:2398410938412093}\n", + { 'is_valid' => 'true', + 'invalidate_handle' => '{HMAC-SHA1:2398410938412093}' }, 0], + + # Warnings from lines with no colon: + ["x\n", {}, 1], + ["x\nx\n", {}, 2], + ["East is least\n", {}, 1], + + # But not from blank lines (because LJ generates them) + ["x\n\n", {}, 1], + + # Warning from empty key + [":\n", { '' => '' }, 1], + [":missing key\n", { '' => 'missing key' }, 1], + + # Warnings from leading or trailing whitespace in key or value + [" street:foothill blvd\n", { 'street' => 'foothill blvd' }, 1], + ["major: computer science\n", { 'major' => 'computer science' }, 1], + [" dorm : east \n", { 'dorm' => 'east' }, 2], + + # Warnings from missing trailing newline + ['e^(i*pi)+1:0', { 'e^(i*pi)+1' => '0' }, 1], + ["east:west\nnorth:south", { 'east' => 'west', 'north' => 'south' }, 1] + ].each do |case_| _run_kvdictTest(case_) - } + end end def _run_kvdictTest(case_) @@ -50,7 +50,7 @@ def _run_kvdictTest(case_) d = nil d2 = nil - assert_log_line_count(warnings) { + assert_log_line_count(warnings) do # Convert KVForm to dict d = Util.kv_to_dict(kv) @@ -64,53 +64,53 @@ def _run_kvdictTest(case_) # make sure it parses to expected dict assert_equal(dct, d) - } + end # Convert back to KVForm and round-trip back to dict to make sure # that *** dict -> kv -> dict is identity. *** kv = Util.dict_to_kv(d) - silence_logging { + silence_logging do d2 = Util.kv_to_dict(kv) - } + end assert_equal(d, d2) end def test_kvseq [ - [[], "", 0], + [[], '', 0], - [[["openid", "useful"], ["a", "b"]], "openid:useful\na:b\n", 0], + [[%w[openid useful], %w[a b]], "openid:useful\na:b\n", 0], - # Warnings about leading whitespace - [[[" openid", "useful"], ["a", "b"]], " openid:useful\na:b\n", 2], + # Warnings about leading whitespace + [[[' openid', 'useful'], ['a', 'b']], " openid:useful\na:b\n", 2], - # Warnings about leading and trailing whitespace - [[[" openid ", " useful "], - [" a ", " b "]], " openid : useful \n a : b \n", 8], + # Warnings about leading and trailing whitespace + [[[' openid ', ' useful '], + [' a ', ' b ']], " openid : useful \n a : b \n", 8], - # warnings about leading and trailing whitespace, but not about - # internal whitespace. - [[[" open id ", " use ful "], - [" a ", " b "]], " open id : use ful \n a : b \n", 8], + # warnings about leading and trailing whitespace, but not about + # internal whitespace. + [[[' open id ', ' use ful '], + [' a ', ' b ']], " open id : use ful \n a : b \n", 8], - [[["foo", "bar"]], "foo:bar\n", 0], - ].each { |case_| + [[%w[foo bar]], "foo:bar\n", 0] + ].each do |case_| _run_kvseqTest(case_) - } + end end def _cleanSeq(seq) # Create a new sequence by stripping whitespace from start and end # of each value of each pair - seq.collect { |k, v| [k.strip(), v.strip()] } + seq.collect { |k, v| [k.strip, v.strip] } end def _run_kvseqTest(case_) seq, kvform, warnings = case_ - assert_log_line_count(warnings) { + assert_log_line_count(warnings) do # seq serializes to expected kvform actual = Util.seq_to_kv(seq) @@ -132,20 +132,20 @@ def _run_kvseqTest(case_) clean_seq = _cleanSeq(seq) assert_equal(seq, clean_seq) - } + end end def test_kvexc [ - [["openid", "use\nful"]], - [["open\nid", "useful"]], - [["open\nid", "use\nful"]], - [["open:id", "useful"]], - [["foo", "bar"], ["ba\n d", "seed"]], - [["foo", "bar"], ["bad:", "seed"]], - ].each { |case_| + [%W[openid use\nful]], + [%W[open\nid useful]], + [%W[open\nid use\nful]], + [['open:id', 'useful']], + [['foo', 'bar'], ["ba\n d", 'seed']], + [['foo', 'bar'], ['bad:', 'seed']] + ].each do |case_| _run_kvexcTest(case_) - } + end end def _run_kvexcTest(case_) @@ -157,9 +157,9 @@ def _run_kvexcTest(case_) end def test_convert - assert_log_line_count(2) { + assert_log_line_count(2) do result = Util.seq_to_kv([[1, 1]]) assert_equal(result, "1:1\n") - } + end end end diff --git a/test/test_kvpost.rb b/test/test_kvpost.rb index de1cb09a..3c1d67fb 100644 --- a/test/test_kvpost.rb +++ b/test/test_kvpost.rb @@ -1,51 +1,51 @@ -require "minitest/autorun" -require "testutil" -require "openid/kvpost" -require "openid/kvform" -require "openid/message" +require 'minitest/autorun' +require 'testutil' +require 'openid/kvpost' +require 'openid/kvform' +require 'openid/message' module OpenID class KVPostTestCase < Minitest::Test include FetcherMixin def mk_resp(status, resp_hash) - return MockResponse.new(status, Util.dict_to_kv(resp_hash)) + MockResponse.new(status, Util.dict_to_kv(resp_hash)) end def test_msg_from_http_resp_success - resp = mk_resp(200, {'mode' => 'seitan'}) + resp = mk_resp(200, { 'mode' => 'seitan' }) msg = Message.from_http_response(resp, 'http://invalid/') - assert_equal({'openid.mode' => 'seitan'}, msg.to_post_args) + assert_equal({ 'openid.mode' => 'seitan' }, msg.to_post_args) end def test_400 - args = {'error' => 'I ate too much cheese', - 'error_code' => 'sadness'} + args = { 'error' => 'I ate too much cheese', + 'error_code' => 'sadness' } resp = mk_resp(400, args) begin val = Message.from_http_response(resp, 'http://invalid/') - rescue ServerError => why - assert_equal(why.error_text, 'I ate too much cheese') - assert_equal(why.error_code, 'sadness') - assert_equal(why.message.to_args, args) + rescue ServerError => e + assert_equal(e.error_text, 'I ate too much cheese') + assert_equal(e.error_code, 'sadness') + assert_equal(e.message.to_args, args) else - fail("Expected exception. Got: #{val}") + raise("Expected exception. Got: #{val}") end end def test_500 - args = {'error' => 'I ate too much cheese', - 'error_code' => 'sadness'} + args = { 'error' => 'I ate too much cheese', + 'error_code' => 'sadness' } resp = mk_resp(500, args) - assert_raises(HTTPStatusError) { + assert_raises(HTTPStatusError) do Message.from_http_response(resp, 'http://invalid') - } + end end def make_kv_post_with_response(status, args) resp = mk_resp(status, args) mock_fetcher = Class.new do - define_method(:fetch) do |url, body, xxx, yyy| + define_method(:fetch) do |_url, _body, _xxx, _yyy| resp end end @@ -56,9 +56,9 @@ def make_kv_post_with_response(status, args) end def test_make_kv_post - assert_raises(HTTPStatusError) { + assert_raises(HTTPStatusError) do make_kv_post_with_response(500, {}) - } + end end end end diff --git a/test/test_linkparse.rb b/test/test_linkparse.rb index 49e3042e..5dd0dfc6 100644 --- a/test/test_linkparse.rb +++ b/test/test_linkparse.rb @@ -13,44 +13,42 @@ def attr_cmp(expected, found) fk, fv = f.shift ok = false while ek[-1] == '*'[0] # optional entry detected - if fk == ek[0...-1] and fv==ev # optional entry found + if fk == ek[0...-1] and fv == ev # optional entry found ok = true break else # not found. okay, move on to next expected pair ek, ev = e.shift end - if ek.nil? - if fk == nil - ok = true - end - break - end + next unless ek.nil? + + ok = true if fk.nil? + break end next if ok next if fk == ek and fv == ev + return false end - return f.empty? + f.empty? end def test_attrcmp good = [ - [{'foo' => 'bar'},{'foo' => 'bar'}], - [{'foo*' => 'bar'},{'foo' => 'bar'}], - [{'foo' => 'bar', 'bam*' => 'baz'},{'foo' => 'bar'}], - [{'foo' => 'bar', 'bam*' => 'baz', 'tak' => 'tal'}, - {'foo' => 'bar', 'tak' => 'tal'}], - ] + [{ 'foo' => 'bar' }, { 'foo' => 'bar' }], + [{ 'foo*' => 'bar' }, { 'foo' => 'bar' }], + [{ 'foo' => 'bar', 'bam*' => 'baz' }, { 'foo' => 'bar' }], + [{ 'foo' => 'bar', 'bam*' => 'baz', 'tak' => 'tal' }, + { 'foo' => 'bar', 'tak' => 'tal' }] + ] bad = [ - [{},{'foo' => 'bar'}], - [{'foo' => 'bar'}, {'bam' => 'baz'}], - [{'foo' => 'bar'}, {}], - [{'foo*' => 'bar'},{'foo*' => 'bar'}], - [{'foo' => 'bar', 'tak' => 'tal'}, {'foo' => 'bar'}] + [{}, { 'foo' => 'bar' }], + [{ 'foo' => 'bar' }, { 'bam' => 'baz' }], + [{ 'foo' => 'bar' }, {}], + [{ 'foo*' => 'bar' }, { 'foo*' => 'bar' }], + [{ 'foo' => 'bar', 'tak' => 'tal' }, { 'foo' => 'bar' }] ] - good.each{|c|assert(attr_cmp(c[0],c[1]),c.inspect)} - bad.each{|c|assert(!attr_cmp(c[0],c[1]),c.inspect)} - + good.each { |c| assert(attr_cmp(c[0], c[1]), c.inspect) } + bad.each { |c| assert(!attr_cmp(c[0], c[1]), c.inspect) } end def test_linkparse @@ -58,54 +56,51 @@ def test_linkparse numtests = nil testnum = 0 - cases.each {|c| - headers, html = c.split("\n\n",2) + cases.each do |c| + headers, html = c.split("\n\n", 2) expected_links = [] - name = "" + name = '' testnum += 1 - headers.split("\n").each{|h| - k,v = h.split(":",2) + headers.split("\n").each do |h| + k, v = h.split(':', 2) v = '' if v.nil? - if k == "Num Tests" - assert(numtests.nil?, "datafile parsing error: there can be only one NumTests") + if k == 'Num Tests' + assert(numtests.nil?, 'datafile parsing error: there can be only one NumTests') numtests = v.to_i testnum = 0 next - elsif k == "Name" + elsif k == 'Name' name = v.strip - elsif k == "Link" or k == "Link*" + elsif ['Link', 'Link*'].include?(k) attrs = {} - v.strip.split.each{|a| - kk,vv = a.split('=') - attrs[kk]=vv - } - expected_links << [k== "Link*", attrs] + v.strip.split.each do |a| + kk, vv = a.split('=') + attrs[kk] = vv + end + expected_links << [k == 'Link*', attrs] else assert(false, "datafile parsing error: bad header #{h}") end - } + end html = html.force_encoding('UTF-8') if html.respond_to? :force_encoding - links = OpenID::parse_link_attrs(html) - + links = OpenID.parse_link_attrs(html) + found = links.dup expected = expected_links.dup - while(fl = found.shift) + while (fl = found.shift) optional, el = expected.shift - while optional and !attr_cmp(el, fl) and not expected.empty? - optional, el = expected.shift - end - assert(attr_cmp(el,fl), "#{name}: #{fl.inspect} does not match #{el.inspect}") + optional, el = expected.shift while optional and !attr_cmp(el, fl) and !expected.empty? + assert(attr_cmp(el, fl), "#{name}: #{fl.inspect} does not match #{el.inspect}") end - } - assert_equal(numtests, testnum, "Number of tests") - - # test handling of invalid UTF-8 byte sequences - if "".respond_to? :force_encoding - html = "hello joel\255".force_encoding('UTF-8') - else - html = "hello joel\255" end - OpenID::parse_link_attrs(html) + assert_equal(numtests, testnum, 'Number of tests') + # test handling of invalid UTF-8 byte sequences + html = if ''.respond_to? :force_encoding + "hello joel\255".force_encoding('UTF-8') + else + "hello joel\255" + end + OpenID.parse_link_attrs(html) end end diff --git a/test/test_message.rb b/test/test_message.rb index 54416870..1ae7c22e 100644 --- a/test/test_message.rb +++ b/test/test_message.rb @@ -6,10 +6,9 @@ module OpenID module GetArgsMixin - # Tests a standard set of behaviors of Message.get_arg with # variations on handling defaults. - def get_arg_tests(ns, key, expected=nil) + def get_arg_tests(ns, key, expected = nil) if expected.nil? assert_nil(@m.get_arg(ns, key)) @@ -21,9 +20,7 @@ def get_arg_tests(ns, key, expected=nil) assert_equal(@m.get_arg(ns, key, :a_default), expected) assert_equal(@m.get_arg(ns, key, NO_DEFAULT), expected) end - end - end class EmptyMessageTestCase < Minitest::Test @@ -38,7 +35,7 @@ def test_get_aliased_arg_no_default @m.get_aliased_arg('ns.pork', NO_DEFAULT) end - ns_uri = "urn:pork" + ns_uri = 'urn:pork' @m.namespaces.add_alias(ns_uri, 'pork_alias') # Should return ns_uri. @@ -59,7 +56,7 @@ def test_to_kvform def test_from_kvform kvform = "foo:bar\none:two\n" - args = {'foo' => 'bar', 'one' => 'two'} + args = { 'foo' => 'bar', 'one' => 'two' } expected_result = Message.from_openid_args(args) assert_equal(expected_result, Message.from_kvform(kvform)) @@ -79,9 +76,9 @@ def test_get_openid end def test_get_key_openid - assert_raises(UndefinedOpenIDNamespace) { + assert_raises(UndefinedOpenIDNamespace) do @m.get_key(OPENID_NS, nil) - } + end end def test_get_key_bare @@ -101,9 +98,9 @@ def test_get_key_ns3 end def test_has_key - assert_raises(UndefinedOpenIDNamespace) { + assert_raises(UndefinedOpenIDNamespace) do @m.has_key?(OPENID_NS, 'foo') - } + end end def test_has_key_bare @@ -123,9 +120,9 @@ def test_has_key_ns3 end def test_get_arg - assert_raises(UndefinedOpenIDNamespace) { + assert_raises(UndefinedOpenIDNamespace) do @m.get_args(OPENID_NS) - } + end end def test_get_arg_bare @@ -145,9 +142,9 @@ def test_get_arg_ns3 end def test_get_args - assert_raises(UndefinedOpenIDNamespace) { + assert_raises(UndefinedOpenIDNamespace) do @m.get_args(OPENID_NS) - } + end end def test_get_args_bare @@ -167,9 +164,9 @@ def test_get_args_ns3 end def test_update_args - assert_raises(UndefinedOpenIDNamespace) { - @m.update_args(OPENID_NS, {'does not'=>'matter'}) - } + assert_raises(UndefinedOpenIDNamespace) do + @m.update_args(OPENID_NS, { 'does not' => 'matter' }) + end end def _test_update_args_ns(ns) @@ -185,20 +182,23 @@ def _test_update_args_ns(ns) def test_update_args_bare _test_update_args_ns(BARE_NS) end + def test_update_args_ns1 _test_update_args_ns(OPENID1_NS) end + def test_update_args_ns2 _test_update_args_ns(OPENID2_NS) end + def test_update_args_ns3 _test_update_args_ns('urn:xxx') end def test_set_arg - assert_raises(UndefinedOpenIDNamespace) { - @m.set_arg(OPENID_NS,'does not','matter') - } + assert_raises(UndefinedOpenIDNamespace) do + @m.set_arg(OPENID_NS, 'does not', 'matter') + end end def _test_set_arg_ns(ns) @@ -212,20 +212,23 @@ def _test_set_arg_ns(ns) def test_set_arg_bare _test_set_arg_ns(BARE_NS) end + def test_set_arg_ns1 _test_set_arg_ns(OPENID1_NS) end + def test_set_arg_ns2 _test_set_arg_ns(OPENID2_NS) end + def test_set_arg_ns3 _test_set_arg_ns('urn:xxx') end def test_del_arg - assert_raises(UndefinedOpenIDNamespace) { + assert_raises(UndefinedOpenIDNamespace) do @m.set_arg(OPENID_NS, 'does not', 'matter') - } + end end def _test_del_arg_ns(ns) @@ -236,12 +239,15 @@ def _test_del_arg_ns(ns) def test_del_arg_bare _test_del_arg_ns(BARE_NS) end + def test_del_arg_ns1 _test_del_arg_ns(OPENID1_NS) end + def test_del_arg_ns2 _test_del_arg_ns(OPENID2_NS) end + def test_del_arg_ns3 _test_del_arg_ns('urn:xxx') end @@ -255,9 +261,9 @@ def test_isOpenID2 end def test_set_openid_namespace - assert_raises(InvalidOpenIDNamespace) { + assert_raises(InvalidOpenIDNamespace) do @m.set_openid_namespace('http://invalid/', false) - } + end end end @@ -265,8 +271,8 @@ class OpenID1MessageTest < Minitest::Test include GetArgsMixin def setup - @m = Message.from_post_args({'openid.mode' => 'error', - 'openid.error' => 'unit test'}) + @m = Message.from_post_args({ 'openid.mode' => 'error', + 'openid.error' => 'unit test' }) end def test_has_openid_ns @@ -285,12 +291,12 @@ def test_get_aliased_arg_ns def test_get_aliased_arg_with_ns @m = Message.from_post_args( - {'openid.mode' => 'error', - 'openid.error' => 'unit test', - 'openid.ns.invalid' => 'http://invalid/', - 'openid.invalid.stuff' => 'things', - 'openid.invalid.stuff.blinky' => 'powerplant', - }) + { 'openid.mode' => 'error', + 'openid.error' => 'unit test', + 'openid.ns.invalid' => 'http://invalid/', + 'openid.invalid.stuff' => 'things', + 'openid.invalid.stuff.blinky' => 'powerplant' } + ) assert_equal('http://invalid/', @m.get_aliased_arg('ns.invalid')) assert_equal('things', @m.get_aliased_arg('invalid.stuff')) assert_equal('powerplant', @m.get_aliased_arg('invalid.stuff.blinky')) @@ -298,12 +304,12 @@ def test_get_aliased_arg_with_ns def test_get_aliased_arg_with_ns_default @m = Message.from_post_args({}) - assert_equal('monkeys!', @m.get_aliased_arg('ns.invalid', "monkeys!")) + assert_equal('monkeys!', @m.get_aliased_arg('ns.invalid', 'monkeys!')) end def test_to_post_args - assert_equal({'openid.mode' => 'error', - 'openid.error' => 'unit test'}, + assert_equal({ 'openid.mode' => 'error', + 'openid.error' => 'unit test' }, @m.to_post_args) end @@ -312,17 +318,16 @@ def test_to_post_args_ns @m.namespaces.add_alias(invalid_ns, 'foos') @m.set_arg(invalid_ns, 'ball', 'awesome') @m.set_arg(BARE_NS, 'xey', 'value') - assert_equal({'openid.mode' => 'error', + assert_equal({ 'openid.mode' => 'error', 'openid.error' => 'unit test', 'openid.foos.ball' => 'awesome', 'xey' => 'value', - 'openid.ns.foos' => 'http://invalid/' - }, @m.to_post_args) + 'openid.ns.foos' => 'http://invalid/' }, @m.to_post_args) end def test_to_args - assert_equal({'mode' => 'error', - 'error' => 'unit test'}, + assert_equal({ 'mode' => 'error', + 'error' => 'unit test' }, @m.to_args) end @@ -342,8 +347,8 @@ def test_to_url actual_base = actual[0...base_url.length] assert_equal(base_url, actual_base) assert_equal('?', actual[base_url.length].chr) - query = actual[base_url.length+1..-1] - assert_equal({'openid.mode'=>['error'],'openid.error'=>['unit test']}, + query = actual[base_url.length + 1..-1] + assert_equal({ 'openid.mode' => ['error'], 'openid.error' => ['unit test'] }, CGI.parse(query)) end @@ -374,15 +379,19 @@ def test_get_key_ns3 def test_has_key assert_equal(true, @m.has_key?(OPENID_NS, 'mode')) end + def test_has_key_bare assert_equal(false, @m.has_key?(BARE_NS, 'mode')) end + def test_has_key_ns1 assert_equal(true, @m.has_key?(OPENID1_NS, 'mode')) end + def test_has_key_ns2 assert_equal(false, @m.has_key?(OPENID2_NS, 'mode')) end + def test_has_key_ns3 assert_equal(false, @m.has_key?('urn:xxx', 'mode')) end @@ -412,30 +421,32 @@ def test_get_arg_ns3 end def test_get_args - assert_equal({'mode'=>'error','error'=>'unit test'}, + assert_equal({ 'mode' => 'error', 'error' => 'unit test' }, @m.get_args(OPENID_NS)) end + def test_get_args_bare assert_equal({}, @m.get_args(BARE_NS)) end + def test_get_args_ns1 - assert_equal({'mode'=>'error','error'=>'unit test'}, + assert_equal({ 'mode' => 'error', 'error' => 'unit test' }, @m.get_args(OPENID1_NS)) end + def test_get_args_ns2 assert_equal({}, @m.get_args(OPENID2_NS)) end + def test_get_args_ns3 assert_equal({}, @m.get_args('urn:xxx')) end - def _test_update_args_ns(ns, before=nil) - if before.nil? - before = {} - end + def _test_update_args_ns(ns, before = nil) + before = {} if before.nil? update_args = { - 'Camper van Beethoven'=>'David Lowery', - 'Magnolia Electric Co.'=>'Jason Molina' + 'Camper van Beethoven' => 'David Lowery', + 'Magnolia Electric Co.' => 'Jason Molina' } assert_equal(before, @m.get_args(ns)) @m.update_args(ns, update_args) @@ -445,17 +456,21 @@ def _test_update_args_ns(ns, before=nil) end def test_update_args - _test_update_args_ns(OPENID_NS, {'mode'=>'error','error'=>'unit test'}) + _test_update_args_ns(OPENID_NS, { 'mode' => 'error', 'error' => 'unit test' }) end + def test_update_args_bare _test_update_args_ns(BARE_NS) end + def test_update_args_ns1 - _test_update_args_ns(OPENID1_NS, {'mode'=>'error','error'=>'unit test'}) + _test_update_args_ns(OPENID1_NS, { 'mode' => 'error', 'error' => 'unit test' }) end + def test_update_args_ns2 _test_update_args_ns(OPENID2_NS) end + def test_update_args_ns3 _test_update_args_ns('urn:xxx') end @@ -463,31 +478,59 @@ def test_update_args_ns3 def _test_set_arg_ns(ns) key = 'awesometown' value = 'funny' - assert_nil(@m.get_arg(ns,key)) + assert_nil(@m.get_arg(ns, key)) @m.set_arg(ns, key, value) - assert_equal(value, @m.get_arg(ns,key)) + assert_equal(value, @m.get_arg(ns, key)) end - def test_set_arg; _test_set_arg_ns(OPENID_NS); end - def test_set_arg_bare; _test_set_arg_ns(BARE_NS); end - def test_set_arg_ns1; _test_set_arg_ns(OPENID1_NS); end - def test_set_arg_ns2; _test_set_arg_ns(OPENID2_NS); end - def test_set_arg_ns3; _test_set_arg_ns('urn:xxx'); end + def test_set_arg + _test_set_arg_ns(OPENID_NS) + end + + def test_set_arg_bare + _test_set_arg_ns(BARE_NS) + end + + def test_set_arg_ns1 + _test_set_arg_ns(OPENID1_NS) + end + + def test_set_arg_ns2 + _test_set_arg_ns(OPENID2_NS) + end + + def test_set_arg_ns3 + _test_set_arg_ns('urn:xxx') + end def _test_del_arg_ns(ns) key = 'marry an' value = 'ice cream sandwich' @m.set_arg(ns, key, value) - assert_equal(value, @m.get_arg(ns,key)) - @m.del_arg(ns,key) - assert_nil(@m.get_arg(ns,key)) + assert_equal(value, @m.get_arg(ns, key)) + @m.del_arg(ns, key) + assert_nil(@m.get_arg(ns, key)) + end + + def test_del_arg + _test_del_arg_ns(OPENID_NS) + end + + def test_del_arg_bare + _test_del_arg_ns(BARE_NS) + end + + def test_del_arg_ns1 + _test_del_arg_ns(OPENID1_NS) + end + + def test_del_arg_ns2 + _test_del_arg_ns(OPENID2_NS) end - def test_del_arg; _test_del_arg_ns(OPENID_NS); end - def test_del_arg_bare; _test_del_arg_ns(BARE_NS); end - def test_del_arg_ns1; _test_del_arg_ns(OPENID1_NS); end - def test_del_arg_ns2; _test_del_arg_ns(OPENID2_NS); end - def test_del_arg_ns3; _test_del_arg_ns('urn:yyy'); end + def test_del_arg_ns3 + _test_del_arg_ns('urn:yyy') + end def test_isOpenID1 assert_equal(true, @m.is_openid1) @@ -504,7 +547,7 @@ def test_equal def test_from_openid_args_undefined_ns expected = 'almost.complete' - msg = Message.from_openid_args({'coverage.is' => expected}) + msg = Message.from_openid_args({ 'coverage.is' => expected }) actual = msg.get_arg(OPENID1_NS, 'coverage.is') assert_equal(expected, actual) end @@ -526,16 +569,15 @@ class OpenID1ExplicitMessageTest < Minitest::Test # XXX - check to make sure the test suite will get built the way this # expects. def setup - @m = Message.from_post_args({'openid.mode'=>'error', - 'openid.error'=>'unit test', - 'openid.ns'=>OPENID1_NS}) + @m = Message.from_post_args({ 'openid.mode' => 'error', + 'openid.error' => 'unit test', + 'openid.ns' => OPENID1_NS }) end def test_to_post_args - assert_equal({'openid.mode' => 'error', - 'openid.error' => 'unit test', - 'openid.ns'=>OPENID1_NS, - }, + assert_equal({ 'openid.mode' => 'error', + 'openid.error' => 'unit test', + 'openid.ns' => OPENID1_NS }, @m.to_post_args) end @@ -544,20 +586,18 @@ def test_to_post_args_ns @m.namespaces.add_alias(invalid_ns, 'foos') @m.set_arg(invalid_ns, 'ball', 'awesome') @m.set_arg(BARE_NS, 'xey', 'value') - assert_equal({'openid.mode' => 'error', + assert_equal({ 'openid.mode' => 'error', 'openid.error' => 'unit test', 'openid.foos.ball' => 'awesome', 'xey' => 'value', - 'openid.ns'=>OPENID1_NS, - 'openid.ns.foos' => 'http://invalid/' - }, @m.to_post_args) + 'openid.ns' => OPENID1_NS, + 'openid.ns.foos' => 'http://invalid/' }, @m.to_post_args) end def test_to_args - assert_equal({'mode' => 'error', + assert_equal({ 'mode' => 'error', 'error' => 'unit test', - 'ns'=>OPENID1_NS - }, + 'ns' => OPENID1_NS }, @m.to_args) end @@ -577,52 +617,49 @@ def test_to_url actual_base = actual[0...base_url.length] assert_equal(base_url, actual_base) assert_equal('?', actual[base_url.length].chr) - query = actual[base_url.length+1..-1] - assert_equal({'openid.mode'=>['error'], - 'openid.error'=>['unit test'], - 'openid.ns'=>[OPENID1_NS], - }, + query = actual[base_url.length + 1..-1] + assert_equal({ 'openid.mode' => ['error'], + 'openid.error' => ['unit test'], + 'openid.ns' => [OPENID1_NS] }, CGI.parse(query)) end - - end class OpenID2MessageTest < Minitest::Test include TestUtil def setup - @m = Message.from_post_args({'openid.mode'=>'error', - 'openid.error'=>'unit test', - 'openid.ns'=>OPENID2_NS}) + @m = Message.from_post_args({ 'openid.mode' => 'error', + 'openid.error' => 'unit test', + 'openid.ns' => OPENID2_NS }) @m.set_arg(BARE_NS, 'xey', 'value') end def test_to_args_fails - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @m.to_args - } + end end def test_fix_ns_non_string # Using has_key to invoke _fix_ns since _fix_ns should be private - assert_raises(ArgumentError) { - @m.has_key?(:non_string_namespace, "key") - } + assert_raises(ArgumentError) do + @m.has_key?(:non_string_namespace, 'key') + end end def test_fix_ns_non_uri # Using has_key to invoke _fix_ns since _fix_ns should be private - assert_log_matches(/identifiers SHOULD be URIs/) { - @m.has_key?("foo", "key") - } + assert_log_matches(/identifiers SHOULD be URIs/) do + @m.has_key?('foo', 'key') + end end def test_fix_ns_sreg_literal # Using has_key to invoke _fix_ns since _fix_ns should be private - assert_log_matches(/identifiers SHOULD be URIs/, /instead of "sreg"/) { - @m.has_key?("sreg", "key") - } + assert_log_matches(/identifiers SHOULD be URIs/, /instead of "sreg"/) do + @m.has_key?('sreg', 'key') + end end def test_copy @@ -631,31 +668,29 @@ def test_copy end def test_to_post_args - assert_equal({'openid.mode' => 'error', + assert_equal({ 'openid.mode' => 'error', 'openid.error' => 'unit test', 'openid.ns' => OPENID2_NS, - 'xey' => 'value', - }, @m.to_post_args) + 'xey' => 'value' }, @m.to_post_args) end def test_to_post_args_ns invalid_ns = 'http://invalid/' @m.namespaces.add_alias(invalid_ns, 'foos') @m.set_arg(invalid_ns, 'ball', 'awesome') - assert_equal({'openid.mode' => 'error', + assert_equal({ 'openid.mode' => 'error', 'openid.error' => 'unit test', 'openid.ns' => OPENID2_NS, 'openid.ns.foos' => invalid_ns, 'openid.foos.ball' => 'awesome', - 'xey' => 'value', - }, @m.to_post_args) + 'xey' => 'value' }, @m.to_post_args) end def test_to_args @m.del_arg(BARE_NS, 'xey') - assert_equal({'mode' => 'error', - 'error' => 'unit test', - 'ns' => OPENID2_NS}, + assert_equal({ 'mode' => 'error', + 'error' => 'unit test', + 'ns' => OPENID2_NS }, @m.to_args) end @@ -666,10 +701,10 @@ def test_to_kvform end def _test_urlencoded(s) - expected_list = ["openid.error=unit+test", - "openid.mode=error", + expected_list = ['openid.error=unit+test', + 'openid.mode=error', "openid.ns=#{CGI.escape(OPENID2_NS)}", - "xey=value"] + 'xey=value'] # Hard to do this with string comparison since the mapping doesn't # preserve order. encoded_list = s.split('&') @@ -687,7 +722,7 @@ def test_to_url actual_base = actual[0...base_url.length] assert_equal(base_url, actual_base) assert_equal('?', actual[base_url.length].chr) - query = actual[base_url.length+1..-1] + query = actual[base_url.length + 1..-1] _test_urlencoded(query) end @@ -716,53 +751,53 @@ def test_get_key_ns3 end def test_has_key_openid - assert_equal(true, @m.has_key?(OPENID_NS,'mode')) + assert_equal(true, @m.has_key?(OPENID_NS, 'mode')) end def test_has_key_bare - assert_equal(false, @m.has_key?(BARE_NS,'mode')) + assert_equal(false, @m.has_key?(BARE_NS, 'mode')) end def test_has_key_ns1 - assert_equal(false, @m.has_key?(OPENID1_NS,'mode')) + assert_equal(false, @m.has_key?(OPENID1_NS, 'mode')) end def test_has_key_ns2 - assert_equal(true, @m.has_key?(OPENID2_NS,'mode')) + assert_equal(true, @m.has_key?(OPENID2_NS, 'mode')) end def test_has_key_ns3 - assert_equal(false, @m.has_key?('urn:xxx','mode')) + assert_equal(false, @m.has_key?('urn:xxx', 'mode')) end # XXX - getArgTest def test_get_arg_openid - assert_equal('error', @m.get_arg(OPENID_NS,'mode')) + assert_equal('error', @m.get_arg(OPENID_NS, 'mode')) end def test_get_arg_bare - assert_nil(@m.get_arg(BARE_NS,'mode')) + assert_nil(@m.get_arg(BARE_NS, 'mode')) end def test_get_arg_ns1 - assert_nil(@m.get_arg(OPENID1_NS,'mode')) + assert_nil(@m.get_arg(OPENID1_NS, 'mode')) end def test_get_arg_ns2 - assert_equal('error', @m.get_arg(OPENID2_NS,'mode')) + assert_equal('error', @m.get_arg(OPENID2_NS, 'mode')) end def test_get_arg_ns3 - assert_nil(@m.get_arg('urn:bananastand','mode')) + assert_nil(@m.get_arg('urn:bananastand', 'mode')) end def test_get_args_openid - assert_equal({'mode'=>'error','error'=>'unit test'}, + assert_equal({ 'mode' => 'error', 'error' => 'unit test' }, @m.get_args(OPENID_NS)) end def test_get_args_bare - assert_equal({'xey'=>'value'}, + assert_equal({ 'xey' => 'value' }, @m.get_args(BARE_NS)) end @@ -772,7 +807,7 @@ def test_get_args_ns1 end def test_get_args_ns2 - assert_equal({'mode'=>'error','error'=>'unit test'}, + assert_equal({ 'mode' => 'error', 'error' => 'unit test' }, @m.get_args(OPENID2_NS)) end @@ -781,9 +816,9 @@ def test_get_args_ns3 @m.get_args('urn:loose seal')) end - def _test_update_args_ns(ns, before=nil) - before = {} unless before - update_args = {'aa'=>'bb','cc'=>'dd'} + def _test_update_args_ns(ns, before = nil) + before ||= {} + update_args = { 'aa' => 'bb', 'cc' => 'dd' } assert_equal(before, @m.get_args(ns)) @m.update_args(ns, update_args) @@ -793,11 +828,11 @@ def _test_update_args_ns(ns, before=nil) end def test_update_args_openid - _test_update_args_ns(OPENID_NS, {'mode'=>'error','error'=>'unit test'}) + _test_update_args_ns(OPENID_NS, { 'mode' => 'error', 'error' => 'unit test' }) end def test_update_args_bare - _test_update_args_ns(BARE_NS, {'xey'=>'value'}) + _test_update_args_ns(BARE_NS, { 'xey' => 'value' }) end def test_update_args_ns1 @@ -805,7 +840,7 @@ def test_update_args_ns1 end def test_update_args_ns2 - _test_update_args_ns(OPENID2_NS, {'mode'=>'error','error'=>'unit test'}) + _test_update_args_ns(OPENID2_NS, { 'mode' => 'error', 'error' => 'unit test' }) end def test_update_args_ns3 @@ -814,17 +849,31 @@ def test_update_args_ns3 def _test_set_arg_ns(ns) key = "logan's" - value = "run" - assert_nil(@m.get_arg(ns,key)) + value = 'run' + assert_nil(@m.get_arg(ns, key)) @m.set_arg(ns, key, value) - assert_equal(value, @m.get_arg(ns,key)) + assert_equal(value, @m.get_arg(ns, key)) + end + + def test_set_arg_openid + _test_set_arg_ns(OPENID_NS) end - def test_set_arg_openid; _test_set_arg_ns(OPENID_NS); end - def test_set_arg_bare; _test_set_arg_ns(BARE_NS); end - def test_set_arg_ns1; _test_set_arg_ns(OPENID1_NS); end - def test_set_arg_ns2; _test_set_arg_ns(OPENID2_NS); end - def test_set_arg_ns3; _test_set_arg_ns('urn:g'); end + def test_set_arg_bare + _test_set_arg_ns(BARE_NS) + end + + def test_set_arg_ns1 + _test_set_arg_ns(OPENID1_NS) + end + + def test_set_arg_ns2 + _test_set_arg_ns(OPENID2_NS) + end + + def test_set_arg_ns3 + _test_set_arg_ns('urn:g') + end def test_bad_alias # Make sure dotted aliases and OpenID protocol fields are not allowed @@ -832,21 +881,21 @@ def test_bad_alias fields = OPENID_PROTOCOL_FIELDS + ['dotted.alias'] - fields.each { |f| - args = {"openid.ns.#{f}" => "blah#{f}", - "openid.#{f}.foo" => "test#{f}"} + fields.each do |f| + args = { "openid.ns.#{f}" => "blah#{f}", + "openid.#{f}.foo" => "test#{f}" } # .fromPostArgs covers .fromPostArgs, .fromOpenIDArgs, # ._fromOpenIDArgs, and .fromOpenIDArgs (since it calls # .fromPostArgs). - assert_raises(AssertionError) { + assert_raises(AssertionError) do Message.from_post_args(args) - } - } + end + end end def test_from_post_args - msg = Message.from_post_args({'foos' => 'ball'}) + msg = Message.from_post_args({ 'foos' => 'ball' }) assert_equal('ball', msg.get_arg(BARE_NS, 'foos')) end @@ -860,11 +909,25 @@ def _test_del_arg_ns(ns) assert_nil(@m.get_arg(ns, key)) end - def test_del_arg_openid; _test_del_arg_ns(OPENID_NS); end - def test_del_arg_bare; _test_del_arg_ns(BARE_NS); end - def test_del_arg_ns1; _test_del_arg_ns(OPENID1_NS); end - def test_del_arg_ns2; _test_del_arg_ns(OPENID2_NS); end - def test_del_arg_ns3; _test_del_arg_ns('urn:tofu'); end + def test_del_arg_openid + _test_del_arg_ns(OPENID_NS) + end + + def test_del_arg_bare + _test_del_arg_ns(BARE_NS) + end + + def test_del_arg_ns1 + _test_del_arg_ns(OPENID1_NS) + end + + def test_del_arg_ns2 + _test_del_arg_ns(OPENID2_NS) + end + + def test_del_arg_ns3 + _test_del_arg_ns('urn:tofu') + end def test_overwrite_extension_arg ns = 'urn:unittest_extension' @@ -879,9 +942,9 @@ def test_overwrite_extension_arg end def test_argList - assert_raises(ArgumentError) { - Message.from_post_args({'arg' => [1, 2, 3]}) - } + assert_raises(ArgumentError) do + Message.from_post_args({ 'arg' => [1, 2, 3] }) + end end def test_isOpenID1 @@ -908,7 +971,7 @@ def setup @form_tag_attrs = { 'company' => 'janrain', - 'class' => 'fancyCSS', + 'class' => 'fancyCSS' } @submit_text = 'GO!' @@ -918,70 +981,66 @@ def setup @required_form_attrs = { 'accept-charset' => 'UTF-8', 'enctype' => 'application/x-www-form-urlencoded', - 'method' => 'post', + 'method' => 'post' } end def _checkForm(html, message_, action_url, - form_tag_attrs, submit_text) + _form_tag_attrs, submit_text) @xml = REXML::Document.new(html) # Get root element form = @xml.root # Check required form attributes - @required_form_attrs.each { |k, v| + @required_form_attrs.each do |k, v| assert(form.attributes[k] == v, "Expected '#{v}' for required form attribute '#{k}', got '#{form.attributes[k]}'") - } + end # Check extra form attributes - @form_tag_attrs.each { |k, v| + @form_tag_attrs.each do |k, v| # Skip attributes that already passed the required attribute # check, since they should be ignored by the form generation # code. - if @required_form_attrs.include?(k) - continue - end + continue if @required_form_attrs.include?(k) assert(form.attributes[k] == v, "Form attribute '#{k}' should be '#{v}', found '#{form.attributes[k]}'") # Check hidden fields against post args hiddens = [] - form.each { |e| - if (e.is_a?(REXML::Element)) and - (e.name.upcase() == 'INPUT') and - (e.attributes['type'].upcase() == 'HIDDEN') - # For each post arg, make sure there is a hidden with that - # value. Make sure there are no other hiddens. - hiddens += [e] - end - } + form.each do |e| + next unless e.is_a?(REXML::Element) and + (e.name.upcase == 'INPUT') and + (e.attributes['type'].upcase == 'HIDDEN') + + # For each post arg, make sure there is a hidden with that + # value. Make sure there are no other hiddens. + hiddens += [e] + end - message_.to_post_args().each { |name, value| + message_.to_post_args.each do |name, value| success = false - hiddens.each { |e| - if e.attributes['name'] == name - assert(e.attributes['value'] == value, - "Expected value of hidden input '#{e.attributes['name']}' " + - "to be '#{value}', got '#{e.attributes['value']}'") - success = true - break - end - } - - if !success - flunk "Post arg '#{name}' not found in form" + hiddens.each do |e| + next unless e.attributes['name'] == name + + assert(e.attributes['value'] == value, + "Expected value of hidden input '#{e.attributes['name']}' " + + "to be '#{value}', got '#{e.attributes['value']}'") + success = true + break end - } - hiddens.each { |e| - assert(message_.to_post_args().keys().include?(e.attributes['name']), + flunk "Post arg '#{name}' not found in form" unless success + end + + hiddens.each do |e| + assert(message_.to_post_args.keys.include?(e.attributes['name']), "Form element for '#{e.attributes['name']}' not in " + - "original message") - } + 'original message') + end # Check action URL assert(form.attributes['action'] == action_url, @@ -989,13 +1048,13 @@ def _checkForm(html, message_, action_url, # Check submit text submits = [] - form.each { |e| - if (e.is_a?(REXML::Element)) and - (e.name.upcase() == 'INPUT') and - e.attributes['type'].upcase() == 'SUBMIT' - submits += [e] - end - } + form.each do |e| + next unless e.is_a?(REXML::Element) and + (e.name.upcase == 'INPUT') and + e.attributes['type'].upcase == 'SUBMIT' + + submits += [e] + end assert(submits.length == 1, "Expected only one 'input' with type = 'submit', got #{submits.length}") @@ -1003,8 +1062,7 @@ def _checkForm(html, message_, action_url, assert(submits[0].attributes['value'] == submit_text, "Expected submit value to be '#{submit_text}', " + "got '#{submits[0].attributes['value']}'") - } - + end end def test_toFormMarkup @@ -1045,7 +1103,6 @@ def test_overrideRequired end class NamespaceMapTestCase < Minitest::Test - def test_onealias nsm = NamespaceMap.new uri = 'http://example.com/foo' @@ -1055,19 +1112,18 @@ def test_onealias assert_equal(_alias, nsm.get_alias(uri)) end - def test_iteration nsm = NamespaceMap.new - uripat = "http://example.com/foo%i" + uripat = 'http://example.com/foo%i' nsm.add(uripat % 0) - (1..23).each { |i| + (1..23).each do |i| assert_equal(false, nsm.member?(uripat % i)) nsm.add(uripat % i) - } - nsm.each { |uri, _alias| + end + nsm.each do |uri, _alias| assert_equal(uri[22..-1], _alias[3..-1]) - } + end nsm = NamespaceMap.new alias_ = 'bogus' @@ -1075,8 +1131,8 @@ def test_iteration nsm.add_alias(uri, alias_) - assert_equal(nsm.aliases(), [alias_]) - assert_equal(nsm.namespace_uris(), [uri]) + assert_equal(nsm.aliases, [alias_]) + assert_equal(nsm.namespace_uris, [uri]) end def test_register_default_alias @@ -1087,17 +1143,17 @@ def test_register_default_alias Message.register_namespace_alias(invalid_ns, alias_) # Once it's registered, you can't register it again - assert_raises(NamespaceAliasRegistrationError) { + assert_raises(NamespaceAliasRegistrationError) do Message.register_namespace_alias(invalid_ns, 'another_alias') - } + end # Once it's registered, you can't register another URL with that alias - assert_raises(NamespaceAliasRegistrationError) { + assert_raises(NamespaceAliasRegistrationError) do Message.register_namespace_alias('http://janrain.com/', alias_) - } + end # It gets used automatically by the Message class: - msg = Message.from_openid_args({'invalid.stuff' => 'things'}) + msg = Message.from_openid_args({ 'invalid.stuff' => 'things' }) assert(msg.is_openid1) assert_equal(alias_, msg.namespaces.get_alias(invalid_ns)) assert_equal(invalid_ns, msg.namespaces.get_namespace_uri(alias_)) @@ -1108,9 +1164,9 @@ def test_alias_defined_twice uri = 'urn:bogus' nsm.add_alias(uri, 'foos') - assert_raises(IndexError) { + assert_raises(IndexError) do nsm.add_alias(uri, 'ball') - } + end end end end diff --git a/test/test_nonce.rb b/test/test_nonce.rb index cc8fd92c..9dfcbc90 100644 --- a/test/test_nonce.rb +++ b/test/test_nonce.rb @@ -3,17 +3,16 @@ module OpenID class NonceTestCase < Minitest::Test - - NONCE_RE = /\A\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ/ + NONCE_RE = /\A\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ/ def test_mk_nonce - nonce = Nonce::mk_nonce + nonce = Nonce.mk_nonce assert(nonce.match(NONCE_RE)) assert(nonce.size == 26) end def test_mk_nonce_time - nonce = Nonce::mk_nonce(0) + nonce = Nonce.mk_nonce(0) assert(nonce.match(NONCE_RE)) assert(nonce.size == 26) assert(nonce.match(/^1970-01-01T00:00:00Z/)) @@ -23,16 +22,16 @@ def test_split s = '1970-01-01T00:00:00Z' expected_t = 0 expected_salt = '' - actual_t, actual_salt = Nonce::split_nonce(s) + actual_t, actual_salt = Nonce.split_nonce(s) assert_equal(expected_t, actual_t) assert_equal(expected_salt, actual_salt) end def test_mk_split t = 42 - nonce_str = Nonce::mk_nonce(t) + nonce_str = Nonce.mk_nonce(t) assert(nonce_str.match(NONCE_RE)) - at, salt = Nonce::split_nonce(nonce_str) + at, salt = Nonce.split_nonce(nonce_str) assert_equal(6, salt.size) assert_equal(t, at) end @@ -45,11 +44,11 @@ def test_bad_split '1970-00-01T00:00:00Z', '1970.01-01T00:00:00Z', 'Thu Sep 7 13:29:31 PDT 2006', - 'monkeys', - ] - cases.each{|c| - assert_raises(ArgumentError, c.inspect) { Nonce::split_nonce(c) } - } + 'monkeys' + ] + cases.each do |c| + assert_raises(ArgumentError, c.inspect) { Nonce.split_nonce(c) } + end end def test_check_timestamp @@ -76,14 +75,14 @@ def test_check_timestamp ['1970-01-01T00:00:02Z', 1, 0, false], # malformed nonce string - ['monkeys', 0, 0, false], + ['monkeys', 0, 0, false] ] - - cases.each{|c| + + cases.each do |c| (nonce_str, allowed_skew, now, expected) = c - actual = Nonce::check_timestamp(nonce_str, allowed_skew, now) + actual = Nonce.check_timestamp(nonce_str, allowed_skew, now) assert_equal(expected, actual, c.inspect) - } + end end end end diff --git a/test/test_oauth.rb b/test/test_oauth.rb index 85a14e0a..d267153e 100644 --- a/test/test_oauth.rb +++ b/test/test_oauth.rb @@ -17,55 +17,55 @@ def test_construct assert_nil(@req.scope) assert_equal('oauth', @req.ns_alias) - req2 = OAuth::Request.new("CONSUMER","http://sample.com/some_scope") - assert_equal("CONSUMER",req2.consumer) - assert_equal("http://sample.com/some_scope",req2.scope) + req2 = OAuth::Request.new('CONSUMER', 'http://sample.com/some_scope') + assert_equal('CONSUMER', req2.consumer) + assert_equal('http://sample.com/some_scope', req2.scope) end def test_add_consumer - @req.consumer="CONSUMER" - assert_equal("CONSUMER",@req.consumer) + @req.consumer = 'CONSUMER' + assert_equal('CONSUMER', @req.consumer) end def test_add_scope - @req.scope="http://sample.com/some_scope" - assert_equal("http://sample.com/some_scope",@req.scope) + @req.scope = 'http://sample.com/some_scope' + assert_equal('http://sample.com/some_scope', @req.scope) end def test_get_extension_args assert_equal({}, @req.get_extension_args) - @req.consumer="CONSUMER" - assert_equal({'consumer' => 'CONSUMER'}, @req.get_extension_args) - @req.scope="http://sample.com/some_scope" - assert_equal({'consumer' => 'CONSUMER', 'scope' => 'http://sample.com/some_scope'}, @req.get_extension_args) + @req.consumer = 'CONSUMER' + assert_equal({ 'consumer' => 'CONSUMER' }, @req.get_extension_args) + @req.scope = 'http://sample.com/some_scope' + assert_equal({ 'consumer' => 'CONSUMER', 'scope' => 'http://sample.com/some_scope' }, @req.get_extension_args) end def test_parse_extension_args - args = {'consumer' => 'CONSUMER', 'scope' => 'http://sample.com/some_scope'} + args = { 'consumer' => 'CONSUMER', 'scope' => 'http://sample.com/some_scope' } @req.parse_extension_args(args) - assert_equal("CONSUMER",@req.consumer) - assert_equal("http://sample.com/some_scope",@req.scope) + assert_equal('CONSUMER', @req.consumer) + assert_equal('http://sample.com/some_scope', @req.scope) end def test_parse_extension_args_empty @req.parse_extension_args({}) - assert_nil( @req.consumer ) - assert_nil( @req.scope ) + assert_nil(@req.consumer) + assert_nil(@req.scope) end def test_from_openid_request openid_req_msg = Message.from_openid_args({ - 'mode' => 'checkid_setup', - 'ns' => OPENID2_NS, - 'ns.oauth' => OAuth::NS_URI, - 'oauth.consumer' => 'CONSUMER', - 'oauth.scope' => "http://sample.com/some_scope" - }) + 'mode' => 'checkid_setup', + 'ns' => OPENID2_NS, + 'ns.oauth' => OAuth::NS_URI, + 'oauth.consumer' => 'CONSUMER', + 'oauth.scope' => 'http://sample.com/some_scope' + }) oid_req = Server::OpenIDRequest.new oid_req.message = openid_req_msg req = OAuth::Request.from_openid_request(oid_req) - assert_equal("CONSUMER",req.consumer) - assert_equal("http://sample.com/some_scope",req.scope) + assert_equal('CONSUMER', req.consumer) + assert_equal('http://sample.com/some_scope', req.scope) end def test_from_openid_request_no_oauth @@ -75,7 +75,6 @@ def test_from_openid_request_no_oauth oauth_req = OAuth::Request.from_openid_request(openid_req) assert(oauth_req.nil?) end - end class DummySuccessResponse @@ -86,10 +85,9 @@ def initialize(message, signed_stuff) @signed_stuff = signed_stuff end - def get_signed_ns(ns_uri) - return @signed_stuff + def get_signed_ns(_ns_uri) + @signed_stuff end - end class OAuthResponseTestCase < Minitest::Test @@ -101,69 +99,69 @@ def test_construct assert_nil(@req.request_token) assert_nil(@req.scope) - req2 = OAuth::Response.new("REQUESTTOKEN","http://sample.com/some_scope") - assert_equal("REQUESTTOKEN",req2.request_token) - assert_equal("http://sample.com/some_scope",req2.scope) + req2 = OAuth::Response.new('REQUESTTOKEN', 'http://sample.com/some_scope') + assert_equal('REQUESTTOKEN', req2.request_token) + assert_equal('http://sample.com/some_scope', req2.scope) end def test_add_request_token - @req.request_token="REQUESTTOKEN" - assert_equal("REQUESTTOKEN",@req.request_token) + @req.request_token = 'REQUESTTOKEN' + assert_equal('REQUESTTOKEN', @req.request_token) end def test_add_scope - @req.scope="http://sample.com/some_scope" - assert_equal("http://sample.com/some_scope",@req.scope) + @req.scope = 'http://sample.com/some_scope' + assert_equal('http://sample.com/some_scope', @req.scope) end def test_get_extension_args assert_equal({}, @req.get_extension_args) - @req.request_token="REQUESTTOKEN" - assert_equal({'request_token' => 'REQUESTTOKEN'}, @req.get_extension_args) - @req.scope="http://sample.com/some_scope" - assert_equal({'request_token' => 'REQUESTTOKEN', 'scope' => 'http://sample.com/some_scope'}, @req.get_extension_args) + @req.request_token = 'REQUESTTOKEN' + assert_equal({ 'request_token' => 'REQUESTTOKEN' }, @req.get_extension_args) + @req.scope = 'http://sample.com/some_scope' + assert_equal({ 'request_token' => 'REQUESTTOKEN', 'scope' => 'http://sample.com/some_scope' }, + @req.get_extension_args) end def test_parse_extension_args - args = {'request_token' => 'REQUESTTOKEN', 'scope' => 'http://sample.com/some_scope'} + args = { 'request_token' => 'REQUESTTOKEN', 'scope' => 'http://sample.com/some_scope' } @req.parse_extension_args(args) - assert_equal("REQUESTTOKEN",@req.request_token) - assert_equal("http://sample.com/some_scope",@req.scope) + assert_equal('REQUESTTOKEN', @req.request_token) + assert_equal('http://sample.com/some_scope', @req.scope) end def test_parse_extension_args_empty @req.parse_extension_args({}) - assert_nil( @req.request_token ) - assert_nil( @req.scope ) + assert_nil(@req.request_token) + assert_nil(@req.scope) end def test_from_success_response - openid_req_msg = Message.from_openid_args({ - 'mode' => 'id_res', - 'ns' => OPENID2_NS, - 'ns.oauth' => OAuth::NS_URI, - 'oauth.request_token' => 'REQUESTTOKEN', - 'oauth.scope' => "http://sample.com/some_scope" - }) + 'mode' => 'id_res', + 'ns' => OPENID2_NS, + 'ns.oauth' => OAuth::NS_URI, + 'oauth.request_token' => 'REQUESTTOKEN', + 'oauth.scope' => 'http://sample.com/some_scope' + }) signed_stuff = { 'request_token' => 'REQUESTTOKEN', - 'scope' => "http://sample.com/some_scope" + 'scope' => 'http://sample.com/some_scope' } oid_req = DummySuccessResponse.new(openid_req_msg, signed_stuff) req = OAuth::Response.from_success_response(oid_req) - assert_equal("REQUESTTOKEN",req.request_token) - assert_equal("http://sample.com/some_scope",req.scope) + assert_equal('REQUESTTOKEN', req.request_token) + assert_equal('http://sample.com/some_scope', req.scope) end def test_from_success_response_unsigned openid_req_msg = Message.from_openid_args({ - 'mode' => 'id_res', - 'ns' => OPENID2_NS, - 'ns.oauth' => OAuth::NS_URI, - 'oauth.request_token' => 'REQUESTTOKEN', - 'oauth.scope' => "http://sample.com/some_scope" - }) + 'mode' => 'id_res', + 'ns' => OPENID2_NS, + 'ns.oauth' => OAuth::NS_URI, + 'oauth.request_token' => 'REQUESTTOKEN', + 'oauth.scope' => 'http://sample.com/some_scope' + }) signed_stuff = {} endpoint = OpenIDServiceEndpoint.new oid_req = Consumer::SuccessResponse.new(endpoint, openid_req_msg, signed_stuff) diff --git a/test/test_openid_yadis.rb b/test/test_openid_yadis.rb index 6ff9371c..3861f1ea 100644 --- a/test/test_openid_yadis.rb +++ b/test/test_openid_yadis.rb @@ -3,90 +3,85 @@ require 'openid/yadis/services' module OpenID - - XRDS_BOILERPLATE = < - - -%s - - -EOF + XRDS_BOILERPLATE = <<~EOF + + + + %s + + + EOF def self.mkXRDS(services) - return sprintf(XRDS_BOILERPLATE, services) + format(XRDS_BOILERPLATE, services) end - def self.mkService(uris=nil, type_uris=nil, local_id=nil, dent=" ") + def self.mkService(uris = nil, type_uris = nil, local_id = nil, dent = ' ') chunks = [dent, "\n"] - dent2 = dent + " " + dent2 = dent + ' ' if type_uris - type_uris.each { |type_uri| - chunks += [dent2 + "", type_uri, "\n"] - } + type_uris.each do |type_uri| + chunks += [dent2 + '', type_uri, "\n"] + end end if uris - uris.each { |uri| + uris.each do |uri| if uri.is_a?(Array) uri, prio = uri else prio = nil end - chunks += [dent2, "", uri, "\n"] - } + chunks += [dent2, '', uri, "\n"] + end end - if local_id - chunks += [dent2, "", local_id, "\n"] - end + chunks += [dent2, '', local_id, "\n"] if local_id chunks += [dent, "\n"] - return chunks.join("") + chunks.join('') end # Different sets of server URLs for use in the URI tag SERVER_URL_OPTIONS = [ - [], # This case should not generate an endpoint object - ['http://server.url/'], - ['https://server.url/'], - ['https://server.url/', 'http://server.url/'], - ['https://server.url/', - 'http://server.url/', - 'http://example.server.url/'], - ] + [], # This case should not generate an endpoint object + ['http://server.url/'], + ['https://server.url/'], + ['https://server.url/', 'http://server.url/'], + ['https://server.url/', + 'http://server.url/', + 'http://example.server.url/'] + ] # Used for generating test data - def OpenID.subsets(l) + def self.subsets(l) subsets_list = [[]] - l.each { |x| + l.each do |x| subsets_list += subsets_list.collect { |t| [x] + t } - } + end - return subsets_list + subsets_list end # A couple of example extension type URIs. These are not at all # official, but are just here for testing. EXT_TYPES = [ - 'http://janrain.com/extension/blah', - 'http://openid.net/sreg/1.0', - ] + 'http://janrain.com/extension/blah', + 'http://openid.net/sreg/1.0' + ] # Range of valid Delegate tag values for generating test data LOCAL_ID_OPTIONS = [ - nil, - 'http://vanity.domain/', - 'https://somewhere/yadis/', - ] + nil, + 'http://vanity.domain/', + 'https://somewhere/yadis/' + ] class OpenIDYadisTest def initialize(uris, type_uris, local_id) @@ -117,7 +112,7 @@ def runTest(testcase) type_uris.sort! seen_uris = [] - endpoints.each { |endpoint| + endpoints.each do |endpoint| seen_uris << endpoint.server_url # All endpoints will have same yadis_url @@ -130,7 +125,7 @@ def runTest(testcase) actual_types = endpoint.type_uris.dup actual_types.sort! testcase.assert_equal(type_uris, actual_types, actual_types.inspect) - } + end # So that they will compare equal, because we don't care what # order they are in @@ -151,27 +146,25 @@ def test_openid_yadis # OpenID endpoint type_uri_options = [] - OpenID.subsets([OPENID_1_0_TYPE, OPENID_1_1_TYPE]).each { |ts| - OpenID.subsets(EXT_TYPES).each { |exts| - if !ts.empty? - type_uri_options << exts + ts - end - } - } + OpenID.subsets([OPENID_1_0_TYPE, OPENID_1_1_TYPE]).each do |ts| + OpenID.subsets(EXT_TYPES).each do |exts| + type_uri_options << exts + ts unless ts.empty? + end + end # All combinations of valid URIs, Type URIs and Delegate tags - SERVER_URL_OPTIONS.each { |uris| - type_uri_options.each { |type_uris| - LOCAL_ID_OPTIONS.each { |local_id| + SERVER_URL_OPTIONS.each do |uris| + type_uri_options.each do |type_uris| + LOCAL_ID_OPTIONS.each do |local_id| data << [uris, type_uris, local_id] - } - } - } + end + end + end - data.each { |args| + data.each do |args| t = OpenIDYadisTest.new(*args) t.runTest(self) - } + end end end end diff --git a/test/test_pape.rb b/test/test_pape.rb index a4309d8e..93b75a92 100644 --- a/test/test_pape.rb +++ b/test/test_pape.rb @@ -34,21 +34,22 @@ def test_add_policy_uri end def test_get_extension_args - assert_equal({'preferred_auth_policies' => ''}, @req.get_extension_args) + assert_equal({ 'preferred_auth_policies' => '' }, @req.get_extension_args) @req.add_policy_uri('http://uri') - assert_equal({'preferred_auth_policies' => 'http://uri'}, @req.get_extension_args) + assert_equal({ 'preferred_auth_policies' => 'http://uri' }, @req.get_extension_args) @req.add_policy_uri('http://zig') - assert_equal({'preferred_auth_policies' => 'http://uri http://zig'}, @req.get_extension_args) + assert_equal({ 'preferred_auth_policies' => 'http://uri http://zig' }, @req.get_extension_args) @req.max_auth_age = 789 - assert_equal({'preferred_auth_policies' => 'http://uri http://zig', 'max_auth_age' => '789'}, @req.get_extension_args) + assert_equal({ 'preferred_auth_policies' => 'http://uri http://zig', 'max_auth_age' => '789' }, + @req.get_extension_args) end def test_parse_extension_args - args = {'preferred_auth_policies' => 'http://foo http://bar', - 'max_auth_age' => '9'} + args = { 'preferred_auth_policies' => 'http://foo http://bar', + 'max_auth_age' => '9' } @req.parse_extension_args(args) assert_equal(9, @req.max_auth_age) - assert_equal(['http://foo','http://bar'], @req.preferred_auth_policies) + assert_equal(['http://foo', 'http://bar'], @req.preferred_auth_policies) end def test_parse_extension_args_empty @@ -59,12 +60,13 @@ def test_parse_extension_args_empty def test_from_openid_request openid_req_msg = Message.from_openid_args({ - 'mode' => 'checkid_setup', - 'ns' => OPENID2_NS, - 'ns.pape' => PAPE::NS_URI, - 'pape.preferred_auth_policies' => [PAPE::AUTH_MULTI_FACTOR, PAPE::AUTH_PHISHING_RESISTANT].join(' '), - 'pape.max_auth_age' => '5476' - }) + 'mode' => 'checkid_setup', + 'ns' => OPENID2_NS, + 'ns.pape' => PAPE::NS_URI, + 'pape.preferred_auth_policies' => [PAPE::AUTH_MULTI_FACTOR, + PAPE::AUTH_PHISHING_RESISTANT].join(' '), + 'pape.max_auth_age' => '5476' + }) oid_req = Server::OpenIDRequest.new oid_req.message = openid_req_msg req = PAPE::Request.from_openid_request(oid_req) @@ -97,10 +99,9 @@ def initialize(message, signed_stuff) @signed_stuff = signed_stuff end - def get_signed_ns(ns_uri) - return @signed_stuff + def get_signed_ns(_ns_uri) + @signed_stuff end - end class PapeResponseTestCase < Minitest::Test @@ -114,9 +115,9 @@ def test_construct assert_equal('pape', @req.ns_alias) assert_nil(@req.nist_auth_level) - req2 = PAPE::Response.new([PAPE::AUTH_MULTI_FACTOR], "1983-11-05T12:30:24Z", 3) + req2 = PAPE::Response.new([PAPE::AUTH_MULTI_FACTOR], '1983-11-05T12:30:24Z', 3) assert_equal([PAPE::AUTH_MULTI_FACTOR], req2.auth_policies) - assert_equal("1983-11-05T12:30:24Z", req2.auth_time) + assert_equal('1983-11-05T12:30:24Z', req2.auth_time) assert_equal(3, req2.nist_auth_level) end @@ -133,24 +134,28 @@ def test_add_policy_uri end def test_get_extension_args - assert_equal({'auth_policies' => 'none'}, @req.get_extension_args) + assert_equal({ 'auth_policies' => 'none' }, @req.get_extension_args) @req.add_policy_uri('http://uri') - assert_equal({'auth_policies' => 'http://uri'}, @req.get_extension_args) + assert_equal({ 'auth_policies' => 'http://uri' }, @req.get_extension_args) @req.add_policy_uri('http://zig') - assert_equal({'auth_policies' => 'http://uri http://zig'}, @req.get_extension_args) - @req.auth_time = "1983-11-05T12:30:24Z" - assert_equal({'auth_policies' => 'http://uri http://zig', 'auth_time' => "1983-11-05T12:30:24Z"}, @req.get_extension_args) + assert_equal({ 'auth_policies' => 'http://uri http://zig' }, @req.get_extension_args) + @req.auth_time = '1983-11-05T12:30:24Z' + assert_equal({ 'auth_policies' => 'http://uri http://zig', 'auth_time' => '1983-11-05T12:30:24Z' }, + @req.get_extension_args) @req.nist_auth_level = 3 - assert_equal({'auth_policies' => 'http://uri http://zig', 'auth_time' => "1983-11-05T12:30:24Z", 'nist_auth_level' => '3'}, @req.get_extension_args) + assert_equal( + { 'auth_policies' => 'http://uri http://zig', 'auth_time' => '1983-11-05T12:30:24Z', + 'nist_auth_level' => '3' }, @req.get_extension_args + ) end def test_get_extension_args_error_auth_age - @req.auth_time = "the beginning of time" + @req.auth_time = 'the beginning of time' assert_raises(ArgumentError) { @req.get_extension_args } end def test_get_extension_args_error_nist_auth_level - @req.nist_auth_level = "high as a kite" + @req.nist_auth_level = 'high as a kite' assert_raises(ArgumentError) { @req.get_extension_args } @req.nist_auth_level = 5 assert_raises(ArgumentError) { @req.get_extension_args } @@ -159,11 +164,11 @@ def test_get_extension_args_error_nist_auth_level end def test_parse_extension_args - args = {'auth_policies' => 'http://foo http://bar', - 'auth_time' => '1983-11-05T12:30:24Z'} + args = { 'auth_policies' => 'http://foo http://bar', + 'auth_time' => '1983-11-05T12:30:24Z' } @req.parse_extension_args(args) assert_equal('1983-11-05T12:30:24Z', @req.auth_time) - assert_equal(['http://foo','http://bar'], @req.auth_policies) + assert_equal(['http://foo', 'http://bar'], @req.auth_policies) end def test_parse_extension_args_empty @@ -173,52 +178,51 @@ def test_parse_extension_args_empty end def test_parse_extension_args_strict_bogus1 - args = {'auth_policies' => 'http://foo http://bar', - 'auth_time' => 'this one time'} - assert_raises(ArgumentError) { + args = { 'auth_policies' => 'http://foo http://bar', + 'auth_time' => 'this one time' } + assert_raises(ArgumentError) do @req.parse_extension_args(args, true) - } + end end def test_parse_extension_args_strict_bogus2 - args = {'auth_policies' => 'http://foo http://bar', - 'auth_time' => '1983-11-05T12:30:24Z', - 'nist_auth_level' => 'some'} - assert_raises(ArgumentError) { + args = { 'auth_policies' => 'http://foo http://bar', + 'auth_time' => '1983-11-05T12:30:24Z', + 'nist_auth_level' => 'some' } + assert_raises(ArgumentError) do @req.parse_extension_args(args, true) - } + end end def test_parse_extension_args_strict_good - args = {'auth_policies' => 'http://foo http://bar', - 'auth_time' => '2007-10-11T05:25:18Z', - 'nist_auth_level' => '0'} + args = { 'auth_policies' => 'http://foo http://bar', + 'auth_time' => '2007-10-11T05:25:18Z', + 'nist_auth_level' => '0' } @req.parse_extension_args(args, true) - assert_equal(['http://foo','http://bar'], @req.auth_policies) + assert_equal(['http://foo', 'http://bar'], @req.auth_policies) assert_equal('2007-10-11T05:25:18Z', @req.auth_time) assert_equal(0, @req.nist_auth_level) end def test_parse_extension_args_nostrict_bogus - args = {'auth_policies' => 'http://foo http://bar', - 'auth_time' => 'some time ago', - 'nist_auth_level' => 'some'} + args = { 'auth_policies' => 'http://foo http://bar', + 'auth_time' => 'some time ago', + 'nist_auth_level' => 'some' } @req.parse_extension_args(args) - assert_equal(['http://foo','http://bar'], @req.auth_policies) + assert_equal(['http://foo', 'http://bar'], @req.auth_policies) assert_nil(@req.auth_time) assert_nil(@req.nist_auth_level) end - def test_from_success_response - openid_req_msg = Message.from_openid_args({ - 'mode' => 'id_res', - 'ns' => OPENID2_NS, - 'ns.pape' => PAPE::NS_URI, - 'pape.auth_policies' => [PAPE::AUTH_MULTI_FACTOR, PAPE::AUTH_PHISHING_RESISTANT].join(' '), - 'pape.auth_time' => '1983-11-05T12:30:24Z' - }) + 'mode' => 'id_res', + 'ns' => OPENID2_NS, + 'ns.pape' => PAPE::NS_URI, + 'pape.auth_policies' => [PAPE::AUTH_MULTI_FACTOR, + PAPE::AUTH_PHISHING_RESISTANT].join(' '), + 'pape.auth_time' => '1983-11-05T12:30:24Z' + }) signed_stuff = { 'auth_policies' => [PAPE::AUTH_MULTI_FACTOR, PAPE::AUTH_PHISHING_RESISTANT].join(' '), 'auth_time' => '1983-11-05T12:30:24Z' @@ -231,12 +235,13 @@ def test_from_success_response def test_from_success_response_unsigned openid_req_msg = Message.from_openid_args({ - 'mode' => 'id_res', - 'ns' => OPENID2_NS, - 'ns.pape' => PAPE::NS_URI, - 'pape.auth_policies' => [PAPE::AUTH_MULTI_FACTOR, PAPE::AUTH_PHISHING_RESISTANT].join(' '), - 'pape.auth_time' => '1983-11-05T12:30:24Z' - }) + 'mode' => 'id_res', + 'ns' => OPENID2_NS, + 'ns.pape' => PAPE::NS_URI, + 'pape.auth_policies' => [PAPE::AUTH_MULTI_FACTOR, + PAPE::AUTH_PHISHING_RESISTANT].join(' '), + 'pape.auth_time' => '1983-11-05T12:30:24Z' + }) signed_stuff = {} endpoint = OpenIDServiceEndpoint.new oid_req = Consumer::SuccessResponse.new(endpoint, openid_req_msg, signed_stuff) diff --git a/test/test_parsehtml.rb b/test/test_parsehtml.rb index 2d365289..dcbaadd0 100644 --- a/test/test_parsehtml.rb +++ b/test/test_parsehtml.rb @@ -1,48 +1,48 @@ -require "minitest/autorun" -require "testutil" -require "openid/yadis/parsehtml" +require 'minitest/autorun' +require 'testutil' +require 'openid/yadis/parsehtml' module OpenID class ParseHTMLTestCase < Minitest::Test include OpenID::TestDataMixin def test_parsehtml - reserved_values = ['None', 'EOF'] + reserved_values = %w[None EOF] chunks = read_data_file('test1-parsehtml.txt', false).split("\f\n") - chunks.each{|c| + chunks.each do |c| expected, html = c.split("\n", 2) - found = Yadis::html_yadis_location(html) + found = Yadis.html_yadis_location(html) assert(!reserved_values.member?(found)) # this case is a little hard to detect and the distinction # seems unimportant - expected = "None" if expected == "EOF" + expected = 'None' if expected == 'EOF' - found = "None" if found.nil? - assert_equal(expected, found, html.split("\n",2)[0]) - } + found = 'None' if found.nil? + assert_equal(expected, found, html.split("\n", 2)[0]) + end end end # the HTML tokenizer test class TC_TestHTMLTokenizer < Minitest::Test def test_bad_link - toke = HTMLTokenizer.new("

foo

") - assert("http://bad.com/link" == toke.getTag("a").attr_hash['href']) + toke = HTMLTokenizer.new('

foo

') + assert('http://bad.com/link' == toke.getTag('a').attr_hash['href']) end def test_namespace - toke = HTMLTokenizer.new("") - assert("http://www.com/foo" == toke.getTag("f:table").attr_hash['xmlns:f']) + toke = HTMLTokenizer.new('') + assert('http://www.com/foo' == toke.getTag('f:table').attr_hash['xmlns:f']) end def test_comment - toke = HTMLTokenizer.new("") + toke = HTMLTokenizer.new('') t = toke.getNextToken assert(HTMLComment == t.class) - assert("comment on me" == t.contents) + assert('comment on me' == t.contents) end def test_full @@ -68,12 +68,11 @@ def test_full " toke = HTMLTokenizer.new(page) - assert("

" == toke.getTag("h1", "h2", "h3").to_s.downcase) - assert(HTMLTag.new("") == toke.getTag("IMG", "A")) - assert("links" == toke.getTrimmedText) - assert(toke.getTag("IMG", "A").attr_hash['optional']) - assert("_blank" == toke.getTag("IMG", "A").attr_hash['target']) + assert('

' == toke.getTag('h1', 'h2', 'h3').to_s.downcase) + assert(HTMLTag.new('') == toke.getTag('IMG', 'A')) + assert('links' == toke.getTrimmedText) + assert(toke.getTag('IMG', 'A').attr_hash['optional']) + assert('_blank' == toke.getTag('IMG', 'A').attr_hash['target']) end end end - diff --git a/test/test_responses.rb b/test/test_responses.rb index 0f2758b0..b879969a 100644 --- a/test/test_responses.rb +++ b/test/test_responses.rb @@ -1,6 +1,6 @@ -require "minitest/autorun" -require "openid/consumer/discovery" -require "openid/consumer/responses" +require 'minitest/autorun' +require 'openid/consumer/discovery' +require 'openid/consumer/responses' module OpenID class Consumer @@ -18,15 +18,15 @@ def test_extension_response 'unittest.one' => '1', 'unittest.two' => '2', 'sreg.nickname' => 'j3h', - 'return_to' => 'return_to', + 'return_to' => 'return_to' } signed_list = q.keys.map { |k| 'openid.' + k } msg = Message.from_openid_args(q) resp = SuccessResponse.new(@endpoint, msg, signed_list) utargs = resp.extension_response('urn:unittest', false) - assert_equal(utargs, {'one' => '1', 'two' => '2'}) + assert_equal(utargs, { 'one' => '1', 'two' => '2' }) sregargs = resp.extension_response('urn:sreg', false) - assert_equal(sregargs, {'nickname' => 'j3h'}) + assert_equal(sregargs, { 'nickname' => 'j3h' }) end def test_extension_response_signed @@ -38,19 +38,19 @@ def test_extension_response_signed 'sreg.nickname' => 'j3h', 'sreg.dob' => 'yesterday', 'return_to' => 'return_to', - 'signed' => 'sreg.nickname,unittest.one,sreg.dob', + 'signed' => 'sreg.nickname,unittest.one,sreg.dob' } signed_list = ['openid.sreg.nickname', 'openid.unittest.one', - 'openid.sreg.dob',] + 'openid.sreg.dob'] msg = Message.from_openid_args(args) resp = SuccessResponse.new(@endpoint, msg, signed_list) # All args in this NS are signed, so expect all. sregargs = resp.extension_response('urn:sreg', true) - assert_equal(sregargs, {'nickname' => 'j3h', 'dob' => 'yesterday'}) + assert_equal(sregargs, { 'nickname' => 'j3h', 'dob' => 'yesterday' }) # Not all args in this NS are signed, so expect nil when # asking for them. diff --git a/test/test_server.rb b/test/test_server.rb index f3b52558..865666af 100644 --- a/test/test_server.rb +++ b/test/test_server.rb @@ -19,14 +19,13 @@ # for more, see /etc/ssh/moduli module OpenID - ALT_MODULUS = 0xCAADDDEC1667FC68B5FA15D53C4E1532DD24561A1A2D47A12C01ABEA1E00731F6921AAC40742311FDF9E634BB7131BEE1AF240261554389A910425E044E88C8359B010F5AD2B80E29CB1A5B027B19D9E01A6F63A6F45E5D7ED2FF6A2A0085050A7D0CF307C3DB51D2490355907B4427C23A98DF1EB8ABEF2BA209BB7AFFE86A7 ALT_GEN = 5 class CatchLogs def catchlogs_setup @old_logger = Util.logger - Util.logger = self.method('got_log_message') + Util.logger = method('got_log_message') @messages = [] end @@ -41,19 +40,19 @@ def teardown class TestProtocolError < Minitest::Test def test_browserWithReturnTo - return_to = "http://rp.unittest/consumer" + return_to = 'http://rp.unittest/consumer' # will be a ProtocolError raised by Decode or # CheckIDRequest.answer args = Message.from_post_args({ 'openid.mode' => 'monkeydance', 'openid.identity' => 'http://wagu.unittest/', - 'openid.return_to' => return_to, + 'openid.return_to' => return_to }) - e = Server::ProtocolError.new(args, "plucky") + e = Server::ProtocolError.new(args, 'plucky') assert(e.has_return_to) expected_args = { 'openid.mode' => 'error', - 'openid.error' => 'plucky', + 'openid.error' => 'plucky' } _, result_args = e.encode_to_url.split('?', 2) @@ -62,7 +61,7 @@ def test_browserWithReturnTo end def test_browserWithReturnTo_OpenID2_GET - return_to = "http://rp.unittest/consumer" + return_to = 'http://rp.unittest/consumer' # will be a ProtocolError raised by Decode or # CheckIDRequest.answer args = Message.from_post_args({ @@ -70,14 +69,14 @@ def test_browserWithReturnTo_OpenID2_GET 'openid.mode' => 'monkeydance', 'openid.identity' => 'http://wagu.unittest/', 'openid.claimed_id' => 'http://wagu.unittest/', - 'openid.return_to' => return_to, + 'openid.return_to' => return_to }) - e = Server::ProtocolError.new(args, "plucky") + e = Server::ProtocolError.new(args, 'plucky') assert(e.has_return_to) expected_args = { 'openid.ns' => OPENID2_NS, 'openid.mode' => 'error', - 'openid.error' => 'plucky', + 'openid.error' => 'plucky' } _, result_args = e.encode_to_url.split('?', 2) @@ -86,7 +85,7 @@ def test_browserWithReturnTo_OpenID2_GET end def test_browserWithReturnTo_OpenID2_POST - return_to = "http://rp.unittest/consumer" + ('x' * OPENID1_URL_LIMIT) + return_to = 'http://rp.unittest/consumer' + ('x' * OPENID1_URL_LIMIT) # will be a ProtocolError raised by Decode or # CheckIDRequest.answer args = Message.from_post_args({ @@ -94,29 +93,30 @@ def test_browserWithReturnTo_OpenID2_POST 'openid.mode' => 'monkeydance', 'openid.identity' => 'http://wagu.unittest/', 'openid.claimed_id' => 'http://wagu.unittest/', - 'openid.return_to' => return_to, + 'openid.return_to' => return_to }) - e = Server::ProtocolError.new(args, "plucky") + e = Server::ProtocolError.new(args, 'plucky') assert(e.has_return_to) assert(e.which_encoding == Server::ENCODE_HTML_FORM) assert(e.to_form_markup == e.to_message.to_form_markup( - args.get_arg(OPENID_NS, 'return_to'))) + args.get_arg(OPENID_NS, 'return_to') + )) end def test_browserWithReturnTo_OpenID1_exceeds_limit - return_to = "http://rp.unittest/consumer" + ('x' * OPENID1_URL_LIMIT) + return_to = 'http://rp.unittest/consumer' + ('x' * OPENID1_URL_LIMIT) # will be a ProtocolError raised by Decode or # CheckIDRequest.answer args = Message.from_post_args({ 'openid.mode' => 'monkeydance', 'openid.identity' => 'http://wagu.unittest/', - 'openid.return_to' => return_to, + 'openid.return_to' => return_to }) - e = Server::ProtocolError.new(args, "plucky") + e = Server::ProtocolError.new(args, 'plucky') assert(e.has_return_to) expected_args = { 'openid.mode' => 'error', - 'openid.error' => 'plucky', + 'openid.error' => 'plucky' } assert(e.which_encoding == Server::ENCODE_URL) @@ -131,22 +131,22 @@ def test_noReturnTo # CheckIDRequest.answer args = Message.from_post_args({ 'openid.mode' => 'zebradance', - 'openid.identity' => 'http://wagu.unittest/', + 'openid.identity' => 'http://wagu.unittest/' }) - e = Server::ProtocolError.new(args, "waffles") + e = Server::ProtocolError.new(args, 'waffles') assert(!e.has_return_to) expected = "error:waffles\nmode:error\n" assert_equal(e.encode_to_kvform, expected) end def test_no_message - e = Server::ProtocolError.new(nil, "no message") + e = Server::ProtocolError.new(nil, 'no message') assert(e.get_return_to.nil?) assert_nil(e.which_encoding) end def test_which_encoding_no_message - e = Server::ProtocolError.new(nil, "no message") + e = Server::ProtocolError.new(nil, 'no message') assert(e.which_encoding.nil?) end end @@ -154,12 +154,12 @@ def test_which_encoding_no_message class TestDecode < Minitest::Test def setup @claimed_id = 'http://de.legating.de.coder.unittest/' - @id_url = "http://decoder.am.unittest/" - @rt_url = "http://rp.unittest/foobot/?qux=zam" - @tr_url = "http://rp.unittest/" - @assoc_handle = "{assoc}{handle}" + @id_url = 'http://decoder.am.unittest/' + @rt_url = 'http://rp.unittest/foobot/?qux=zam' + @tr_url = 'http://rp.unittest/' + @assoc_handle = '{assoc}{handle}' @op_endpoint = 'http://endpoint.unittest/encode' - @store = Store::Memory.new() + @store = Store::Memory.new @server = Server::Server.new(@store, @op_endpoint) @decode = Server::Decoder.new(@server).method('decode') end @@ -173,21 +173,21 @@ def test_none def test_irrelevant args = { 'pony' => 'spotted', - 'sreg.mutant_power' => 'decaffinator', + 'sreg.mutant_power' => 'decaffinator' } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_bad args = { 'openid.mode' => 'twos-compliment', - 'openid.pants' => 'zippered', + 'openid.pants' => 'zippered' } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_dictOfLists @@ -196,12 +196,12 @@ def test_dictOfLists 'openid.identity' => @id_url, 'openid.assoc_handle' => @assoc_handle, 'openid.return_to' => @rt_url, - 'openid.trust_root' => @tr_url, + 'openid.trust_root' => @tr_url } begin result = @decode.call(args) - rescue ArgumentError => err - assert !err.to_s.index('values').nil? + rescue ArgumentError => e + assert !e.to_s.index('values').nil? else flunk("Expected ArgumentError, but got result #{result}") end @@ -215,11 +215,11 @@ def test_checkidImmediate 'openid.return_to' => @rt_url, 'openid.trust_root' => @tr_url, # should be ignored - 'openid.some.extension' => 'junk', + 'openid.some.extension' => 'junk' } r = @decode.call(args) assert(r.is_a?(Server::CheckIDRequest)) - assert_equal(r.mode, "checkid_immediate") + assert_equal(r.mode, 'checkid_immediate') assert_equal(r.immediate, true) assert_equal(r.identity, @id_url) assert_equal(r.trust_root, @tr_url) @@ -240,12 +240,12 @@ def test_checkid_missing_return_to_and_trust_root 'openid.mode' => 'checkid_setup', 'openid.identity' => @id_url, 'openid.claimed_id' => @id_url, - 'openid.assoc_handle' => @assoc_handle, + 'openid.assoc_handle' => @assoc_handle } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do m = Message.from_post_args(args) Server::CheckIDRequest.from_message(m, @op_endpoint) - } + end end def test_checkid_id_select @@ -256,7 +256,7 @@ def test_checkid_id_select 'openid.claimed_id' => IDENTIFIER_SELECT, 'openid.assoc_handle' => @assoc_handle, 'openid.return_to' => @rt_url, - 'openid.realm' => @tr_url, + 'openid.realm' => @tr_url } m = Message.from_post_args(args) req = Server::CheckIDRequest.from_message(m, @op_endpoint) @@ -269,22 +269,22 @@ def test_checkid_not_id_select 'openid.mode' => 'checkid_setup', 'openid.assoc_handle' => @assoc_handle, 'openid.return_to' => @rt_url, - 'openid.realm' => @tr_url, + 'openid.realm' => @tr_url } id_args = [ - {'openid.claimed_id' => IDENTIFIER_SELECT, - 'openid.identity' => 'http://bogus.com/'}, + { 'openid.claimed_id' => IDENTIFIER_SELECT, + 'openid.identity' => 'http://bogus.com/' }, - {'openid.claimed_id' => 'http://bogus.com/', - 'openid.identity' => 'http://bogus.com/'}, - ] + { 'openid.claimed_id' => 'http://bogus.com/', + 'openid.identity' => 'http://bogus.com/' } + ] - id_args.each { |id| + id_args.each do |id| m = Message.from_post_args(args.merge(id)) req = Server::CheckIDRequest.from_message(m, @op_endpoint) assert(!req.id_select) - } + end end def test_checkidSetup @@ -293,11 +293,11 @@ def test_checkidSetup 'openid.identity' => @id_url, 'openid.assoc_handle' => @assoc_handle, 'openid.return_to' => @rt_url, - 'openid.trust_root' => @tr_url, + 'openid.trust_root' => @tr_url } r = @decode.call(args) assert(r.is_a?(Server::CheckIDRequest)) - assert_equal(r.mode, "checkid_setup") + assert_equal(r.mode, 'checkid_setup') assert_equal(r.immediate, false) assert_equal(r.identity, @id_url) assert_equal(r.trust_root, @tr_url) @@ -312,11 +312,11 @@ def test_checkidSetupOpenID2 'openid.claimed_id' => @claimed_id, 'openid.assoc_handle' => @assoc_handle, 'openid.return_to' => @rt_url, - 'openid.realm' => @tr_url, + 'openid.realm' => @tr_url } r = @decode.call(args) assert(r.is_a?(Server::CheckIDRequest)) - assert_equal(r.mode, "checkid_setup") + assert_equal(r.mode, 'checkid_setup') assert_equal(r.immediate, false) assert_equal(r.identity, @id_url) assert_equal(r.claimed_id, @claimed_id) @@ -331,11 +331,11 @@ def test_checkidSetupNoClaimedIDOpenID2 'openid.identity' => @id_url, 'openid.assoc_handle' => @assoc_handle, 'openid.return_to' => @rt_url, - 'openid.realm' => @tr_url, + 'openid.realm' => @tr_url } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_checkidSetupNoIdentityOpenID2 @@ -344,11 +344,11 @@ def test_checkidSetupNoIdentityOpenID2 'openid.mode' => 'checkid_setup', 'openid.assoc_handle' => @assoc_handle, 'openid.return_to' => @rt_url, - 'openid.realm' => @tr_url, + 'openid.realm' => @tr_url } r = @decode.call(args) assert(r.is_a?(Server::CheckIDRequest)) - assert_equal(r.mode, "checkid_setup") + assert_equal(r.mode, 'checkid_setup') assert_equal(r.immediate, false) assert_nil(r.identity) assert_equal(r.trust_root, @tr_url) @@ -362,11 +362,11 @@ def test_checkidSetupNoReturnOpenID1 'openid.mode' => 'checkid_setup', 'openid.identity' => @id_url, 'openid.assoc_handle' => @assoc_handle, - 'openid.trust_root' => @tr_url, + 'openid.trust_root' => @tr_url } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_checkidSetupNoReturnOpenID2 @@ -379,23 +379,23 @@ def test_checkidSetupNoReturnOpenID2 'openid.identity' => @id_url, 'openid.claimed_id' => @id_url, 'openid.assoc_handle' => @assoc_handle, - 'openid.realm' => @tr_url, + 'openid.realm' => @tr_url } req = @decode.call(args) assert(req.is_a?(Server::CheckIDRequest)) - assert_raises(Server::NoReturnToError) { + assert_raises(Server::NoReturnToError) do req.answer(false) - } + end - assert_raises(Server::NoReturnToError) { + assert_raises(Server::NoReturnToError) do req.encode_to_url('bogus') - } + end - assert_raises(Server::NoReturnToError) { + assert_raises(Server::NoReturnToError) do req.cancel_url - } + end end def test_checkidSetupRealmRequiredOpenID2 @@ -406,11 +406,11 @@ def test_checkidSetupRealmRequiredOpenID2 'openid.ns' => OPENID2_NS, 'openid.mode' => 'checkid_setup', 'openid.identity' => @id_url, - 'openid.assoc_handle' => @assoc_handle, + 'openid.assoc_handle' => @assoc_handle } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_checkidSetupBadReturn @@ -418,12 +418,12 @@ def test_checkidSetupBadReturn 'openid.mode' => 'checkid_setup', 'openid.identity' => @id_url, 'openid.assoc_handle' => @assoc_handle, - 'openid.return_to' => 'not a url', + 'openid.return_to' => 'not a url' } begin result = @decode.call(args) - rescue Server::ProtocolError => err - assert(err.openid_message) + rescue Server::ProtocolError => e + assert(e.openid_message) else flunk("Expected ProtocolError, instead returned with #{result}") end @@ -435,31 +435,31 @@ def test_checkidSetupUntrustedReturn 'openid.identity' => @id_url, 'openid.assoc_handle' => @assoc_handle, 'openid.return_to' => @rt_url, - 'openid.trust_root' => 'http://not-the-return-place.unittest/', + 'openid.trust_root' => 'http://not-the-return-place.unittest/' } begin result = @decode.call(args) - rescue Server::UntrustedReturnURL => err - assert(err.openid_message, err.to_s) + rescue Server::UntrustedReturnURL => e + assert(e.openid_message, e.to_s) else flunk("Expected UntrustedReturnURL, instead returned with #{result}") end end def test_checkidSetupUntrustedReturn_Constructor - assert_raises(Server::UntrustedReturnURL) { + assert_raises(Server::UntrustedReturnURL) do Server::CheckIDRequest.new(@id_url, @rt_url, nil, 'http://not-the-return-place.unittest/', false, @assoc_handle) - } + end end def test_checkidSetupMalformedReturnURL_Constructor - assert_raises(Server::MalformedReturnURL) { + assert_raises(Server::MalformedReturnURL) do Server::CheckIDRequest.new(@id_url, 'bogus://return.url', nil, 'http://trustroot.com/', false, @assoc_handle) - } + end end def test_checkAuth @@ -471,7 +471,7 @@ def test_checkAuth 'openid.identity' => 'signedval1', 'openid.return_to' => 'signedval2', 'openid.response_nonce' => 'signedval3', - 'openid.baz' => 'unsigned', + 'openid.baz' => 'unsigned' } r = @decode.call(args) assert(r.is_a?(Server::CheckAuthRequest)) @@ -486,11 +486,11 @@ def test_checkAuthMissingSignature 'openid.signed' => 'foo,bar,mode', 'openid.foo' => 'signedval1', 'openid.bar' => 'signedval2', - 'openid.baz' => 'unsigned', + 'openid.baz' => 'unsigned' } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_checkAuthAndInvalidate @@ -503,7 +503,7 @@ def test_checkAuthAndInvalidate 'openid.identity' => 'signedval1', 'openid.return_to' => 'signedval2', 'openid.response_nonce' => 'signedval3', - 'openid.baz' => 'unsigned', + 'openid.baz' => 'unsigned' } r = @decode.call(args) assert(r.is_a?(Server::CheckAuthRequest)) @@ -514,13 +514,13 @@ def test_associateDH args = { 'openid.mode' => 'associate', 'openid.session_type' => 'DH-SHA1', - 'openid.dh_consumer_public' => "Rzup9265tw==", + 'openid.dh_consumer_public' => 'Rzup9265tw==' } r = @decode.call(args) assert(r.is_a?(Server::AssociateRequest)) - assert_equal(r.mode, "associate") - assert_equal(r.session.session_type, "DH-SHA1") - assert_equal(r.assoc_type, "HMAC-SHA1") + assert_equal(r.mode, 'associate') + assert_equal(r.session.session_type, 'DH-SHA1') + assert_equal(r.assoc_type, 'HMAC-SHA1') assert(r.session.consumer_pubkey) end @@ -528,23 +528,23 @@ def test_associateDHMissingKey # Trying DH assoc w/o public key args = { 'openid.mode' => 'associate', - 'openid.session_type' => 'DH-SHA1', + 'openid.session_type' => 'DH-SHA1' } # Using DH-SHA1 without supplying dh_consumer_public is an error. - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_associateDHpubKeyNotB64 args = { 'openid.mode' => 'associate', 'openid.session_type' => 'DH-SHA1', - 'openid.dh_consumer_public' => "donkeydonkeydonkey", + 'openid.dh_consumer_public' => 'donkeydonkeydonkey' } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_associateDHModGen @@ -553,15 +553,15 @@ def test_associateDHModGen args = { 'openid.mode' => 'associate', 'openid.session_type' => 'DH-SHA1', - 'openid.dh_consumer_public' => "Rzup9265tw==", + 'openid.dh_consumer_public' => 'Rzup9265tw==', 'openid.dh_modulus' => CryptUtil.num_to_base64(ALT_MODULUS), - 'openid.dh_gen' => CryptUtil.num_to_base64(ALT_GEN) , + 'openid.dh_gen' => CryptUtil.num_to_base64(ALT_GEN) } r = @decode.call(args) assert(r.is_a?(Server::AssociateRequest)) - assert_equal(r.mode, "associate") - assert_equal(r.session.session_type, "DH-SHA1") - assert_equal(r.assoc_type, "HMAC-SHA1") + assert_equal(r.mode, 'associate') + assert_equal(r.session.session_type, 'DH-SHA1') + assert_equal(r.assoc_type, 'HMAC-SHA1') assert_equal(r.session.dh.modulus, ALT_MODULUS) assert_equal(r.session.dh.generator, ALT_GEN) assert(r.session.consumer_pubkey) @@ -573,37 +573,37 @@ def test_associateDHCorruptModGen args = { 'openid.mode' => 'associate', 'openid.session_type' => 'DH-SHA1', - 'openid.dh_consumer_public' => "Rzup9265tw==", + 'openid.dh_consumer_public' => 'Rzup9265tw==', 'openid.dh_modulus' => 'pizza', - 'openid.dh_gen' => 'gnocchi', + 'openid.dh_gen' => 'gnocchi' } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_associateDHMissingGen args = { 'openid.mode' => 'associate', 'openid.session_type' => 'DH-SHA1', - 'openid.dh_consumer_public' => "Rzup9265tw==", - 'openid.dh_modulus' => 'pizza', + 'openid.dh_consumer_public' => 'Rzup9265tw==', + 'openid.dh_modulus' => 'pizza' } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_associateDHMissingMod args = { 'openid.mode' => 'associate', 'openid.session_type' => 'DH-SHA1', - 'openid.dh_consumer_public' => "Rzup9265tw==", - 'openid.dh_gen' => 'pizza', + 'openid.dh_consumer_public' => 'Rzup9265tw==', + 'openid.dh_gen' => 'pizza' } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end # def test_associateDHInvalidModGen(self): @@ -623,55 +623,55 @@ def test_associateWeirdSession args = { 'openid.mode' => 'associate', 'openid.session_type' => 'FLCL6', - 'openid.dh_consumer_public' => "YQ==\n", + 'openid.dh_consumer_public' => "YQ==\n" } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_associatePlain args = { - 'openid.mode' => 'associate', + 'openid.mode' => 'associate' } r = @decode.call(args) assert(r.is_a?(Server::AssociateRequest)) - assert_equal(r.mode, "associate") - assert_equal(r.session.session_type, "no-encryption") - assert_equal(r.assoc_type, "HMAC-SHA1") + assert_equal(r.mode, 'associate') + assert_equal(r.session.session_type, 'no-encryption') + assert_equal(r.assoc_type, 'HMAC-SHA1') end def test_nomode args = { 'openid.session_type' => 'DH-SHA1', - 'openid.dh_consumer_public' => "my public keeey", + 'openid.dh_consumer_public' => 'my public keeey' } - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @decode.call(args) - } + end end def test_invalidns - args = {'openid.ns' => 'Vegetables', - 'openid.mode' => 'associate'} + args = { 'openid.ns' => 'Vegetables', + 'openid.mode' => 'associate' } begin @decode.call(args) - rescue Server::ProtocolError => err - assert(err.openid_message) - assert(err.to_s.index('Vegetables')) + rescue Server::ProtocolError => e + assert(e.openid_message) + assert(e.to_s.index('Vegetables')) end end end class BogusEncoder < Server::Encoder - def encode(response) - return "BOGUS" + def encode(_response) + 'BOGUS' end end class BogusDecoder < Server::Decoder - def decode(query) - return "BOGUS" + def decode(_query) + 'BOGUS' end end @@ -688,12 +688,13 @@ def test_id_res_OpenID2_GET # Check that when an OpenID 2 response does not exceed the OpenID # 1 message size, a GET response (i.e., redirect) is issued. request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, - nil) + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, + nil + ) request.message = Message.new(OPENID2_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ @@ -701,7 +702,7 @@ def test_id_res_OpenID2_GET 'mode' => 'id_res', 'identity' => request.identity, 'claimed_id' => request.identity, - 'return_to' => request.return_to, + 'return_to' => request.return_to }) assert(!response.render_as_form) @@ -714,12 +715,13 @@ def test_id_res_OpenID2_POST # Check that when an OpenID 2 response exceeds the OpenID 1 # message size, a POST response (i.e., an HTML form) is returned. request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, - nil) + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, + nil + ) request.message = Message.new(OPENID2_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ @@ -727,7 +729,7 @@ def test_id_res_OpenID2_POST 'mode' => 'id_res', 'identity' => request.identity, 'claimed_id' => request.identity, - 'return_to' => 'x' * OPENID1_URL_LIMIT, + 'return_to' => 'x' * OPENID1_URL_LIMIT }) assert(response.render_as_form) @@ -738,13 +740,14 @@ def test_id_res_OpenID2_POST end def test_to_form_markup - request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, - nil) + request = Server::CheckIDRequest.new( + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, + nil + ) request.message = Message.new(OPENID2_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ @@ -752,20 +755,21 @@ def test_to_form_markup 'mode' => 'id_res', 'identity' => request.identity, 'claimed_id' => request.identity, - 'return_to' => 'x' * OPENID1_URL_LIMIT, + 'return_to' => 'x' * OPENID1_URL_LIMIT }) - form_markup = response.to_form_markup({'foo'=>'bar'}) + form_markup = response.to_form_markup({ 'foo' => 'bar' }) assert(/ foo="bar"/ =~ form_markup, form_markup) end def test_to_html - request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, - nil) + request = Server::CheckIDRequest.new( + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, + nil + ) request.message = Message.new(OPENID2_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ @@ -773,7 +777,7 @@ def test_to_html 'mode' => 'id_res', 'identity' => request.identity, 'claimed_id' => request.identity, - 'return_to' => 'x' * OPENID1_URL_LIMIT, + 'return_to' => 'x' * OPENID1_URL_LIMIT }) html = response.to_html assert(html) @@ -785,19 +789,20 @@ def test_id_res_OpenID1_exceeds_limit # shouldn't be permitted by the library, but this test is in place # to preserve the status quo for OpenID 1. request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, - nil) + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, + nil + ) request.message = Message.new(OPENID1_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ 'mode' => 'id_res', 'identity' => request.identity, - 'return_to' => 'x' * OPENID1_URL_LIMIT, + 'return_to' => 'x' * OPENID1_URL_LIMIT }) assert(!response.render_as_form) @@ -809,17 +814,18 @@ def test_id_res_OpenID1_exceeds_limit def test_id_res request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, nil) + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, nil + ) request.message = Message.new(OPENID1_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ 'mode' => 'id_res', 'identity' => request.identity, - 'return_to' => request.return_to, + 'return_to' => request.return_to }) webresponse = @encode.call(response) assert_equal(webresponse.code, Server::HTTP_REDIRECT) @@ -827,25 +833,26 @@ def test_id_res location = webresponse.headers['location'] assert(location.start_with?(request.return_to), - sprintf("%s does not start with %s", - location, request.return_to)) + format('%s does not start with %s', + location, request.return_to)) # argh. - q2 = Util.parse_query(URI::parse(location).query) + q2 = Util.parse_query(URI.parse(location).query) expected = response.fields.to_post_args assert_equal(q2, expected) end def test_cancel request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, nil) + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, nil + ) request.message = Message.new(OPENID2_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ - 'mode' => 'cancel', + 'mode' => 'cancel' }) webresponse = @encode.call(response) assert_equal(webresponse.code, Server::HTTP_REDIRECT) @@ -854,15 +861,16 @@ def test_cancel def test_cancel_to_form request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, nil) + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, nil + ) request.message = Message.new(OPENID2_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ - 'mode' => 'cancel', + 'mode' => 'cancel' }) form = response.to_form_markup assert(form.index(request.return_to)) @@ -874,7 +882,8 @@ def test_assocReply request = Server::AssociateRequest.from_message(msg) response = Server::OpenIDResponse.new(request) response.fields = Message.from_post_args( - {'openid.assoc_handle' => "every-zig"}) + { 'openid.assoc_handle' => 'every-zig' } + ) webresponse = @encode.call(response) body = "assoc_handle:every-zig\n" @@ -885,8 +894,8 @@ def test_assocReply def test_checkauthReply request = Server::CheckAuthRequest.new('a_sock_monkey', - 'siggggg', - []) + 'siggggg', + []) request.message = Message.new(OPENID2_NS) response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ @@ -903,21 +912,21 @@ def test_checkauthReply def test_unencodableError args = Message.from_post_args({ - 'openid.identity' => 'http://limu.unittest/', + 'openid.identity' => 'http://limu.unittest/' }) - e = Server::ProtocolError.new(args, "wet paint") - assert_raises(Server::EncodingError) { + e = Server::ProtocolError.new(args, 'wet paint') + assert_raises(Server::EncodingError) do @encode.call(e) - } + end end def test_encodableError args = Message.from_post_args({ 'openid.mode' => 'associate', - 'openid.identity' => 'http://limu.unittest/', + 'openid.identity' => 'http://limu.unittest/' }) - body="error:snoot\nmode:error\n" - webresponse = @encode.call(Server::ProtocolError.new(args, "snoot")) + body = "error:snoot\nmode:error\n" + webresponse = @encode.call(Server::ProtocolError.new(args, 'snoot')) assert_equal(webresponse.code, Server::HTTP_ERROR) assert_equal(webresponse.headers, {}) assert_equal(webresponse.body, body) @@ -928,21 +937,22 @@ class TestSigningEncode < Minitest::Test def setup @_dumb_key = Server::Signatory._dumb_key @_normal_key = Server::Signatory._normal_key - @store = Store::Memory.new() - @server = Server::Server.new(@store, "http://signing.unittest/enc") + @store = Store::Memory.new + @server = Server::Server.new(@store, 'http://signing.unittest/enc') @request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, nil) + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, nil + ) @request.message = Message.new(OPENID2_NS) @response = Server::OpenIDResponse.new(@request) @response.fields = Message.from_openid_args({ 'mode' => 'id_res', 'identity' => @request.identity, - 'return_to' => @request.return_to, + 'return_to' => @request.return_to }) @signatory = Server::Signatory.new(@store) @encoder = Server::SigningEncoder.new(@signatory) @@ -952,16 +962,17 @@ def setup def test_idres assoc_handle = '{bicycle}{shed}' @store.store_association( - @_normal_key, - Association.from_expires_in(60, assoc_handle, - 'sekrit', 'HMAC-SHA1')) + @_normal_key, + Association.from_expires_in(60, assoc_handle, + 'sekrit', 'HMAC-SHA1') + ) @request.assoc_handle = assoc_handle webresponse = @encode.call(@response) assert_equal(webresponse.code, Server::HTTP_REDIRECT) assert(webresponse.headers.member?('location')) location = webresponse.headers['location'] - query = Util.parse_query(URI::parse(location).query) + query = Util.parse_query(URI.parse(location).query) assert(query.member?('openid.sig')) assert(query.member?('openid.assoc_handle')) assert(query.member?('openid.signed')) @@ -973,7 +984,7 @@ def test_idresDumb assert(webresponse.headers.has_key?('location')) location = webresponse.headers['location'] - query = Util.parse_query(URI::parse(location).query) + query = Util.parse_query(URI.parse(location).query) assert(query.member?('openid.sig')) assert(query.member?('openid.assoc_handle')) assert(query.member?('openid.signed')) @@ -981,18 +992,19 @@ def test_idresDumb def test_forgotStore @encoder.signatory = nil - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @encode.call(@response) - } + end end def test_cancel request = Server::CheckIDRequest.new( - 'http://bombom.unittest/', - 'http://burr.unittest/999', - @server.op_endpoint, - 'http://burr.unittest/', - false, nil) + 'http://bombom.unittest/', + 'http://burr.unittest/999', + @server.op_endpoint, + 'http://burr.unittest/', + false, nil + ) request.message = Message.new(OPENID2_NS) response = Server::OpenIDResponse.new(request) response.fields.set_arg(OPENID_NS, 'mode', 'cancel') @@ -1000,7 +1012,7 @@ def test_cancel assert_equal(webresponse.code, Server::HTTP_REDIRECT) assert(webresponse.headers.has_key?('location')) location = webresponse.headers['location'] - query = Util.parse_query(URI::parse(location).query) + query = Util.parse_query(URI.parse(location).query) assert !query.has_key?('openid.sig') end @@ -1009,7 +1021,7 @@ def test_assocReply msg.set_arg(OPENID2_NS, 'session_type', 'no-encryption') request = Server::AssociateRequest.from_message(msg) response = Server::OpenIDResponse.new(request) - response.fields = Message.from_openid_args({'assoc_handle' => "every-zig"}) + response.fields = Message.from_openid_args({ 'assoc_handle' => 'every-zig' }) webresponse = @encode.call(response) body = "assoc_handle:every-zig\n" assert_equal(webresponse.code, Server::HTTP_OK) @@ -1019,39 +1031,40 @@ def test_assocReply def test_alreadySigned @response.fields.set_arg(OPENID_NS, 'sig', 'priorSig==') - assert_raises(Server::AlreadySigned) { + assert_raises(Server::AlreadySigned) do @encode.call(@response) - } + end end end class TestCheckID < Minitest::Test def setup @op_endpoint = 'http://endpoint.unittest/' - @store = Store::Memory.new() + @store = Store::Memory.new @server = Server::Server.new(@store, @op_endpoint) @request = Server::CheckIDRequest.new( - 'http://bambam.unittest/', - 'http://bar.unittest/999', - @server.op_endpoint, - 'http://bar.unittest/', - false) + 'http://bambam.unittest/', + 'http://bar.unittest/999', + @server.op_endpoint, + 'http://bar.unittest/', + false + ) @request.message = Message.new(OPENID2_NS) end def test_trustRootInvalid - @request.trust_root = "http://foo.unittest/17" - @request.return_to = "http://foo.unittest/39" - assert(!@request.trust_root_valid()) + @request.trust_root = 'http://foo.unittest/17' + @request.return_to = 'http://foo.unittest/39' + assert(!@request.trust_root_valid) end def test_trustRootInvalid_modified - @request.trust_root = "does://not.parse/" + @request.trust_root = 'does://not.parse/' @request.message = :sentinel begin result = @request.trust_root_valid - rescue Server::MalformedTrustRoot => why - assert_equal(:sentinel, why.openid_message) + rescue Server::MalformedTrustRoot => e + assert_equal(:sentinel, e.openid_message) else flunk("Expected MalformedTrustRoot, got #{result.inspect}") end @@ -1059,96 +1072,95 @@ def test_trustRootInvalid_modified def test_trustRootvalid_absent_trust_root @request.trust_root = nil - assert(@request.trust_root_valid()) + assert(@request.trust_root_valid) end def test_trustRootValid - @request.trust_root = "http://foo.unittest/" - @request.return_to = "http://foo.unittest/39" - assert(@request.trust_root_valid()) + @request.trust_root = 'http://foo.unittest/' + @request.return_to = 'http://foo.unittest/39' + assert(@request.trust_root_valid) end def test_trustRootValidNoReturnTo request = Server::CheckIDRequest.new( - 'http://bambam.unittest/', - nil, - @server.op_endpoint, - 'http://bar.unittest/', - false) + 'http://bambam.unittest/', + nil, + @server.op_endpoint, + 'http://bar.unittest/', + false + ) - assert(request.trust_root_valid()) + assert(request.trust_root_valid) end def test_returnToVerified_callsVerify # Make sure that verifyReturnTo is calling the trustroot # function verifyReturnTo # Ensure that exceptions are passed through - sentinel = Exception.new() + sentinel = Exception.new __req = @request tc = self - vrfyExc = Proc.new { |trust_root, return_to| + vrfyExc = proc do |trust_root, return_to| tc.assert_equal(__req.trust_root, trust_root) tc.assert_equal(__req.return_to, return_to) raise sentinel - } + end TrustRoot.extend(OverrideMethodMixin) TrustRoot.with_method_overridden(:verify_return_to, vrfyExc) do - begin - @request.return_to_verified() - flunk("Expected sentinel to be raised, got success") - rescue Exception => e - assert(e.equal?(sentinel), [e, sentinel].inspect) - end + @request.return_to_verified + flunk('Expected sentinel to be raised, got success') + rescue Exception => e + assert(e.equal?(sentinel), [e, sentinel].inspect) end # Ensure that True and False are passed through unchanged - constVerify = Proc.new { |val| - verify = Proc.new { |trust_root, return_to| + constVerify = proc do |val| + verify = proc do |trust_root, return_to| tc.assert_equal(__req.trust_root, trust_root) tc.assert_equal(__req.request.return_to, return_to) return val - } + end return verify - } + end - [true, false].each { |val| + [true, false].each do |val| verifier = constVerify.call(val) TrustRoot.with_method_overridden(:verify_return_to, verifier) do - assert_equal(val, @request.return_to_verified()) + assert_equal(val, @request.return_to_verified) end - } + end end - def _expectAnswer(answer, identity=nil, claimed_id=nil) + def _expectAnswer(answer, identity = nil, claimed_id = nil) expected_list = [ - ['mode', 'id_res'], - ['return_to', @request.return_to], - ['op_endpoint', @op_endpoint], - ] + %w[mode id_res], + ['return_to', @request.return_to], + ['op_endpoint', @op_endpoint] + ] if identity expected_list << ['identity', identity] - if claimed_id - expected_list << ['claimed_id', claimed_id] - else - expected_list << ['claimed_id', identity] - end + expected_list << if claimed_id + ['claimed_id', claimed_id] + else + ['claimed_id', identity] + end end - expected_list.each { |k, expected| + expected_list.each do |k, expected| actual = answer.fields.get_arg(OPENID_NS, k) assert_equal(expected, actual, - sprintf("%s: expected %s, got %s", - k, expected, actual)) - } + format('%s: expected %s, got %s', + k, expected, actual)) + end assert(answer.fields.has_key?(OPENID_NS, 'response_nonce')) - assert(answer.fields.get_openid_namespace() == OPENID2_NS) + assert(answer.fields.get_openid_namespace == OPENID2_NS) # One for nonce, one for ns assert_equal(answer.fields.to_post_args.length, @@ -1184,9 +1196,9 @@ def test_answerAllowAnonymousFail @request.identity = nil # XXX - Check on this, I think this behavior is legal in OpenID # 2.0? - assert_raises(ArgumentError) { - @request.answer(true, nil, "=V") - } + assert_raises(ArgumentError) do + @request.answer(true, nil, '=V') + end end def test_answerAllowWithIdentity @@ -1198,9 +1210,9 @@ def test_answerAllowWithIdentity def test_answerAllowWithNoIdentity @request.identity = IDENTIFIER_SELECT - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @request.answer(true, nil, nil) - } + end end def test_immediate_openid1_no_identity @@ -1225,30 +1237,30 @@ def test_immediate_openid1_no_server_url @request.mode = 'checkid_immediate' @request.op_endpoint = nil - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @request.answer(false) - } + end end def test_immediate_encode_to_url @request.message = Message.new(OPENID1_NS) @request.immediate = true @request.mode = 'checkid_immediate' - @request.trust_root = "BOGUS" - @request.assoc_handle = "ASSOC" + @request.trust_root = 'BOGUS' + @request.assoc_handle = 'ASSOC' - server_url = "http://server.com/server" + server_url = 'http://server.com/server' url = @request.encode_to_url(server_url) assert(url.start_with?(server_url)) - _, query = url.split("?", 2) + _, query = url.split('?', 2) args = Util.parse_query(query) m = Message.from_post_args(args) - assert(m.get_arg(OPENID_NS, 'trust_root') == "BOGUS") - assert(m.get_arg(OPENID_NS, 'assoc_handle') == "ASSOC") - assert(m.get_arg(OPENID_NS, 'mode'), "checkid_immediate") + assert(m.get_arg(OPENID_NS, 'trust_root') == 'BOGUS') + assert(m.get_arg(OPENID_NS, 'assoc_handle') == 'ASSOC') + assert(m.get_arg(OPENID_NS, 'mode'), 'checkid_immediate') assert(m.get_arg(OPENID_NS, 'identity') == @request.identity) assert(m.get_arg(OPENID_NS, 'claimed_id') == @request.claimed_id) assert(m.get_arg(OPENID_NS, 'return_to') == @request.return_to) @@ -1272,32 +1284,32 @@ def test_answerAllowWithDelegatedIdentityOpenID1 @request.identity = IDENTIFIER_SELECT selected_id = 'http://anon.unittest/9861' claimed_id = 'http://monkeyhat.unittest/' - assert_raises(Server::VersionError) { + assert_raises(Server::VersionError) do @request.answer(true, nil, selected_id, claimed_id) - } + end end def test_answerAllowWithAnotherIdentity # XXX - Check on this, I think this behavior is legal in OpenID # 2.0? - assert_raises(ArgumentError){ - @request.answer(true, nil, "http://pebbles.unittest/") - } + assert_raises(ArgumentError) do + @request.answer(true, nil, 'http://pebbles.unittest/') + end end def test_answerAllowNoIdentityOpenID1 @request.message = Message.new(OPENID1_NS) @request.identity = nil - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @request.answer(true, nil, nil) - } + end end def test_answerAllowForgotEndpoint @request.op_endpoint = nil - assert_raises(RuntimeError) { + assert_raises(RuntimeError) do @request.answer(true) - } + end end def test_checkIDWithNoIdentityOpenID1 @@ -1307,9 +1319,9 @@ def test_checkIDWithNoIdentityOpenID1 msg.set_arg(OPENID_NS, 'mode', 'checkid_setup') msg.set_arg(OPENID_NS, 'assoc_handle', 'bogus') - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do Server::CheckIDRequest.from_message(msg, @server) - } + end end def test_fromMessageClaimedIDWithoutIdentityOpenID2 @@ -1318,9 +1330,9 @@ def test_fromMessageClaimedIDWithoutIdentityOpenID2 msg.set_arg(OPENID_NS, 'return_to', 'http://invalid:8000/rt') msg.set_arg(OPENID_NS, 'claimed_id', 'https://example.myopenid.com') - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do Server::CheckIDRequest.from_message(msg, @server) - } + end end def test_fromMessageIdentityWithoutClaimedIDOpenID2 @@ -1329,22 +1341,22 @@ def test_fromMessageIdentityWithoutClaimedIDOpenID2 msg.set_arg(OPENID_NS, 'return_to', 'http://invalid:8000/rt') msg.set_arg(OPENID_NS, 'identity', 'https://example.myopenid.com') - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do Server::CheckIDRequest.from_message(msg, @server) - } + end end def test_fromMessageWithEmptyTrustRoot return_to = 'http://some.url/foo?bar=baz' msg = Message.from_post_args({ - 'openid.assoc_handle' => '{blah}{blah}{OZivdQ==}', - 'openid.claimed_id' => 'http://delegated.invalid/', - 'openid.identity' => 'http://op-local.example.com/', - 'openid.mode' => 'checkid_setup', - 'openid.ns' => 'http://openid.net/signon/1.0', - 'openid.return_to' => return_to, - 'openid.trust_root' => '' - }); + 'openid.assoc_handle' => '{blah}{blah}{OZivdQ==}', + 'openid.claimed_id' => 'http://delegated.invalid/', + 'openid.identity' => 'http://op-local.example.com/', + 'openid.mode' => 'checkid_setup', + 'openid.ns' => 'http://openid.net/signon/1.0', + 'openid.return_to' => return_to, + 'openid.trust_root' => '' + }) result = Server::CheckIDRequest.from_message(msg, @server) assert_equal(return_to, result.trust_root) end @@ -1396,7 +1408,7 @@ def test_answerImmediateDenyOpenID2 @request.mode = 'checkid_immediate' @request.immediate = true - server_url = "http://setup-url.unittest/" + server_url = 'http://setup-url.unittest/' # crappiting setup_url, you dirty my interface with your presence! answer = @request.answer(false, server_url) assert_equal(answer.request, @request) @@ -1414,7 +1426,7 @@ def test_answerImmediateDenyOpenID1 @request.mode = 'checkid_immediate' @request.immediate = true @request.claimed_id = 'http://claimed-id.test/' - server_url = "http://setup-url.unittest/" + server_url = 'http://setup-url.unittest/' # crappiting setup_url, you dirty my interface with your presence! answer = @request.answer(false, server_url) assert_equal(answer.request, @request) @@ -1431,7 +1443,7 @@ def test_answerImmediateDenyOpenID1 def test_answerSetupDeny answer = @request.answer(false) assert_equal(answer.fields.get_args(OPENID_NS), { - 'mode' => 'cancel', + 'mode' => 'cancel' }) end @@ -1444,14 +1456,14 @@ def test_encodeToURL result_args = Util.parse_query(result_args) message = Message.from_post_args(result_args) rebuilt_request = Server::CheckIDRequest.from_message(message, - @server.op_endpoint) + @server.op_endpoint) @request.message = message - @request.instance_variables.each { |var| + @request.instance_variables.each do |var| assert_equal(@request.instance_variable_get(var), rebuilt_request.instance_variable_get(var), var) - } + end end def test_getCancelURL @@ -1459,56 +1471,56 @@ def test_getCancelURL rt, query_string = url.split('?', -1) assert_equal(@request.return_to, rt) query = Util.parse_query(query_string) - assert_equal(query, {'openid.mode' => 'cancel', - 'openid.ns' => OPENID2_NS}) + assert_equal(query, { 'openid.mode' => 'cancel', + 'openid.ns' => OPENID2_NS }) end def test_getCancelURLimmed @request.mode = 'checkid_immediate' @request.immediate = true - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @request.cancel_url - } + end end def test_fromMessageWithoutTrustRoot - msg = Message.new(OPENID2_NS) - msg.set_arg(OPENID_NS, 'mode', 'checkid_setup') - msg.set_arg(OPENID_NS, 'return_to', 'http://real.trust.root/foo') - msg.set_arg(OPENID_NS, 'assoc_handle', 'bogus') - msg.set_arg(OPENID_NS, 'identity', 'george') - msg.set_arg(OPENID_NS, 'claimed_id', 'george') + msg = Message.new(OPENID2_NS) + msg.set_arg(OPENID_NS, 'mode', 'checkid_setup') + msg.set_arg(OPENID_NS, 'return_to', 'http://real.trust.root/foo') + msg.set_arg(OPENID_NS, 'assoc_handle', 'bogus') + msg.set_arg(OPENID_NS, 'identity', 'george') + msg.set_arg(OPENID_NS, 'claimed_id', 'george') - result = Server::CheckIDRequest.from_message(msg, @server.op_endpoint) + result = Server::CheckIDRequest.from_message(msg, @server.op_endpoint) - assert_equal(result.trust_root, 'http://real.trust.root/foo') + assert_equal(result.trust_root, 'http://real.trust.root/foo') end def test_fromMessageWithoutTrustRootOrReturnTo - msg = Message.new(OPENID2_NS) - msg.set_arg(OPENID_NS, 'mode', 'checkid_setup') - msg.set_arg(OPENID_NS, 'assoc_handle', 'bogus') - msg.set_arg(OPENID_NS, 'identity', 'george') - msg.set_arg(OPENID_NS, 'claimed_id', 'george') + msg = Message.new(OPENID2_NS) + msg.set_arg(OPENID_NS, 'mode', 'checkid_setup') + msg.set_arg(OPENID_NS, 'assoc_handle', 'bogus') + msg.set_arg(OPENID_NS, 'identity', 'george') + msg.set_arg(OPENID_NS, 'claimed_id', 'george') - assert_raises(Server::ProtocolError) { - Server::CheckIDRequest.from_message(msg, @server.op_endpoint) - } + assert_raises(Server::ProtocolError) do + Server::CheckIDRequest.from_message(msg, @server.op_endpoint) + end end end class TestCheckIDExtension < Minitest::Test - def setup @op_endpoint = 'http://endpoint.unittest/ext' - @store = Store::Memory.new() + @store = Store::Memory.new @server = Server::Server.new(@store, @op_endpoint) @request = Server::CheckIDRequest.new( - 'http://bambam.unittest/', - 'http://bar.unittest/999', - @server.op_endpoint, - 'http://bar.unittest/', - false) + 'http://bambam.unittest/', + 'http://bar.unittest/999', + @server.op_endpoint, + 'http://bar.unittest/', + false + ) @request.message = Message.new(OPENID2_NS) @response = Server::OpenIDResponse.new(@request) @response.fields.set_arg(OPENID_NS, 'mode', 'id_res') @@ -1519,23 +1531,21 @@ def test_addField namespace = 'something:' @response.fields.set_arg(namespace, 'bright', 'potato') assert_equal(@response.fields.get_args(OPENID_NS), - {'blue' => 'star', - 'mode' => 'id_res', - }) + { 'blue' => 'star', + 'mode' => 'id_res' }) assert_equal(@response.fields.get_args(namespace), - {'bright' => 'potato'}) + { 'bright' => 'potato' }) end def test_addFields namespace = 'mi5:' - args = {'tangy' => 'suspenders', - 'bravo' => 'inclusion'} + args = { 'tangy' => 'suspenders', + 'bravo' => 'inclusion' } @response.fields.update_args(namespace, args) assert_equal(@response.fields.get_args(OPENID_NS), - {'blue' => 'star', - 'mode' => 'id_res', - }) + { 'blue' => 'star', + 'mode' => 'id_res' }) assert_equal(@response.fields.get_args(namespace), args) end end @@ -1549,28 +1559,25 @@ def initialize(assoc) end def verify(assoc_handle, message) - Util.assert(message.has_key?(OPENID_NS, "sig")) - if self.assocs.member?([true, assoc_handle]) - return @isValid - else - return false - end + Util.assert(message.has_key?(OPENID_NS, 'sig')) + return @isValid if assocs.member?([true, assoc_handle]) + + false end def get_association(assoc_handle, dumb) - if self.assocs.member?([dumb, assoc_handle]) - # This isn't a valid implementation for many uses of this - # function, mind you. - return true - else - return nil - end + return true if assocs.member?([dumb, assoc_handle]) + + # This isn't a valid implementation for many uses of this + # function, mind you. + + nil end def invalidate(assoc_handle, dumb) - if self.assocs.member?([dumb, assoc_handle]) - @assocs.delete([dumb, assoc_handle]) - end + return unless assocs.member?([dumb, assoc_handle]) + + @assocs.delete([dumb, assoc_handle]) end end @@ -1580,10 +1587,11 @@ def setup @message = Message.from_post_args({ 'openid.sig' => 'signarture', 'one' => 'alpha', - 'two' => 'beta', + 'two' => 'beta' }) @request = Server::CheckAuthRequest.new( - @assoc_handle, @message) + @assoc_handle, @message + ) @request.message = Message.new(OPENID2_NS) @signatory = MockSignatory.new([true, @assoc_handle]) @@ -1595,7 +1603,7 @@ def test_to_s def test_valid r = @request.answer(@signatory) - assert_equal({'is_valid' => 'true'}, + assert_equal({ 'is_valid' => 'true' }, r.fields.get_args(OPENID_NS)) assert_equal(r.request, @request) end @@ -1603,9 +1611,8 @@ def test_valid def test_invalid @signatory.isValid = false r = @request.answer(@signatory) - assert_equal({'is_valid' => 'false'}, + assert_equal({ 'is_valid' => 'false' }, r.fields.get_args(OPENID_NS)) - end def test_replay @@ -1622,16 +1629,16 @@ def test_replay # be used with another handle without breaking the sig. r = @request.answer(@signatory) r = @request.answer(@signatory) - assert_equal({'is_valid' => 'false'}, + assert_equal({ 'is_valid' => 'false' }, r.fields.get_args(OPENID_NS)) end def test_invalidatehandle - @request.invalidate_handle = "bogusHandle" + @request.invalidate_handle = 'bogusHandle' r = @request.answer(@signatory) assert_equal(r.fields.get_args(OPENID_NS), - {'is_valid' => 'true', - 'invalidate_handle' => "bogusHandle"}) + { 'is_valid' => 'true', + 'invalidate_handle' => 'bogusHandle' }) assert_equal(r.request, @request) end @@ -1640,7 +1647,7 @@ def test_invalidatehandleNo @signatory.assocs << [false, 'goodhandle'] @request.invalidate_handle = assoc_handle r = @request.answer(@signatory) - assert_equal(r.fields.get_args(OPENID_NS), {'is_valid' => 'true'}) + assert_equal(r.fields.get_args(OPENID_NS), { 'is_valid' => 'true' }) end end @@ -1650,29 +1657,29 @@ class TestAssociate < Minitest::Test def setup @request = Server::AssociateRequest.from_message(Message.from_post_args({})) - @store = Store::Memory.new() + @store = Store::Memory.new @signatory = Server::Signatory.new(@store) end def test_dhSHA1 @assoc = @signatory.create_association(false, 'HMAC-SHA1') - consumer_dh = DiffieHellman.from_defaults() + consumer_dh = DiffieHellman.from_defaults cpub = consumer_dh.public - server_dh = DiffieHellman.from_defaults() + server_dh = DiffieHellman.from_defaults session = Server::DiffieHellmanSHA1ServerSession.new(server_dh, cpub) @request = Server::AssociateRequest.new(session, 'HMAC-SHA1') @request.message = Message.new(OPENID2_NS) response = @request.answer(@assoc) - rfg = lambda { |f| response.fields.get_arg(OPENID_NS, f) } - assert_equal(rfg.call("assoc_type"), "HMAC-SHA1") - assert_equal(rfg.call("assoc_handle"), @assoc.handle) - assert(!rfg.call("mac_key")) - assert_equal(rfg.call("session_type"), "DH-SHA1") - assert(rfg.call("enc_mac_key")) - assert(rfg.call("dh_server_public")) - - enc_key = Util.from_base64(rfg.call("enc_mac_key")) - spub = CryptUtil.base64_to_num(rfg.call("dh_server_public")) + rfg = ->(f) { response.fields.get_arg(OPENID_NS, f) } + assert_equal(rfg.call('assoc_type'), 'HMAC-SHA1') + assert_equal(rfg.call('assoc_handle'), @assoc.handle) + assert(!rfg.call('mac_key')) + assert_equal(rfg.call('session_type'), 'DH-SHA1') + assert(rfg.call('enc_mac_key')) + assert(rfg.call('dh_server_public')) + + enc_key = Util.from_base64(rfg.call('enc_mac_key')) + spub = CryptUtil.base64_to_num(rfg.call('dh_server_public')) secret = consumer_dh.xor_secret(CryptUtil.method('sha1'), spub, enc_key) assert_equal(secret, @assoc.secret) @@ -1680,97 +1687,96 @@ def test_dhSHA1 def test_dhSHA256 @assoc = @signatory.create_association(false, 'HMAC-SHA256') - consumer_dh = DiffieHellman.from_defaults() + consumer_dh = DiffieHellman.from_defaults cpub = consumer_dh.public - server_dh = DiffieHellman.from_defaults() + server_dh = DiffieHellman.from_defaults session = Server::DiffieHellmanSHA256ServerSession.new(server_dh, cpub) @request = Server::AssociateRequest.new(session, 'HMAC-SHA256') @request.message = Message.new(OPENID2_NS) response = @request.answer(@assoc) - rfg = lambda { |f| response.fields.get_arg(OPENID_NS, f) } - assert_equal(rfg.call("assoc_type"), "HMAC-SHA256") - assert_equal(rfg.call("assoc_handle"), @assoc.handle) - assert(!rfg.call("mac_key")) - assert_equal(rfg.call("session_type"), "DH-SHA256") - assert(rfg.call("enc_mac_key")) - assert(rfg.call("dh_server_public")) - - enc_key = Util.from_base64(rfg.call("enc_mac_key")) - spub = CryptUtil.base64_to_num(rfg.call("dh_server_public")) + rfg = ->(f) { response.fields.get_arg(OPENID_NS, f) } + assert_equal(rfg.call('assoc_type'), 'HMAC-SHA256') + assert_equal(rfg.call('assoc_handle'), @assoc.handle) + assert(!rfg.call('mac_key')) + assert_equal(rfg.call('session_type'), 'DH-SHA256') + assert(rfg.call('enc_mac_key')) + assert(rfg.call('dh_server_public')) + + enc_key = Util.from_base64(rfg.call('enc_mac_key')) + spub = CryptUtil.base64_to_num(rfg.call('dh_server_public')) secret = consumer_dh.xor_secret(CryptUtil.method('sha256'), spub, enc_key) assert_equal(secret, @assoc.secret) end def test_protoError256 - s256_session = Consumer::DiffieHellmanSHA256Session.new() + s256_session = Consumer::DiffieHellmanSHA256Session.new - invalid_s256 = {'openid.assoc_type' => 'HMAC-SHA1', - 'openid.session_type' => 'DH-SHA256',} - invalid_s256.merge!(s256_session.get_request()) + invalid_s256 = { 'openid.assoc_type' => 'HMAC-SHA1', + 'openid.session_type' => 'DH-SHA256' } + invalid_s256.merge!(s256_session.get_request) - invalid_s256_2 = {'openid.assoc_type' => 'MONKEY-PIRATE', - 'openid.session_type' => 'DH-SHA256',} - invalid_s256_2.merge!(s256_session.get_request()) + invalid_s256_2 = { 'openid.assoc_type' => 'MONKEY-PIRATE', + 'openid.session_type' => 'DH-SHA256' } + invalid_s256_2.merge!(s256_session.get_request) bad_request_argss = [ - invalid_s256, - invalid_s256_2, - ] + invalid_s256, + invalid_s256_2 + ] - bad_request_argss.each { |request_args| + bad_request_argss.each do |request_args| message = Message.from_post_args(request_args) - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do Server::AssociateRequest.from_message(message) - } - } + end + end end def test_protoError - s1_session = Consumer::DiffieHellmanSHA1Session.new() + s1_session = Consumer::DiffieHellmanSHA1Session.new - invalid_s1 = {'openid.assoc_type' => 'HMAC-SHA256', - 'openid.session_type' => 'DH-SHA1',} - invalid_s1.merge!(s1_session.get_request()) + invalid_s1 = { 'openid.assoc_type' => 'HMAC-SHA256', + 'openid.session_type' => 'DH-SHA1' } + invalid_s1.merge!(s1_session.get_request) - invalid_s1_2 = {'openid.assoc_type' => 'ROBOT-NINJA', - 'openid.session_type' => 'DH-SHA1',} - invalid_s1_2.merge!(s1_session.get_request()) + invalid_s1_2 = { 'openid.assoc_type' => 'ROBOT-NINJA', + 'openid.session_type' => 'DH-SHA1' } + invalid_s1_2.merge!(s1_session.get_request) bad_request_argss = [ - {'openid.assoc_type' => 'Wha?'}, - invalid_s1, - invalid_s1_2, - ] + { 'openid.assoc_type' => 'Wha?' }, + invalid_s1, + invalid_s1_2 + ] - bad_request_argss.each { |request_args| + bad_request_argss.each do |request_args| message = Message.from_post_args(request_args) - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do Server::AssociateRequest.from_message(message) - } - } + end + end end def test_protoErrorFields - contact = 'user@example.invalid' reference = 'Trac ticket number MAX_INT' error = 'poltergeist' openid1_args = { 'openid.identitiy' => 'invalid', - 'openid.mode' => 'checkid_setup', + 'openid.mode' => 'checkid_setup' } openid2_args = openid1_args.dup - openid2_args.merge!({'openid.ns' => OPENID2_NS}) + openid2_args.merge!({ 'openid.ns' => OPENID2_NS }) # Check presence of optional fields in both protocol versions openid1_msg = Message.from_post_args(openid1_args) p = Server::ProtocolError.new(openid1_msg, error, reference, contact) - reply = p.to_message() + reply = p.to_message assert_equal(reply.get_arg(OPENID_NS, 'reference'), reference) assert_equal(reply.get_arg(OPENID_NS, 'contact'), contact) @@ -1778,7 +1784,7 @@ def test_protoErrorFields openid2_msg = Message.from_post_args(openid2_args) p = Server::ProtocolError.new(openid2_msg, error, reference, contact) - reply = p.to_message() + reply = p.to_message assert_equal(reply.get_arg(OPENID_NS, 'reference'), reference) assert_equal(reply.get_arg(OPENID_NS, 'contact'), contact) @@ -1793,78 +1799,84 @@ def failUnlessExpiresInMatches(msg, expected_expires_in) slop = 1 # second difference = expected_expires_in - expires_in - error_message = sprintf('"expires_in" value not within %s of expected: ' + + error_message = format('"expires_in" value not within %s of expected: ' + 'expected=%s, actual=%s', slop, expected_expires_in, - expires_in) + expires_in) assert((0 <= difference and difference <= slop), error_message) end def test_plaintext @assoc = @signatory.create_association(false, 'HMAC-SHA1') response = @request.answer(@assoc) - rfg = lambda { |f| response.fields.get_arg(OPENID_NS, f) } + rfg = ->(f) { response.fields.get_arg(OPENID_NS, f) } - assert_equal(rfg.call("assoc_type"), "HMAC-SHA1") - assert_equal(rfg.call("assoc_handle"), @assoc.handle) + assert_equal(rfg.call('assoc_type'), 'HMAC-SHA1') + assert_equal(rfg.call('assoc_handle'), @assoc.handle) failUnlessExpiresInMatches(response.fields, @signatory.secret_lifetime) assert_equal( - rfg.call("mac_key"), Util.to_base64(@assoc.secret)) - assert(!rfg.call("session_type")) - assert(!rfg.call("enc_mac_key")) - assert(!rfg.call("dh_server_public")) + rfg.call('mac_key'), Util.to_base64(@assoc.secret) + ) + assert(!rfg.call('session_type')) + assert(!rfg.call('enc_mac_key')) + assert(!rfg.call('dh_server_public')) end def test_plaintext_v2 - # The main difference between this and the v1 test is that - # session_type is always returned in v2. - args = { - 'openid.ns' => OPENID2_NS, - 'openid.mode' => 'associate', - 'openid.assoc_type' => 'HMAC-SHA1', - 'openid.session_type' => 'no-encryption', - } - @request = Server::AssociateRequest.from_message( - Message.from_post_args(args)) + # The main difference between this and the v1 test is that + # session_type is always returned in v2. + args = { + 'openid.ns' => OPENID2_NS, + 'openid.mode' => 'associate', + 'openid.assoc_type' => 'HMAC-SHA1', + 'openid.session_type' => 'no-encryption' + } + @request = Server::AssociateRequest.from_message( + Message.from_post_args(args) + ) - assert(!@request.message.is_openid1()) + assert(!@request.message.is_openid1) - @assoc = @signatory.create_association(false, 'HMAC-SHA1') - response = @request.answer(@assoc) - rfg = lambda { |f| response.fields.get_arg(OPENID_NS, f) } + @assoc = @signatory.create_association(false, 'HMAC-SHA1') + response = @request.answer(@assoc) + rfg = ->(f) { response.fields.get_arg(OPENID_NS, f) } - assert_equal(rfg.call("assoc_type"), "HMAC-SHA1") - assert_equal(rfg.call("assoc_handle"), @assoc.handle) + assert_equal(rfg.call('assoc_type'), 'HMAC-SHA1') + assert_equal(rfg.call('assoc_handle'), @assoc.handle) - failUnlessExpiresInMatches( - response.fields, @signatory.secret_lifetime) + failUnlessExpiresInMatches( + response.fields, @signatory.secret_lifetime + ) - assert_equal( - rfg.call("mac_key"), Util.to_base64(@assoc.secret)) + assert_equal( + rfg.call('mac_key'), Util.to_base64(@assoc.secret) + ) - assert_equal(rfg.call("session_type"), "no-encryption") - assert(!rfg.call("enc_mac_key")) - assert(!rfg.call("dh_server_public")) + assert_equal(rfg.call('session_type'), 'no-encryption') + assert(!rfg.call('enc_mac_key')) + assert(!rfg.call('dh_server_public')) end def test_plaintext256 @assoc = @signatory.create_association(false, 'HMAC-SHA256') response = @request.answer(@assoc) - rfg = lambda { |f| response.fields.get_arg(OPENID_NS, f) } + rfg = ->(f) { response.fields.get_arg(OPENID_NS, f) } - assert_equal(rfg.call("assoc_type"), "HMAC-SHA1") - assert_equal(rfg.call("assoc_handle"), @assoc.handle) + assert_equal(rfg.call('assoc_type'), 'HMAC-SHA1') + assert_equal(rfg.call('assoc_handle'), @assoc.handle) failUnlessExpiresInMatches( - response.fields, @signatory.secret_lifetime) + response.fields, @signatory.secret_lifetime + ) assert_equal( - rfg.call("mac_key"), Util.to_base64(@assoc.secret)) - assert(!rfg.call("session_type")) - assert(!rfg.call("enc_mac_key")) - assert(!rfg.call("dh_server_public")) + rfg.call('mac_key'), Util.to_base64(@assoc.secret) + ) + assert(!rfg.call('session_type')) + assert(!rfg.call('enc_mac_key')) + assert(!rfg.call('dh_server_public')) end def test_unsupportedPrefer @@ -1879,7 +1891,7 @@ def test_unsupportedPrefer response = @request.answer_unsupported(message, allowed_assoc, allowed_sess) - rfg = lambda { |f| response.fields.get_arg(OPENID_NS, f) } + rfg = ->(f) { response.fields.get_arg(OPENID_NS, f) } assert_equal(rfg.call('error_code'), 'unsupported-type') assert_equal(rfg.call('assoc_type'), allowed_assoc) assert_equal(rfg.call('error'), message) @@ -1894,7 +1906,7 @@ def test_unsupported @request.message = Message.new(OPENID2_NS) response = @request.answer_unsupported(message) - rfg = lambda { |f| response.fields.get_arg(OPENID_NS, f) } + rfg = ->(f) { response.fields.get_arg(OPENID_NS, f) } assert_equal(rfg.call('error_code'), 'unsupported-type') assert_nil(rfg.call('assoc_type')) assert_equal(rfg.call('error'), message) @@ -1906,9 +1918,9 @@ def test_openid1_unsupported_explode # the request was an OpenID 1 request. m = Message.new(OPENID1_NS) - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do @request.answer_unsupported(m) - } + end end end @@ -1919,49 +1931,49 @@ class TestServer < Minitest::Test include TestUtil def setup - @store = Store::Memory.new() - @server = Server::Server.new(@store, "http://server.unittest/endpt") + @store = Store::Memory.new + @server = Server::Server.new(@store, 'http://server.unittest/endpt') # catchlogs_setup() end def test_failed_dispatch - request = Server::OpenIDRequest.new() - request.mode = "monkeymode" + request = Server::OpenIDRequest.new + request.mode = 'monkeymode' request.message = Message.new(OPENID1_NS) - assert_raises(RuntimeError) { + assert_raises(RuntimeError) do @server.handle_request(request) - } + end end def test_decode_request @server.decoder = BogusDecoder.new(@server) - assert(@server.decode_request({}) == "BOGUS") + assert(@server.decode_request({}) == 'BOGUS') end def test_encode_response @server.encoder = BogusEncoder.new - assert(@server.encode_response(nil) == "BOGUS") + assert(@server.encode_response(nil) == 'BOGUS') end def test_dispatch @server.extend(InstanceDefExtension) - @server.instance_def(:openid_monkeymode) do |request| + @server.instance_def(:openid_monkeymode) do |_request| raise UnhandledError end - request = Server::OpenIDRequest.new() - request.mode = "monkeymode" + request = Server::OpenIDRequest.new + request.mode = 'monkeymode' request.message = Message.new(OPENID1_NS) - assert_raises(UnhandledError) { + assert_raises(UnhandledError) do @server.handle_request(request) - } + end end def test_associate request = Server::AssociateRequest.from_message(Message.from_post_args({})) response = @server.openid_associate(request) - assert(response.fields.has_key?(OPENID_NS, "assoc_handle"), - sprintf("No assoc_handle here: %s", response.fields.inspect)) + assert(response.fields.has_key?(OPENID_NS, 'assoc_handle'), + format('No assoc_handle here: %s', response.fields.inspect)) end def test_associate2 @@ -1975,17 +1987,17 @@ def test_associate2 # ProtocolError. msg = Message.from_post_args({ 'openid.ns' => OPENID2_NS, - 'openid.session_type' => 'no-encryption', + 'openid.session_type' => 'no-encryption' }) request = Server::AssociateRequest.from_message(msg) response = @server.openid_associate(request) - assert(response.fields.has_key?(OPENID_NS, "error")) - assert(response.fields.has_key?(OPENID_NS, "error_code")) - assert(!response.fields.has_key?(OPENID_NS, "assoc_handle")) - assert(!response.fields.has_key?(OPENID_NS, "assoc_type")) - assert(!response.fields.has_key?(OPENID_NS, "session_type")) + assert(response.fields.has_key?(OPENID_NS, 'error')) + assert(response.fields.has_key?(OPENID_NS, 'error_code')) + assert(!response.fields.has_key?(OPENID_NS, 'assoc_handle')) + assert(!response.fields.has_key?(OPENID_NS, 'assoc_type')) + assert(!response.fields.has_key?(OPENID_NS, 'session_type')) end def test_associate3 @@ -1993,29 +2005,29 @@ def test_associate3 # supported types. # # Should give back an error message with a fallback type. - @server.negotiator.allowed_types = [['HMAC-SHA256', 'DH-SHA256']] + @server.negotiator.allowed_types = [%w[HMAC-SHA256 DH-SHA256]] msg = Message.from_post_args({ 'openid.ns' => OPENID2_NS, - 'openid.session_type' => 'no-encryption', + 'openid.session_type' => 'no-encryption' }) request = Server::AssociateRequest.from_message(msg) response = @server.openid_associate(request) - assert(response.fields.has_key?(OPENID_NS, "error")) - assert(response.fields.has_key?(OPENID_NS, "error_code")) - assert(!response.fields.has_key?(OPENID_NS, "assoc_handle")) + assert(response.fields.has_key?(OPENID_NS, 'error')) + assert(response.fields.has_key?(OPENID_NS, 'error_code')) + assert(!response.fields.has_key?(OPENID_NS, 'assoc_handle')) - assert_equal(response.fields.get_arg(OPENID_NS, "assoc_type"), + assert_equal(response.fields.get_arg(OPENID_NS, 'assoc_type'), 'HMAC-SHA256') - assert_equal(response.fields.get_arg(OPENID_NS, "session_type"), + assert_equal(response.fields.get_arg(OPENID_NS, 'session_type'), 'DH-SHA256') end def test_associate4 # DH-SHA256 association session - @server.negotiator.allowed_types = [['HMAC-SHA256', 'DH-SHA256']] + @server.negotiator.allowed_types = [%w[HMAC-SHA256 DH-SHA256]] query = { 'openid.dh_consumer_public' => @@ -2024,46 +2036,46 @@ def test_associate4 '1WxJY3jHd5k1/ZReyRZOxZTKdF/dnIqwF8ZXUwI6peV0TyS/K1fOfF/s', 'openid.assoc_type' => 'HMAC-SHA256', - 'openid.session_type' => 'DH-SHA256', + 'openid.session_type' => 'DH-SHA256' } message = Message.from_post_args(query) request = Server::AssociateRequest.from_message(message) response = @server.openid_associate(request) - assert(response.fields.has_key?(OPENID_NS, "assoc_handle")) + assert(response.fields.has_key?(OPENID_NS, 'assoc_handle')) end def test_no_encryption_openid1 # Make sure no-encryption associate requests for OpenID 1 are # logged. - assert_log_matches(/Continuing anyway./) { + assert_log_matches(/Continuing anyway./) do m = Message.from_openid_args({ - 'session_type' => 'no-encryption', + 'session_type' => 'no-encryption' }) Server::AssociateRequest.from_message(m) - } + end end def test_missingSessionTypeOpenID2 # Make sure session_type is required in OpenID 2 msg = Message.from_post_args({ - 'openid.ns' => OPENID2_NS, + 'openid.ns' => OPENID2_NS }) - assert_raises(Server::ProtocolError) { + assert_raises(Server::ProtocolError) do Server::AssociateRequest.from_message(msg) - } + end end def test_checkAuth request = Server::CheckAuthRequest.new('arrrrrf', '0x3999', []) request.message = Message.new(OPENID2_NS) response = nil - silence_logging { + silence_logging do response = @server.openid_check_authentication(request) - } - assert(response.fields.has_key?(OPENID_NS, "is_valid")) + end + assert(response.fields.has_key?(OPENID_NS, 'is_valid')) end end @@ -2075,7 +2087,7 @@ class TestSignatory < Minitest::Test include TestUtil def setup - @store = Store::Memory.new() + @store = Store::Memory.new @signatory = Server::Signatory.new(@store) @_dumb_key = @signatory.class._dumb_key @_normal_key = @signatory.class._normal_key @@ -2083,30 +2095,32 @@ def setup end def test_get_association_nil - assert_raises(ArgumentError) { + assert_raises(ArgumentError) do @signatory.get_association(nil, false) - } + end end def test_sign - request = TestingRequest.new() + request = TestingRequest.new assoc_handle = '{assoc}{lookatme}' @store.store_association( - @_normal_key, - Association.from_expires_in(60, assoc_handle, - 'sekrit', 'HMAC-SHA1')) + @_normal_key, + Association.from_expires_in(60, assoc_handle, + 'sekrit', 'HMAC-SHA1') + ) request.assoc_handle = assoc_handle request.namespace = OPENID1_NS response = Server::OpenIDResponse.new(request) response.fields = Message.from_openid_args({ 'foo' => 'amsigned', 'bar' => 'notsigned', - 'azu' => 'alsosigned', + 'azu' => 'alsosigned' }) sresponse = @signatory.sign(response) assert_equal( - sresponse.fields.get_arg(OPENID_NS, 'assoc_handle'), - assoc_handle) + sresponse.fields.get_arg(OPENID_NS, 'assoc_handle'), + assoc_handle + ) assert_equal(sresponse.fields.get_arg(OPENID_NS, 'signed'), 'assoc_handle,azu,bar,foo,signed') assert(sresponse.fields.get_arg(OPENID_NS, 'sig')) @@ -2114,7 +2128,7 @@ def test_sign end def test_signDumb - request = TestingRequest.new() + request = TestingRequest.new request.assoc_handle = nil request.namespace = OPENID2_NS response = Server::OpenIDResponse.new(request) @@ -2122,7 +2136,7 @@ def test_signDumb 'foo' => 'amsigned', 'bar' => 'notsigned', 'azu' => 'alsosigned', - 'ns' => OPENID2_NS, + 'ns' => OPENID2_NS }) sresponse = @signatory.sign(response) assoc_handle = sresponse.fields.get_arg(OPENID_NS, 'assoc_handle') @@ -2150,13 +2164,14 @@ def test_signExpired # instance, the OP will include the field # "openid.invalidate_handle" set to the association handle # that the Relying Party included with the original request. - request = TestingRequest.new() + request = TestingRequest.new request.namespace = OPENID2_NS assoc_handle = '{assoc}{lookatme}' @store.store_association( - @_normal_key, - Association.from_expires_in(-10, assoc_handle, - 'sekrit', 'HMAC-SHA1')) + @_normal_key, + Association.from_expires_in(-10, assoc_handle, + 'sekrit', 'HMAC-SHA1') + ) assert(@store.get_association(@_normal_key, assoc_handle)) request.assoc_handle = assoc_handle @@ -2164,20 +2179,21 @@ def test_signExpired response.fields = Message.from_openid_args({ 'foo' => 'amsigned', 'bar' => 'notsigned', - 'azu' => 'alsosigned', + 'azu' => 'alsosigned' }) sresponse = nil - silence_logging { + silence_logging do sresponse = @signatory.sign(response) - } + end new_assoc_handle = sresponse.fields.get_arg(OPENID_NS, 'assoc_handle') assert(new_assoc_handle) assert(new_assoc_handle != assoc_handle) assert_equal( - sresponse.fields.get_arg(OPENID_NS, 'invalidate_handle'), - assoc_handle) + sresponse.fields.get_arg(OPENID_NS, 'invalidate_handle'), + assoc_handle + ) assert_equal(sresponse.fields.get_arg(OPENID_NS, 'signed'), 'assoc_handle,azu,bar,foo,invalidate_handle,signed') @@ -2185,7 +2201,7 @@ def test_signExpired # make sure the expired association is gone assert(!@store.get_association(@_normal_key, assoc_handle), - "expired association is still retrievable.") + 'expired association is still retrievable.') # make sure the new key is a dumb mode association assert(@store.get_association(@_dumb_key, new_assoc_handle)) @@ -2194,7 +2210,7 @@ def test_signExpired end def test_signInvalidHandle - request = TestingRequest.new() + request = TestingRequest.new request.namespace = OPENID2_NS assoc_handle = '{bogus-assoc}{notvalid}' @@ -2203,7 +2219,7 @@ def test_signInvalidHandle response.fields = Message.from_openid_args({ 'foo' => 'amsigned', 'bar' => 'notsigned', - 'azu' => 'alsosigned', + 'azu' => 'alsosigned' }) sresponse = @signatory.sign(response) @@ -2212,12 +2228,14 @@ def test_signInvalidHandle assert(new_assoc_handle != assoc_handle) assert_equal( - sresponse.fields.get_arg(OPENID_NS, 'invalidate_handle'), - assoc_handle) + sresponse.fields.get_arg(OPENID_NS, 'invalidate_handle'), + assoc_handle + ) assert_equal( - sresponse.fields.get_arg(OPENID_NS, 'signed'), - 'assoc_handle,azu,bar,foo,invalidate_handle,signed') + sresponse.fields.get_arg(OPENID_NS, 'signed'), + 'assoc_handle,azu,bar,foo,invalidate_handle,signed' + ) assert(sresponse.fields.get_arg(OPENID_NS, 'sig')) # make sure the new key is a dumb mode association @@ -2229,7 +2247,8 @@ def test_signInvalidHandle def test_verify assoc_handle = '{vroom}{zoom}' assoc = Association.from_expires_in( - 60, assoc_handle, 'sekrit', 'HMAC-SHA1') + 60, assoc_handle, 'sekrit', 'HMAC-SHA1' + ) @store.store_association(@_dumb_key, assoc) @@ -2238,7 +2257,7 @@ def test_verify 'openid.apple' => 'orange', 'openid.assoc_handle' => assoc_handle, 'openid.signed' => 'apple,assoc_handle,foo,signed', - 'openid.sig' => 'uXoT1qm62/BB09Xbj98TQ8mlBco=', + 'openid.sig' => 'uXoT1qm62/BB09Xbj98TQ8mlBco=' }) verified = @signatory.verify(assoc_handle, signed) @@ -2249,17 +2268,18 @@ def test_verify def test_verifyBadSig assoc_handle = '{vroom}{zoom}' assoc = Association.from_expires_in( - 60, assoc_handle, 'sekrit', 'HMAC-SHA1') + 60, assoc_handle, 'sekrit', 'HMAC-SHA1' + ) @store.store_association(@_dumb_key, assoc) signed = Message.from_post_args({ - 'openid.foo' => 'bar', - 'openid.apple' => 'orange', - 'openid.assoc_handle' => assoc_handle, - 'openid.signed' => 'apple,assoc_handle,foo,signed', - 'openid.sig' => 'uXoT1qm62/BB09Xbj98TQ8mlBco=BOGUS' - }) + 'openid.foo' => 'bar', + 'openid.apple' => 'orange', + 'openid.assoc_handle' => assoc_handle, + 'openid.signed' => 'apple,assoc_handle,foo,signed', + 'openid.sig' => 'uXoT1qm62/BB09Xbj98TQ8mlBco=BOGUS' + }) verified = @signatory.verify(assoc_handle, signed) # @failIf(@messages, @messages) @@ -2269,15 +2289,15 @@ def test_verifyBadSig def test_verifyBadHandle assoc_handle = '{vroom}{zoom}' signed = Message.from_post_args({ - 'foo' => 'bar', - 'apple' => 'orange', - 'openid.sig' => "Ylu0KcIR7PvNegB/K41KpnRgJl0=", - }) + 'foo' => 'bar', + 'apple' => 'orange', + 'openid.sig' => 'Ylu0KcIR7PvNegB/K41KpnRgJl0=' + }) verified = nil - silence_logging { + silence_logging do verified = @signatory.verify(assoc_handle, signed) - } + end assert !verified end @@ -2286,20 +2306,21 @@ def test_verifyAssocMismatch # Attempt to validate sign-all message with a signed-list assoc. assoc_handle = '{vroom}{zoom}' assoc = Association.from_expires_in( - 60, assoc_handle, 'sekrit', 'HMAC-SHA1') + 60, assoc_handle, 'sekrit', 'HMAC-SHA1' + ) @store.store_association(@_dumb_key, assoc) signed = Message.from_post_args({ - 'foo' => 'bar', - 'apple' => 'orange', - 'openid.sig' => "d71xlHtqnq98DonoSgoK/nD+QRM=", - }) + 'foo' => 'bar', + 'apple' => 'orange', + 'openid.sig' => 'd71xlHtqnq98DonoSgoK/nD+QRM=' + }) verified = nil - silence_logging { + silence_logging do verified = @signatory.verify(assoc_handle, signed) - } + end assert !verified end @@ -2314,26 +2335,26 @@ def test_getAssoc def test_getAssocExpired assoc_handle = makeAssoc(true, -10) assoc = nil - silence_logging { + silence_logging do assoc = @signatory.get_association(assoc_handle, true) - } + end assert !assoc end def test_getAssocInvalid ah = 'no-such-handle' - silence_logging { + silence_logging do assert_nil(@signatory.get_association(ah, false)) - } + end # assert(!@messages, @messages) end def test_getAssocDumbVsNormal # getAssociation(dumb=False) cannot get a dumb assoc assoc_handle = makeAssoc(true) - silence_logging { + silence_logging do assert_nil(@signatory.get_association(assoc_handle, false)) - } + end # @failIf(@messages, @messages) end @@ -2345,30 +2366,30 @@ def test_getAssocNormalVsDumb # An OP MUST NOT verify signatures for associations that have shared # MAC keys. assoc_handle = makeAssoc(false) - silence_logging { + silence_logging do assert_nil(@signatory.get_association(assoc_handle, true)) - } + end # @failIf(@messages, @messages) end def test_createAssociation assoc = @signatory.create_association(false) - silence_logging { + silence_logging do assert(@signatory.get_association(assoc.handle, false)) - } + end # @failIf(@messages, @messages) end - def makeAssoc(dumb, lifetime=60) + def makeAssoc(dumb, lifetime = 60) assoc_handle = '{bling}' assoc = Association.from_expires_in(lifetime, assoc_handle, 'sekrit', 'HMAC-SHA1') - silence_logging { + silence_logging do @store.store_association(((dumb and @_dumb_key) or @_normal_key), assoc) - } + end - return assoc_handle + assoc_handle end def test_invalidate @@ -2376,7 +2397,7 @@ def test_invalidate assoc = Association.from_expires_in(60, assoc_handle, 'sekrit', 'HMAC-SHA1') - silence_logging { + silence_logging do @store.store_association(@_dumb_key, assoc) assoc = @signatory.get_association(assoc_handle, true) assert(assoc) @@ -2385,7 +2406,7 @@ def test_invalidate @signatory.invalidate(assoc_handle, true) assoc = @signatory.get_association(assoc_handle, true) assert(!assoc) - } + end # @failIf(@messages, @messages) end end @@ -2393,12 +2414,12 @@ def test_invalidate class RunthroughTestCase < Minitest::Test def setup @store = Store::Memory.new - @server = Server::Server.new(@store, "http://example.com/openid/server") + @server = Server::Server.new(@store, 'http://example.com/openid/server') end def test_openid1_assoc_checkid - assoc_args = {'openid.mode' => 'associate', - 'openid.assoc_type' => 'HMAC-SHA1'} + assoc_args = { 'openid.mode' => 'associate', + 'openid.assoc_type' => 'HMAC-SHA1' } areq = @server.decode_request(assoc_args) aresp = @server.handle_request(areq) @@ -2409,11 +2430,10 @@ def test_openid1_assoc_checkid assoc = @store.get_association('http://localhost/|normal', ahandle) assert(assoc.is_a?(Association)) - - checkid_args = {'openid.mode' => 'checkid_setup', - 'openid.return_to' => 'http://example.com/openid/consumer', - 'openid.assoc_handle' => ahandle, - 'openid.identity' => 'http://foo.com/'} + checkid_args = { 'openid.mode' => 'checkid_setup', + 'openid.return_to' => 'http://example.com/openid/consumer', + 'openid.assoc_handle' => ahandle, + 'openid.identity' => 'http://foo.com/' } cireq = @server.decode_request(checkid_args) ciresp = cireq.answer(true) @@ -2425,6 +2445,5 @@ def test_openid1_assoc_checkid assert(assoc.check_message_signature(signed_resp.fields)) end - end end diff --git a/test/test_sreg.rb b/test/test_sreg.rb index 72defab1..2ccb2138 100644 --- a/test/test_sreg.rb +++ b/test/test_sreg.rb @@ -7,52 +7,51 @@ module OpenID module SReg module SRegTest SOME_DATA = { - 'nickname'=>'linusaur', - 'postcode'=>'12345', - 'country'=>'US', - 'gender'=>'M', - 'fullname'=>'Leonhard Euler', - 'email'=>'president@whitehouse.gov', - 'dob'=>'0000-00-00', - 'language'=>'en-us', + 'nickname' => 'linusaur', + 'postcode' => '12345', + 'country' => 'US', + 'gender' => 'M', + 'fullname' => 'Leonhard Euler', + 'email' => 'president@whitehouse.gov', + 'dob' => '0000-00-00', + 'language' => 'en-us' } class SRegTest < Minitest::Test - def test_is11 assert_equal(NS_URI, NS_URI_1_1) end def test_check_field_name - DATA_FIELDS.keys.each{|field_name| - OpenID::check_sreg_field_name(field_name) - } - assert_raises(ArgumentError) { OpenID::check_sreg_field_name('invalid') } - assert_raises(ArgumentError) { OpenID::check_sreg_field_name(nil) } + DATA_FIELDS.keys.each do |field_name| + OpenID.check_sreg_field_name(field_name) + end + assert_raises(ArgumentError) { OpenID.check_sreg_field_name('invalid') } + assert_raises(ArgumentError) { OpenID.check_sreg_field_name(nil) } end def test_unsupported endpoint = FakeEndpoint.new([]) - assert(!OpenID::supports_sreg?(endpoint)) - assert_equal([NS_URI_1_1,NS_URI_1_0], endpoint.checked_uris) + assert(!OpenID.supports_sreg?(endpoint)) + assert_equal([NS_URI_1_1, NS_URI_1_0], endpoint.checked_uris) end def test_supported_1_1 endpoint = FakeEndpoint.new([NS_URI_1_1]) - assert(OpenID::supports_sreg?(endpoint)) + assert(OpenID.supports_sreg?(endpoint)) assert_equal([NS_URI_1_1], endpoint.checked_uris) end def test_supported_1_0 endpoint = FakeEndpoint.new([NS_URI_1_0]) - assert(OpenID::supports_sreg?(endpoint)) - assert_equal([NS_URI_1_1,NS_URI_1_0], endpoint.checked_uris) + assert(OpenID.supports_sreg?(endpoint)) + assert_equal([NS_URI_1_1, NS_URI_1_0], endpoint.checked_uris) end - end class FakeEndpoint < Object attr_accessor :checked_uris + def initialize(supported) @supported = supported @checked_uris = [] @@ -60,22 +59,21 @@ def initialize(supported) def uses_extension(namespace_uri) @checked_uris << namespace_uri - return @supported.member?(namespace_uri) + @supported.member?(namespace_uri) end end class FakeMessage < Object - attr_accessor :namespaces - attr_accessor :openid1 + attr_accessor :namespaces, :openid1 + def initialize @openid1 = false @namespaces = NamespaceMap.new end def is_openid1 - return @openid1 + @openid1 end - end class GetNSTest < Minitest::Test @@ -84,14 +82,14 @@ def setup end def test_openid2_empty - ns_uri = OpenID::get_sreg_ns(@msg) + ns_uri = OpenID.get_sreg_ns(@msg) assert_equal('sreg', @msg.namespaces.get_alias(ns_uri)) assert_equal(NS_URI, ns_uri) end def test_openid1_empty @msg.openid1 = true - ns_uri = OpenID::get_sreg_ns(@msg) + ns_uri = OpenID.get_sreg_ns(@msg) assert_equal('sreg', @msg.namespaces.get_alias(ns_uri)) assert_equal(NS_URI, ns_uri) end @@ -99,46 +97,46 @@ def test_openid1_empty def test_openid1defined_1_0 @msg.openid1 = true @msg.namespaces.add(NS_URI_1_0) - ns_uri = OpenID::get_sreg_ns(@msg) + ns_uri = OpenID.get_sreg_ns(@msg) assert_equal(NS_URI_1_0, ns_uri) end def test_openid1_defined_1_0_override_alias - [true, false].each{|openid_version| - [NS_URI_1_0, NS_URI_1_1].each{|sreg_version| - ['sreg', 'bogus'].each{|name| + [true, false].each do |openid_version| + [NS_URI_1_0, NS_URI_1_1].each do |sreg_version| + %w[sreg bogus].each do |name| setup @msg.openid1 = openid_version @msg.namespaces.add_alias(sreg_version, name) - ns_uri = OpenID::get_sreg_ns(@msg) + ns_uri = OpenID.get_sreg_ns(@msg) assert_equal(name, @msg.namespaces.get_alias(ns_uri)) assert_equal(sreg_version, ns_uri) - } - } - } + end + end + end end def test_openid1_defined_badly @msg.openid1 = true @msg.namespaces.add_alias('http://invalid/', 'sreg') - assert_raises(NamespaceError) { OpenID::get_sreg_ns(@msg) } + assert_raises(NamespaceError) { OpenID.get_sreg_ns(@msg) } end def test_openid2_defined_badly @msg.namespaces.add_alias('http://invalid/', 'sreg') - assert_raises(NamespaceError) { OpenID::get_sreg_ns(@msg) } + assert_raises(NamespaceError) { OpenID.get_sreg_ns(@msg) } end def test_openid2_defined_1_0 @msg.namespaces.add(NS_URI_1_0) - ns_uri = OpenID::get_sreg_ns(@msg) + ns_uri = OpenID.get_sreg_ns(@msg) assert_equal(NS_URI_1_0, ns_uri) end def test_openid1_sreg_ns_from_args args = { - 'sreg.optional'=> 'nickname', - 'sreg.required'=> 'dob', + 'sreg.optional' => 'nickname', + 'sreg.required' => 'dob' } m = Message.from_openid_args(args) @@ -146,7 +144,6 @@ def test_openid1_sreg_ns_from_args assert_equal('nickname', m.get_arg(NS_URI_1_1, 'optional')) assert_equal('dob', m.get_arg(NS_URI_1_1, 'required')) end - end class SRegRequestTest < Minitest::Test @@ -159,7 +156,7 @@ def test_construct_empty end def test_construct_fields - req = Request.new(['nickname'],['gender'],'http://policy', 'http://sreg.ns_uri') + req = Request.new(['nickname'], ['gender'], 'http://policy', 'http://sreg.ns_uri') assert_equal(['gender'], req.optional) assert_equal(['nickname'], req.required) assert_equal('http://policy', req.policy_url) @@ -167,11 +164,11 @@ def test_construct_fields end def test_construct_bad_fields - assert_raises(ArgumentError) {Request.new(['elvis'])} + assert_raises(ArgumentError) { Request.new(['elvis']) } end def test_from_openid_request_message_copied - message = Message.from_openid_args({"sreg.required" => "nickname"}) + message = Message.from_openid_args({ 'sreg.required' => 'nickname' }) openid_req = Server::OpenIDRequest.new openid_req.message = message sreg_req = Request.from_openid_request(openid_req) @@ -182,8 +179,8 @@ def test_from_openid_request_message_copied end def test_from_openid_request_ns_1_0 - message = Message.from_openid_args({'ns.sreg' => NS_URI_1_0, - "sreg.required" => "nickname"}) + message = Message.from_openid_args({ 'ns.sreg' => NS_URI_1_0, + 'sreg.required' => 'nickname' }) openid_req = Server::OpenIDRequest.new openid_req.message = message sreg_req = Request.from_openid_request(openid_req) @@ -206,84 +203,84 @@ def test_parse_extension_args_empty def test_parse_extension_args_extra_ignored req = Request.new - req.parse_extension_args({'extra' => 'stuff'}) + req.parse_extension_args({ 'extra' => 'stuff' }) end def test_parse_extension_args_non_strict req = Request.new - req.parse_extension_args({'required' => 'stuff'}) + req.parse_extension_args({ 'required' => 'stuff' }) assert_equal([], req.required) end def test_parse_extension_args_strict req = Request.new - assert_raises(ArgumentError) { - req.parse_extension_args({'required' => 'stuff'}, true) - } + assert_raises(ArgumentError) do + req.parse_extension_args({ 'required' => 'stuff' }, true) + end end def test_parse_extension_args_policy req = Request.new - req.parse_extension_args({'policy_url' => 'http://policy'}, true) + req.parse_extension_args({ 'policy_url' => 'http://policy' }, true) assert_equal('http://policy', req.policy_url) end def test_parse_extension_args_required_empty req = Request.new - req.parse_extension_args({'required' => ''}, true) + req.parse_extension_args({ 'required' => '' }, true) assert_equal([], req.required) end def test_parse_extension_args_optional_empty req = Request.new - req.parse_extension_args({'optional' => ''},true) + req.parse_extension_args({ 'optional' => '' }, true) assert_equal([], req.optional) end def test_parse_extension_args_optional_single req = Request.new - req.parse_extension_args({'optional' => 'nickname'},true) + req.parse_extension_args({ 'optional' => 'nickname' }, true) assert_equal(['nickname'], req.optional) end def test_parse_extension_args_optional_list req = Request.new - req.parse_extension_args({'optional' => 'nickname,email'},true) - assert_equal(['nickname','email'], req.optional) + req.parse_extension_args({ 'optional' => 'nickname,email' }, true) + assert_equal(%w[nickname email], req.optional) end def test_parse_extension_args_optional_list_bad_nonstrict req = Request.new - req.parse_extension_args({'optional' => 'nickname,email,beer'}) - assert_equal(['nickname','email'], req.optional) + req.parse_extension_args({ 'optional' => 'nickname,email,beer' }) + assert_equal(%w[nickname email], req.optional) end def test_parse_extension_args_optional_list_bad_strict req = Request.new - assert_raises(ArgumentError) { - req.parse_extension_args({'optional' => 'nickname,email,beer'}, true) - } + assert_raises(ArgumentError) do + req.parse_extension_args({ 'optional' => 'nickname,email,beer' }, true) + end end def test_parse_extension_args_both_nonstrict req = Request.new - req.parse_extension_args({'optional' => 'nickname', 'required' => 'nickname'}) + req.parse_extension_args({ 'optional' => 'nickname', 'required' => 'nickname' }) assert_equal(['nickname'], req.required) assert_equal([], req.optional) end def test_parse_extension_args_both_strict req = Request.new - assert_raises(ArgumentError) { - req.parse_extension_args({'optional' => 'nickname', 'required' => 'nickname'},true) - } + assert_raises(ArgumentError) do + req.parse_extension_args({ 'optional' => 'nickname', 'required' => 'nickname' }, true) + end end def test_parse_extension_args_both_list req = Request.new - req.parse_extension_args({'optional' => 'nickname,email', 'required' => 'country,postcode'},true) - assert_equal(['nickname','email'], req.optional) - assert_equal(['country','postcode'], req.required) + req.parse_extension_args({ 'optional' => 'nickname,email', 'required' => 'country,postcode' }, true) + assert_equal(%w[nickname email], req.optional) + assert_equal(%w[country postcode], req.required) end def test_all_requested_fields @@ -293,7 +290,7 @@ def test_all_requested_fields assert_equal(['nickname'], req.all_requested_fields) req.request_field('gender', true) requested = req.all_requested_fields.sort - assert_equal(['gender', 'nickname'], requested) + assert_equal(%w[gender nickname], requested) end def test_were_fields_requested @@ -305,25 +302,25 @@ def test_were_fields_requested def test_member req = Request.new - DATA_FIELDS.keys.each {|f| + DATA_FIELDS.keys.each do |f| assert(!req.member?(f)) - } + end assert(!req.member?('something else')) req.request_field('nickname') - DATA_FIELDS.keys.each {|f| - assert_equal(f == 'nickname',req.member?(f)) - } + DATA_FIELDS.keys.each do |f| + assert_equal(f == 'nickname', req.member?(f)) + end end def test_request_field_bogus req = Request.new fields = DATA_FIELDS.keys - fields.each {|f| req.request_field(f) } + fields.each { |f| req.request_field(f) } assert_equal(fields, req.optional) assert_equal([], req.required) # By default, adding the same fields over again has no effect - fields.each {|f| req.request_field(f) } + fields.each { |f| req.request_field(f) } assert_equal(fields, req.optional) assert_equal([], req.required) @@ -334,7 +331,7 @@ def test_request_field_bogus assert_equal(expected, req.optional) assert_equal([overridden], req.required) - fields.each {|f| req.request_field(f, true) } + fields.each { |f| req.request_field(f, true) } assert_equal(fields, req.required) assert_equal([], req.optional) end @@ -379,53 +376,53 @@ def test_get_extension_args assert_equal({}, req.get_extension_args) req.request_field('nickname') - assert_equal({'optional' => 'nickname'}, req.get_extension_args) + assert_equal({ 'optional' => 'nickname' }, req.get_extension_args) req.request_field('email') - assert_equal({'optional' => 'nickname,email'}, req.get_extension_args) + assert_equal({ 'optional' => 'nickname,email' }, req.get_extension_args) req.request_field('gender', true) - assert_equal({'optional' => 'nickname,email', - 'required' => 'gender'}, req.get_extension_args) + assert_equal({ 'optional' => 'nickname,email', + 'required' => 'gender' }, req.get_extension_args) req.request_field('dob', true) - assert_equal({'optional' => 'nickname,email', - 'required' => 'gender,dob'}, req.get_extension_args) + assert_equal({ 'optional' => 'nickname,email', + 'required' => 'gender,dob' }, req.get_extension_args) req.policy_url = 'http://policy' - assert_equal({'optional' => 'nickname,email', + assert_equal({ 'optional' => 'nickname,email', 'required' => 'gender,dob', - 'policy_url' => 'http://policy'}, + 'policy_url' => 'http://policy' }, req.get_extension_args) - end end class DummySuccessResponse attr_accessor :message + def initialize(message, signed_stuff) @message = message @signed_stuff = signed_stuff end - def get_signed_ns(ns_uri) - return @signed_stuff + + def get_signed_ns(_ns_uri) + @signed_stuff end end - class SRegResponseTest < Minitest::Test def test_construct resp = Response.new(SOME_DATA) assert_equal(SOME_DATA, resp.get_extension_args) assert_equal(NS_URI, resp.ns_uri) - resp2 = Response.new({}, "http://foo") + resp2 = Response.new({}, 'http://foo') assert_equal({}, resp2.get_extension_args) assert_equal('http://foo', resp2.ns_uri) end def test_from_success_response_signed message = Message.from_openid_args({ - 'sreg.nickname'=>'The Mad Stork', + 'sreg.nickname' => 'The Mad Stork' }) success_resp = DummySuccessResponse.new(message, {}) sreg_resp = Response.from_success_response(success_resp) @@ -435,11 +432,11 @@ def test_from_success_response_signed def test_from_success_response_unsigned message = Message.from_openid_args({ 'ns.sreg' => NS_URI, - 'sreg.nickname' => 'The Mad Stork', + 'sreg.nickname' => 'The Mad Stork' }) success_resp = DummySuccessResponse.new(message, {}) sreg_resp = Response.from_success_response(success_resp, false) - assert_equal({'nickname' => 'The Mad Stork'}, + assert_equal({ 'nickname' => 'The Mad Stork' }, sreg_resp.get_extension_args) end end @@ -448,7 +445,7 @@ class SendFieldsTest < Minitest::Test # class SendFieldsTest < Object def test_send_fields # create a request message with simple reg fields - sreg_req = Request.new(['nickname', 'email'], ['fullname']) + sreg_req = Request.new(%w[nickname email], ['fullname']) req_msg = Message.new req_msg.update_args(NS_URI, sreg_req.get_extension_args) req = Server::OpenIDRequest.new @@ -467,10 +464,9 @@ def test_send_fields # extract sent fields sreg_data_resp = resp_msg.get_args(NS_URI) - assert_equal({'nickname' => 'linusaur', - 'email'=>'president@whitehouse.gov', - 'fullname'=>'Leonhard Euler', - }, sreg_data_resp) + assert_equal({ 'nickname' => 'linusaur', + 'email' => 'president@whitehouse.gov', + 'fullname' => 'Leonhard Euler' }, sreg_data_resp) end end end diff --git a/test/test_stores.rb b/test/test_stores.rb index 4a039731..7fef94c3 100644 --- a/test/test_stores.rb +++ b/test/test_stores.rb @@ -11,7 +11,7 @@ module OpenID module Store module StoreTestCase @@allowed_handle = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' - @@allowed_nonce = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + @@allowed_nonce = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' def _gen_nonce OpenID::CryptUtil.random_string(8, @@allowed_nonce) @@ -21,18 +21,18 @@ def _gen_handle(n) OpenID::CryptUtil.random_string(n, @@allowed_handle) end - def _gen_secret(n, chars=nil) + def _gen_secret(n, chars = nil) OpenID::CryptUtil.random_string(n, chars) end - def _gen_assoc(issued, lifetime=600) + def _gen_assoc(issued, lifetime = 600) secret = _gen_secret(20) handle = _gen_handle(128) OpenID::Association.new(handle, secret, Time.now + issued, lifetime, 'HMAC-SHA1') end - def _check_retrieve(url, handle=nil, expected=nil) + def _check_retrieve(url, handle = nil, expected = nil) ret_assoc = @store.get_association(url, handle) if expected.nil? @@ -50,7 +50,7 @@ def _check_remove(url, handle, expected) end def test_store - assoc = _gen_assoc(issued=0) + assoc = _gen_assoc(issued = 0) # Make sure that a missing association returns no result _check_retrieve(server_url) @@ -82,7 +82,7 @@ def test_store @store.store_association(server_url, assoc) # More recent and expires after assoc - assoc2 = _gen_assoc(issued=1) + assoc2 = _gen_assoc(issued = 1) @store.store_association(server_url, assoc2) # After storing an association with a different handle, but the @@ -99,7 +99,7 @@ def test_store # More recent, and expires earlier than assoc2 or assoc. Make sure # that we're picking the one with the latest issued date and not # taking into account the expiration. - assoc3 = _gen_assoc(issued=2, 100) + assoc3 = _gen_assoc(issued = 2, 100) @store.store_association(server_url, assoc3) _check_retrieve(server_url, nil, assoc3) @@ -151,66 +151,64 @@ def test_assoc_cleanup @store.store_association(server_url + '2', assocExpired2) @store.store_association(server_url + '3', assocValid2) - cleaned = @store.cleanup_associations() - assert_equal(2, cleaned, "cleaned up associations") + cleaned = @store.cleanup_associations + assert_equal(2, cleaned, 'cleaned up associations') end - def _check_use_nonce(nonce, expected, server_url, msg='') - stamp, salt = Nonce::split_nonce(nonce) + def _check_use_nonce(nonce, expected, server_url, msg = '') + stamp, salt = Nonce.split_nonce(nonce) actual = @store.use_nonce(server_url, stamp, salt) assert_equal(expected, actual, msg) end def server_url - "http://www.myopenid.com/openid" + 'http://www.myopenid.com/openid' end def test_nonce - [server_url, ''].each{|url| - nonce1 = Nonce::mk_nonce + [server_url, ''].each do |url| + nonce1 = Nonce.mk_nonce _check_use_nonce(nonce1, true, url, "#{url}: nonce allowed by default") _check_use_nonce(nonce1, false, url, "#{url}: nonce not allowed twice") _check_use_nonce(nonce1, false, url, "#{url}: nonce not allowed third time") # old nonces shouldn't pass - old_nonce = Nonce::mk_nonce(3600) + old_nonce = Nonce.mk_nonce(3600) _check_use_nonce(old_nonce, false, url, "Old nonce #{old_nonce.inspect} passed") - - } + end end def test_nonce_cleanup now = Time.now.to_i - old_nonce1 = Nonce::mk_nonce(now - 20000) - old_nonce2 = Nonce::mk_nonce(now - 10000) - recent_nonce = Nonce::mk_nonce(now - 600) + old_nonce1 = Nonce.mk_nonce(now - 20_000) + old_nonce2 = Nonce.mk_nonce(now - 10_000) + recent_nonce = Nonce.mk_nonce(now - 600) orig_skew = Nonce.skew Nonce.skew = 0 @store.cleanup_nonces - Nonce.skew = 1000000 - ts, salt = Nonce::split_nonce(old_nonce1) - assert(@store.use_nonce(server_url, ts, salt), "oldnonce1") - ts, salt = Nonce::split_nonce(old_nonce2) - assert(@store.use_nonce(server_url, ts, salt), "oldnonce2") - ts, salt = Nonce::split_nonce(recent_nonce) - assert(@store.use_nonce(server_url, ts, salt), "recent_nonce") + Nonce.skew = 1_000_000 + ts, salt = Nonce.split_nonce(old_nonce1) + assert(@store.use_nonce(server_url, ts, salt), 'oldnonce1') + ts, salt = Nonce.split_nonce(old_nonce2) + assert(@store.use_nonce(server_url, ts, salt), 'oldnonce2') + ts, salt = Nonce.split_nonce(recent_nonce) + assert(@store.use_nonce(server_url, ts, salt), 'recent_nonce') Nonce.skew = 1000 cleaned = @store.cleanup_nonces assert_equal(2, cleaned, "Cleaned #{cleaned} nonces") - Nonce.skew = 100000 - ts, salt = Nonce::split_nonce(old_nonce1) - assert(@store.use_nonce(server_url, ts, salt), "oldnonce1 after cleanup") - ts, salt = Nonce::split_nonce(old_nonce2) - assert(@store.use_nonce(server_url, ts, salt), "oldnonce2 after cleanup") - ts, salt = Nonce::split_nonce(recent_nonce) - assert(!@store.use_nonce(server_url, ts, salt), "recent_nonce after cleanup") + Nonce.skew = 100_000 + ts, salt = Nonce.split_nonce(old_nonce1) + assert(@store.use_nonce(server_url, ts, salt), 'oldnonce1 after cleanup') + ts, salt = Nonce.split_nonce(old_nonce2) + assert(@store.use_nonce(server_url, ts, salt), 'oldnonce2 after cleanup') + ts, salt = Nonce.split_nonce(recent_nonce) + assert(!@store.use_nonce(server_url, ts, salt), 'recent_nonce after cleanup') Nonce.skew = orig_skew - end end @@ -218,7 +216,8 @@ class FileStoreTestCase < Minitest::Test include StoreTestCase def setup - raise "filestoretest directory exists" if File.exist?('filestoretest') + raise 'filestoretest directory exists' if File.exist?('filestoretest') + @store = Filesystem.new('filestoretest') end @@ -242,56 +241,52 @@ def setup class MemcacheStoreTestCase < Minitest::Test include StoreTestCase def setup - store_uniq = OpenID::CryptUtil.random_string(6, "0123456789") + store_uniq = OpenID::CryptUtil.random_string(6, '0123456789') store_namespace = "openid-store-#{store_uniq}:" @store = Memcache.new(::TESTING_MEMCACHE, store_namespace) end - def test_nonce_cleanup - end + def test_nonce_cleanup; end - def test_assoc_cleanup - end + def test_assoc_cleanup; end end end class AbstractStoreTestCase < Minitest::Test def test_abstract_class # the abstract made concrete - abc = Interface.new() - server_url = "http://server.com/" - association = OpenID::Association.new("foo", "bar", Time.now, Time.now + 10, "dummy") + abc = Interface.new + server_url = 'http://server.com/' + association = OpenID::Association.new('foo', 'bar', Time.now, Time.now + 10, 'dummy') - assert_raises(NotImplementedError) { + assert_raises(NotImplementedError) do abc.store_association(server_url, association) - } + end - assert_raises(NotImplementedError) { + assert_raises(NotImplementedError) do abc.get_association(server_url) - } + end - assert_raises(NotImplementedError) { + assert_raises(NotImplementedError) do abc.remove_association(server_url, association.handle) - } - - assert_raises(NotImplementedError) { - abc.use_nonce(server_url, Time.now.to_i, "foo") - } + end - assert_raises(NotImplementedError) { - abc.cleanup_nonces() - } + assert_raises(NotImplementedError) do + abc.use_nonce(server_url, Time.now.to_i, 'foo') + end - assert_raises(NotImplementedError) { - abc.cleanup_associations() - } + assert_raises(NotImplementedError) do + abc.cleanup_nonces + end - assert_raises(NotImplementedError) { - abc.cleanup() - } + assert_raises(NotImplementedError) do + abc.cleanup_associations + end + assert_raises(NotImplementedError) do + abc.cleanup + end end - end end end diff --git a/test/test_trustroot.rb b/test/test_trustroot.rb index 5baa1bb6..2a800e51 100644 --- a/test/test_trustroot.rb +++ b/test/test_trustroot.rb @@ -34,79 +34,79 @@ def _test_match(trust_root, url, expected_match) def test_trustroots data = read_data_file('trustroot.txt', false) - parts = data.split('=' * 40 + "\n").collect { |i| i.strip() } + parts = data.split('=' * 40 + "\n").collect { |i| i.strip } assert(parts[0] == '') _, ph, pdat, mh, mdat = parts - getTests(['bad', 'insane', 'sane'], ph, pdat).each { |tc| + getTests(%w[bad insane sane], ph, pdat).each do |tc| sanity, desc, case_ = tc _test_sanity(case_, sanity, desc) - } + end - getTests([true, false], mh, mdat).each { |tc| + getTests([true, false], mh, mdat).each do |tc| match, _, case_ = tc - trust_root, url = case_.split() + trust_root, url = case_.split _test_match(trust_root, url, match) - } + end end def getTests(grps, head, dat) tests = [] - top = head.strip() - gdat = dat.split('-' * 40 + "\n").collect { |i| i.strip() } + top = head.strip + gdat = dat.split('-' * 40 + "\n").collect { |i| i.strip } assert gdat[0] == '' assert gdat.length == (grps.length * 2 + 1) i = 1 - grps.each { |x| + grps.each do |x| n, desc = gdat[i].split(': ') cases = gdat[i + 1].split("\n") - assert(cases.length == n.to_i, "Number of cases differs from header count") - cases.each { |case_| + assert(cases.length == n.to_i, 'Number of cases differs from header count') + cases.each do |case_| tests += [[x, top + ' - ' + desc, case_]] - } + end i += 2 - } + end - return tests + tests end def test_return_to_matches data = [ - [[], nil, false], - [[], "", false], - [[], "http://bogus/return_to", false], - [["http://bogus/"], nil, false], - [["://broken/"], nil, false], - [["://broken/"], "http://broken/", false], - [["http://*.broken/"], "http://foo.broken/", false], - [["http://x.broken/"], "http://foo.broken/", false], - [["http://first/", "http://second/path/"], "http://second/?query=x", false], + [[], nil, false], + [[], '', false], + [[], 'http://bogus/return_to', false], + [['http://bogus/'], nil, false], + [['://broken/'], nil, false], + [['://broken/'], 'http://broken/', false], + [['http://*.broken/'], 'http://foo.broken/', false], + [['http://x.broken/'], 'http://foo.broken/', false], + [['http://first/', 'http://second/path/'], 'http://second/?query=x', false], - [["http://broken/"], "http://broken/", true], - [["http://first/", "http://second/"], "http://second/?query=x", true], - ] + [['http://broken/'], 'http://broken/', true], + [['http://first/', 'http://second/'], 'http://second/?query=x', true] + ] - data.each { |case_| + data.each do |case_| allowed_return_urls, return_to, expected_result = case_ - actual_result = OpenID::TrustRoot::return_to_matches(allowed_return_urls, - return_to) + actual_result = OpenID::TrustRoot.return_to_matches(allowed_return_urls, + return_to) assert(expected_result == actual_result) - } + end end def test_build_discovery_url data = [ - ["http://foo.com/path", "http://foo.com/path"], - ["http://foo.com/path?foo=bar", "http://foo.com/path?foo=bar"], - ["http://*.bogus.com/path", "http://www.bogus.com/path"], - ["http://*.bogus.com:122/path", "http://www.bogus.com:122/path"], - ] + ['http://foo.com/path', 'http://foo.com/path'], + ['http://foo.com/path?foo=bar', 'http://foo.com/path?foo=bar'], + ['http://*.bogus.com/path', 'http://www.bogus.com/path'], + ['http://*.bogus.com:122/path', 'http://www.bogus.com:122/path'] + ] - data.each { |case_| + data.each do |case_| trust_root, expected_disco_url = case_ tr = OpenID::TrustRoot::TrustRoot.parse(trust_root) - actual_disco_url = tr.build_discovery_url() + actual_disco_url = tr.build_discovery_url assert actual_disco_url == expected_disco_url - } + end end end diff --git a/test/test_ui.rb b/test/test_ui.rb index e7a68216..2d6ab633 100644 --- a/test/test_ui.rb +++ b/test/test_ui.rb @@ -6,7 +6,6 @@ module OpenID module UITest class UIRequestTestCase < Minitest::Test - def setup @req = UI::Request.new end @@ -17,15 +16,15 @@ def test_construct assert_nil @req.lang assert_equal 'ui', @req.ns_alias - req2 = UI::Request.new("popup", true, "ja-JP") - assert_equal "popup", req2.mode + req2 = UI::Request.new('popup', true, 'ja-JP') + assert_equal 'popup', req2.mode assert_equal true, req2.icon - assert_equal "ja-JP", req2.lang + assert_equal 'ja-JP', req2.lang end def test_add_mode - @req.mode = "popup" - assert_equal "popup", @req.mode + @req.mode = 'popup' + assert_equal 'popup', @req.mode end def test_add_icon @@ -34,26 +33,26 @@ def test_add_icon end def test_add_lang - @req.lang = "ja-JP" - assert_equal "ja-JP", @req.lang + @req.lang = 'ja-JP' + assert_equal 'ja-JP', @req.lang end def test_get_extension_args assert_equal({}, @req.get_extension_args) - @req.mode = "popup" - assert_equal({'mode' => 'popup'}, @req.get_extension_args) + @req.mode = 'popup' + assert_equal({ 'mode' => 'popup' }, @req.get_extension_args) @req.icon = true - assert_equal({'mode' => 'popup', 'icon' => true}, @req.get_extension_args) - @req.lang = "ja-JP" - assert_equal({'mode' => 'popup', 'icon' => true, 'lang' => 'ja-JP'}, @req.get_extension_args) + assert_equal({ 'mode' => 'popup', 'icon' => true }, @req.get_extension_args) + @req.lang = 'ja-JP' + assert_equal({ 'mode' => 'popup', 'icon' => true, 'lang' => 'ja-JP' }, @req.get_extension_args) end def test_parse_extension_args - args = {'mode' => 'popup', 'icon' => true, 'lang' => 'ja-JP'} + args = { 'mode' => 'popup', 'icon' => true, 'lang' => 'ja-JP' } @req.parse_extension_args args - assert_equal "popup", @req.mode + assert_equal 'popup', @req.mode assert_equal true, @req.icon - assert_equal "ja-JP", @req.lang + assert_equal 'ja-JP', @req.lang end def test_parse_extension_args_empty @@ -75,9 +74,9 @@ def test_from_openid_request oid_req = Server::OpenIDRequest.new oid_req.message = openid_req_msg req = UI::Request.from_openid_request oid_req - assert_equal "popup", req.mode + assert_equal 'popup', req.mode assert_equal true, req.icon - assert_equal "ja-JP", req.lang + assert_equal 'ja-JP', req.lang end def test_from_openid_request_no_ui_params @@ -87,7 +86,6 @@ def test_from_openid_request_no_ui_params ui_req = UI::Request.from_openid_request openid_req assert ui_req.nil? end - end end end diff --git a/test/test_urinorm.rb b/test/test_urinorm.rb index 9f6597ed..9b7ca734 100644 --- a/test/test_urinorm.rb +++ b/test/test_urinorm.rb @@ -1,6 +1,6 @@ -require "minitest/autorun" -require "testutil" -require "openid/urinorm" +require 'minitest/autorun' +require 'testutil' +require 'openid/urinorm' class URINormTestCase < Minitest::Test include OpenID::TestDataMixin @@ -29,6 +29,4 @@ def test_normalize end end end - end - diff --git a/test/test_util.rb b/test/test_util.rb index 52c1fb0b..16058633 100644 --- a/test/test_util.rb +++ b/test/test_util.rb @@ -1,37 +1,35 @@ # encoding: ASCII-8BIT -require "minitest/autorun" -require "openid/util" + +require 'minitest/autorun' +require 'openid/util' module OpenID class UtilTestCase < Minitest::Test - def test_base64 cases = [ - "", - "\000", - "\001", - "\000" * 100, - (0...256).collect{ |i| i.chr }.join('') - ] + '', + "\000", + "\001", + "\000" * 100, + (0...256).collect { |i| i.chr }.join('') + ] cases.each do |c| encoded = Util.to_base64(c) decoded = Util.from_base64(encoded) assert(c == decoded) end - end def test_base64_valid - [["foos", "~\212,"], - ["++++", "\373\357\276"], - ["/+==", "\377"], - ["", ""], - ["FOOSBALL", "\024\343\222\004\002\313"], - ["FoosBL==", "\026\212,\004"], + [['foos', "~\212,"], + ['++++', "\373\357\276"], + ['/+==', "\377"], + ['', ''], + ['FOOSBALL', "\024\343\222\004\002\313"], + ['FoosBL==', "\026\212,\004"], ["Foos\nBall", "\026\212,\005\251e"], - ["Foo\r\ns\nBall", "\026\212,\005\251e"] - ].each do | input, expected | + ["Foo\r\ns\nBall", "\026\212,\005\251e"]].each do |input, expected| assert_equal(expected, Util.from_base64(input)) end end @@ -42,103 +40,100 @@ def test_base64_invalid 'Balls', 'B===', 'Foos Ball', - '=foo', - ].each do |invalid_input| + '=foo'].each do |invalid_input| assert_raises(ArgumentError) do Util.from_base64(invalid_input) end end end - def test_append_args() + def test_append_args simple = 'http://www.example.com/' cases = [ - ['empty list', - [simple, []], - simple], + ['empty list', + [simple, []], + simple], - ['empty dict', - [simple, {}], - simple], + ['empty dict', + [simple, {}], + simple], - ['one list', - [simple, [['a', 'b']]], - simple + '?a=b'], + ['one list', + [simple, [%w[a b]]], + simple + '?a=b'], - ['one dict', - [simple, {'a' => 'b'}], - simple + '?a=b'], + ['one dict', + [simple, { 'a' => 'b' }], + simple + '?a=b'], - ['two list (same)', - [simple, [['a', 'b'], ['a', 'c']]], - simple + '?a=b&a=c'], + ['two list (same)', + [simple, [%w[a b], %w[a c]]], + simple + '?a=b&a=c'], - ['two list', - [simple, [['a', 'b'], ['b', 'c']]], - simple + '?a=b&b=c'], + ['two list', + [simple, [%w[a b], %w[b c]]], + simple + '?a=b&b=c'], - ['two list (order)', - [simple, [['b', 'c'], ['a', 'b']]], - simple + '?b=c&a=b'], + ['two list (order)', + [simple, [%w[b c], %w[a b]]], + simple + '?b=c&a=b'], - ['two dict [order]', - [simple, {'b' => 'c', 'a' => 'b'}], - simple + '?a=b&b=c'], + ['two dict [order]', + [simple, { 'b' => 'c', 'a' => 'b' }], + simple + '?a=b&b=c'], - ['args exist [empty]', - [simple + '?stuff=bother', []], - simple + '?stuff=bother'], + ['args exist [empty]', + [simple + '?stuff=bother', []], + simple + '?stuff=bother'], - ['escape', - [simple, [['=', '=']]], - simple + '?%3D=%3D'], + ['escape', + [simple, [['=', '=']]], + simple + '?%3D=%3D'], - ['escape [URL]', - [simple, [['this_url', simple]]], - simple + '?this_url=http%3A%2F%2Fwww.example.com%2F'], + ['escape [URL]', + [simple, [['this_url', simple]]], + simple + '?this_url=http%3A%2F%2Fwww.example.com%2F'], - ['use dots', - [simple, [['openid.stuff', 'bother']]], - simple + '?openid.stuff=bother'], + ['use dots', + [simple, [['openid.stuff', 'bother']]], + simple + '?openid.stuff=bother'], - ['args exist', - [simple + '?stuff=bother', [['ack', 'ack']]], - simple + '?stuff=bother&ack=ack'], + ['args exist', + [simple + '?stuff=bother', [%w[ack ack]]], + simple + '?stuff=bother&ack=ack'], - ['args exist', - [simple + '?stuff=bother', [['ack', 'ack']]], - simple + '?stuff=bother&ack=ack'], + ['args exist', + [simple + '?stuff=bother', [%w[ack ack]]], + simple + '?stuff=bother&ack=ack'], - ['args exist [dict]', - [simple + '?stuff=bother', {'ack' => 'ack'}], - simple + '?stuff=bother&ack=ack'], + ['args exist [dict]', + [simple + '?stuff=bother', { 'ack' => 'ack' }], + simple + '?stuff=bother&ack=ack'], - ['args exist [dict 2]', - [simple + '?stuff=bother', {'ack' => 'ack', 'zebra' => 'lion'}], - simple + '?stuff=bother&ack=ack&zebra=lion'], + ['args exist [dict 2]', + [simple + '?stuff=bother', { 'ack' => 'ack', 'zebra' => 'lion' }], + simple + '?stuff=bother&ack=ack&zebra=lion'], - ['three args [dict]', - [simple, {'stuff' => 'bother', 'ack' => 'ack', 'zebra' => 'lion'}], - simple + '?ack=ack&stuff=bother&zebra=lion'], + ['three args [dict]', + [simple, { 'stuff' => 'bother', 'ack' => 'ack', 'zebra' => 'lion' }], + simple + '?ack=ack&stuff=bother&zebra=lion'], - ['three args [list]', - [simple, [['stuff', 'bother'], ['ack', 'ack'], ['zebra', 'lion']]], - simple + '?stuff=bother&ack=ack&zebra=lion'], - ] + ['three args [list]', + [simple, [%w[stuff bother], %w[ack ack], %w[zebra lion]]], + simple + '?stuff=bother&ack=ack&zebra=lion'] + ] - cases.each { |name, args, expected| + cases.each do |name, args, expected| url, pairs = args actual = Util.append_args(url, pairs) msg = "[#{name}] Expected: #{expected}, actual: #{actual}" assert_equal(expected, actual, msg) - } - + end end def test_parse_query - assert_equal({'foo'=>'bar'}, Util.parse_query('foo=bar')) + assert_equal({ 'foo' => 'bar' }, Util.parse_query('foo=bar')) end - end end diff --git a/test/test_xrds.rb b/test/test_xrds.rb index 595af1fb..6c7708f5 100644 --- a/test/test_xrds.rb +++ b/test/test_xrds.rb @@ -4,7 +4,6 @@ module OpenID module Yadis - module XRDSTestMixin include TestDataMixin @@ -30,22 +29,22 @@ def test_parse def test_parse_no_xrds_xml xmldoc = read_xrds_data_file(NOXRDS_FILE) - assert_raises(Yadis::XRDSError) { + assert_raises(Yadis::XRDSError) do Yadis.parseXRDS(xmldoc) - } + end end def test_parse_no_xrds_empty - assert_raises(Yadis::XRDSError) { + assert_raises(Yadis::XRDSError) do Yadis.parseXRDS('') - } + end end def test_is_xrds isnt = REXML::Document.new(read_xrds_data_file(NOXRDS_FILE)) should_be = Yadis.parseXRDS(read_xrds_data_file(XRD_FILE)) - assert_equal false, Yadis::is_xrds?(isnt) - assert Yadis::is_xrds?(should_be) + assert_equal false, Yadis.is_xrds?(isnt) + assert Yadis.is_xrds?(should_be) end end @@ -55,7 +54,7 @@ class GetYadisXRDTestCase < Minitest::Test # XXX: Test to make sure this really gets the _right_ XRD. def test_get_xrd doc = Yadis.parseXRDS(read_xrds_data_file(XRD_FILE)) - result = Yadis::get_yadis_xrd(doc) + result = Yadis.get_yadis_xrd(doc) refute_nil result assert_equal 'XRD', result.name assert_equal Yadis::XRD_NS_2_0, result.namespace @@ -64,9 +63,9 @@ def test_get_xrd def test_no_xrd xmldoc = read_xrds_data_file(NOXRD_FILE) doc = Yadis.parseXRDS(xmldoc) - assert_raises(Yadis::XRDSError) { + assert_raises(Yadis::XRDSError) do Yadis.get_yadis_xrd(doc) - } + end end end @@ -76,10 +75,10 @@ class EachServiceTestCase < Minitest::Test def test_get_xrd doc = Yadis.parseXRDS(read_xrds_data_file(XRD_FILE)) count = 0 - result = Yadis::each_service(doc) { |e| + result = Yadis.each_service(doc) do |e| assert_equal 'Service', e.name count += 1 - } + end refute_nil result assert_equal 5, count end @@ -87,18 +86,18 @@ def test_get_xrd def test_no_xrd xmldoc = read_xrds_data_file(NOXRD_FILE) doc = Yadis.parseXRDS(xmldoc) - assert_raises(Yadis::XRDSError) { + assert_raises(Yadis::XRDSError) do Yadis.each_service(doc) - } + end end def test_equal_j3h doc = Yadis.parseXRDS(read_xrds_data_file('=j3h.2007.11.14.xrds')) count = 0 - result = Yadis::each_service(doc) { |e| + result = Yadis.each_service(doc) do |e| assert_equal 'Service', e.name count += 1 - } + end refute_nil result assert_equal 2, count end @@ -107,20 +106,20 @@ def test_equal_j3h # XXX: test prioSort! class ExpandServiceTestCase < Minitest::Test - @@service_xml = < -urn://foo -urn://bar -http://2.invalid/ -http://0.invalid/ -http://1.invalid/ - -END + @@service_xml = <<~END + + urn://foo + urn://bar + http://2.invalid/ + http://0.invalid/ + http://1.invalid/ + + END # XXX - not sorted! def test_expand_service service_element = REXML::Document.new(@@service_xml).root - result = Yadis::expand_service(service_element) + result = Yadis.expand_service(service_element) assert_equal 3, result.length types, uri, result_element = result[0] assert_same service_element, result_element @@ -135,19 +134,19 @@ def test_expand_service class PrioSortTestCase < Minitest::Test def new_uri(priority) - e = REXML::Element.new("URI") - e.add_attribute("priority", priority.to_s) unless e.nil? - return e + e = REXML::Element.new('URI') + e.add_attribute('priority', priority.to_s) unless e.nil? + e end def test_sorting l = [ - e7 = new_uri(7), - e1 = new_uri(1), - e0 = new_uri(nil), - e2 = new_uri(2), - ] - sorted = Yadis::prio_sort(l) + e7 = new_uri(7), + e1 = new_uri(1), + e0 = new_uri(nil), + e2 = new_uri(2) + ] + sorted = Yadis.prio_sort(l) assert_same e0, sorted[0] assert_same e1, sorted[1] assert_same e2, sorted[2] diff --git a/test/test_xri.rb b/test/test_xri.rb index f6775f79..e3d5517e 100644 --- a/test/test_xri.rb +++ b/test/test_xri.rb @@ -2,11 +2,8 @@ require 'openid/yadis/xri' module OpenID - module Yadis - class XriDiscoveryTestCase < Minitest::Test - def test_isXRI? assert_equal(:xri, XRI.identifier_scheme('=john.smith')) assert_equal(:xri, XRI.identifier_scheme('@smiths/john')) @@ -20,7 +17,7 @@ def test_isXRI? class XriEscapingTestCase < Minitest::Test def test_escaping_percents - assert_equal('@example/abc%252Fd/ef', + assert_equal('@example/abc%252Fd/ef', XRI.escape_for_iri('@example/abc%2Fd/ef')) end diff --git a/test/test_xrires.rb b/test/test_xrires.rb index a08f2cb5..f7b7b4db 100644 --- a/test/test_xrires.rb +++ b/test/test_xrires.rb @@ -3,16 +3,13 @@ module OpenID module Yadis - class XRDSFetcher def initialize(results) @results = results end - def fetch(url, body=nil, headers=nil, redirect_limit=nil) - if !@results.empty? - return @results.shift - end + def fetch(_url, _body = nil, _headers = nil, _redirect_limit = nil) + return @results.shift unless @results.empty? nil end @@ -29,7 +26,7 @@ def setup def test_proxy_url st = @servicetype ste = @servicetype_enc - args_esc = ["_xrd_r=application%2Fxrds%2Bxml", "_xrd_t=#{ste}"] + args_esc = ['_xrd_r=application%2Fxrds%2Bxml', "_xrd_t=#{ste}"] pqu = @proxy.method('query_url') h = @proxy_url @@ -50,7 +47,7 @@ def test_proxy_url assert_match args_esc[1], pqu.call('=foo/bar?mi=fa&so=la', st) # With no service endpoint selection. - args_esc = "_xrd_r=application%2Fxrds%2Bxml%3Bsep%3Dfalse" + args_esc = '_xrd_r=application%2Fxrds%2Bxml%3Bsep%3Dfalse' assert_match h + '=foo?', pqu.call('=foo', nil) assert_match args_esc, pqu.call('=foo', nil) @@ -59,7 +56,7 @@ def test_proxy_url def test_proxy_url_qmarks st = @servicetype ste = @servicetype_enc - args_esc = ["_xrd_r=application%2Fxrds%2Bxml", "_xrd_t=#{ste}"] + args_esc = ['_xrd_r=application%2Fxrds%2Bxml', "_xrd_t=#{ste}"] pqu = @proxy.method('query_url') h = @proxy_url diff --git a/test/test_yadis_discovery.rb b/test/test_yadis_discovery.rb index 434a020e..6727ac7a 100644 --- a/test/test_yadis_discovery.rb +++ b/test/test_yadis_discovery.rb @@ -7,7 +7,6 @@ require 'discoverdata' module OpenID - module YadisDiscovery include FetcherMixin include DiscoverData @@ -18,15 +17,15 @@ def self.mkResponse(data) status_mo = data.scan(STATUS_HEADER_RE) headers_str, body = data.split("\n\n", 2) headers = {} - headers_str.split("\n", -1).each { |line| + headers_str.split("\n", -1).each do |line| k, v = line.split(':', 2) - k = k.strip().downcase - v = v.strip() + k = k.strip.downcase + v = v.strip headers[k] = v - } + end status = status_mo[0][0].to_i - return HTTPResponse._from_raw_data(status, body, - headers) + HTTPResponse._from_raw_data(status, body, + headers) end class TestFetcher @@ -36,10 +35,10 @@ def initialize(base_url) @base_url = base_url end - def fetch(url, headers, body, redirect_limit=nil) + def fetch(url, _headers, _body, _redirect_limit = nil) current_url = url while true - parsed = URI::parse(current_url) + parsed = URI.parse(current_url) # parsed[2][1:] path = parsed.path[1..-1] begin @@ -50,7 +49,7 @@ def fetch(url, headers, body, redirect_limit=nil) end response = YadisDiscovery.mkResponse(data) - if ["301", "302", "303", "307"].member?(response.code) + if %w[301 302 303 307].member?(response.code) current_url = response['location'] else response.final_url = current_url @@ -65,16 +64,14 @@ def initialize @count = 0 end - def fetch(uri, headers=nil, body=nil, redirect_limit=nil) + def fetch(uri, headers = nil, _body = nil, _redirect_limit = nil) @count += 1 - if @count == 1 - headers = { - 'X-XRDS-Location'.downcase => 'http://unittest/404', - } - return HTTPResponse._from_raw_data(200, '', headers, uri) - else - return HTTPResponse._from_raw_data(404, '', {}, uri) - end + return HTTPResponse._from_raw_data(404, '', {}, uri) unless @count == 1 + + headers = { + 'X-XRDS-Location'.downcase => 'http://unittest/404' + } + HTTPResponse._from_raw_data(200, '', headers, uri) end end @@ -82,10 +79,10 @@ class TestSecondGet < Minitest::Test include FetcherMixin def test_404 - uri = "http://something.unittest/" - assert_raises(DiscoveryFailure) { + uri = 'http://something.unittest/' + assert_raises(DiscoveryFailure) do with_fetcher(MockFetcher.new) { Yadis.discover(uri) } - } + end end end @@ -119,20 +116,20 @@ def do_discovery def runCustomTest setup - if @expected.respond_to?("ancestors") and @expected.ancestors.member?(DiscoveryFailure) - @testcase.assert_raises(DiscoveryFailure) { + if @expected.respond_to?('ancestors') and @expected.ancestors.member?(DiscoveryFailure) + @testcase.assert_raises(DiscoveryFailure) do do_discovery - } + end else result = do_discovery @testcase.assert_equal(@input_url, result.request_uri) - msg = sprintf("Identity URL mismatch: actual = %s, expected = %s", - result.normalized_uri, @expected.normalized_uri) + msg = format('Identity URL mismatch: actual = %s, expected = %s', + result.normalized_uri, @expected.normalized_uri) @testcase.assert_equal(@expected.normalized_uri, result.normalized_uri, msg) - msg = sprintf("Content mismatch: actual = %s, expected = %s", - result.response_text, @expected.response_text) + msg = format('Content mismatch: actual = %s, expected = %s', + result.response_text, @expected.response_text) @testcase.assert_equal(@expected.response_text, result.response_text, msg) expected_keys = @expected.instance_variables @@ -143,24 +140,24 @@ def runCustomTest @testcase.assert_equal(actual_keys, expected_keys) - @expected.instance_variables.each { |k| + @expected.instance_variables.each do |k| exp_v = @expected.instance_variable_get(k) act_v = result.instance_variable_get(k) @testcase.assert_equal(act_v, exp_v, [k, exp_v, act_v]) - } + end end end end class NoContentTypeFetcher - def fetch(url, body=nil, headers=nil, redirect_limit=nil) - return OpenID::HTTPResponse._from_raw_data(200, "", {}, nil) + def fetch(_url, _body = nil, _headers = nil, _redirect_limit = nil) + OpenID::HTTPResponse._from_raw_data(200, '', {}, nil) end end class BlankContentTypeFetcher - def fetch(url, body=nil, headers=nil, redirect_limit=nil) - return OpenID::HTTPResponse._from_raw_data(200, "", {"Content-Type" => ""}, nil) + def fetch(_url, _body = nil, _headers = nil, _redirect_limit = nil) + OpenID::HTTPResponse._from_raw_data(200, '', { 'Content-Type' => '' }, nil) end end @@ -168,23 +165,23 @@ class TestYadisDiscovery < Minitest::Test include FetcherMixin def test_yadis_discovery - DiscoverData::TESTLIST.each { |success, input_name, id_name, result_name| + DiscoverData::TESTLIST.each do |success, input_name, id_name, result_name| test = DiscoveryTestCase.new(self, input_name, id_name, result_name, success) test.runCustomTest - } + end end def test_is_xrds_yadis_location result = Yadis::DiscoveryResult.new('http://request.uri/') - result.normalized_uri = "http://normalized/" - result.xrds_uri = "http://normalized/xrds" + result.normalized_uri = 'http://normalized/' + result.xrds_uri = 'http://normalized/xrds' assert(result.is_xrds) end def test_is_xrds_content_type result = Yadis::DiscoveryResult.new('http://request.uri/') - result.normalized_uri = result.xrds_uri = "http://normalized/" + result.normalized_uri = result.xrds_uri = 'http://normalized/' result.content_type = Yadis::YADIS_CONTENT_TYPE assert(result.is_xrds) @@ -192,23 +189,23 @@ def test_is_xrds_content_type def test_is_xrds_neither result = Yadis::DiscoveryResult.new('http://request.uri/') - result.normalized_uri = result.xrds_uri = "http://normalized/" - result.content_type = "another/content-type" + result.normalized_uri = result.xrds_uri = 'http://normalized/' + result.content_type = 'another/content-type' assert(!result.is_xrds) end def test_no_content_type with_fetcher(NoContentTypeFetcher.new) do - result = Yadis.discover("http://bogus") + result = Yadis.discover('http://bogus') assert_nil(result.content_type) end end def test_blank_content_type with_fetcher(BlankContentTypeFetcher.new) do - result = Yadis.discover("http://bogus") - assert_equal("", result.content_type) + result = Yadis.discover('http://bogus') + assert_equal('', result.content_type) end end end diff --git a/test/testutil.rb b/test/testutil.rb index 9d74db56..b3ee1c50 100644 --- a/test/testutil.rb +++ b/test/testutil.rb @@ -1,4 +1,4 @@ -require "pathname" +require 'pathname' if defined? Minitest::Test # We're on Minitest 5+. Nothing to do here. @@ -12,7 +12,7 @@ module TestDataMixin TESTS_DIR = Pathname.new(__FILE__).dirname TEST_DATA_DIR = Pathname.new('data') - def read_data_file(filename, lines=true, data_dir=TEST_DATA_DIR) + def read_data_file(filename, lines = true, data_dir = TEST_DATA_DIR) fname = TESTS_DIR.join(data_dir, filename) if lines @@ -28,7 +28,7 @@ def with_fetcher(fetcher) original_fetcher = OpenID.fetcher begin OpenID.fetcher = fetcher - return yield + yield ensure OpenID.fetcher = original_fetcher end @@ -37,7 +37,7 @@ def with_fetcher(fetcher) module Const def const(symbol, value) - (class << self;self;end).instance_eval do + (class << self; self; end).instance_eval do define_method(symbol) { value } end end @@ -54,15 +54,13 @@ def initialize(code, body) module ProtocolErrorMixin def assert_protocol_error(str_prefix) - begin - result = yield - rescue ProtocolError => why - message = "Expected prefix #{str_prefix.inspect}, got "\ - "#{why.message.inspect}" - assert(why.message.start_with?(str_prefix), message) - else - fail("Expected ProtocolError. Got #{result.inspect}") - end + result = yield + rescue ProtocolError => e + message = "Expected prefix #{str_prefix.inspect}, got "\ + "#{e.message.inspect}" + assert(e.message.start_with?(str_prefix), message) + else + raise("Expected ProtocolError. Got #{result.inspect}") end end @@ -71,7 +69,8 @@ def with_method_overridden(method_name, proc) original = method(method_name) begin # TODO: find a combination of undef calls which prevent the warning - verbose, $VERBOSE = $VERBOSE, false + verbose = $VERBOSE + $VERBOSE = false define_method(method_name, proc) module_function(method_name) $VERBOSE = verbose @@ -98,9 +97,10 @@ def with_method_overridden(method_name, proc) # module InstanceDefExtension def instance_def(method_name, &proc) - (class << self;self;end).instance_eval do + (class << self; self; end).instance_eval do # TODO: find a combination of undef calls which prevent the warning - verbose, $VERBOSE = $VERBOSE, false + verbose = $VERBOSE + $VERBOSE = false define_method(method_name, proc) $VERBOSE = verbose end @@ -112,7 +112,7 @@ def instance_def(method_name, &proc) class GoodAssoc attr_accessor :handle, :expires_in - def initialize(handle='-blah-') + def initialize(handle = '-blah-') @handle = handle @expires_in = 3600 end @@ -123,12 +123,12 @@ def check_message_signature(msg) end class HTTPResponse - def self._from_raw_data(status, body="", headers={}, final_url=nil) + def self._from_raw_data(status, body = '', headers = {}, final_url = nil) resp = Net::HTTPResponse.new('1.1', status.to_s, 'NONE') - me = self._from_net_response(resp, final_url) + me = _from_net_response(resp, final_url) me.initialize_http_header headers me.body = body - return me + me end end end diff --git a/test/util.rb b/test/util.rb index 93bd096c..cc013075 100644 --- a/test/util.rb +++ b/test/util.rb @@ -50,4 +50,3 @@ def silence_logging end end end -