From 8510656e970215b2c3941c4edbdc8ffcc4688f14 Mon Sep 17 00:00:00 2001 From: Manuel Puyol Date: Fri, 2 Jul 2021 14:56:36 -0500 Subject: [PATCH 1/5] add JSON formatter --- lib/erb_lint/reporters/json_reporter.rb | 72 ++++++++++++++ spec/erb_lint/reporters/json_reporter_spec.rb | 96 +++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 lib/erb_lint/reporters/json_reporter.rb create mode 100644 spec/erb_lint/reporters/json_reporter_spec.rb diff --git a/lib/erb_lint/reporters/json_reporter.rb b/lib/erb_lint/reporters/json_reporter.rb new file mode 100644 index 00000000..da5bde42 --- /dev/null +++ b/lib/erb_lint/reporters/json_reporter.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require "json" + +module ERBLint + module Reporters + class JsonReporter < Reporter + def preview; end + + def show + puts formatted_data + end + + private + + def formatted_data + { + metadata: metadata, + files: formatted_files, + summary: summary, + }.to_json + end + + def metadata + { + erb_lint_version: ERBLint::VERSION, + ruby_engine: RUBY_ENGINE, + ruby_version: RUBY_VERSION, + ruby_patchlevel: RUBY_PATCHLEVEL.to_s, + ruby_platform: RUBY_PLATFORM, + } + end + + def summary + { + offenses: stats.found, + inspected_files: stats.processed_files.size, + corrected: stats.corrected, + } + end + + def formatted_files + processed_files.map do |filename, offenses| + { + path: filename, + offenses: formatted_offenses(offenses), + } + end + end + + def formatted_offenses(offenses) + offenses.map do |offense| + format_offense(offense) + end + end + + def format_offense(offense) + { + cop_name: offense.linter.class.simple_name, + message: offense.message.to_s, + location: { + start_line: offense.line_number, + start_column: offense.column, + last_line: offense.source_range.last_line, + last_column: offense.source_range.last_column, + length: offense.source_range.length, + }, + } + end + end + end +end diff --git a/spec/erb_lint/reporters/json_reporter_spec.rb b/spec/erb_lint/reporters/json_reporter_spec.rb new file mode 100644 index 00000000..fbd0aea0 --- /dev/null +++ b/spec/erb_lint/reporters/json_reporter_spec.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe ERBLint::Reporters::JsonReporter do + describe '.show' do + subject { described_class.new(stats, false).show } + + let(:stats) do + ERBLint::Stats.new( + found: 2, + processed_files: { + 'app/views/subscriptions/_loader.html.erb' => offenses, + }, + corrected: 1 + ) + end + + let(:offenses) do + [ + instance_double( + ERBLint::Offense, + message: 'Extra space detected where there should be no space.', + line_number: 1, + column: 7, + source_range: instance_double( + BetterHtml::Tokenizer::Location, + last_line: 1, + last_column: 9, + length: 2, + ), + linter: ERBLint::Linters::SpaceInHtmlTag.new(nil, ERBLint::LinterConfig.new), + ), + instance_double( + ERBLint::Offense, + message: 'Remove newline before `%>` to match start of tag.', + line_number: 52, + column: 10, + source_range: instance_double( + BetterHtml::Tokenizer::Location, + last_line: 54, + last_column: 10, + length: 10, + ), + linter: ERBLint::Linters::ClosingErbTagIndent.new(nil, ERBLint::LinterConfig.new), + ), + ] + end + + let(:expected_hash) do + { + metadata: { + erb_lint_version: ERBLint::VERSION, + ruby_engine: RUBY_ENGINE, + ruby_version: RUBY_VERSION, + ruby_patchlevel: RUBY_PATCHLEVEL.to_s, + ruby_platform: RUBY_PLATFORM, + }, + files: [{ + path: 'app/views/subscriptions/_loader.html.erb', + offenses: [{ + cop_name: 'SpaceInHtmlTag', + message: 'Extra space detected where there should be no space.', + location: { + start_line: 1, + start_column: 7, + last_line: 1, + last_column: 9, + length: 2, + }, + }, + { + cop_name: 'ClosingErbTagIndent', + message: 'Remove newline before `%>` to match start of tag.', + location: { + start_line: 52, + start_column: 10, + last_line: 54, + last_column: 10, + length: 10, + }, + }], + }], + summary: { + offenses: 2, + inspected_files: 1, + corrected: 1 + }, + } + end + + it 'displays formatted offenses output' do + expect { subject }.to(output(expected_hash.to_json + "\n").to_stdout) + end + end +end From b13e67ae17844115d3cd4e9f0e0a68a42474c36b Mon Sep 17 00:00:00 2001 From: Manuel Puyol Date: Fri, 2 Jul 2021 15:00:46 -0500 Subject: [PATCH 2/5] add json to format output --- spec/erb_lint/cli_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/erb_lint/cli_spec.rb b/spec/erb_lint/cli_spec.rb index b9e3404c..281f7136 100644 --- a/spec/erb_lint/cli_spec.rb +++ b/spec/erb_lint/cli_spec.rb @@ -76,7 +76,7 @@ def run(_processed_source) it 'shows format instructions' do expect { subject }.to( - output(/Report offenses in the given format: \(compact, multiline\) \(default: multiline\)/).to_stdout + output(/Report offenses in the given format: \(compact, json, multiline\) \(default: multiline\)/).to_stdout ) end @@ -319,6 +319,7 @@ def run(_processed_source) expect { subject }.to(output(Regexp.new(Regexp.escape(<<~EOF.strip))).to_stderr) nonexistentformat: is not a valid format. Available formats: - compact + - json - multiline EOF end From 13a255a48401bd57307ca29191b5f8370a882fa4 Mon Sep 17 00:00:00 2001 From: Manuel Puyol Date: Fri, 2 Jul 2021 15:02:51 -0500 Subject: [PATCH 3/5] lint json spec --- spec/erb_lint/reporters/json_reporter_spec.rb | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/spec/erb_lint/reporters/json_reporter_spec.rb b/spec/erb_lint/reporters/json_reporter_spec.rb index fbd0aea0..777cc9af 100644 --- a/spec/erb_lint/reporters/json_reporter_spec.rb +++ b/spec/erb_lint/reporters/json_reporter_spec.rb @@ -69,22 +69,22 @@ length: 2, }, }, - { - cop_name: 'ClosingErbTagIndent', - message: 'Remove newline before `%>` to match start of tag.', - location: { - start_line: 52, - start_column: 10, - last_line: 54, - last_column: 10, - length: 10, - }, - }], + { + cop_name: 'ClosingErbTagIndent', + message: 'Remove newline before `%>` to match start of tag.', + location: { + start_line: 52, + start_column: 10, + last_line: 54, + last_column: 10, + length: 10, + }, + }], }], summary: { offenses: 2, inspected_files: 1, - corrected: 1 + corrected: 1, }, } end From cdb73dcf3ea6ee0e1cf9003579e3a092a9d03be3 Mon Sep 17 00:00:00 2001 From: Manuel Puyol Date: Fri, 2 Jul 2021 15:04:56 -0500 Subject: [PATCH 4/5] change cop_name to linter --- lib/erb_lint/reporters/json_reporter.rb | 2 +- spec/erb_lint/reporters/json_reporter_spec.rb | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/erb_lint/reporters/json_reporter.rb b/lib/erb_lint/reporters/json_reporter.rb index da5bde42..c3f937f2 100644 --- a/lib/erb_lint/reporters/json_reporter.rb +++ b/lib/erb_lint/reporters/json_reporter.rb @@ -56,7 +56,7 @@ def formatted_offenses(offenses) def format_offense(offense) { - cop_name: offense.linter.class.simple_name, + linter: offense.linter.class.simple_name, message: offense.message.to_s, location: { start_line: offense.line_number, diff --git a/spec/erb_lint/reporters/json_reporter_spec.rb b/spec/erb_lint/reporters/json_reporter_spec.rb index 777cc9af..927aec06 100644 --- a/spec/erb_lint/reporters/json_reporter_spec.rb +++ b/spec/erb_lint/reporters/json_reporter_spec.rb @@ -59,7 +59,7 @@ files: [{ path: 'app/views/subscriptions/_loader.html.erb', offenses: [{ - cop_name: 'SpaceInHtmlTag', + linter: 'SpaceInHtmlTag', message: 'Extra space detected where there should be no space.', location: { start_line: 1, @@ -69,17 +69,17 @@ length: 2, }, }, - { - cop_name: 'ClosingErbTagIndent', - message: 'Remove newline before `%>` to match start of tag.', - location: { - start_line: 52, - start_column: 10, - last_line: 54, - last_column: 10, - length: 10, - }, - }], + { + linter: 'ClosingErbTagIndent', + message: 'Remove newline before `%>` to match start of tag.', + location: { + start_line: 52, + start_column: 10, + last_line: 54, + last_column: 10, + length: 10, + }, + }], }], summary: { offenses: 2, From 10701ace19db2c998410227b76d16b46f0b6651b Mon Sep 17 00:00:00 2001 From: Manuel Puyol Date: Tue, 20 Jul 2021 16:29:00 -0500 Subject: [PATCH 5/5] lint --- spec/erb_lint/reporters/json_reporter_spec.rb | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/spec/erb_lint/reporters/json_reporter_spec.rb b/spec/erb_lint/reporters/json_reporter_spec.rb index 927aec06..e9e84a42 100644 --- a/spec/erb_lint/reporters/json_reporter_spec.rb +++ b/spec/erb_lint/reporters/json_reporter_spec.rb @@ -58,28 +58,30 @@ }, files: [{ path: 'app/views/subscriptions/_loader.html.erb', - offenses: [{ - linter: 'SpaceInHtmlTag', - message: 'Extra space detected where there should be no space.', - location: { - start_line: 1, - start_column: 7, - last_line: 1, - last_column: 9, - length: 2, + offenses: [ + { + linter: 'SpaceInHtmlTag', + message: 'Extra space detected where there should be no space.', + location: { + start_line: 1, + start_column: 7, + last_line: 1, + last_column: 9, + length: 2, + }, }, - }, - { - linter: 'ClosingErbTagIndent', - message: 'Remove newline before `%>` to match start of tag.', - location: { - start_line: 52, - start_column: 10, - last_line: 54, - last_column: 10, - length: 10, + { + linter: 'ClosingErbTagIndent', + message: 'Remove newline before `%>` to match start of tag.', + location: { + start_line: 52, + start_column: 10, + last_line: 54, + last_column: 10, + length: 10, + }, }, - }], + ], }], summary: { offenses: 2,