From aad33e6310cae0ee1aa61483cea0566bd1c6ab6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20T=C3=B3th?= Date: Tue, 13 Feb 2018 16:46:22 +0100 Subject: [PATCH 1/8] Pronto integration Integration of pronto required to add few new gems and to update some of the gems. The old method which provided the linter launching was reworked to launch pronto which provide the linter launching. The output of pronto is the result of all linters. The pronto result is transformed into a structure which match the original one. This integration required to change few tests and add new ones. Closes #192 --- Gemfile | 5 + Gemfile.lock | 36 +- .../rubocop_checker/message_builder.rb | 13 +- .../rubocop_checker/rubocop_results_filter.rb | 2 +- app/workers/concerns/code_analysis_mixin.rb | 62 +- .../results.json | 6 +- .../with_lines_not_in_the_diff/results.json | 32 +- .../results.json | 2922 ++--------------- .../with_results_with_offenses/results.json | 42 +- .../results.json | 6 +- .../results.json | 32 +- .../rubocop_checker/message_builder_spec.rb | 8 +- .../rubocop_results_filter_spec.rb | 4 +- .../concerns/code_analysis_mixin_spec.rb | 110 +- 14 files changed, 503 insertions(+), 2777 deletions(-) diff --git a/Gemfile b/Gemfile index 99489c8b..6a1bb7d9 100644 --- a/Gemfile +++ b/Gemfile @@ -50,6 +50,11 @@ gem 'octokit', '~> 4.8.0', :require => false gem 'faraday', '~> 0.9.2' gem 'faraday-http-cache', '~> 2.0.0' +gem 'pronto', '~> 0.9.5', :require => false +gem 'pronto-haml', '~> 0.9.0', :require => false +gem 'pronto-rubocop', :require => false +gem 'pronto-yamllint', :require => false + group :development, :test do gem 'rspec' gem 'rspec-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 7b0b037a..b9727db2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -156,6 +156,9 @@ GEM multi_json (~> 1.0) net-http-persistent (~> 2.9) net-http-pipeline + gitlab (4.14.1) + httparty (~> 0.14, >= 0.14.0) + terminal-table (~> 1.5, >= 1.5.1) globalid (0.4.2) activesupport (>= 4.2.0) haml (5.1.2) @@ -168,6 +171,9 @@ GEM sysexits (~> 1.1) hashdiff (1.0.0) highline (1.7.10) + httparty (0.18.0) + mime-types (~> 3.0) + multi_xml (>= 0.5.2) i18n (1.8.2) concurrent-ruby (~> 1.0) ice_cube (0.14.0) @@ -193,6 +199,9 @@ GEM marcel (0.3.3) mimemagic (~> 0.3.2) method_source (0.9.2) + mime-types (3.3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2020.0425) mimemagic (0.3.4) mini_mime (1.0.2) mini_portile2 (2.4.0) @@ -201,6 +210,7 @@ GEM more_core_extensions (4.0.0) activesupport multi_json (1.14.1) + multi_xml (0.6.0) multipart-post (2.1.1) mustermann (1.1.1) ruby2_keywords (~> 0.0.1) @@ -216,6 +226,21 @@ GEM parser (2.7.1.3) ast (~> 2.4.0) pg (1.2.2) + pronto (0.9.5) + gitlab (~> 4.0, >= 4.0.0) + httparty (>= 0.13.7) + octokit (~> 4.7, >= 4.7.0) + rainbow (~> 2.1) + rugged (~> 0.24, >= 0.23.0) + thor (~> 0.19.0) + pronto-haml (0.9.0) + haml_lint (~> 0.23) + pronto (~> 0.9.0) + pronto-rubocop (0.9.1) + pronto (~> 0.9.0) + rubocop (~> 0.50, >= 0.49.1) + pronto-yamllint (0.1.1) + pronto (~> 0.9.0) pry (0.9.12.6) coderay (~> 1.0) method_source (~> 0.8) @@ -252,7 +277,8 @@ GEM method_source rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) - rainbow (3.0.0) + rainbow (2.2.2) + rake rake (12.3.3) rb-fsevent (0.10.3) rb-inotify (0.10.1) @@ -343,11 +369,13 @@ GEM sprockets (>= 3.0.0) sysexits (1.2.0) temple (0.8.2) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) thin (1.7.2) daemons (~> 1.0, >= 1.0.9) eventmachine (~> 1.0, >= 1.0.4) rack (>= 1, < 3) - thor (1.0.1) + thor (0.19.4) thread_safe (0.3.6) tilt (2.0.10) timecop (0.9.1) @@ -419,6 +447,10 @@ DEPENDENCIES net-ssh (~> 4.2.0) octokit (~> 4.8.0) pg + pronto (~> 0.9.5) + pronto-haml (~> 0.9.0) + pronto-rubocop + pronto-yamllint rails (~> 5.2.2) rspec rspec-rails diff --git a/app/workers/commit_monitor_handlers/commit_range/rubocop_checker/message_builder.rb b/app/workers/commit_monitor_handlers/commit_range/rubocop_checker/message_builder.rb index 3e9d043b..b1951f53 100644 --- a/app/workers/commit_monitor_handlers/commit_range/rubocop_checker/message_builder.rb +++ b/app/workers/commit_monitor_handlers/commit_range/rubocop_checker/message_builder.rb @@ -78,7 +78,7 @@ def offenses SEVERITY_MAP[o["severity"]], format_message(o), f["path"], - format_locator(f, o) + format_line(f, o) ) end end.flatten @@ -96,22 +96,13 @@ def format_cop_name(cop_name) COP_URIS[cop_name] || cop_name end - def format_locator(file, offense) - [format_line(file, offense), format_column(offense)].compact.join(", ").presence - end - def format_line(file, offense) - line = offense.fetch_path("location", "line") + line = offense.fetch_path("line") return nil unless line uri = File.join(line_uri, "blob", commits.last, file["path"]) << "#L#{line}" "[Line #{line}](#{uri})" end - def format_column(offense) - column = offense.fetch_path("location", "column") - column && "Col #{column}" - end - # TODO: Don't reuse the commit_uri. This should probably be its own URI. def line_uri branch.commit_uri.chomp("commit/$commit") diff --git a/app/workers/commit_monitor_handlers/commit_range/rubocop_checker/rubocop_results_filter.rb b/app/workers/commit_monitor_handlers/commit_range/rubocop_checker/rubocop_results_filter.rb index 98a660cf..1b9218ad 100644 --- a/app/workers/commit_monitor_handlers/commit_range/rubocop_checker/rubocop_results_filter.rb +++ b/app/workers/commit_monitor_handlers/commit_range/rubocop_checker/rubocop_results_filter.rb @@ -26,7 +26,7 @@ def filter_on_diff @results["files"].each do |f| f["offenses"].select! do |o| o["severity"].in?(%w(error fatal)) || - @diff_details[f["path"]].include?(o["location"]["line"]) + @diff_details[f["path"]].include?(o["line"]) end end end diff --git a/app/workers/concerns/code_analysis_mixin.rb b/app/workers/concerns/code_analysis_mixin.rb index 9ccd9ef2..2be46848 100644 --- a/app/workers/concerns/code_analysis_mixin.rb +++ b/app/workers/concerns/code_analysis_mixin.rb @@ -1,3 +1,15 @@ +require 'pronto/runners' +require 'pronto/rubocop' +require 'pronto/yamllint' +require 'pronto/haml' +require 'pronto/git/repository' +require 'pronto/git/patches' +require 'pronto/git/patch' +require 'pronto/git/line' + +require 'fileutils' +require 'tmpdir' + module CodeAnalysisMixin def merged_linter_results results = { @@ -19,11 +31,51 @@ def merged_linter_results results end + # run linters via pronto and return the pronto result + def pronto_result + p_result = nil + + # temporary solution for: download repo, obtain changes, get pronto result about changes + Dir.mktmpdir do |dir| + FileUtils.copy_entry(@branch.repo.path.to_s, dir) + repo = Pronto::Git::Repository.new(dir) + rg = repo.instance_variable_get(:@repo) + rg.fetch('origin', @branch.name.sub(/^prs/, 'pull')) + rg.checkout('FETCH_HEAD') + rg.reset('HEAD', :hard) + patches = repo.diff(@branch.merge_target) + p_result = Pronto::Runners.new.run(patches) + end + + p_result + end + def run_all_linters - unmerged_results = [] - unmerged_results << Linter::Rubocop.new(branch).run - unmerged_results << Linter::Haml.new(branch).run - unmerged_results << Linter::Yaml.new(branch).run - unmerged_results.tap(&:compact!) + pronto_result.group_by(&:runner).values.map do |linted| # group by linter + output = {} + + output["files"] = linted.group_by(&:path).map do |path, value| # group by file in linter + { + "path" => path, + "offenses" => value.map do |msg| # put offenses of file in linter into an array + { + "severity" => msg.level.to_s, + "message" => msg.msg, + "cop_name" => msg.runner, + "corrected" => false, + "line" => msg.line.position + } + end + } + end + + output["summary"] = { + "offense_count" => output["files"].sum { |item| item['offenses'].length }, + "target_file_count" => output["files"].length, + "inspected_file_count" => 0 # TODO: value cannot be obtained from the result of `pronto_result` method + } + + output + end end end diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_haml_file_using_haml-lint/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_haml_file_using_haml-lint/results.json index c43c40ad..e3438034 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_haml_file_using_haml-lint/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_haml_file_using_haml-lint/results.json @@ -13,9 +13,7 @@ { "severity": "error", "message": "You don't need to use \"- end\" in Haml. Un-indent to close a block:\n- if foo?\n %strong Foo!\n- else\n Not foo.\n%p This line is un-indented, so it isn't part of the \"if\" block", - "location": { - "line": 3 - }, + "line": 3, "linter_name": "Syntax" } ] @@ -26,4 +24,4 @@ "target_file_count": 1, "inspected_file_count": 1 } -} \ No newline at end of file +} diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_lines_not_in_the_diff/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_lines_not_in_the_diff/results.json index 8a575fda..682e2144 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_lines_not_in_the_diff/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_lines_not_in_the_diff/results.json @@ -16,15 +16,7 @@ "cop_name": "Style/MutableConstant", "corrected": false, "correctable": true, - "location": { - "start_line": 2, - "start_column": 10, - "last_line": 6, - "last_column": 3, - "length": 78, - "line": 2, - "column": 10 - } + "line": 2 }, { "severity": "convention", @@ -32,15 +24,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 3, - "start_column": 5, - "last_line": 3, - "last_column": 20, - "length": 16, - "line": 3, - "column": 5 - } + "line": 3 }, { "severity": "convention", @@ -48,15 +32,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 4, - "start_column": 5, - "last_line": 4, - "last_column": 22, - "length": 18, - "line": 4, - "column": 5 - } + "line": 4 } ] } @@ -66,4 +42,4 @@ "target_file_count": 1, "inspected_file_count": 1 } -} \ No newline at end of file +} diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_generating_multiple_comments/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_generating_multiple_comments/results.json index 16e18e12..1ef6b328 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_generating_multiple_comments/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_generating_multiple_comments/results.json @@ -16,15 +16,7 @@ "cop_name": "Style/MutableConstant", "corrected": false, "correctable": true, - "location": { - "start_line": 2, - "start_column": 10, - "last_line": 197, - "last_column": 3, - "length": 4456, - "line": 2, - "column": 10 - } + "line": 2 }, { "severity": "convention", @@ -32,15 +24,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 3, - "start_column": 5, - "last_line": 3, - "last_column": 20, - "length": 16, - "line": 3, - "column": 5 - } + "line": 3 }, { "severity": "convention", @@ -48,15 +32,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 4, - "start_column": 5, - "last_line": 4, - "last_column": 18, - "length": 14, - "line": 4, - "column": 5 - } + "line": 4 }, { "severity": "convention", @@ -64,15 +40,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 5, - "start_column": 5, - "last_line": 5, - "last_column": 18, - "length": 14, - "line": 5, - "column": 5 - } + "line": 5 }, { "severity": "convention", @@ -80,15 +48,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 6, - "start_column": 5, - "last_line": 6, - "last_column": 15, - "length": 11, - "line": 6, - "column": 5 - } + "line": 6 }, { "severity": "convention", @@ -96,15 +56,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 7, - "start_column": 5, - "last_line": 7, - "last_column": 25, - "length": 21, - "line": 7, - "column": 5 - } + "line": 7 }, { "severity": "convention", @@ -112,15 +64,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 8, - "start_column": 5, - "last_line": 8, - "last_column": 31, - "length": 27, - "line": 8, - "column": 5 - } + "line": 8 }, { "severity": "convention", @@ -128,15 +72,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 9, - "start_column": 5, - "last_line": 9, - "last_column": 24, - "length": 20, - "line": 9, - "column": 5 - } + "line": 9 }, { "severity": "convention", @@ -144,15 +80,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 10, - "start_column": 5, - "last_line": 10, - "last_column": 17, - "length": 13, - "line": 10, - "column": 5 - } + "line": 10 }, { "severity": "convention", @@ -160,15 +88,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 11, - "start_column": 5, - "last_line": 11, - "last_column": 18, - "length": 14, - "line": 11, - "column": 5 - } + "line": 11 }, { "severity": "convention", @@ -176,15 +96,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 12, - "start_column": 5, - "last_line": 12, - "last_column": 18, - "length": 14, - "line": 12, - "column": 5 - } + "line": 12 }, { "severity": "convention", @@ -192,15 +104,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 13, - "start_column": 5, - "last_line": 13, - "last_column": 26, - "length": 22, - "line": 13, - "column": 5 - } + "line": 13 }, { "severity": "convention", @@ -208,15 +112,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 14, - "start_column": 5, - "last_line": 14, - "last_column": 20, - "length": 16, - "line": 14, - "column": 5 - } + "line": 14 }, { "severity": "convention", @@ -224,15 +120,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 15, - "start_column": 5, - "last_line": 15, - "last_column": 15, - "length": 11, - "line": 15, - "column": 5 - } + "line": 15 }, { "severity": "convention", @@ -240,15 +128,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 16, - "start_column": 5, - "last_line": 16, - "last_column": 16, - "length": 12, - "line": 16, - "column": 5 - } + "line": 16 }, { "severity": "convention", @@ -256,15 +136,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 17, - "start_column": 5, - "last_line": 17, - "last_column": 25, - "length": 21, - "line": 17, - "column": 5 - } + "line": 17 }, { "severity": "convention", @@ -272,15 +144,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 18, - "start_column": 5, - "last_line": 18, - "last_column": 19, - "length": 15, - "line": 18, - "column": 5 - } + "line": 18 }, { "severity": "convention", @@ -288,15 +152,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 19, - "start_column": 5, - "last_line": 19, - "last_column": 22, - "length": 18, - "line": 19, - "column": 5 - } + "line": 19 }, { "severity": "convention", @@ -304,15 +160,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 20, - "start_column": 5, - "last_line": 20, - "last_column": 22, - "length": 18, - "line": 20, - "column": 5 - } + "line": 20 }, { "severity": "convention", @@ -320,15 +168,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 21, - "start_column": 5, - "last_line": 21, - "last_column": 20, - "length": 16, - "line": 21, - "column": 5 - } + "line": 21 }, { "severity": "convention", @@ -336,15 +176,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 22, - "start_column": 5, - "last_line": 22, - "last_column": 22, - "length": 18, - "line": 22, - "column": 5 - } + "line": 22 }, { "severity": "convention", @@ -352,15 +184,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 23, - "start_column": 5, - "last_line": 23, - "last_column": 17, - "length": 13, - "line": 23, - "column": 5 - } + "line": 23 }, { "severity": "convention", @@ -368,15 +192,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 24, - "start_column": 5, - "last_line": 24, - "last_column": 20, - "length": 16, - "line": 24, - "column": 5 - } + "line": 24 }, { "severity": "convention", @@ -384,15 +200,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 25, - "start_column": 5, - "last_line": 25, - "last_column": 21, - "length": 17, - "line": 25, - "column": 5 - } + "line": 25 }, { "severity": "convention", @@ -400,15 +208,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 26, - "start_column": 5, - "last_line": 26, - "last_column": 18, - "length": 14, - "line": 26, - "column": 5 - } + "line": 26 }, { "severity": "convention", @@ -416,15 +216,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 27, - "start_column": 5, - "last_line": 27, - "last_column": 17, - "length": 13, - "line": 27, - "column": 5 - } + "line": 27 }, { "severity": "convention", @@ -432,15 +224,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 28, - "start_column": 5, - "last_line": 28, - "last_column": 16, - "length": 12, - "line": 28, - "column": 5 - } + "line": 28 }, { "severity": "convention", @@ -448,15 +232,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 29, - "start_column": 5, - "last_line": 29, - "last_column": 30, - "length": 26, - "line": 29, - "column": 5 - } + "line": 29 }, { "severity": "convention", @@ -464,15 +240,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 30, - "start_column": 5, - "last_line": 30, - "last_column": 29, - "length": 25, - "line": 30, - "column": 5 - } + "line": 30 }, { "severity": "convention", @@ -480,15 +248,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 31, - "start_column": 5, - "last_line": 31, - "last_column": 29, - "length": 25, - "line": 31, - "column": 5 - } + "line": 31 }, { "severity": "convention", @@ -496,15 +256,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 32, - "start_column": 5, - "last_line": 32, - "last_column": 26, - "length": 22, - "line": 32, - "column": 5 - } + "line": 32 }, { "severity": "convention", @@ -512,15 +264,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 33, - "start_column": 5, - "last_line": 33, - "last_column": 20, - "length": 16, - "line": 33, - "column": 5 - } + "line": 33 }, { "severity": "convention", @@ -528,15 +272,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 34, - "start_column": 5, - "last_line": 34, - "last_column": 17, - "length": 13, - "line": 34, - "column": 5 - } + "line": 34 }, { "severity": "convention", @@ -544,15 +280,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 35, - "start_column": 5, - "last_line": 35, - "last_column": 21, - "length": 17, - "line": 35, - "column": 5 - } + "line": 35 }, { "severity": "convention", @@ -560,15 +288,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 36, - "start_column": 5, - "last_line": 36, - "last_column": 23, - "length": 19, - "line": 36, - "column": 5 - } + "line": 36 }, { "severity": "convention", @@ -576,15 +296,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 37, - "start_column": 5, - "last_line": 37, - "last_column": 21, - "length": 17, - "line": 37, - "column": 5 - } + "line": 37 }, { "severity": "convention", @@ -592,15 +304,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 38, - "start_column": 5, - "last_line": 38, - "last_column": 25, - "length": 21, - "line": 38, - "column": 5 - } + "line": 38 }, { "severity": "convention", @@ -608,15 +312,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 39, - "start_column": 5, - "last_line": 39, - "last_column": 21, - "length": 17, - "line": 39, - "column": 5 - } + "line": 39 }, { "severity": "convention", @@ -624,15 +320,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 40, - "start_column": 5, - "last_line": 40, - "last_column": 18, - "length": 14, - "line": 40, - "column": 5 - } + "line": 40 }, { "severity": "convention", @@ -640,15 +328,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 41, - "start_column": 5, - "last_line": 41, - "last_column": 21, - "length": 17, - "line": 41, - "column": 5 - } + "line": 41 }, { "severity": "convention", @@ -656,15 +336,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 42, - "start_column": 5, - "last_line": 42, - "last_column": 19, - "length": 15, - "line": 42, - "column": 5 - } + "line": 42 }, { "severity": "convention", @@ -672,15 +344,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 43, - "start_column": 5, - "last_line": 43, - "last_column": 17, - "length": 13, - "line": 43, - "column": 5 - } + "line": 43 }, { "severity": "convention", @@ -688,15 +352,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 44, - "start_column": 5, - "last_line": 44, - "last_column": 25, - "length": 21, - "line": 44, - "column": 5 - } + "line": 44 }, { "severity": "convention", @@ -704,15 +360,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 45, - "start_column": 5, - "last_line": 45, - "last_column": 21, - "length": 17, - "line": 45, - "column": 5 - } + "line": 45 }, { "severity": "convention", @@ -720,15 +368,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 46, - "start_column": 5, - "last_line": 46, - "last_column": 21, - "length": 17, - "line": 46, - "column": 5 - } + "line": 46 }, { "severity": "convention", @@ -736,15 +376,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 47, - "start_column": 5, - "last_line": 47, - "last_column": 22, - "length": 18, - "line": 47, - "column": 5 - } + "line": 47 }, { "severity": "convention", @@ -752,15 +384,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 48, - "start_column": 5, - "last_line": 48, - "last_column": 17, - "length": 13, - "line": 48, - "column": 5 - } + "line": 48 }, { "severity": "convention", @@ -768,15 +392,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 49, - "start_column": 5, - "last_line": 49, - "last_column": 22, - "length": 18, - "line": 49, - "column": 5 - } + "line": 49 }, { "severity": "convention", @@ -784,15 +400,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 50, - "start_column": 5, - "last_line": 50, - "last_column": 24, - "length": 20, - "line": 50, - "column": 5 - } + "line": 50 }, { "severity": "convention", @@ -800,15 +408,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 51, - "start_column": 5, - "last_line": 51, - "last_column": 24, - "length": 20, - "line": 51, - "column": 5 - } + "line": 51 }, { "severity": "convention", @@ -816,15 +416,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 52, - "start_column": 5, - "last_line": 52, - "last_column": 22, - "length": 18, - "line": 52, - "column": 5 - } + "line": 52 }, { "severity": "convention", @@ -832,15 +424,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 53, - "start_column": 5, - "last_line": 53, - "last_column": 26, - "length": 22, - "line": 53, - "column": 5 - } + "line": 53 }, { "severity": "convention", @@ -848,15 +432,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 54, - "start_column": 5, - "last_line": 54, - "last_column": 21, - "length": 17, - "line": 54, - "column": 5 - } + "line": 54 }, { "severity": "convention", @@ -864,15 +440,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 55, - "start_column": 5, - "last_line": 55, - "last_column": 15, - "length": 11, - "line": 55, - "column": 5 - } + "line": 55 }, { "severity": "convention", @@ -880,15 +448,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 56, - "start_column": 5, - "last_line": 56, - "last_column": 14, - "length": 10, - "line": 56, - "column": 5 - } + "line": 56 }, { "severity": "convention", @@ -896,15 +456,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 57, - "start_column": 5, - "last_line": 57, - "last_column": 18, - "length": 14, - "line": 57, - "column": 5 - } + "line": 57 }, { "severity": "convention", @@ -912,15 +464,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 58, - "start_column": 5, - "last_line": 58, - "last_column": 16, - "length": 12, - "line": 58, - "column": 5 - } + "line": 58 }, { "severity": "convention", @@ -928,15 +472,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 59, - "start_column": 5, - "last_line": 59, - "last_column": 20, - "length": 16, - "line": 59, - "column": 5 - } + "line": 59 }, { "severity": "convention", @@ -944,15 +480,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 60, - "start_column": 5, - "last_line": 60, - "last_column": 21, - "length": 17, - "line": 60, - "column": 5 - } + "line": 60 }, { "severity": "convention", @@ -960,15 +488,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 61, - "start_column": 5, - "last_line": 61, - "last_column": 18, - "length": 14, - "line": 61, - "column": 5 - } + "line": 61 }, { "severity": "convention", @@ -976,15 +496,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 62, - "start_column": 5, - "last_line": 62, - "last_column": 19, - "length": 15, - "line": 62, - "column": 5 - } + "line": 62 }, { "severity": "convention", @@ -992,15 +504,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 63, - "start_column": 5, - "last_line": 63, - "last_column": 23, - "length": 19, - "line": 63, - "column": 5 - } + "line": 63 }, { "severity": "convention", @@ -1008,15 +512,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 64, - "start_column": 5, - "last_line": 64, - "last_column": 16, - "length": 12, - "line": 64, - "column": 5 - } + "line": 64 }, { "severity": "convention", @@ -1024,15 +520,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 65, - "start_column": 5, - "last_line": 65, - "last_column": 23, - "length": 19, - "line": 65, - "column": 5 - } + "line": 65 }, { "severity": "convention", @@ -1040,15 +528,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 66, - "start_column": 5, - "last_line": 66, - "last_column": 33, - "length": 29, - "line": 66, - "column": 5 - } + "line": 66 }, { "severity": "convention", @@ -1056,15 +536,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 67, - "start_column": 5, - "last_line": 67, - "last_column": 24, - "length": 20, - "line": 67, - "column": 5 - } + "line": 67 }, { "severity": "convention", @@ -1072,15 +544,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 68, - "start_column": 5, - "last_line": 68, - "last_column": 19, - "length": 15, - "line": 68, - "column": 5 - } + "line": 68 }, { "severity": "convention", @@ -1088,15 +552,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 69, - "start_column": 5, - "last_line": 69, - "last_column": 16, - "length": 12, - "line": 69, - "column": 5 - } + "line": 69 }, { "severity": "convention", @@ -1104,15 +560,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 70, - "start_column": 5, - "last_line": 70, - "last_column": 16, - "length": 12, - "line": 70, - "column": 5 - } + "line": 70 }, { "severity": "convention", @@ -1120,15 +568,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 71, - "start_column": 5, - "last_line": 71, - "last_column": 16, - "length": 12, - "line": 71, - "column": 5 - } + "line": 71 }, { "severity": "convention", @@ -1136,15 +576,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 72, - "start_column": 5, - "last_line": 72, - "last_column": 24, - "length": 20, - "line": 72, - "column": 5 - } + "line": 72 }, { "severity": "convention", @@ -1152,15 +584,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 73, - "start_column": 5, - "last_line": 73, - "last_column": 17, - "length": 13, - "line": 73, - "column": 5 - } + "line": 73 }, { "severity": "convention", @@ -1168,15 +592,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 74, - "start_column": 5, - "last_line": 74, - "last_column": 16, - "length": 12, - "line": 74, - "column": 5 - } + "line": 74 }, { "severity": "convention", @@ -1184,15 +600,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 75, - "start_column": 5, - "last_line": 75, - "last_column": 16, - "length": 12, - "line": 75, - "column": 5 - } + "line": 75 }, { "severity": "convention", @@ -1200,15 +608,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 76, - "start_column": 5, - "last_line": 76, - "last_column": 24, - "length": 20, - "line": 76, - "column": 5 - } + "line": 76 }, { "severity": "convention", @@ -1216,15 +616,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 77, - "start_column": 5, - "last_line": 77, - "last_column": 26, - "length": 22, - "line": 77, - "column": 5 - } + "line": 77 }, { "severity": "convention", @@ -1232,15 +624,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 78, - "start_column": 5, - "last_line": 78, - "last_column": 23, - "length": 19, - "line": 78, - "column": 5 - } + "line": 78 }, { "severity": "convention", @@ -1248,15 +632,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 79, - "start_column": 5, - "last_line": 79, - "last_column": 27, - "length": 23, - "line": 79, - "column": 5 - } + "line": 79 }, { "severity": "convention", @@ -1264,15 +640,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 80, - "start_column": 5, - "last_line": 80, - "last_column": 22, - "length": 18, - "line": 80, - "column": 5 - } + "line": 80 }, { "severity": "convention", @@ -1280,15 +648,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 81, - "start_column": 5, - "last_line": 81, - "last_column": 22, - "length": 18, - "line": 81, - "column": 5 - } + "line": 81 }, { "severity": "convention", @@ -1296,15 +656,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 82, - "start_column": 5, - "last_line": 82, - "last_column": 31, - "length": 27, - "line": 82, - "column": 5 - } + "line": 82 }, { "severity": "convention", @@ -1312,15 +664,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 83, - "start_column": 5, - "last_line": 83, - "last_column": 24, - "length": 20, - "line": 83, - "column": 5 - } + "line": 83 }, { "severity": "convention", @@ -1328,15 +672,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 84, - "start_column": 5, - "last_line": 84, - "last_column": 15, - "length": 11, - "line": 84, - "column": 5 - } + "line": 84 }, { "severity": "convention", @@ -1344,15 +680,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 85, - "start_column": 5, - "last_line": 85, - "last_column": 15, - "length": 11, - "line": 85, - "column": 5 - } + "line": 85 }, { "severity": "convention", @@ -1360,15 +688,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 86, - "start_column": 5, - "last_line": 86, - "last_column": 22, - "length": 18, - "line": 86, - "column": 5 - } + "line": 86 }, { "severity": "convention", @@ -1376,15 +696,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 87, - "start_column": 5, - "last_line": 87, - "last_column": 23, - "length": 19, - "line": 87, - "column": 5 - } + "line": 87 }, { "severity": "convention", @@ -1392,15 +704,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 88, - "start_column": 5, - "last_line": 88, - "last_column": 20, - "length": 16, - "line": 88, - "column": 5 - } + "line": 88 }, { "severity": "convention", @@ -1408,15 +712,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 89, - "start_column": 5, - "last_line": 89, - "last_column": 17, - "length": 13, - "line": 89, - "column": 5 - } + "line": 89 }, { "severity": "convention", @@ -1424,15 +720,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 90, - "start_column": 5, - "last_line": 90, - "last_column": 23, - "length": 19, - "line": 90, - "column": 5 - } + "line": 90 }, { "severity": "convention", @@ -1440,15 +728,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 91, - "start_column": 5, - "last_line": 91, - "last_column": 17, - "length": 13, - "line": 91, - "column": 5 - } + "line": 91 }, { "severity": "convention", @@ -1456,15 +736,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 92, - "start_column": 5, - "last_line": 92, - "last_column": 22, - "length": 18, - "line": 92, - "column": 5 - } + "line": 92 }, { "severity": "convention", @@ -1472,15 +744,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 93, - "start_column": 5, - "last_line": 93, - "last_column": 22, - "length": 18, - "line": 93, - "column": 5 - } + "line": 93 }, { "severity": "convention", @@ -1488,15 +752,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 94, - "start_column": 5, - "last_line": 94, - "last_column": 22, - "length": 18, - "line": 94, - "column": 5 - } + "line": 94 }, { "severity": "convention", @@ -1504,15 +760,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 95, - "start_column": 5, - "last_line": 95, - "last_column": 18, - "length": 14, - "line": 95, - "column": 5 - } + "line": 95 }, { "severity": "convention", @@ -1520,15 +768,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 96, - "start_column": 5, - "last_line": 96, - "last_column": 26, - "length": 22, - "line": 96, - "column": 5 - } + "line": 96 }, { "severity": "convention", @@ -1536,15 +776,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 97, - "start_column": 5, - "last_line": 97, - "last_column": 30, - "length": 26, - "line": 97, - "column": 5 - } + "line": 97 }, { "severity": "convention", @@ -1552,15 +784,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 98, - "start_column": 5, - "last_line": 98, - "last_column": 21, - "length": 17, - "line": 98, - "column": 5 - } + "line": 98 }, { "severity": "convention", @@ -1568,15 +792,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 99, - "start_column": 5, - "last_line": 99, - "last_column": 18, - "length": 14, - "line": 99, - "column": 5 - } + "line": 99 }, { "severity": "convention", @@ -1584,15 +800,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 100, - "start_column": 5, - "last_line": 100, - "last_column": 20, - "length": 16, - "line": 100, - "column": 5 - } + "line": 100 }, { "severity": "warning", @@ -1600,15 +808,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 100, - "start_column": 5, - "last_line": 100, - "last_column": 11, - "length": 7, - "line": 100, - "column": 5 - } + "line": 100 }, { "severity": "convention", @@ -1616,15 +816,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 101, - "start_column": 5, - "last_line": 101, - "last_column": 18, - "length": 14, - "line": 101, - "column": 5 - } + "line": 101 }, { "severity": "warning", @@ -1632,15 +824,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 101, - "start_column": 5, - "last_line": 101, - "last_column": 11, - "length": 7, - "line": 101, - "column": 5 - } + "line": 101 }, { "severity": "convention", @@ -1648,15 +832,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 102, - "start_column": 5, - "last_line": 102, - "last_column": 18, - "length": 14, - "line": 102, - "column": 5 - } + "line": 102 }, { "severity": "warning", @@ -1664,15 +840,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 102, - "start_column": 5, - "last_line": 102, - "last_column": 11, - "length": 7, - "line": 102, - "column": 5 - } + "line": 102 }, { "severity": "convention", @@ -1680,15 +848,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 103, - "start_column": 5, - "last_line": 103, - "last_column": 15, - "length": 11, - "line": 103, - "column": 5 - } + "line": 103 }, { "severity": "warning", @@ -1696,15 +856,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 103, - "start_column": 5, - "last_line": 103, - "last_column": 9, - "length": 5, - "line": 103, - "column": 5 - } + "line": 103 }, { "severity": "convention", @@ -1712,15 +864,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 104, - "start_column": 5, - "last_line": 104, - "last_column": 25, - "length": 21, - "line": 104, - "column": 5 - } + "line": 104 }, { "severity": "warning", @@ -1728,15 +872,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 104, - "start_column": 5, - "last_line": 104, - "last_column": 10, - "length": 6, - "line": 104, - "column": 5 - } + "line": 104 }, { "severity": "convention", @@ -1744,15 +880,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 105, - "start_column": 5, - "last_line": 105, - "last_column": 31, - "length": 27, - "line": 105, - "column": 5 - } + "line": 105 }, { "severity": "warning", @@ -1760,15 +888,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 105, - "start_column": 5, - "last_line": 105, - "last_column": 17, - "length": 13, - "line": 105, - "column": 5 - } + "line": 105 }, { "severity": "convention", @@ -1776,15 +896,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 106, - "start_column": 5, - "last_line": 106, - "last_column": 24, - "length": 20, - "line": 106, - "column": 5 - } + "line": 106 }, { "severity": "warning", @@ -1792,15 +904,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 106, - "start_column": 5, - "last_line": 106, - "last_column": 16, - "length": 12, - "line": 106, - "column": 5 - } + "line": 106 }, { "severity": "convention", @@ -1808,15 +912,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 107, - "start_column": 5, - "last_line": 107, - "last_column": 17, - "length": 13, - "line": 107, - "column": 5 - } + "line": 107 }, { "severity": "warning", @@ -1824,15 +920,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 107, - "start_column": 5, - "last_line": 107, - "last_column": 10, - "length": 6, - "line": 107, - "column": 5 - } + "line": 107 }, { "severity": "convention", @@ -1840,15 +928,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 108, - "start_column": 5, - "last_line": 108, - "last_column": 18, - "length": 14, - "line": 108, - "column": 5 - } + "line": 108 }, { "severity": "warning", @@ -1856,15 +936,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 108, - "start_column": 5, - "last_line": 108, - "last_column": 9, - "length": 5, - "line": 108, - "column": 5 - } + "line": 108 }, { "severity": "convention", @@ -1872,15 +944,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 109, - "start_column": 5, - "last_line": 109, - "last_column": 18, - "length": 14, - "line": 109, - "column": 5 - } + "line": 109 }, { "severity": "warning", @@ -1888,15 +952,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 109, - "start_column": 5, - "last_line": 109, - "last_column": 11, - "length": 7, - "line": 109, - "column": 5 - } + "line": 109 }, { "severity": "convention", @@ -1904,15 +960,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 110, - "start_column": 5, - "last_line": 110, - "last_column": 26, - "length": 22, - "line": 110, - "column": 5 - } + "line": 110 }, { "severity": "warning", @@ -1920,15 +968,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 110, - "start_column": 5, - "last_line": 110, - "last_column": 15, - "length": 11, - "line": 110, - "column": 5 - } + "line": 110 }, { "severity": "convention", @@ -1936,15 +976,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 111, - "start_column": 5, - "last_line": 111, - "last_column": 20, - "length": 16, - "line": 111, - "column": 5 - } + "line": 111 }, { "severity": "warning", @@ -1952,15 +984,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 111, - "start_column": 5, - "last_line": 111, - "last_column": 13, - "length": 9, - "line": 111, - "column": 5 - } + "line": 111 }, { "severity": "convention", @@ -1968,15 +992,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 112, - "start_column": 5, - "last_line": 112, - "last_column": 15, - "length": 11, - "line": 112, - "column": 5 - } + "line": 112 }, { "severity": "warning", @@ -1984,15 +1000,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 112, - "start_column": 5, - "last_line": 112, - "last_column": 9, - "length": 5, - "line": 112, - "column": 5 - } + "line": 112 }, { "severity": "convention", @@ -2000,15 +1008,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 113, - "start_column": 5, - "last_line": 113, - "last_column": 16, - "length": 12, - "line": 113, - "column": 5 - } + "line": 113 }, { "severity": "warning", @@ -2016,15 +1016,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 113, - "start_column": 5, - "last_line": 113, - "last_column": 8, - "length": 4, - "line": 113, - "column": 5 - } + "line": 113 }, { "severity": "convention", @@ -2032,15 +1024,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 114, - "start_column": 5, - "last_line": 114, - "last_column": 25, - "length": 21, - "line": 114, - "column": 5 - } + "line": 114 }, { "severity": "warning", @@ -2048,15 +1032,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 114, - "start_column": 5, - "last_line": 114, - "last_column": 10, - "length": 6, - "line": 114, - "column": 5 - } + "line": 114 }, { "severity": "convention", @@ -2064,15 +1040,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 115, - "start_column": 5, - "last_line": 115, - "last_column": 19, - "length": 15, - "line": 115, - "column": 5 - } + "line": 115 }, { "severity": "warning", @@ -2080,15 +1048,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 115, - "start_column": 5, - "last_line": 115, - "last_column": 9, - "length": 5, - "line": 115, - "column": 5 - } + "line": 115 }, { "severity": "convention", @@ -2096,15 +1056,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 116, - "start_column": 5, - "last_line": 116, - "last_column": 22, - "length": 18, - "line": 116, - "column": 5 - } + "line": 116 }, { "severity": "warning", @@ -2112,15 +1064,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 116, - "start_column": 5, - "last_line": 116, - "last_column": 12, - "length": 8, - "line": 116, - "column": 5 - } + "line": 116 }, { "severity": "convention", @@ -2128,15 +1072,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 117, - "start_column": 5, - "last_line": 117, - "last_column": 22, - "length": 18, - "line": 117, - "column": 5 - } + "line": 117 }, { "severity": "warning", @@ -2144,15 +1080,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 117, - "start_column": 5, - "last_line": 117, - "last_column": 12, - "length": 8, - "line": 117, - "column": 5 - } + "line": 117 }, { "severity": "convention", @@ -2160,15 +1088,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 118, - "start_column": 5, - "last_line": 118, - "last_column": 20, - "length": 16, - "line": 118, - "column": 5 - } + "line": 118 }, { "severity": "warning", @@ -2176,15 +1096,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 118, - "start_column": 5, - "last_line": 118, - "last_column": 12, - "length": 8, - "line": 118, - "column": 5 - } + "line": 118 }, { "severity": "convention", @@ -2192,15 +1104,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 119, - "start_column": 5, - "last_line": 119, - "last_column": 22, - "length": 18, - "line": 119, - "column": 5 - } + "line": 119 }, { "severity": "warning", @@ -2208,15 +1112,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 119, - "start_column": 5, - "last_line": 119, - "last_column": 10, - "length": 6, - "line": 119, - "column": 5 - } + "line": 119 }, { "severity": "convention", @@ -2224,15 +1120,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 120, - "start_column": 5, - "last_line": 120, - "last_column": 17, - "length": 13, - "line": 120, - "column": 5 - } + "line": 120 }, { "severity": "warning", @@ -2240,15 +1128,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 120, - "start_column": 5, - "last_line": 120, - "last_column": 9, - "length": 5, - "line": 120, - "column": 5 - } + "line": 120 }, { "severity": "convention", @@ -2256,15 +1136,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 121, - "start_column": 5, - "last_line": 121, - "last_column": 20, - "length": 16, - "line": 121, - "column": 5 - } + "line": 121 }, { "severity": "warning", @@ -2272,15 +1144,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 121, - "start_column": 5, - "last_line": 121, - "last_column": 10, - "length": 6, - "line": 121, - "column": 5 - } + "line": 121 }, { "severity": "convention", @@ -2288,15 +1152,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 122, - "start_column": 5, - "last_line": 122, - "last_column": 21, - "length": 17, - "line": 122, - "column": 5 - } + "line": 122 }, { "severity": "warning", @@ -2304,15 +1160,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 122, - "start_column": 5, - "last_line": 122, - "last_column": 8, - "length": 4, - "line": 122, - "column": 5 - } + "line": 122 }, { "severity": "convention", @@ -2320,15 +1168,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 123, - "start_column": 5, - "last_line": 123, - "last_column": 18, - "length": 14, - "line": 123, - "column": 5 - } + "line": 123 }, { "severity": "warning", @@ -2336,15 +1176,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 123, - "start_column": 5, - "last_line": 123, - "last_column": 9, - "length": 5, - "line": 123, - "column": 5 - } + "line": 123 }, { "severity": "convention", @@ -2352,15 +1184,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 124, - "start_column": 5, - "last_line": 124, - "last_column": 17, - "length": 13, - "line": 124, - "column": 5 - } + "line": 124 }, { "severity": "warning", @@ -2368,15 +1192,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 124, - "start_column": 5, - "last_line": 124, - "last_column": 11, - "length": 7, - "line": 124, - "column": 5 - } + "line": 124 }, { "severity": "convention", @@ -2384,15 +1200,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 125, - "start_column": 5, - "last_line": 125, - "last_column": 16, - "length": 12, - "line": 125, - "column": 5 - } + "line": 125 }, { "severity": "warning", @@ -2400,15 +1208,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 125, - "start_column": 5, - "last_line": 125, - "last_column": 8, - "length": 4, - "line": 125, - "column": 5 - } + "line": 125 }, { "severity": "convention", @@ -2416,15 +1216,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 126, - "start_column": 5, - "last_line": 126, - "last_column": 30, - "length": 26, - "line": 126, - "column": 5 - } + "line": 126 }, { "severity": "warning", @@ -2432,15 +1224,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 126, - "start_column": 5, - "last_line": 126, - "last_column": 16, - "length": 12, - "line": 126, - "column": 5 - } + "line": 126 }, { "severity": "convention", @@ -2448,15 +1232,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 127, - "start_column": 5, - "last_line": 127, - "last_column": 29, - "length": 25, - "line": 127, - "column": 5 - } + "line": 127 }, { "severity": "warning", @@ -2464,15 +1240,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 127, - "start_column": 5, - "last_line": 127, - "last_column": 16, - "length": 12, - "line": 127, - "column": 5 - } + "line": 127 }, { "severity": "convention", @@ -2480,15 +1248,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 128, - "start_column": 5, - "last_line": 128, - "last_column": 29, - "length": 25, - "line": 128, - "column": 5 - } + "line": 128 }, { "severity": "warning", @@ -2496,15 +1256,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 128, - "start_column": 5, - "last_line": 128, - "last_column": 15, - "length": 11, - "line": 128, - "column": 5 - } + "line": 128 }, { "severity": "convention", @@ -2512,15 +1264,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 129, - "start_column": 5, - "last_line": 129, - "last_column": 26, - "length": 22, - "line": 129, - "column": 5 - } + "line": 129 }, { "severity": "warning", @@ -2528,15 +1272,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 129, - "start_column": 5, - "last_line": 129, - "last_column": 16, - "length": 12, - "line": 129, - "column": 5 - } + "line": 129 }, { "severity": "convention", @@ -2544,15 +1280,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 130, - "start_column": 5, - "last_line": 130, - "last_column": 20, - "length": 16, - "line": 130, - "column": 5 - } + "line": 130 }, { "severity": "warning", @@ -2560,15 +1288,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 130, - "start_column": 5, - "last_line": 130, - "last_column": 12, - "length": 8, - "line": 130, - "column": 5 - } + "line": 130 }, { "severity": "convention", @@ -2576,15 +1296,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 131, - "start_column": 5, - "last_line": 131, - "last_column": 17, - "length": 13, - "line": 131, - "column": 5 - } + "line": 131 }, { "severity": "warning", @@ -2592,15 +1304,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 131, - "start_column": 5, - "last_line": 131, - "last_column": 10, - "length": 6, - "line": 131, - "column": 5 - } + "line": 131 }, { "severity": "convention", @@ -2608,15 +1312,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 132, - "start_column": 5, - "last_line": 132, - "last_column": 21, - "length": 17, - "line": 132, - "column": 5 - } + "line": 132 }, { "severity": "warning", @@ -2624,15 +1320,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 132, - "start_column": 5, - "last_line": 132, - "last_column": 9, - "length": 5, - "line": 132, - "column": 5 - } + "line": 132 }, { "severity": "convention", @@ -2640,15 +1328,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 133, - "start_column": 5, - "last_line": 133, - "last_column": 23, - "length": 19, - "line": 133, - "column": 5 - } + "line": 133 }, { "severity": "warning", @@ -2656,15 +1336,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 133, - "start_column": 5, - "last_line": 133, - "last_column": 14, - "length": 10, - "line": 133, - "column": 5 - } + "line": 133 }, { "severity": "convention", @@ -2672,15 +1344,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 134, - "start_column": 5, - "last_line": 134, - "last_column": 21, - "length": 17, - "line": 134, - "column": 5 - } + "line": 134 }, { "severity": "warning", @@ -2688,15 +1352,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 134, - "start_column": 5, - "last_line": 134, - "last_column": 11, - "length": 7, - "line": 134, - "column": 5 - } + "line": 134 }, { "severity": "convention", @@ -2704,15 +1360,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 135, - "start_column": 5, - "last_line": 135, - "last_column": 25, - "length": 21, - "line": 135, - "column": 5 - } + "line": 135 }, { "severity": "warning", @@ -2720,15 +1368,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 135, - "start_column": 5, - "last_line": 135, - "last_column": 12, - "length": 8, - "line": 135, - "column": 5 - } + "line": 135 }, { "severity": "convention", @@ -2736,15 +1376,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 136, - "start_column": 5, - "last_line": 136, - "last_column": 21, - "length": 17, - "line": 136, - "column": 5 - } + "line": 136 }, { "severity": "warning", @@ -2752,15 +1384,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 136, - "start_column": 5, - "last_line": 136, - "last_column": 15, - "length": 11, - "line": 136, - "column": 5 - } + "line": 136 }, { "severity": "convention", @@ -2768,15 +1392,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 137, - "start_column": 5, - "last_line": 137, - "last_column": 18, - "length": 14, - "line": 137, - "column": 5 - } + "line": 137 }, { "severity": "warning", @@ -2784,15 +1400,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 137, - "start_column": 5, - "last_line": 137, - "last_column": 10, - "length": 6, - "line": 137, - "column": 5 - } + "line": 137 }, { "severity": "convention", @@ -2800,15 +1408,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 138, - "start_column": 5, - "last_line": 138, - "last_column": 21, - "length": 17, - "line": 138, - "column": 5 - } + "line": 138 }, { "severity": "warning", @@ -2816,15 +1416,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 138, - "start_column": 5, - "last_line": 138, - "last_column": 10, - "length": 6, - "line": 138, - "column": 5 - } + "line": 138 }, { "severity": "convention", @@ -2832,15 +1424,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 139, - "start_column": 5, - "last_line": 139, - "last_column": 19, - "length": 15, - "line": 139, - "column": 5 - } + "line": 139 }, { "severity": "warning", @@ -2848,15 +1432,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 139, - "start_column": 5, - "last_line": 139, - "last_column": 13, - "length": 9, - "line": 139, - "column": 5 - } + "line": 139 }, { "severity": "convention", @@ -2864,15 +1440,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 140, - "start_column": 5, - "last_line": 140, - "last_column": 17, - "length": 13, - "line": 140, - "column": 5 - } + "line": 140 }, { "severity": "warning", @@ -2880,15 +1448,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 140, - "start_column": 5, - "last_line": 140, - "last_column": 8, - "length": 4, - "line": 140, - "column": 5 - } + "line": 140 }, { "severity": "convention", @@ -2896,15 +1456,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 141, - "start_column": 5, - "last_line": 141, - "last_column": 25, - "length": 21, - "line": 141, - "column": 5 - } + "line": 141 }, { "severity": "warning", @@ -2912,15 +1464,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 141, - "start_column": 5, - "last_line": 141, - "last_column": 14, - "length": 10, - "line": 141, - "column": 5 - } + "line": 141 }, { "severity": "convention", @@ -2928,15 +1472,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 142, - "start_column": 5, - "last_line": 142, - "last_column": 21, - "length": 17, - "line": 142, - "column": 5 - } + "line": 142 }, { "severity": "warning", @@ -2944,15 +1480,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 142, - "start_column": 5, - "last_line": 142, - "last_column": 13, - "length": 9, - "line": 142, - "column": 5 - } + "line": 142 }, { "severity": "convention", @@ -2960,15 +1488,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 143, - "start_column": 5, - "last_line": 143, - "last_column": 21, - "length": 17, - "line": 143, - "column": 5 - } + "line": 143 }, { "severity": "warning", @@ -2976,15 +1496,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 143, - "start_column": 5, - "last_line": 143, - "last_column": 10, - "length": 6, - "line": 143, - "column": 5 - } + "line": 143 }, { "severity": "convention", @@ -2992,15 +1504,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 144, - "start_column": 5, - "last_line": 144, - "last_column": 22, - "length": 18, - "line": 144, - "column": 5 - } + "line": 144 }, { "severity": "warning", @@ -3008,15 +1512,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 144, - "start_column": 5, - "last_line": 144, - "last_column": 13, - "length": 9, - "line": 144, - "column": 5 - } + "line": 144 }, { "severity": "convention", @@ -3024,15 +1520,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 145, - "start_column": 5, - "last_line": 145, - "last_column": 17, - "length": 13, - "line": 145, - "column": 5 - } + "line": 145 }, { "severity": "warning", @@ -3040,15 +1528,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 145, - "start_column": 5, - "last_line": 145, - "last_column": 11, - "length": 7, - "line": 145, - "column": 5 - } + "line": 145 }, { "severity": "convention", @@ -3056,15 +1536,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 146, - "start_column": 5, - "last_line": 146, - "last_column": 22, - "length": 18, - "line": 146, - "column": 5 - } + "line": 146 }, { "severity": "warning", @@ -3072,15 +1544,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 146, - "start_column": 5, - "last_line": 146, - "last_column": 14, - "length": 10, - "line": 146, - "column": 5 - } + "line": 146 }, { "severity": "convention", @@ -3088,15 +1552,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 147, - "start_column": 5, - "last_line": 147, - "last_column": 24, - "length": 20, - "line": 147, - "column": 5 - } + "line": 147 }, { "severity": "warning", @@ -3104,15 +1560,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 147, - "start_column": 5, - "last_line": 147, - "last_column": 10, - "length": 6, - "line": 147, - "column": 5 - } + "line": 147 }, { "severity": "convention", @@ -3120,15 +1568,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 148, - "start_column": 5, - "last_line": 148, - "last_column": 24, - "length": 20, - "line": 148, - "column": 5 - } + "line": 148 }, { "severity": "warning", @@ -3136,15 +1576,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 148, - "start_column": 5, - "last_line": 148, - "last_column": 16, - "length": 12, - "line": 148, - "column": 5 - } + "line": 148 }, { "severity": "convention", @@ -3152,15 +1584,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 149, - "start_column": 5, - "last_line": 149, - "last_column": 22, - "length": 18, - "line": 149, - "column": 5 - } + "line": 149 }, { "severity": "warning", @@ -3168,15 +1592,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 149, - "start_column": 5, - "last_line": 149, - "last_column": 10, - "length": 6, - "line": 149, - "column": 5 - } + "line": 149 }, { "severity": "convention", @@ -3184,15 +1600,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 150, - "start_column": 5, - "last_line": 150, - "last_column": 26, - "length": 22, - "line": 150, - "column": 5 - } + "line": 150 }, { "severity": "warning", @@ -3200,15 +1608,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 150, - "start_column": 5, - "last_line": 150, - "last_column": 14, - "length": 10, - "line": 150, - "column": 5 - } + "line": 150 }, { "severity": "convention", @@ -3216,15 +1616,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 151, - "start_column": 5, - "last_line": 151, - "last_column": 21, - "length": 17, - "line": 151, - "column": 5 - } + "line": 151 }, { "severity": "warning", @@ -3232,15 +1624,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 151, - "start_column": 5, - "last_line": 151, - "last_column": 14, - "length": 10, - "line": 151, - "column": 5 - } + "line": 151 }, { "severity": "convention", @@ -3248,15 +1632,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 152, - "start_column": 5, - "last_line": 152, - "last_column": 15, - "length": 11, - "line": 152, - "column": 5 - } + "line": 152 }, { "severity": "warning", @@ -3264,15 +1640,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 152, - "start_column": 5, - "last_line": 152, - "last_column": 9, - "length": 5, - "line": 152, - "column": 5 - } + "line": 152 }, { "severity": "convention", @@ -3280,15 +1648,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 153, - "start_column": 5, - "last_line": 153, - "last_column": 14, - "length": 10, - "line": 153, - "column": 5 - } + "line": 153 }, { "severity": "warning", @@ -3296,15 +1656,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 153, - "start_column": 5, - "last_line": 153, - "last_column": 8, - "length": 4, - "line": 153, - "column": 5 - } + "line": 153 }, { "severity": "convention", @@ -3312,15 +1664,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 154, - "start_column": 5, - "last_line": 154, - "last_column": 18, - "length": 14, - "line": 154, - "column": 5 - } + "line": 154 }, { "severity": "warning", @@ -3328,15 +1672,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 154, - "start_column": 5, - "last_line": 154, - "last_column": 12, - "length": 8, - "line": 154, - "column": 5 - } + "line": 154 }, { "severity": "convention", @@ -3344,15 +1680,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 155, - "start_column": 5, - "last_line": 155, - "last_column": 16, - "length": 12, - "line": 155, - "column": 5 - } + "line": 155 }, { "severity": "warning", @@ -3360,15 +1688,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 155, - "start_column": 5, - "last_line": 155, - "last_column": 8, - "length": 4, - "line": 155, - "column": 5 - } + "line": 155 }, { "severity": "convention", @@ -3376,15 +1696,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 156, - "start_column": 5, - "last_line": 156, - "last_column": 20, - "length": 16, - "line": 156, - "column": 5 - } + "line": 156 }, { "severity": "warning", @@ -3392,15 +1704,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 156, - "start_column": 5, - "last_line": 156, - "last_column": 10, - "length": 6, - "line": 156, - "column": 5 - } + "line": 156 }, { "severity": "convention", @@ -3408,15 +1712,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 157, - "start_column": 5, - "last_line": 157, - "last_column": 21, - "length": 17, - "line": 157, - "column": 5 - } + "line": 157 }, { "severity": "warning", @@ -3424,15 +1720,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 157, - "start_column": 5, - "last_line": 157, - "last_column": 12, - "length": 8, - "line": 157, - "column": 5 - } + "line": 157 }, { "severity": "convention", @@ -3440,15 +1728,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 158, - "start_column": 5, - "last_line": 158, - "last_column": 18, - "length": 14, - "line": 158, - "column": 5 - } + "line": 158 }, { "severity": "warning", @@ -3456,15 +1736,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 158, - "start_column": 5, - "last_line": 158, - "last_column": 11, - "length": 7, - "line": 158, - "column": 5 - } + "line": 158 }, { "severity": "convention", @@ -3472,15 +1744,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 159, - "start_column": 5, - "last_line": 159, - "last_column": 19, - "length": 15, - "line": 159, - "column": 5 - } + "line": 159 }, { "severity": "warning", @@ -3488,15 +1752,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 159, - "start_column": 5, - "last_line": 159, - "last_column": 9, - "length": 5, - "line": 159, - "column": 5 - } + "line": 159 }, { "severity": "convention", @@ -3504,15 +1760,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 160, - "start_column": 5, - "last_line": 160, - "last_column": 23, - "length": 19, - "line": 160, - "column": 5 - } + "line": 160 }, { "severity": "warning", @@ -3520,15 +1768,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 160, - "start_column": 5, - "last_line": 160, - "last_column": 14, - "length": 10, - "line": 160, - "column": 5 - } + "line": 160 }, { "severity": "convention", @@ -3536,15 +1776,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 161, - "start_column": 5, - "last_line": 161, - "last_column": 16, - "length": 12, - "line": 161, - "column": 5 - } + "line": 161 }, { "severity": "warning", @@ -3552,15 +1784,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 161, - "start_column": 5, - "last_line": 161, - "last_column": 8, - "length": 4, - "line": 161, - "column": 5 - } + "line": 161 }, { "severity": "convention", @@ -3568,15 +1792,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 162, - "start_column": 5, - "last_line": 162, - "last_column": 23, - "length": 19, - "line": 162, - "column": 5 - } + "line": 162 }, { "severity": "warning", @@ -3584,15 +1800,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 162, - "start_column": 5, - "last_line": 162, - "last_column": 10, - "length": 6, - "line": 162, - "column": 5 - } + "line": 162 }, { "severity": "convention", @@ -3600,15 +1808,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 163, - "start_column": 5, - "last_line": 163, - "last_column": 33, - "length": 29, - "line": 163, - "column": 5 - } + "line": 163 }, { "severity": "warning", @@ -3616,15 +1816,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 163, - "start_column": 5, - "last_line": 163, - "last_column": 21, - "length": 17, - "line": 163, - "column": 5 - } + "line": 163 }, { "severity": "convention", @@ -3632,15 +1824,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 164, - "start_column": 5, - "last_line": 164, - "last_column": 24, - "length": 20, - "line": 164, - "column": 5 - } + "line": 164 }, { "severity": "warning", @@ -3648,15 +1832,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 164, - "start_column": 5, - "last_line": 164, - "last_column": 14, - "length": 10, - "line": 164, - "column": 5 - } + "line": 164 }, { "severity": "convention", @@ -3664,15 +1840,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 165, - "start_column": 5, - "last_line": 165, - "last_column": 19, - "length": 15, - "line": 165, - "column": 5 - } + "line": 165 }, { "severity": "warning", @@ -3680,15 +1848,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 165, - "start_column": 5, - "last_line": 165, - "last_column": 12, - "length": 8, - "line": 165, - "column": 5 - } + "line": 165 }, { "severity": "convention", @@ -3696,15 +1856,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 166, - "start_column": 5, - "last_line": 166, - "last_column": 16, - "length": 12, - "line": 166, - "column": 5 - } + "line": 166 }, { "severity": "warning", @@ -3712,15 +1864,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 166, - "start_column": 5, - "last_line": 166, - "last_column": 9, - "length": 5, - "line": 166, - "column": 5 - } + "line": 166 }, { "severity": "convention", @@ -3728,15 +1872,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 167, - "start_column": 5, - "last_line": 167, - "last_column": 16, - "length": 12, - "line": 167, - "column": 5 - } + "line": 167 }, { "severity": "warning", @@ -3744,15 +1880,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 167, - "start_column": 5, - "last_line": 167, - "last_column": 9, - "length": 5, - "line": 167, - "column": 5 - } + "line": 167 }, { "severity": "convention", @@ -3760,15 +1888,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 168, - "start_column": 5, - "last_line": 168, - "last_column": 16, - "length": 12, - "line": 168, - "column": 5 - } + "line": 168 }, { "severity": "warning", @@ -3776,15 +1896,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 168, - "start_column": 5, - "last_line": 168, - "last_column": 9, - "length": 5, - "line": 168, - "column": 5 - } + "line": 168 }, { "severity": "convention", @@ -3792,15 +1904,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 169, - "start_column": 5, - "last_line": 169, - "last_column": 24, - "length": 20, - "line": 169, - "column": 5 - } + "line": 169 }, { "severity": "warning", @@ -3808,15 +1912,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 169, - "start_column": 5, - "last_line": 169, - "last_column": 16, - "length": 12, - "line": 169, - "column": 5 - } + "line": 169 }, { "severity": "convention", @@ -3824,15 +1920,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 170, - "start_column": 5, - "last_line": 170, - "last_column": 17, - "length": 13, - "line": 170, - "column": 5 - } + "line": 170 }, { "severity": "warning", @@ -3840,15 +1928,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 170, - "start_column": 5, - "last_line": 170, - "last_column": 10, - "length": 6, - "line": 170, - "column": 5 - } + "line": 170 }, { "severity": "convention", @@ -3856,15 +1936,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 171, - "start_column": 5, - "last_line": 171, - "last_column": 16, - "length": 12, - "line": 171, - "column": 5 - } + "line": 171 }, { "severity": "warning", @@ -3872,15 +1944,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 171, - "start_column": 5, - "last_line": 171, - "last_column": 9, - "length": 5, - "line": 171, - "column": 5 - } + "line": 171 }, { "severity": "convention", @@ -3888,15 +1952,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 172, - "start_column": 5, - "last_line": 172, - "last_column": 16, - "length": 12, - "line": 172, - "column": 5 - } + "line": 172 }, { "severity": "warning", @@ -3904,15 +1960,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 172, - "start_column": 5, - "last_line": 172, - "last_column": 9, - "length": 5, - "line": 172, - "column": 5 - } + "line": 172 }, { "severity": "convention", @@ -3920,15 +1968,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 173, - "start_column": 5, - "last_line": 173, - "last_column": 24, - "length": 20, - "line": 173, - "column": 5 - } + "line": 173 }, { "severity": "warning", @@ -3936,15 +1976,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 173, - "start_column": 5, - "last_line": 173, - "last_column": 7, - "length": 3, - "line": 173, - "column": 5 - } + "line": 173 }, { "severity": "convention", @@ -3952,15 +1984,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 174, - "start_column": 5, - "last_line": 174, - "last_column": 26, - "length": 22, - "line": 174, - "column": 5 - } + "line": 174 }, { "severity": "warning", @@ -3968,15 +1992,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 174, - "start_column": 5, - "last_line": 174, - "last_column": 19, - "length": 15, - "line": 174, - "column": 5 - } + "line": 174 }, { "severity": "convention", @@ -3984,15 +2000,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 175, - "start_column": 5, - "last_line": 175, - "last_column": 23, - "length": 19, - "line": 175, - "column": 5 - } + "line": 175 }, { "severity": "warning", @@ -4000,15 +2008,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 175, - "start_column": 5, - "last_line": 175, - "last_column": 11, - "length": 7, - "line": 175, - "column": 5 - } + "line": 175 }, { "severity": "convention", @@ -4016,15 +2016,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 176, - "start_column": 5, - "last_line": 176, - "last_column": 27, - "length": 23, - "line": 176, - "column": 5 - } + "line": 176 }, { "severity": "warning", @@ -4032,15 +2024,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 176, - "start_column": 5, - "last_line": 176, - "last_column": 14, - "length": 10, - "line": 176, - "column": 5 - } + "line": 176 }, { "severity": "convention", @@ -4048,15 +2032,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 177, - "start_column": 5, - "last_line": 177, - "last_column": 22, - "length": 18, - "line": 177, - "column": 5 - } + "line": 177 }, { "severity": "warning", @@ -4064,15 +2040,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 177, - "start_column": 5, - "last_line": 177, - "last_column": 15, - "length": 11, - "line": 177, - "column": 5 - } + "line": 177 }, { "severity": "convention", @@ -4080,15 +2048,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 178, - "start_column": 5, - "last_line": 178, - "last_column": 22, - "length": 18, - "line": 178, - "column": 5 - } + "line": 178 }, { "severity": "warning", @@ -4096,15 +2056,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 178, - "start_column": 5, - "last_line": 178, - "last_column": 9, - "length": 5, - "line": 178, - "column": 5 - } + "line": 178 }, { "severity": "convention", @@ -4112,15 +2064,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 179, - "start_column": 5, - "last_line": 179, - "last_column": 31, - "length": 27, - "line": 179, - "column": 5 - } + "line": 179 }, { "severity": "warning", @@ -4128,15 +2072,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 179, - "start_column": 5, - "last_line": 179, - "last_column": 15, - "length": 11, - "line": 179, - "column": 5 - } + "line": 179 }, { "severity": "convention", @@ -4144,15 +2080,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 180, - "start_column": 5, - "last_line": 180, - "last_column": 24, - "length": 20, - "line": 180, - "column": 5 - } + "line": 180 }, { "severity": "warning", @@ -4160,15 +2088,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 180, - "start_column": 5, - "last_line": 180, - "last_column": 18, - "length": 14, - "line": 180, - "column": 5 - } + "line": 180 }, { "severity": "convention", @@ -4176,15 +2096,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 181, - "start_column": 5, - "last_line": 181, - "last_column": 15, - "length": 11, - "line": 181, - "column": 5 - } + "line": 181 }, { "severity": "warning", @@ -4192,15 +2104,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 181, - "start_column": 5, - "last_line": 181, - "last_column": 8, - "length": 4, - "line": 181, - "column": 5 - } + "line": 181 }, { "severity": "convention", @@ -4208,15 +2112,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 182, - "start_column": 5, - "last_line": 182, - "last_column": 15, - "length": 11, - "line": 182, - "column": 5 - } + "line": 182 }, { "severity": "warning", @@ -4224,15 +2120,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 182, - "start_column": 5, - "last_line": 182, - "last_column": 9, - "length": 5, - "line": 182, - "column": 5 - } + "line": 182 }, { "severity": "convention", @@ -4240,15 +2128,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 183, - "start_column": 5, - "last_line": 183, - "last_column": 22, - "length": 18, - "line": 183, - "column": 5 - } + "line": 183 }, { "severity": "warning", @@ -4256,15 +2136,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 183, - "start_column": 5, - "last_line": 183, - "last_column": 8, - "length": 4, - "line": 183, - "column": 5 - } + "line": 183 }, { "severity": "convention", @@ -4272,15 +2144,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 184, - "start_column": 5, - "last_line": 184, - "last_column": 23, - "length": 19, - "line": 184, - "column": 5 - } + "line": 184 }, { "severity": "warning", @@ -4288,15 +2152,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 184, - "start_column": 5, - "last_line": 184, - "last_column": 12, - "length": 8, - "line": 184, - "column": 5 - } + "line": 184 }, { "severity": "convention", @@ -4304,15 +2160,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 185, - "start_column": 5, - "last_line": 185, - "last_column": 20, - "length": 16, - "line": 185, - "column": 5 - } + "line": 185 }, { "severity": "warning", @@ -4320,15 +2168,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 185, - "start_column": 5, - "last_line": 185, - "last_column": 13, - "length": 9, - "line": 185, - "column": 5 - } + "line": 185 }, { "severity": "convention", @@ -4336,15 +2176,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 186, - "start_column": 5, - "last_line": 186, - "last_column": 17, - "length": 13, - "line": 186, - "column": 5 - } + "line": 186 }, { "severity": "warning", @@ -4352,15 +2184,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 186, - "start_column": 5, - "last_line": 186, - "last_column": 8, - "length": 4, - "line": 186, - "column": 5 - } + "line": 186 }, { "severity": "convention", @@ -4368,15 +2192,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 187, - "start_column": 5, - "last_line": 187, - "last_column": 23, - "length": 19, - "line": 187, - "column": 5 - } + "line": 187 }, { "severity": "warning", @@ -4384,15 +2200,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 187, - "start_column": 5, - "last_line": 187, - "last_column": 16, - "length": 12, - "line": 187, - "column": 5 - } + "line": 187 }, { "severity": "convention", @@ -4400,15 +2208,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 188, - "start_column": 5, - "last_line": 188, - "last_column": 17, - "length": 13, - "line": 188, - "column": 5 - } + "line": 188 }, { "severity": "warning", @@ -4416,15 +2216,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 188, - "start_column": 5, - "last_line": 188, - "last_column": 9, - "length": 5, - "line": 188, - "column": 5 - } + "line": 188 }, { "severity": "convention", @@ -4432,15 +2224,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 189, - "start_column": 5, - "last_line": 189, - "last_column": 22, - "length": 18, - "line": 189, - "column": 5 - } + "line": 189 }, { "severity": "warning", @@ -4448,15 +2232,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 189, - "start_column": 5, - "last_line": 189, - "last_column": 10, - "length": 6, - "line": 189, - "column": 5 - } + "line": 189 }, { "severity": "convention", @@ -4464,15 +2240,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 190, - "start_column": 5, - "last_line": 190, - "last_column": 22, - "length": 18, - "line": 190, - "column": 5 - } + "line": 190 }, { "severity": "warning", @@ -4480,15 +2248,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 190, - "start_column": 5, - "last_line": 190, - "last_column": 14, - "length": 10, - "line": 190, - "column": 5 - } + "line": 190 }, { "severity": "convention", @@ -4496,15 +2256,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 191, - "start_column": 5, - "last_line": 191, - "last_column": 22, - "length": 18, - "line": 191, - "column": 5 - } + "line": 191 }, { "severity": "warning", @@ -4512,15 +2264,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 191, - "start_column": 5, - "last_line": 191, - "last_column": 15, - "length": 11, - "line": 191, - "column": 5 - } + "line": 191 }, { "severity": "convention", @@ -4528,15 +2272,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 192, - "start_column": 5, - "last_line": 192, - "last_column": 18, - "length": 14, - "line": 192, - "column": 5 - } + "line": 192 }, { "severity": "warning", @@ -4544,15 +2280,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 192, - "start_column": 5, - "last_line": 192, - "last_column": 9, - "length": 5, - "line": 192, - "column": 5 - } + "line": 192 }, { "severity": "convention", @@ -4560,15 +2288,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 193, - "start_column": 5, - "last_line": 193, - "last_column": 26, - "length": 22, - "line": 193, - "column": 5 - } + "line": 193 }, { "severity": "warning", @@ -4576,15 +2296,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 193, - "start_column": 5, - "last_line": 193, - "last_column": 11, - "length": 7, - "line": 193, - "column": 5 - } + "line": 193 }, { "severity": "convention", @@ -4592,15 +2304,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 194, - "start_column": 5, - "last_line": 194, - "last_column": 30, - "length": 26, - "line": 194, - "column": 5 - } + "line": 194 }, { "severity": "warning", @@ -4608,15 +2312,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 194, - "start_column": 5, - "last_line": 194, - "last_column": 17, - "length": 13, - "line": 194, - "column": 5 - } + "line": 194 }, { "severity": "convention", @@ -4624,15 +2320,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 195, - "start_column": 5, - "last_line": 195, - "last_column": 21, - "length": 17, - "line": 195, - "column": 5 - } + "line": 195 }, { "severity": "warning", @@ -4640,15 +2328,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 195, - "start_column": 5, - "last_line": 195, - "last_column": 15, - "length": 11, - "line": 195, - "column": 5 - } + "line": 195 }, { "severity": "convention", @@ -4656,15 +2336,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 196, - "start_column": 5, - "last_line": 196, - "last_column": 18, - "length": 14, - "line": 196, - "column": 5 - } + "line": 196 }, { "severity": "warning", @@ -4672,15 +2344,7 @@ "cop_name": "Lint/DuplicateHashKey", "corrected": false, "correctable": false, - "location": { - "start_line": 196, - "start_column": 5, - "last_line": 196, - "last_column": 8, - "length": 4, - "line": 196, - "column": 5 - } + "line": 196 } ] } @@ -4690,4 +2354,4 @@ "target_file_count": 1, "inspected_file_count": 1 } -} \ No newline at end of file +} diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_offenses/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_offenses/results.json index bacc0b85..64009bc0 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_offenses/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_offenses/results.json @@ -16,15 +16,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 3, - "start_column": 5, - "last_line": 3, - "last_column": 20, - "length": 16, - "line": 3, - "column": 5 - } + "line": 3 }, { "severity": "convention", @@ -32,15 +24,7 @@ "cop_name": "Layout/HashAlignment", "corrected": false, "correctable": true, - "location": { - "start_line": 4, - "start_column": 5, - "last_line": 4, - "last_column": 22, - "length": 18, - "line": 4, - "column": 5 - } + "line": 4 } ] }, @@ -59,15 +43,7 @@ "cop_name": "Lint/Syntax", "corrected": false, "correctable": false, - "location": { - "start_line": 3, - "start_column": 1, - "last_line": 3, - "last_column": 3, - "length": 3, - "line": 3, - "column": 1 - } + "line": 3 } ] }, @@ -80,15 +56,7 @@ "cop_name": "Lint/UselessAssignment", "corrected": false, "correctable": false, - "location": { - "start_line": 3, - "start_column": 5, - "last_line": 3, - "last_column": 19, - "length": 15, - "line": 3, - "column": 5 - } + "line": 3 } ] } @@ -98,4 +66,4 @@ "target_file_count": 4, "inspected_file_count": 4 } -} \ No newline at end of file +} diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_without_column_numbers_and_cop_names/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_without_column_numbers_and_cop_names/results.json index 20841ffc..a67c768e 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_without_column_numbers_and_cop_names/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_without_column_numbers_and_cop_names/results.json @@ -13,9 +13,7 @@ { "severity": "warning", "message": "The - symbol should have one space separating it from code", - "location": { - "line": 2 - }, + "line": 2, "linter_name": "SpaceBeforeScript" } ] @@ -26,4 +24,4 @@ "target_file_count": 1, "inspected_file_count": 1 } -} \ No newline at end of file +} diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_void_warnings_in_spec_files/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_void_warnings_in_spec_files/results.json index e53a91e3..defae514 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_void_warnings_in_spec_files/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_void_warnings_in_spec_files/results.json @@ -16,15 +16,7 @@ "cop_name": "Lint/Void", "corrected": false, "correctable": false, - "location": { - "start_line": 2, - "start_column": 13, - "last_line": 2, - "last_column": 14, - "length": 2, - "line": 2, - "column": 13 - } + "line": 2 } ] }, @@ -37,15 +29,7 @@ "cop_name": "Lint/Void", "corrected": false, "correctable": false, - "location": { - "start_line": 2, - "start_column": 13, - "last_line": 2, - "last_column": 14, - "length": 2, - "line": 2, - "column": 13 - } + "line": 2 } ] }, @@ -58,15 +42,7 @@ "cop_name": "Lint/Void", "corrected": false, "correctable": false, - "location": { - "start_line": 3, - "start_column": 14, - "last_line": 3, - "last_column": 15, - "length": 2, - "line": 3, - "column": 14 - } + "line": 3 } ] } @@ -76,4 +52,4 @@ "target_file_count": 3, "inspected_file_count": 3 } -} \ No newline at end of file +} diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/message_builder_spec.rb b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/message_builder_spec.rb index 3a9e65ef..e91abe2f 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/message_builder_spec.rb +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/message_builder_spec.rb @@ -22,15 +22,15 @@ 4 files checked, 4 offenses detected **spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/coding_convention.rb** -- [ ] :exclamation: - [Line 3](https://github.com/some_user/some_repo/blob/8942a195a0bfa69ceb82c020c60565408cb46d3e/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/coding_convention.rb#L3), Col 5 - [Layout/HashAlignment](http://rubydoc.info/gems/rubocop/#{rubocop_version}/RuboCop/Cop/Layout/HashAlignment) - Align the keys and values of a hash literal if they span more than one line. -- [ ] :exclamation: - [Line 4](https://github.com/some_user/some_repo/blob/8942a195a0bfa69ceb82c020c60565408cb46d3e/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/coding_convention.rb#L4), Col 5 - [Layout/HashAlignment](http://rubydoc.info/gems/rubocop/#{rubocop_version}/RuboCop/Cop/Layout/HashAlignment) - Align the keys and values of a hash literal if they span more than one line. +- [ ] :exclamation: - [Line 3](https://github.com/some_user/some_repo/blob/8942a195a0bfa69ceb82c020c60565408cb46d3e/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/coding_convention.rb#L3) - [Layout/HashAlignment](http://rubydoc.info/gems/rubocop/#{rubocop_version}/RuboCop/Cop/Layout/HashAlignment) - Align the keys and values of a hash literal if they span more than one line. +- [ ] :exclamation: - [Line 4](https://github.com/some_user/some_repo/blob/8942a195a0bfa69ceb82c020c60565408cb46d3e/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/coding_convention.rb#L4) - [Layout/HashAlignment](http://rubydoc.info/gems/rubocop/#{rubocop_version}/RuboCop/Cop/Layout/HashAlignment) - Align the keys and values of a hash literal if they span more than one line. **spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/ruby_syntax_error.rb** -- [ ] :bomb: :boom: :fire: :fire_engine: - [Line 3](https://github.com/some_user/some_repo/blob/8942a195a0bfa69ceb82c020c60565408cb46d3e/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/ruby_syntax_error.rb#L3), Col 1 - [Lint/Syntax](http://rubydoc.info/gems/rubocop/#{rubocop_version}/RuboCop/Cop/Lint/Syntax) - unexpected token kEND +- [ ] :bomb: :boom: :fire: :fire_engine: - [Line 3](https://github.com/some_user/some_repo/blob/8942a195a0bfa69ceb82c020c60565408cb46d3e/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/ruby_syntax_error.rb#L3) - [Lint/Syntax](http://rubydoc.info/gems/rubocop/#{rubocop_version}/RuboCop/Cop/Lint/Syntax) - unexpected token kEND (Using Ruby 2.5 parser; configure using `TargetRubyVersion` parameter, under `AllCops`) **spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/ruby_warning.rb** -- [ ] :warning: - [Line 3](https://github.com/some_user/some_repo/blob/8942a195a0bfa69ceb82c020c60565408cb46d3e/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/ruby_warning.rb#L3), Col 5 - [Lint/UselessAssignment](http://rubydoc.info/gems/rubocop/#{rubocop_version}/RuboCop/Cop/Lint/UselessAssignment) - Useless assignment to variable - `unused_variable`. +- [ ] :warning: - [Line 3](https://github.com/some_user/some_repo/blob/8942a195a0bfa69ceb82c020c60565408cb46d3e/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/#{rubocop_check_directory}/ruby_warning.rb#L3) - [Lint/UselessAssignment](http://rubydoc.info/gems/rubocop/#{rubocop_version}/RuboCop/Cop/Lint/UselessAssignment) - Useless assignment to variable - `unused_variable`. EOMSG end diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/rubocop_results_filter_spec.rb b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/rubocop_results_filter_spec.rb index 003a06dc..1dd24ae5 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/rubocop_results_filter_spec.rb +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/rubocop_results_filter_spec.rb @@ -13,7 +13,7 @@ expect(filtered["files"].length).to eq(1) expect(filtered["files"][0]["offenses"].length).to eq(1) - expect(filtered["files"][0]["offenses"][0]["location"]["line"]).to eq(4) + expect(filtered["files"][0]["offenses"][0]["line"]).to eq(4) expect(filtered["summary"]["offense_count"]).to eq(1) end @@ -45,7 +45,7 @@ expect(filtered["files"].length).to eq(1) expect(filtered["files"][0]["offenses"].length).to eq(1) - expect(filtered["files"][0]["offenses"][0]["location"]["line"]).to eq(3) + expect(filtered["files"][0]["offenses"][0]["line"]).to eq(3) expect(filtered["summary"]["offense_count"]).to eq(1) end diff --git a/spec/workers/concerns/code_analysis_mixin_spec.rb b/spec/workers/concerns/code_analysis_mixin_spec.rb index 1637f8eb..545c56de 100644 --- a/spec/workers/concerns/code_analysis_mixin_spec.rb +++ b/spec/workers/concerns/code_analysis_mixin_spec.rb @@ -1,5 +1,4 @@ describe CodeAnalysisMixin do - let(:example_rubocop_result) { {"metadata"=>{"rubocop_version"=>"0.47.1", "ruby_engine"=>"ruby", "ruby_version"=>"2.3.3", "ruby_patchlevel"=>"222", "ruby_platform"=>"x86_64-linux"}, "files"=>[{"path"=>"app/helpers/application_helper/button/mixins/discovery_mixin.rb", "offenses"=>[]}, {"path"=>"app/helpers/application_helper/button/button_new_discover.rb", "offenses"=>[{"severity"=>"warning", "message"=>"Method `ApplicationHelper::Button::ButtonNewDiscover#visible?` is defined at both /tmp/d20171201-9050-1m4n90/app/helpers/application_helper/button/button_new_discover.rb:5 and /tmp/d20171201-9050-1m4n90/app/helpers/application_helper/button/button_new_discover.rb:9.", "cop_name"=>"Lint/DuplicateMethods", "corrected"=>nil, "location"=>{"line"=>9, "column"=>3, "length"=>3}}]}], "summary"=>{"offense_count"=>1, "target_file_count"=>2, "inspected_file_count"=>2}} } let(:test_class) do Class.new do include CodeAnalysisMixin @@ -8,34 +7,101 @@ end subject { test_class.new } - context "#merged_linter_results" do + describe "#merged_linter_results" do it "should always return a hash with a 'files' and 'summary' key, even with no cops running" do - expect(Linter::Rubocop).to receive(:new).and_return(double(:run => nil)) - expect(Linter::Haml).to receive(:new).and_return(double(:run => nil)) - expect(Linter::Yaml).to receive(:new).and_return(double(:run => nil)) - - expect(subject.merged_linter_results).to eq("files"=>[], "summary"=>{"inspected_file_count"=>0, "offense_count"=>0, "target_file_count"=>0}) + allow(subject).to receive(:pronto_result).and_return([]) + expect(subject.merged_linter_results).to eq("files" => [], "summary" => {"inspected_file_count" => 0, "offense_count" => 0, "target_file_count" => 0}) end + end + + describe "#run_all_linters" do + let(:item_rubocop) { double("RuCo object", :runner => item_runner_ruco, :path => "RuCo filepath.rb", :level => "RuCo warning-text", :msg => item_msg, :line => item_line) } + let(:item_haml) { double("haml object", :runner => item_runner_haml, :path => "haml filepath.rb", :level => "haml warning-text", :msg => item_msg, :line => item_line) } + let(:item_yaml) { double("yaml object", :runner => item_runner_yaml, :path => "yaml filepath.rb", :level => "yaml warning-text", :msg => item_msg, :line => item_line) } + + let(:item_runner_ruco) { double("runner object", :name => "Pronto::Rubocop") } + let(:item_runner_haml) { double("runner object", :name => "Pronto::Haml") } + let(:item_runner_yaml) { double("runner object", :name => "Pronto::Yaml") } - it "merges together with one result" do - expect(Linter::Rubocop).to receive(:new).and_return(double(:run => example_rubocop_result)) - expect(Linter::Haml).to receive(:new).and_return(double(:run => nil)) - expect(Linter::Yaml).to receive(:new).and_return(double(:run => nil)) + let(:item_msg) { double("msg object", :msg => "message-text", :line => item_line) } + let(:item_line) { double("line object", :position => 1) } - expect(subject.merged_linter_results).to eq( - "files" => example_rubocop_result["files"], - "summary" => {"inspected_file_count"=>2, "offense_count"=>1, "target_file_count"=>2} - ) + before do + allow(subject).to receive(:pronto_result).and_return(input) end - it "merges together with one result" do - expect(Linter::Rubocop).to receive(:new).and_return(double(:run => example_rubocop_result)) - expect(Linter::Haml).to receive(:new).and_return(double(:run => example_rubocop_result)) - expect(Linter::Yaml).to receive(:new).and_return(double(:run => nil)) + context "input is array of pronto messages" do + let(:input) { [item_rubocop, item_haml, item_yaml] } - results = subject.merged_linter_results - expect(results["files"]).to include(*example_rubocop_result["files"]) - expect(results["summary"]).to eq("inspected_file_count"=>4, "offense_count"=>2, "target_file_count"=>4) + it "returns a hash created from an array of \'Pronto::Message\'s" do + expect(subject.run_all_linters).to eq( + [ + { + "files" => [ + { + "path" => item_rubocop.path, + "offenses" => [ + { + "severity" => item_rubocop.level, + "message" => item_rubocop.msg, + "cop_name" => item_rubocop.runner, + "corrected" => false, + "line" => item_msg.line.position + }, + ] + } + ], + "summary" => { + "offense_count" => input.group_by(&:runner).values[0].count, + "target_file_count" => input.group_by(&:runner).values[0].group_by(&:path).count, + "inspected_file_count" => 0 + } + }, + { + "files" => [ + { + "path" => item_haml.path, + "offenses" => [ + { + "severity" => item_haml.level, + "message" => item_haml.msg, + "cop_name" => item_haml.runner, + "corrected" => false, + "line" => item_msg.line.position + }, + ] + } + ], + "summary" => { + "offense_count" => input.group_by(&:runner).values[1].count, + "target_file_count" => input.group_by(&:runner).values[1].group_by(&:path).count, + "inspected_file_count" => 0 + } + }, + { + "files" => [ + { + "path" => item_yaml.path, + "offenses" => [ + { + "severity" => item_yaml.level, + "message" => item_yaml.msg, + "cop_name" => item_yaml.runner, + "corrected" => false, + "line" => item_msg.line.position + }, + ] + } + ], + "summary" => { + "offense_count" => input.group_by(&:runner).values[2].count, + "target_file_count" => input.group_by(&:runner).values[2].group_by(&:path).count, + "inspected_file_count" => 0 + } + } + ] + ) # expect END + end end end end From b4cc189e2312433cb079372cb6a504a58fcd4654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20T=C3=B3th?= Date: Mon, 26 Feb 2018 16:15:24 +0100 Subject: [PATCH 2/8] No longer used files removed (lib/linter/) Request in #406 to remove files in lib/linter/ which are not used --- lib/linter/base.rb | 132 ----------------------------------- lib/linter/haml.rb | 21 ------ lib/linter/rubocop.rb | 32 --------- lib/linter/yaml.rb | 58 --------------- spec/lib/linter/yaml_spec.rb | 96 ------------------------- 5 files changed, 339 deletions(-) delete mode 100644 lib/linter/base.rb delete mode 100644 lib/linter/haml.rb delete mode 100644 lib/linter/rubocop.rb delete mode 100644 lib/linter/yaml.rb delete mode 100644 spec/lib/linter/yaml_spec.rb diff --git a/lib/linter/base.rb b/lib/linter/base.rb deleted file mode 100644 index a3b455ca..00000000 --- a/lib/linter/base.rb +++ /dev/null @@ -1,132 +0,0 @@ -module Linter - class Base - attr_reader :branch - delegate :logger, :to => :branch - - def initialize(branch) - @branch = branch - end - - def run - logger.info("#{log_header} Starting run...") - if files_to_lint.empty? - logger.info("#{log_header} Skipping run due to no candidate files.") - return - end - - require 'tempfile' - result = Dir.mktmpdir do |dir| - files = collected_config_files(dir) - if files.blank? - logger.error("#{log_header} Failed to run due to missing config files.") - return failed_linter_offenses("missing config files") - else - files += collected_files_to_lint(dir) - logger.info("#{log_header} Collected #{files.length} files.") - logger.debug { "#{log_header} File list: #{files.inspect}"} - run_linter(dir) - end - end - - offenses = parse_output(result.output) - logger.info("#{log_header} Completed run with #{offenses.fetch_path('summary', 'offense_count')} offenses") - logger.debug { "#{log_header} Offenses: #{offenses.inspect}" } - offenses - end - - private - - def parse_output(output) - JSON.parse(output.chomp) - rescue JSON::ParserError => error - logger.error("#{log_header} #{error.message}") - logger.error("#{log_header} Failed to parse JSON result #{output.inspect}") - return failed_linter_offenses("error parsing JSON result") - end - - def collected_config_files(dir) - config_files.select { |path| extract_file(path, dir, branch.pull_request?) } - end - - def collected_files_to_lint(dir) - files_to_lint.select { |path| extract_file(path, dir) } - end - - def extract_file(path, destination_dir, merged = false) - content = branch_service.content_at(path, merged) - return false unless content - - perm = branch_service.permission_for(path, merged) - temp_file = File.join(destination_dir, path) - FileUtils.mkdir_p(File.dirname(temp_file)) - - # Use "wb" to prevent Encoding::UndefinedConversionError: "\xD0" from - # ASCII-8BIT to UTF-8 - File.write(temp_file, content, :mode => "wb", :perm => perm) - - true - end - - def branch_service - @branch_service ||= branch.git_service - end - - def diff_service - @diff_service ||= branch_service.diff - end - - def files_to_lint - @files_to_lint ||= begin - unfiltered_files = branch.pull_request? ? diff_service.new_files : branch.git_service.tip_files - filtered_files(unfiltered_files) - end - end - - def run_linter(dir) - logger.info("#{log_header} Executing linter...") - require 'awesome_spawn' - result = AwesomeSpawn.run(linter_executable, :params => options, :chdir => dir) - handle_linter_output(result) - end - - def handle_linter_output(result) - # rubocop exits 1 both when there are errors and when there are style issues. - # Instead of relying on just exit_status, we check if there is anything on stderr. - return result if result.exit_status.zero? || result.error.blank? - FailedLinterRun.new(failed_linter_offenses("#{self.class.name} STDERR:\n```\n#{result.error}\n```")) - end - - def failed_linter_offenses(message) - { - "files" => [ - { - "path" => "\\*\\*", - "offenses" => [ - { - "severity" => "fatal", - "message" => message, - "cop_name" => self.class.name.titleize - } - ] - } - ], - "summary" => { - "offense_count" => 1, - "target_file_count" => files_to_lint.length, - "inspected_file_count" => files_to_lint.length - } - } - end - - def log_header - "#{self.class.name} Repo: #{branch.repo.name} Branch #{branch.name} -" - end - - class FailedLinterRun - attr_reader :output - def initialize(message) - @output = message.to_json - end - end - end -end diff --git a/lib/linter/haml.rb b/lib/linter/haml.rb deleted file mode 100644 index c8e6ac12..00000000 --- a/lib/linter/haml.rb +++ /dev/null @@ -1,21 +0,0 @@ -module Linter - class Haml < Base - private - - def config_files - [".haml-lint.yml"] + Linter::Rubocop::CONFIG_FILES - end - - def linter_executable - 'haml-lint *' - end - - def options - {:reporter => 'json'} - end - - def filtered_files(files) - files.select { |file| file.end_with?(".haml") } - end - end -end diff --git a/lib/linter/rubocop.rb b/lib/linter/rubocop.rb deleted file mode 100644 index b642a694..00000000 --- a/lib/linter/rubocop.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'rubocop' - -module Linter - class Rubocop < Base - CONFIG_FILES = %w[.rubocop.yml .rubocop_base.yml .rubocop_local.yml].freeze - - private - - def config_files - CONFIG_FILES - end - - def linter_executable - 'rubocop' - end - - def options - {:format => 'json', :no_display_cop_names => nil} - end - - def filtered_files(files) - files.select do |file| - file.end_with?(".rb") || - file.end_with?(".ru") || - file.end_with?(".rake") || - File.basename(file).in?(%w(Gemfile Rakefile)) - end.reject do |file| - file.end_with?("db/schema.rb") - end - end - end -end diff --git a/lib/linter/yaml.rb b/lib/linter/yaml.rb deleted file mode 100644 index 14321d77..00000000 --- a/lib/linter/yaml.rb +++ /dev/null @@ -1,58 +0,0 @@ -module Linter - class Yaml < Base - private - - def parse_output(output) - lines = output.chomp.split("\n") - parsed = lines.collect { |line| line_to_hash(line) } - grouped = parsed.group_by { |hash| hash["filename"] } - file_count = parsed.collect { |hash| hash["filename"] }.uniq.count - { - "files" => grouped.collect do |filename, offenses| - { - "path" => filename.sub(%r{\A\./}, ""), - "offenses" => offenses.collect { |offense_hash| offense_hash.except("filename") } - } - end, - "summary" => { - "offense_count" => lines.size, - "target_file_count" => file_count, - "inspected_file_count" => file_count - } - } - end - - def linter_executable - "yamllint" - end - - def config_files - [".yamllint"] - end - - def options - {:f => "parsable", nil => ["."]} - end - - def filtered_files(files) - files.select { |f| f.end_with?(".yml", ".yaml") } - end - - def line_to_hash(line) - filename, line, column, severity_message_cop = line.split(":", 4) - severity_message, cop = severity_message_cop.split(/ \((.*)\)\Z/) - severity, message = severity_message.match(/\[(.*)\] (.*)/).captures - - { - "filename" => filename, - "severity" => severity, - "message" => message, - "cop_name" => cop, - "location" => { - "line" => line.to_i, - "column" => column.to_i - } - } - end - end -end diff --git a/spec/lib/linter/yaml_spec.rb b/spec/lib/linter/yaml_spec.rb deleted file mode 100644 index 3570fe32..00000000 --- a/spec/lib/linter/yaml_spec.rb +++ /dev/null @@ -1,96 +0,0 @@ -RSpec.describe Linter::Yaml do - describe "#parse_output" do - it "formats the output in the same form as rubocop" do - output = <<-EOOUTPUT -config/settings.yml:8:5: [warning] wrong indentation: expected 2 but found 4 (indentation) -config/settings.yml:11:1: [error] duplication of key ":a" in mapping (key-duplicates) -lib/generators/provider/templates/config/settings.yml:8:15: [error] syntax error: could not find expected ':' -EOOUTPUT - - actual = described_class.new(double("branch")).send(:parse_output, output) - - expected = { - "files" => [ - { - "path" => "config/settings.yml", - "offenses" => a_collection_containing_exactly( - { - "severity" => "warning", - "message" => "wrong indentation: expected 2 but found 4", - "cop_name" => "indentation", - "location" => { - "line" => 8, - "column" => 5 - } - }, - { - "severity" => "error", - "message" => "duplication of key \":a\" in mapping", - "cop_name" => "key-duplicates", - "location" => { - "line" => 11, - "column" => 1 - } - } - ) - }, - { - "path" => "lib/generators/provider/templates/config/settings.yml", - "offenses" => [ - { - "severity" => "error", - "message" => "syntax error: could not find expected ':'", - "cop_name" => nil, - "location" => { - "line" => 8, - "column" => 15 - } - }, - ] - } - ], - "summary" => { - "offense_count" => 3, - "target_file_count" => 2, - "inspected_file_count" => 2 - }, - } - expect(actual).to include(expected) - end - end - - describe "#line_to_hash" do - it "with a syntax error" do - line = "./lib/generators/provider/templates/config/settings.yml:8:15: [error] syntax error: could not find expected ':'" - expect(described_class.new(double).send(:line_to_hash, line)).to eq( - "cop_name" => nil, - "filename" => "./lib/generators/provider/templates/config/settings.yml", - "location" => {"line" => 8, "column" => 15}, - "message" => "syntax error: could not find expected ':'", - "severity" => "error" - ) - end - - it "with an indentation warning" do - line = "config/settings.yml:8:5: [warning] wrong indentation: expected 2 but found 4 (indentation)" - expect(described_class.new(double).send(:line_to_hash, line)).to eq( - "cop_name" => "indentation", - "filename" => "config/settings.yml", - "location" => {"line" => 8, "column" => 5}, - "message" => "wrong indentation: expected 2 but found 4", - "severity" => "warning" - ) - end - - it "with a duplicate key error" do - line = "config/settings.yml:11:1: [error] duplication of key \":a\" in mapping (key-duplicates)" - expect(described_class.new(double).send(:line_to_hash, line)).to eq( - "cop_name" => "key-duplicates", - "filename" => "config/settings.yml", - "location" => {"line" => 11, "column" => 1}, - "message" => "duplication of key \":a\" in mapping", - "severity" => "error" - ) - end - end -end From b7867fa65fd3a6f91f79023f6a531c372d02207a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20T=C3=B3th?= Date: Wed, 28 Feb 2018 10:52:10 +0100 Subject: [PATCH 3/8] Removed unused variable "inspected_file_count" Variable "inspected_file_count" in the result of the linters has been removed due to missing use. It was not used in the pull request comment describing the offenses detected by linters in the source code. --- app/workers/concerns/code_analysis_mixin.rb | 12 ++++----- spec/support/rubocop_spec_helper.rb | 2 +- .../results.json | 5 ++-- .../with_lines_not_in_the_diff/results.json | 5 ++-- .../results.json | 5 ++-- .../results.json | 3 +-- .../with_results_with_offenses/results.json | 5 ++-- .../results.json | 5 ++-- .../results.json | 5 ++-- .../concerns/code_analysis_mixin_spec.rb | 27 +++++++++---------- 10 files changed, 31 insertions(+), 43 deletions(-) diff --git a/app/workers/concerns/code_analysis_mixin.rb b/app/workers/concerns/code_analysis_mixin.rb index 2be46848..a8bed528 100644 --- a/app/workers/concerns/code_analysis_mixin.rb +++ b/app/workers/concerns/code_analysis_mixin.rb @@ -15,14 +15,13 @@ def merged_linter_results results = { "files" => [], "summary" => { - "inspected_file_count" => 0, - "offense_count" => 0, - "target_file_count" => 0, + "offense_count" => 0, + "target_file_count" => 0, }, } run_all_linters.each do |result| - %w(offense_count target_file_count inspected_file_count).each do |m| + %w[offense_count target_file_count].each do |m| results['summary'][m] += result['summary'][m] end results['files'] += result['files'] @@ -70,9 +69,8 @@ def run_all_linters end output["summary"] = { - "offense_count" => output["files"].sum { |item| item['offenses'].length }, - "target_file_count" => output["files"].length, - "inspected_file_count" => 0 # TODO: value cannot be obtained from the result of `pronto_result` method + "offense_count" => output["files"].sum { |item| item['offenses'].length }, + "target_file_count" => output["files"].length, } output diff --git a/spec/support/rubocop_spec_helper.rb b/spec/support/rubocop_spec_helper.rb index aea0601a..adc601d5 100644 --- a/spec/support/rubocop_spec_helper.rb +++ b/spec/support/rubocop_spec_helper.rb @@ -4,7 +4,7 @@ def rubocop_results rubocop = JSON.parse(`rubocop --format=json --no-display-cop-names #{rubocop_check_path}`) hamllint = JSON.parse(`haml-lint --reporter=json #{rubocop_check_path}`) - %w(offense_count target_file_count inspected_file_count).each do |m| + %w[offense_count target_file_count].each do |m| rubocop['summary'][m] += hamllint['summary'][m] end rubocop['files'] += hamllint['files'] diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_haml_file_using_haml-lint/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_haml_file_using_haml-lint/results.json index e3438034..9db57a91 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_haml_file_using_haml-lint/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_haml_file_using_haml-lint/results.json @@ -21,7 +21,6 @@ ], "summary": { "offense_count": 1, - "target_file_count": 1, - "inspected_file_count": 1 + "target_file_count": 1 } -} +} \ No newline at end of file diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_lines_not_in_the_diff/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_lines_not_in_the_diff/results.json index 682e2144..d521ecd6 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_lines_not_in_the_diff/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_lines_not_in_the_diff/results.json @@ -39,7 +39,6 @@ ], "summary": { "offense_count": 3, - "target_file_count": 1, - "inspected_file_count": 1 + "target_file_count": 1 } -} +} \ No newline at end of file diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_generating_multiple_comments/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_generating_multiple_comments/results.json index 1ef6b328..927c6cb6 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_generating_multiple_comments/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_generating_multiple_comments/results.json @@ -2351,7 +2351,6 @@ ], "summary": { "offense_count": 292, - "target_file_count": 1, - "inspected_file_count": 1 + "target_file_count": 1 } -} +} \ No newline at end of file diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_no_offenses/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_no_offenses/results.json index 1a996f8f..d6dbaa62 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_no_offenses/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_no_offenses/results.json @@ -16,7 +16,6 @@ ], "summary": { "offense_count": 0, - "target_file_count": 1, - "inspected_file_count": 1 + "target_file_count": 1 } } \ No newline at end of file diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_offenses/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_offenses/results.json index 64009bc0..38b31c21 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_offenses/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_with_offenses/results.json @@ -63,7 +63,6 @@ ], "summary": { "offense_count": 4, - "target_file_count": 4, - "inspected_file_count": 4 + "target_file_count": 4 } -} +} \ No newline at end of file diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_without_column_numbers_and_cop_names/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_without_column_numbers_and_cop_names/results.json index a67c768e..91806861 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_without_column_numbers_and_cop_names/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_results_without_column_numbers_and_cop_names/results.json @@ -21,7 +21,6 @@ ], "summary": { "offense_count": 1, - "target_file_count": 1, - "inspected_file_count": 1 + "target_file_count": 1 } -} +} \ No newline at end of file diff --git a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_void_warnings_in_spec_files/results.json b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_void_warnings_in_spec_files/results.json index defae514..ea0af778 100644 --- a/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_void_warnings_in_spec_files/results.json +++ b/spec/workers/commit_monitor_handlers/commit_range/rubocop_checker/data/with_void_warnings_in_spec_files/results.json @@ -49,7 +49,6 @@ ], "summary": { "offense_count": 3, - "target_file_count": 3, - "inspected_file_count": 3 + "target_file_count": 3 } -} +} \ No newline at end of file diff --git a/spec/workers/concerns/code_analysis_mixin_spec.rb b/spec/workers/concerns/code_analysis_mixin_spec.rb index 545c56de..e258c5a2 100644 --- a/spec/workers/concerns/code_analysis_mixin_spec.rb +++ b/spec/workers/concerns/code_analysis_mixin_spec.rb @@ -10,7 +10,7 @@ describe "#merged_linter_results" do it "should always return a hash with a 'files' and 'summary' key, even with no cops running" do allow(subject).to receive(:pronto_result).and_return([]) - expect(subject.merged_linter_results).to eq("files" => [], "summary" => {"inspected_file_count" => 0, "offense_count" => 0, "target_file_count" => 0}) + expect(subject.merged_linter_results).to eq("files" => [], "summary" => {"offense_count" => 0, "target_file_count" => 0}) end end @@ -37,7 +37,7 @@ expect(subject.run_all_linters).to eq( [ { - "files" => [ + "files" => [ { "path" => item_rubocop.path, "offenses" => [ @@ -46,15 +46,14 @@ "message" => item_rubocop.msg, "cop_name" => item_rubocop.runner, "corrected" => false, - "line" => item_msg.line.position + "line" => item_msg.line.position }, ] } ], - "summary" => { - "offense_count" => input.group_by(&:runner).values[0].count, - "target_file_count" => input.group_by(&:runner).values[0].group_by(&:path).count, - "inspected_file_count" => 0 + "summary" => { + "offense_count" => input.group_by(&:runner).values[0].count, + "target_file_count" => input.group_by(&:runner).values[0].group_by(&:path).count } }, { @@ -67,15 +66,14 @@ "message" => item_haml.msg, "cop_name" => item_haml.runner, "corrected" => false, - "line" => item_msg.line.position + "line" => item_msg.line.position }, ] } ], "summary" => { - "offense_count" => input.group_by(&:runner).values[1].count, - "target_file_count" => input.group_by(&:runner).values[1].group_by(&:path).count, - "inspected_file_count" => 0 + "offense_count" => input.group_by(&:runner).values[1].count, + "target_file_count" => input.group_by(&:runner).values[1].group_by(&:path).count } }, { @@ -88,15 +86,14 @@ "message" => item_yaml.msg, "cop_name" => item_yaml.runner, "corrected" => false, - "line" => item_msg.line.position + "line" => item_msg.line.position }, ] } ], "summary" => { - "offense_count" => input.group_by(&:runner).values[2].count, - "target_file_count" => input.group_by(&:runner).values[2].group_by(&:path).count, - "inspected_file_count" => 0 + "offense_count" => input.group_by(&:runner).values[2].count, + "target_file_count" => input.group_by(&:runner).values[2].group_by(&:path).count } } ] From a8d4051499faca2a17c447310a996301fe1b7f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20T=C3=B3th?= Date: Tue, 3 Apr 2018 12:58:19 +0200 Subject: [PATCH 4/8] Pronto linter dependencies automatically required Pronto runners (linters) expected to run will be automatically required in the CodeAnalysisMixin based on Gemfile specifications for pronto runners (linters). --- app/workers/concerns/code_analysis_mixin.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/workers/concerns/code_analysis_mixin.rb b/app/workers/concerns/code_analysis_mixin.rb index a8bed528..22757c35 100644 --- a/app/workers/concerns/code_analysis_mixin.rb +++ b/app/workers/concerns/code_analysis_mixin.rb @@ -1,7 +1,5 @@ require 'pronto/runners' -require 'pronto/rubocop' -require 'pronto/yamllint' -require 'pronto/haml' +require 'pronto/gem_names' require 'pronto/git/repository' require 'pronto/git/patches' require 'pronto/git/patch' @@ -32,6 +30,8 @@ def merged_linter_results # run linters via pronto and return the pronto result def pronto_result + Pronto::GemNames.new.to_a.each { |gem_name| require "pronto/#{gem_name}" } + p_result = nil # temporary solution for: download repo, obtain changes, get pronto result about changes From a803e3a7815a99e29dc808641ed205a513198aa1 Mon Sep 17 00:00:00 2001 From: Nick LaMuro Date: Tue, 8 Sep 2020 11:20:53 -0500 Subject: [PATCH 5/8] [CodeAnalysisMixin] Simplify proto_result This makes use of the newly working (I hope) Repo#git_fetch, as well as removes some of the `mktmpdir` logic that shouldn't be required because we are using Rugged. --- app/workers/code_analyzer.rb | 1 + app/workers/concerns/code_analysis_mixin.rb | 19 ++++++------------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/app/workers/code_analyzer.rb b/app/workers/code_analyzer.rb index 0d3d54a3..19872126 100644 --- a/app/workers/code_analyzer.rb +++ b/app/workers/code_analyzer.rb @@ -9,6 +9,7 @@ class CodeAnalyzer def perform(branch_id) return unless find_branch(branch_id, :regular) + return unless branch.merge_target analyze end diff --git a/app/workers/concerns/code_analysis_mixin.rb b/app/workers/concerns/code_analysis_mixin.rb index 22757c35..a76c387d 100644 --- a/app/workers/concerns/code_analysis_mixin.rb +++ b/app/workers/concerns/code_analysis_mixin.rb @@ -32,21 +32,14 @@ def merged_linter_results def pronto_result Pronto::GemNames.new.to_a.each { |gem_name| require "pronto/#{gem_name}" } - p_result = nil + branch.repo.git_fetch - # temporary solution for: download repo, obtain changes, get pronto result about changes - Dir.mktmpdir do |dir| - FileUtils.copy_entry(@branch.repo.path.to_s, dir) - repo = Pronto::Git::Repository.new(dir) - rg = repo.instance_variable_get(:@repo) - rg.fetch('origin', @branch.name.sub(/^prs/, 'pull')) - rg.checkout('FETCH_HEAD') - rg.reset('HEAD', :hard) - patches = repo.diff(@branch.merge_target) - p_result = Pronto::Runners.new.run(patches) - end + git_service = branch.git_service + merge_base = git_service.merge_base + pronto_repo = Pronto::Git::Repository.new(repo.path.to_s) + pronto_patches = Pronto::Git::Patches.new(pronto_repo, merge_base, git_service.diff.raw_diff) - p_result + Pronto::Runners.new.run(pronto_patches) end def run_all_linters From 15428a13aaac1c7ec3640385108c41b91f40e62e Mon Sep 17 00:00:00 2001 From: Nick LaMuro Date: Tue, 8 Sep 2020 19:18:12 -0500 Subject: [PATCH 6/8] [CodeAnalysisMixin] Handle Rubocop errors This pulls back in some deleted code to handle errors with the Rubocop linter (but sets up a pattern for it moving forward). --- app/workers/concerns/code_analysis_mixin.rb | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/app/workers/concerns/code_analysis_mixin.rb b/app/workers/concerns/code_analysis_mixin.rb index a76c387d..ddc16f4f 100644 --- a/app/workers/concerns/code_analysis_mixin.rb +++ b/app/workers/concerns/code_analysis_mixin.rb @@ -68,5 +68,31 @@ def run_all_linters output end + rescue RuboCop::ValidationError => error + [failed_linter_offenses("#{self.class.name} STDERR:\n```\n#{error.message}\n```")] + end + + def failed_linter_offenses(message) + git_service = branch.git_service + files_to_lint = branch.pull_request? ? git_service.diff.new_files : git_service.tip_files + { + "files" => [ + { + "path" => "\\*\\*", + "offenses" => [ + { + "severity" => "fatal", + "message" => message, + "cop_name" => self.class.name.titleize + } + ] + } + ], + "summary" => { + "offense_count" => 1, + "target_file_count" => files_to_lint.length, + "inspected_file_count" => files_to_lint.length + } + } end end From 8c70bca47de612fafea552a644c04d6ae2f287af Mon Sep 17 00:00:00 2001 From: Nick LaMuro Date: Thu, 10 Sep 2020 20:54:50 -0500 Subject: [PATCH 7/8] [TESTING] Add manageiq-style Our configs for manageiq-ui-classic (which I am using for testing) require newer versions of Rubocop configs to function, so to facilitate the, I have included `manageiq-style` into this repo for testing this PR. Might be required moving forward, but this is just for testing for now. --- Gemfile | 1 + Gemfile.lock | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/Gemfile b/Gemfile index 6a1bb7d9..d91ea537 100644 --- a/Gemfile +++ b/Gemfile @@ -41,6 +41,7 @@ gem 'default_value_for', '>= 3.1.0' gem 'haml', '~> 5.1', :require => false # force newer version of haml gem 'haml_lint', '~> 0.35.0', :require => false gem 'more_core_extensions', '~> 4.0.0', :require => 'more_core_extensions/all' +gem 'manageiq-style', :require => false gem 'rubocop', '~> 0.82.0', :require => false gem 'rubocop-performance', :require => false gem 'rubocop-rails', :require => false diff --git a/Gemfile.lock b/Gemfile.lock index b9727db2..5a0463cf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -196,6 +196,12 @@ GEM nokogiri (>= 1.5.9) mail (2.7.1) mini_mime (>= 0.1.1) + manageiq-style (1.1.0) + more_core_extensions + optimist + rubocop (~> 0.82.0) + rubocop-performance + rubocop-rails marcel (0.3.3) mimemagic (~> 0.3.2) method_source (0.9.2) @@ -222,6 +228,7 @@ GEM mini_portile2 (~> 2.4.0) octokit (4.8.0) sawyer (~> 0.8.0, >= 0.5.3) + optimist (3.0.1) parallel (1.19.1) parser (2.7.1.3) ast (~> 2.4.0) @@ -442,6 +449,7 @@ DEPENDENCIES influxdb (~> 0.3.13) jquery-rails listen + manageiq-style minigit (~> 0.0.4) more_core_extensions (~> 4.0.0) net-ssh (~> 4.2.0) From 5331ffcfefd6ed681d5c0dffd0cf9f5ecf5016e2 Mon Sep 17 00:00:00 2001 From: Nick LaMuro Date: Thu, 10 Sep 2020 20:57:03 -0500 Subject: [PATCH 8/8] [WIP] Use up to date linter configs Right now, what ever is on the "fetched master" for the linter configs will be what is used by Pronto, and not what is up to date with the branch being checked against. This "attempts" to generate a config based on the git blob for the branch we are checking, but it is still not quite working. --- app/workers/concerns/code_analysis_mixin.rb | 54 +++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/app/workers/concerns/code_analysis_mixin.rb b/app/workers/concerns/code_analysis_mixin.rb index ddc16f4f..fb27c4f4 100644 --- a/app/workers/concerns/code_analysis_mixin.rb +++ b/app/workers/concerns/code_analysis_mixin.rb @@ -5,6 +5,8 @@ require 'pronto/git/patch' require 'pronto/git/line' +require 'tempfile' + require 'fileutils' require 'tmpdir' @@ -33,6 +35,7 @@ def pronto_result Pronto::GemNames.new.to_a.each { |gem_name| require "pronto/#{gem_name}" } branch.repo.git_fetch + generate_linter_configs git_service = branch.git_service merge_base = git_service.merge_base @@ -42,6 +45,55 @@ def pronto_result Pronto::Runners.new.run(pronto_patches) end + # configs in the repo itself most likely will be invalid as the what the + # `MinigitService` has checked out in `.repos/` probably isn't the same SHA + # as what we are working with. + # + # Any specifics per linter that need to be adjusted need to be done here, but + # RuboCop might be the only one that is necessary for now. + # + def generate_linter_configs + # Ensure any tempfiles created here are kept around through + # `.run_all_linters`, and will be unlinked there. + @config_tempfiles = [] + + # This is config option found in the `proto-rubocop` plugin README: + # + # > You can also specify a custom .rubocop.yml location with the + # > environment variable RUBOCOP_CONFIG. + # + git_service = branch.git_service + rubocop_config_contents = git_service.content_at(".rubocop.yml") + yamllint_config_contents = git_service.content_at(".yamllint") + + if rubocop_config_contents + rubocop_yaml_data = YAML.load(rubocop_config_contents) + (rubocop_yaml_data.delete("inherit_from") || []).each do |local_config_path| + next unless inherit_from_data = git_service.content_at(local_config_path) + + rubocop_yaml_data["inherit_from"] ||= [] + rubocop_yaml_data["inherit_from"] << generate_temp_config(local_config_path, inherit_from_data) + end + + ENV["RUBOCOP_CONFIG"] = generate_temp_config(".rubocop.yml", rubocop_yaml_data.to_yaml) + end + + if yamllint_config_contents + yamllint_config_path = generate_temp_config(".yamllint", yamllint_config_contents) + ENV["YAMLLINT_OPTS"] = "-c #{yamllint_config_path}" + end + end + + def generate_temp_config(config_filepath, file_contents) + temp_config = Tempfile.new(config_filepath) + temp_config.write file_contents + temp_config.close + + @config_tempfiles << temp_config + + temp_config.path + end + def run_all_linters pronto_result.group_by(&:runner).values.map do |linted| # group by linter output = {} @@ -70,6 +122,8 @@ def run_all_linters end rescue RuboCop::ValidationError => error [failed_linter_offenses("#{self.class.name} STDERR:\n```\n#{error.message}\n```")] + ensure + @config_tempfiles.each(&:unlink) end def failed_linter_offenses(message)