From 3fe240222ef678795e0ae7d83e38a4142774c0e6 Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Fri, 4 Feb 2022 10:58:30 -0800 Subject: [PATCH 01/31] Allow rule to be disabled by comment This commit introduces a `run_and_clear_ignored_offenses` method which filters out offenses which may include a comment in the format ``` <%# erblint:disable #{offense.linter.simple_class_name} %> ``` as either part of the offending lines, or as a comment in the previous line. --- lib/erb_lint/linter.rb | 14 ++++++++++++++ lib/erb_lint/runner.rb | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index 3d452c90..9458d6e2 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -53,6 +53,20 @@ def run(_processed_source) raise NotImplementedError, "must implement ##{__method__}" end + def clear_ignored_offenses(_processed_source) + @offenses = @offenses.reject do |offense| + source_range = offense.source_range + offending_lines = _processed_source.source_buffer.slice(source_range.range) + previous_line = _processed_source.source_buffer.source_lines[offense.source_range.line_range.first - 2] + offending_lines.match(/<%# erblint:disable #{offense.linter.simple_name} %>/) || previous_line.match(/<%# erblint:disable #{offense.linter.simple_name} %>/) + end + end + + def run_and_clear_ignored_offenses(_processed_source) + run(_processed_source) + clear_ignored_offenses(_processed_source) if @offenses.any? + end + def add_offense(source_range, message, context = nil, severity = nil) @offenses << Offense.new(self, source_range, message, context, severity) end diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index f769f25a..17e532f3 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -21,7 +21,7 @@ def run(processed_source) @linters .reject { |linter| linter.excludes_file?(processed_source.filename) } .each do |linter| - linter.run(processed_source) + linter.run_and_clear_ignored_offenses(processed_source) @offenses.concat(linter.offenses) end end From dfc78e259dd44be4a50d4eda1656beeef577aac4 Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Fri, 4 Feb 2022 12:08:59 -0800 Subject: [PATCH 02/31] use lines instead of source range --- lib/erb_lint/linter.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index 9458d6e2..b3b860c8 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -55,10 +55,10 @@ def run(_processed_source) def clear_ignored_offenses(_processed_source) @offenses = @offenses.reject do |offense| - source_range = offense.source_range - offending_lines = _processed_source.source_buffer.slice(source_range.range) - previous_line = _processed_source.source_buffer.source_lines[offense.source_range.line_range.first - 2] - offending_lines.match(/<%# erblint:disable #{offense.linter.simple_name} %>/) || previous_line.match(/<%# erblint:disable #{offense.linter.simple_name} %>/) + offending_line_ranges = offense.source_range.line_range + offending_lines = _processed_source.source_buffer.source_lines[offending_line_ranges.first - 1..offending_line_ranges.last - 1].join + previous_line = _processed_source.source_buffer.source_lines[offending_line_ranges.first - 2] + offending_lines.match(/<%# erblint:disable #{offense.linter.class.simple_name} %>/) || previous_line.match(/<%# erblint:disable #{offense.linter.class.simple_name} %>/) end end From 521d9234f275c119591142f28bf8b5b575f23cca Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Fri, 4 Feb 2022 17:45:45 -0800 Subject: [PATCH 03/31] add support for no_unused_disable linter This commit adds support for the no_unused_disable linter. This can be configured in `erb-lint.yml`. If there are any unnecessary disable statements, these will be reported. This is a special linter that must run after all other linters. --- lib/erb_lint/linter.rb | 17 ++++++---- lib/erb_lint/linters/no_unused_disable.rb | 39 +++++++++++++++++++++++ lib/erb_lint/offense.rb | 9 ++++++ lib/erb_lint/runner.rb | 15 +++++++-- 4 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 lib/erb_lint/linters/no_unused_disable.rb diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index b3b860c8..58f1c4c1 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +# frozen_string_literal: true module ERBLint # Defines common functionality available to all linters. @@ -53,18 +54,20 @@ def run(_processed_source) raise NotImplementedError, "must implement ##{__method__}" end - def clear_ignored_offenses(_processed_source) - @offenses = @offenses.reject do |offense| + def set_offense_status(processed_source) + @offenses = @offenses.each do |offense| offending_line_ranges = offense.source_range.line_range - offending_lines = _processed_source.source_buffer.source_lines[offending_line_ranges.first - 1..offending_line_ranges.last - 1].join - previous_line = _processed_source.source_buffer.source_lines[offending_line_ranges.first - 2] - offending_lines.match(/<%# erblint:disable #{offense.linter.class.simple_name} %>/) || previous_line.match(/<%# erblint:disable #{offense.linter.class.simple_name} %>/) + offending_lines = processed_source.source_buffer.source_lines[offending_line_ranges.first - 1..offending_line_ranges.last - 1].join + previous_line = processed_source.source_buffer.source_lines[offense.source_range.line_range.first - 2] + if offending_lines.match(/<%# erblint:disable #{offense.linter.class.simple_name} %>/) || previous_line.match(/<%# erblint:disable #{offense.linter.class.simple_name} %>/) + offense.disabled = true + end end end - def run_and_clear_ignored_offenses(_processed_source) + def run_and_set_offense_status(_processed_source) run(_processed_source) - clear_ignored_offenses(_processed_source) if @offenses.any? + set_offense_status(_processed_source) if @offenses.any? end def add_offense(source_range, message, context = nil, severity = nil) diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb new file mode 100644 index 00000000..15be56b0 --- /dev/null +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module ERBLint + module Linters + # Checks for unused disable comments. + class NoUnusedDisable < Linter + include LinterRegistry + + def run(processed_source, offenses) + disabled_rules_and_line_number = {} + + processed_source.source_buffer.source_lines.each_with_index do |line, index| + rule_disable = line.match(/<%# erblint:disable (?.*) %>/)&& line.match(/<%# erblint:disable (?.*) %>/).named_captures['rules'] + next unless rule_disable + rule_disable.split(',').each do |rule| + disabled_rules_and_line_number[rule] = (disabled_rules_and_line_number[rule] ||= []).push(index+1) + end + end + + offenses.each do |offense| + rule_name = offense.linter.class.simple_name + next unless line_numbers = disabled_rules_and_line_number[rule_name] + line_numbers = line_numbers.reject do |line_number| + if (offense.source_range.line_span.first-1..offense.source_range.line_span.last).include?(line_number) + disabled_rules_and_line_number[rule_name].delete(line_number) + end + end + end + + disabled_rules_and_line_number.each do |rule, line_numbers| + line_numbers.each do |line_number| + add_offense(processed_source.source_buffer.line_range(line_number), "Unused erblint:disable comment for #{rule}") + end + end + end + end + end + end + \ No newline at end of file diff --git a/lib/erb_lint/offense.rb b/lib/erb_lint/offense.rb index 5c8db6b7..91d1bce5 100644 --- a/lib/erb_lint/offense.rb +++ b/lib/erb_lint/offense.rb @@ -15,6 +15,7 @@ def initialize(linter, source_range, message, context = nil, severity = nil) @message = message @context = context @severity = severity + @disabled = false end def to_cached_offense_hash @@ -44,6 +45,14 @@ def line_number line_range.begin end + def disabled=(disabled) + @disabled = disabled + end + + def disabled? + @disabled + end + def column source_range.column end diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index 17e532f3..50547e15 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -10,7 +10,7 @@ def initialize(file_loader, config) @config = config || RunnerConfig.default raise ArgumentError, "expect `config` to be a RunnerConfig instance" unless @config.is_a?(RunnerConfig) - linter_classes = LinterRegistry.linters.select { |klass| @config.for_linter(klass).enabled? } + linter_classes = LinterRegistry.linters.select { |klass| @config.for_linter(klass).enabled? && klass != ERBLint::Linters::NoUnusedDisable } @linters = linter_classes.map do |linter_class| linter_class.new(@file_loader, @config.for_linter(linter_class)) end @@ -21,14 +21,25 @@ def run(processed_source) @linters .reject { |linter| linter.excludes_file?(processed_source.filename) } .each do |linter| - linter.run_and_clear_ignored_offenses(processed_source) + linter.run_and_set_offense_status(processed_source) @offenses.concat(linter.offenses) end + report_unused_disable(processed_source) + @offenses = @offenses.reject(&:disabled?) + end + + def report_unused_disable(processed_source) + if LinterRegistry.linters.include?(ERBLint::Linters::NoUnusedDisable) && @config.for_linter(ERBLint::Linters::NoUnusedDisable).enabled? + @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new(@file_loader, @config.for_linter(ERBLint::Linters::NoUnusedDisable)) + @no_unused_disable.run(processed_source, @offenses) + @offenses.concat(@no_unused_disable.offenses) + end end def clear_offenses @offenses = [] @linters.each(&:clear_offenses) + @no_unused_disable.clear_offenses if @no_unused_disable end def restore_offenses(offenses) From 36cb98773213f1d4bc4a945ebc468798fbd5ff1a Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Sat, 5 Feb 2022 11:13:15 -0800 Subject: [PATCH 04/31] Add specs --- spec/erb_lint/runner_spec.rb | 109 ++++++++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 2 deletions(-) diff --git a/spec/erb_lint/runner_spec.rb b/spec/erb_lint/runner_spec.rb index 601ff535..c0ac3441 100644 --- a/spec/erb_lint/runner_spec.rb +++ b/spec/erb_lint/runner_spec.rb @@ -20,16 +20,26 @@ def run(processed_source) add_offense(processed_source.to_source_range(1..1), "#{self.class.name} error") end end - class FakeLinter2 < FakeLinter1; end end end + let(:file_loader) { ERBLint::FileLoader.new(".") } + let(:runner) { described_class.new(file_loader, config) } + + describe "#run" do + before do + allow(ERBLint::LinterRegistry).to(receive(:linters) + .and_return([ERBLint::Linters::FakeLinter1, + ERBLint::Linters::FakeLinter2, + ERBLint::Linters::FinalNewline,])) + runner.run(processed_source) + end + let(:file) { "DummyFileContent" } let(:filename) { "/root/directory/somefolder/otherfolder/dummyfile.html.erb" } let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } - before { runner.run(processed_source) } subject { runner.offenses } context "when all linters are enabled" do @@ -132,4 +142,99 @@ class FakeLinter2 < FakeLinter1; end end end end + + describe "#run with disabled comments" do + module ERBLint + module Linters + class FakeLinter3 < Linter + def run(processed_source) + second_line_range = processed_source.source_buffer.line_range(2).to_range # reports second line of file + add_offense(processed_source.to_source_range(second_line_range), "#{self.class.name} error") + end + end + + class FakeLinter4 < FakeLinter3; end + end + end + + before do + allow(ERBLint::LinterRegistry).to(receive(:linters) + .and_return([ERBLint::Linters::FakeLinter2, + ERBLint::Linters::FakeLinter3, + ERBLint::Linters::FakeLinter4])) + runner.run(processed_source) + end + subject { runner.offenses } + + let(:config) do + ERBLint::RunnerConfig.new( + linters: { + "FakeLinter2" => { "enabled" => true }, + "FakeLinter3" => { "enabled" => true }, + "FakeLinter4" => { "enabled" => true } + } + ) + end + + context "comment after offending lines" do + let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } + let(:file) { <<~FILE } +
something
+ bad content + <%# erblint:disable FakeLinter3 %> + FILE + let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } + + it 'reports all offenses' do + expect(subject.size).to(eq(3)) + expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) + expect(subject[1].linter.class).to(eq(ERBLint::Linters::FakeLinter3)) + expect(subject[2].linter.class).to(eq(ERBLint::Linters::FakeLinter4)) + end + end + + context "comment on offending lines" do + let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } + let(:file) { <<~FILE } +
something
+ bad content<%# erblint:disable FakeLinter3 %> + FILE + let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } + + it 'does not report offense' do + expect(subject.size).to(eq(2)) + expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) + expect(subject[1].linter.class).to(eq(ERBLint::Linters::FakeLinter4)) + end + end + + context "comment before offending lines" do + let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } + let(:file) { <<~FILE } + <%# erblint:disable FakeLinter3 %> + bad content + FILE + let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } + + it 'does not report offense' do + expect(subject.size).to(eq(2)) + expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) + expect(subject[1].linter.class).to(eq(ERBLint::Linters::FakeLinter4)) + end + end + + context "comment for multiple rules" do + let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } + let(:file) { <<~FILE } + <%# erblint:disable FakeLinter3, FakeLinter4 %> + bad content + FILE + let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } + + it 'does not report offense', focus: true do + expect(subject.size).to(eq(1)) + expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) + end + end + end end From 0af4d51c107d2314297bce03d6c4b141f631ff49 Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Sat, 5 Feb 2022 11:13:40 -0800 Subject: [PATCH 05/31] update linter so tests pass --- lib/erb_lint/linter.rb | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index 58f1c4c1..581520c2 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -1,5 +1,4 @@ # frozen_string_literal: true -# frozen_string_literal: true module ERBLint # Defines common functionality available to all linters. @@ -56,15 +55,24 @@ def run(_processed_source) def set_offense_status(processed_source) @offenses = @offenses.each do |offense| - offending_line_ranges = offense.source_range.line_range - offending_lines = processed_source.source_buffer.source_lines[offending_line_ranges.first - 1..offending_line_ranges.last - 1].join - previous_line = processed_source.source_buffer.source_lines[offense.source_range.line_range.first - 2] - if offending_lines.match(/<%# erblint:disable #{offense.linter.class.simple_name} %>/) || previous_line.match(/<%# erblint:disable #{offense.linter.class.simple_name} %>/) + offense_line_range = offense.source_range.line_range + offense_lines = source_for_line_range(processed_source, offense_line_range) + previous_line = processed_source.source_buffer.source_lines[offense_line_range.first - 2] + + if rule_disable_comment?(offense_lines) || rule_disable_comment?(previous_line) offense.disabled = true end end end + def source_for_line_range(processed_source, line_range) + processed_source.source_buffer.source_lines[line_range.first - 1..line_range.last - 1].join + end + + def rule_disable_comment?(lines) + lines.match(/<%# erblint:disable (?.*#{self.class.simple_name}).*%>/).present? + end + def run_and_set_offense_status(_processed_source) run(_processed_source) set_offense_status(_processed_source) if @offenses.any? From 80bfed6dea4e87cf09f3ad922289957a62b80d35 Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Sun, 6 Feb 2022 19:08:53 -0800 Subject: [PATCH 06/31] add test for no_unused_disable --- .../linters/no_unused_disable_spec.rb | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 spec/erb_lint/linters/no_unused_disable_spec.rb diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb new file mode 100644 index 00000000..a60af651 --- /dev/null +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe ERBLint::Linters::NoUnusedDisable do + let(:linter_config) { described_class.config_schema.new } + + let(:file_loader) { ERBLint::FileLoader.new(".") } + let(:linter) { described_class.new(file_loader, linter_config) } + let(:processed_source) { ERBLint::ProcessedSource.new("file.rb", file) } + let(:offenses) { linter.offenses } + + module ERBLint + module Linters + class Fake < ERBLint::Linter + attr_accessor :offenses + end + end + end + + describe "offenses" do + subject { offenses } + context "when file has unused disable comment" do + let(:file) { "<%# erblint:disable Fake %>" } + before { linter.run(processed_source, []) } + it do + expect(subject.size).to(eq(1)) + expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) + end + end + + context "when file has a disable comment and a corresponding offense" do + let(:file) { "<%# erblint:disable Fake %>" } + before do + offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), + processed_source.to_source_range(1..6), "some fake linter message") + offense.disabled = true + linter.run(processed_source, [offense]) + end + + it "does not report anything" do + expect(subject.size).to(eq(0)) + end + end + + context "when file has disable comment for two rules" do + let(:file) { "<%# erblint:disable Fake, Fake2 %>" } + before do + offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), + processed_source.to_source_range(1..6), "some fake linter message") + offense.disabled = true + linter.run(processed_source, [offense]) + end + + it "reports the unused rule" do + expect(subject.size).to(eq(1)) + expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake2")) + end + end + end +end From 7274bd8743e9c74608290d603b231845aa296166 Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Sun, 6 Feb 2022 19:09:07 -0800 Subject: [PATCH 07/31] run rubocop and move to private methods --- lib/erb_lint/linter.rb | 34 +++++++------ lib/erb_lint/linters/no_unused_disable.rb | 59 ++++++++++++----------- lib/erb_lint/offense.rb | 4 +- lib/erb_lint/runner.rb | 28 ++++++++--- spec/erb_lint/runner_spec.rb | 28 +++++------ 5 files changed, 84 insertions(+), 69 deletions(-) diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index 581520c2..cd33bf36 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -53,12 +53,27 @@ def run(_processed_source) raise NotImplementedError, "must implement ##{__method__}" end - def set_offense_status(processed_source) + def run_and_update_offense_status(processed_source) + run(processed_source) + update_offense_status(processed_source) if @offenses.any? + end + + def add_offense(source_range, message, context = nil, severity = nil) + @offenses << Offense.new(self, source_range, message, context, severity) + end + + def clear_offenses + @offenses = [] + end + + private + + def update_offense_status(processed_source) @offenses = @offenses.each do |offense| offense_line_range = offense.source_range.line_range - offense_lines = source_for_line_range(processed_source, offense_line_range) + offense_lines = source_for_line_range(processed_source, offense_line_range) previous_line = processed_source.source_buffer.source_lines[offense_line_range.first - 2] - + if rule_disable_comment?(offense_lines) || rule_disable_comment?(previous_line) offense.disabled = true end @@ -72,18 +87,5 @@ def source_for_line_range(processed_source, line_range) def rule_disable_comment?(lines) lines.match(/<%# erblint:disable (?.*#{self.class.simple_name}).*%>/).present? end - - def run_and_set_offense_status(_processed_source) - run(_processed_source) - set_offense_status(_processed_source) if @offenses.any? - end - - def add_offense(source_range, message, context = nil, severity = nil) - @offenses << Offense.new(self, source_range, message, context, severity) - end - - def clear_offenses - @offenses = [] - end end end diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb index 15be56b0..1c22a843 100644 --- a/lib/erb_lint/linters/no_unused_disable.rb +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -1,39 +1,42 @@ # frozen_string_literal: true module ERBLint - module Linters - # Checks for unused disable comments. - class NoUnusedDisable < Linter - include LinterRegistry - - def run(processed_source, offenses) - disabled_rules_and_line_number = {} - - processed_source.source_buffer.source_lines.each_with_index do |line, index| - rule_disable = line.match(/<%# erblint:disable (?.*) %>/)&& line.match(/<%# erblint:disable (?.*) %>/).named_captures['rules'] - next unless rule_disable - rule_disable.split(',').each do |rule| - disabled_rules_and_line_number[rule] = (disabled_rules_and_line_number[rule] ||= []).push(index+1) - end + module Linters + # Checks for unused disable comments. + class NoUnusedDisable < Linter + include LinterRegistry + + def run(processed_source, offenses) + disabled_rules_and_line_number = {} + + processed_source.source_buffer.source_lines.each_with_index do |line, index| + rule_disable = line.match(/<%# erblint:disable (?.*) %>/) && + line.match(/<%# erblint:disable (?.*) %>/).named_captures["rules"] + next unless rule_disable + rule_disable.split(",").each do |rule| + disabled_rules_and_line_number[rule.strip] = + (disabled_rules_and_line_number[rule.strip] ||= []).push(index + 1) end - - offenses.each do |offense| - rule_name = offense.linter.class.simple_name - next unless line_numbers = disabled_rules_and_line_number[rule_name] - line_numbers = line_numbers.reject do |line_number| - if (offense.source_range.line_span.first-1..offense.source_range.line_span.last).include?(line_number) - disabled_rules_and_line_number[rule_name].delete(line_number) - end + end + + offenses.each do |offense| + rule_name = offense.linter.class.simple_name + line_numbers = disabled_rules_and_line_number[rule_name] + next unless line_numbers + line_numbers.reject do |line_number| + if (offense.source_range.line_span.first - 1..offense.source_range.line_span.last).include?(line_number) + disabled_rules_and_line_number[rule_name].delete(line_number) end end - - disabled_rules_and_line_number.each do |rule, line_numbers| - line_numbers.each do |line_number| - add_offense(processed_source.source_buffer.line_range(line_number), "Unused erblint:disable comment for #{rule}") - end + end + + disabled_rules_and_line_number.each do |rule, line_numbers| + line_numbers.each do |line_number| + add_offense(processed_source.source_buffer.line_range(line_number), + "Unused erblint:disable comment for #{rule}") end end end end end - \ No newline at end of file +end diff --git a/lib/erb_lint/offense.rb b/lib/erb_lint/offense.rb index 91d1bce5..07f9eef6 100644 --- a/lib/erb_lint/offense.rb +++ b/lib/erb_lint/offense.rb @@ -45,9 +45,7 @@ def line_number line_range.begin end - def disabled=(disabled) - @disabled = disabled - end + attr_writer :disabled def disabled? @disabled diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index 50547e15..7f9b4774 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -10,7 +10,9 @@ def initialize(file_loader, config) @config = config || RunnerConfig.default raise ArgumentError, "expect `config` to be a RunnerConfig instance" unless @config.is_a?(RunnerConfig) - linter_classes = LinterRegistry.linters.select { |klass| @config.for_linter(klass).enabled? && klass != ERBLint::Linters::NoUnusedDisable } + linter_classes = LinterRegistry.linters.select do |klass| + @config.for_linter(klass).enabled? && klass != ERBLint::Linters::NoUnusedDisable + end @linters = linter_classes.map do |linter_class| linter_class.new(@file_loader, @config.for_linter(linter_class)) end @@ -21,16 +23,30 @@ def run(processed_source) @linters .reject { |linter| linter.excludes_file?(processed_source.filename) } .each do |linter| - linter.run_and_set_offense_status(processed_source) + linter.run_and_update_offense_status(processed_source) @offenses.concat(linter.offenses) end report_unused_disable(processed_source) @offenses = @offenses.reject(&:disabled?) end + def clear_offenses + @offenses = [] + @linters.each(&:clear_offenses) + @no_unused_disable&.clear_offenses + end + + def restore_offenses(offenses) + @offenses.concat(offenses) + end + + private + def report_unused_disable(processed_source) - if LinterRegistry.linters.include?(ERBLint::Linters::NoUnusedDisable) && @config.for_linter(ERBLint::Linters::NoUnusedDisable).enabled? - @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new(@file_loader, @config.for_linter(ERBLint::Linters::NoUnusedDisable)) + if LinterRegistry.linters.include?(ERBLint::Linters::NoUnusedDisable) && + @config.for_linter(ERBLint::Linters::NoUnusedDisable).enabled? + @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new(@file_loader, + @config.for_linter(ERBLint::Linters::NoUnusedDisable)) @no_unused_disable.run(processed_source, @offenses) @offenses.concat(@no_unused_disable.offenses) end @@ -41,9 +57,5 @@ def clear_offenses @linters.each(&:clear_offenses) @no_unused_disable.clear_offenses if @no_unused_disable end - - def restore_offenses(offenses) - @offenses.concat(offenses) - end end end diff --git a/spec/erb_lint/runner_spec.rb b/spec/erb_lint/runner_spec.rb index c0ac3441..2e379837 100644 --- a/spec/erb_lint/runner_spec.rb +++ b/spec/erb_lint/runner_spec.rb @@ -20,13 +20,13 @@ def run(processed_source) add_offense(processed_source.to_source_range(1..1), "#{self.class.name} error") end end + class FakeLinter2 < FakeLinter1; end end end let(:file_loader) { ERBLint::FileLoader.new(".") } - let(:runner) { described_class.new(file_loader, config) } - + let(:runner) { described_class.new(file_loader, config) } describe "#run" do before do @@ -36,7 +36,7 @@ class FakeLinter2 < FakeLinter1; end ERBLint::Linters::FinalNewline,])) runner.run(processed_source) end - + let(:file) { "DummyFileContent" } let(:filename) { "/root/directory/somefolder/otherfolder/dummyfile.html.erb" } let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } @@ -161,7 +161,7 @@ class FakeLinter4 < FakeLinter3; end allow(ERBLint::LinterRegistry).to(receive(:linters) .and_return([ERBLint::Linters::FakeLinter2, ERBLint::Linters::FakeLinter3, - ERBLint::Linters::FakeLinter4])) + ERBLint::Linters::FakeLinter4,])) runner.run(processed_source) end subject { runner.offenses } @@ -171,12 +171,12 @@ class FakeLinter4 < FakeLinter3; end linters: { "FakeLinter2" => { "enabled" => true }, "FakeLinter3" => { "enabled" => true }, - "FakeLinter4" => { "enabled" => true } + "FakeLinter4" => { "enabled" => true }, } ) end - - context "comment after offending lines" do + + context "comment after offending lines" do let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE }
something
@@ -185,7 +185,7 @@ class FakeLinter4 < FakeLinter3; end FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } - it 'reports all offenses' do + it "reports all offenses" do expect(subject.size).to(eq(3)) expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) expect(subject[1].linter.class).to(eq(ERBLint::Linters::FakeLinter3)) @@ -193,7 +193,7 @@ class FakeLinter4 < FakeLinter3; end end end - context "comment on offending lines" do + context "comment on offending lines" do let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE }
something
@@ -201,14 +201,14 @@ class FakeLinter4 < FakeLinter3; end FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } - it 'does not report offense' do + it "does not report offense" do expect(subject.size).to(eq(2)) expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) expect(subject[1].linter.class).to(eq(ERBLint::Linters::FakeLinter4)) end end - context "comment before offending lines" do + context "comment before offending lines" do let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE } <%# erblint:disable FakeLinter3 %> @@ -216,14 +216,14 @@ class FakeLinter4 < FakeLinter3; end FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } - it 'does not report offense' do + it "does not report offense" do expect(subject.size).to(eq(2)) expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) expect(subject[1].linter.class).to(eq(ERBLint::Linters::FakeLinter4)) end end - context "comment for multiple rules" do + context "comment for multiple rules" do let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE } <%# erblint:disable FakeLinter3, FakeLinter4 %> @@ -231,7 +231,7 @@ class FakeLinter4 < FakeLinter3; end FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } - it 'does not report offense', focus: true do + it "does not report offense", focus: true do expect(subject.size).to(eq(1)) expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) end From f32e7fe725ccf7bff4eab51d52610d6e4d5e53db Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Wed, 2 Mar 2022 19:55:26 -0800 Subject: [PATCH 08/31] clean up no_unused_disable and add additional test --- lib/erb_lint/linters/no_unused_disable.rb | 9 +++++-- .../linters/no_unused_disable_spec.rb | 24 ++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb index 1c22a843..dc60e192 100644 --- a/lib/erb_lint/linters/no_unused_disable.rb +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -10,8 +10,7 @@ def run(processed_source, offenses) disabled_rules_and_line_number = {} processed_source.source_buffer.source_lines.each_with_index do |line, index| - rule_disable = line.match(/<%# erblint:disable (?.*) %>/) && - line.match(/<%# erblint:disable (?.*) %>/).named_captures["rules"] + rule_disable = disable_comment(line) next unless rule_disable rule_disable.split(",").each do |rule| disabled_rules_and_line_number[rule.strip] = @@ -37,6 +36,12 @@ def run(processed_source, offenses) end end end + + private + + def disable_comment(line) + line.match(/<%# erblint:disable (?.*) %>/)&.named_captures&.fetch("rules") + end end end end diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index a60af651..02d38f3b 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -43,7 +43,7 @@ class Fake < ERBLint::Linter end end - context "when file has disable comment for two rules" do + context "when file has disable comment for multiple rules" do let(:file) { "<%# erblint:disable Fake, Fake2 %>" } before do offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), @@ -57,5 +57,27 @@ class Fake < ERBLint::Linter expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake2")) end end + + context "when file has multiple disable comments for one offense" do + let(:file) { <<~ERB } + <%# erblint:disable Fake %> + <%# erblint:disable Fake %> + ERB + before do + second_line_range = processed_source.source_buffer.line_range(2).to_range + offense = ERBLint::Offense.new( + ERBLint::Linters::Fake.new(file_loader, linter_config), + processed_source.to_source_range(second_line_range), + "some fake linter message" + ) + offense.disabled = true + linter.run(processed_source, [offense]) + end + + it "reports the unused rule" do + expect(subject.size).to(eq(1)) + expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) + end + end end end From bb56d0fa5225ef532bb8040ff3e31fba109686e0 Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Wed, 2 Mar 2022 19:55:42 -0800 Subject: [PATCH 09/31] update README --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 8ffe00cf..fced5c5c 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,22 @@ Make sure to add `**/` to exclude patterns; it matches the target files' absolut ## Enable or disable default linters `EnableDefaultLinters`: enables or disables default linters. [Default linters](#Linters) are enabled by default. +## Disable rule at offense-level +You can disable a rule by placing a disable comment in the following formats: + +1. Comment on offending lines +```.erb +
<%# erblint:disable SelfClosingTag %> +``` + +2. Comment on previous lines +```.erb +<%# erblint:disable SelfClosingTag %> +
+``` + +To raise an error when there is a useless disable comment, enable `NoUnusedDisable`. + ## Exclude You can specify the exclude patterns both of global and lint-local. From 1120eb5f56e202fc924ab48ec7ed238c3e792555 Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Wed, 16 Mar 2022 17:20:29 -0700 Subject: [PATCH 10/31] * Address review comments from @rafaelfranca --- lib/erb_lint/linter.rb | 4 ++-- lib/erb_lint/runner.rb | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index cd33bf36..f67fa3cc 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -69,7 +69,7 @@ def clear_offenses private def update_offense_status(processed_source) - @offenses = @offenses.each do |offense| + @offenses.each do |offense| offense_line_range = offense.source_range.line_range offense_lines = source_for_line_range(processed_source, offense_line_range) previous_line = processed_source.source_buffer.source_lines[offense_line_range.first - 2] @@ -85,7 +85,7 @@ def source_for_line_range(processed_source, line_range) end def rule_disable_comment?(lines) - lines.match(/<%# erblint:disable (?.*#{self.class.simple_name}).*%>/).present? + lines.match(/<%# erblint:disable (?.*#{self.class.simple_name}).*%>/) end end end diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index 7f9b4774..cab7b0f3 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -16,6 +16,7 @@ def initialize(file_loader, config) @linters = linter_classes.map do |linter_class| linter_class.new(@file_loader, @config.for_linter(linter_class)) end + @no_unused_disable = nil @offenses = [] end @@ -42,10 +43,15 @@ def restore_offenses(offenses) private - def report_unused_disable(processed_source) - if LinterRegistry.linters.include?(ERBLint::Linters::NoUnusedDisable) && + def no_unused_disable_enabled? + LinterRegistry.linters.include?(ERBLint::Linters::NoUnusedDisable) && @config.for_linter(ERBLint::Linters::NoUnusedDisable).enabled? - @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new(@file_loader, + end + + def report_unused_disable(processed_source) + if no_unused_disable_enabled? + @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new( + @file_loader, @config.for_linter(ERBLint::Linters::NoUnusedDisable)) @no_unused_disable.run(processed_source, @offenses) @offenses.concat(@no_unused_disable.offenses) From 8e15f069ce6cd0e0db159aa40dd79772310e21cf Mon Sep 17 00:00:00 2001 From: Kate Higa Date: Sun, 27 Mar 2022 13:37:15 -0700 Subject: [PATCH 11/31] * Only allow comment on offending lines --- README.md | 10 ++-------- lib/erb_lint/linter.rb | 3 +-- lib/erb_lint/linters/no_unused_disable.rb | 2 +- lib/erb_lint/runner.rb | 3 ++- .../linters/no_unused_disable_spec.rb | 18 ++++++++++++++++++ spec/erb_lint/runner_spec.rb | 19 ++----------------- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index fced5c5c..fd18e5dd 100644 --- a/README.md +++ b/README.md @@ -75,19 +75,13 @@ Make sure to add `**/` to exclude patterns; it matches the target files' absolut `EnableDefaultLinters`: enables or disables default linters. [Default linters](#Linters) are enabled by default. ## Disable rule at offense-level -You can disable a rule by placing a disable comment in the following formats: +You can disable a rule by placing a disable comment in the following format: -1. Comment on offending lines +Comment on offending lines ```.erb
<%# erblint:disable SelfClosingTag %> ``` -2. Comment on previous lines -```.erb -<%# erblint:disable SelfClosingTag %> -
-``` - To raise an error when there is a useless disable comment, enable `NoUnusedDisable`. ## Exclude diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index f67fa3cc..42a7b14f 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -72,9 +72,8 @@ def update_offense_status(processed_source) @offenses.each do |offense| offense_line_range = offense.source_range.line_range offense_lines = source_for_line_range(processed_source, offense_line_range) - previous_line = processed_source.source_buffer.source_lines[offense_line_range.first - 2] - if rule_disable_comment?(offense_lines) || rule_disable_comment?(previous_line) + if rule_disable_comment?(offense_lines) offense.disabled = true end end diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb index dc60e192..84c05d1b 100644 --- a/lib/erb_lint/linters/no_unused_disable.rb +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -23,7 +23,7 @@ def run(processed_source, offenses) line_numbers = disabled_rules_and_line_number[rule_name] next unless line_numbers line_numbers.reject do |line_number| - if (offense.source_range.line_span.first - 1..offense.source_range.line_span.last).include?(line_number) + if (offense.source_range.line_span.first..offense.source_range.line_span.last).include?(line_number) disabled_rules_and_line_number[rule_name].delete(line_number) end end diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index cab7b0f3..ec3cbaf9 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -52,7 +52,8 @@ def report_unused_disable(processed_source) if no_unused_disable_enabled? @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new( @file_loader, - @config.for_linter(ERBLint::Linters::NoUnusedDisable)) + @config.for_linter(ERBLint::Linters::NoUnusedDisable) + ) @no_unused_disable.run(processed_source, @offenses) @offenses.concat(@no_unused_disable.offenses) end diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index 02d38f3b..5979fefb 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -43,6 +43,24 @@ class Fake < ERBLint::Linter end end + context "when file has a disable comment in wrong place and a corresponding offense" do + let(:file) { <<~FILE } + <%# erblint:disable Fake %> + bad content + FILE + before do + offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), + processed_source.to_source_range(28..52), "some fake linter message") + offense.disabled = true + linter.run(processed_source, [offense]) + end + + it "reports the unused rule" do + expect(subject.size).to(eq(1)) + expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) + end + end + context "when file has disable comment for multiple rules" do let(:file) { "<%# erblint:disable Fake, Fake2 %>" } before do diff --git a/spec/erb_lint/runner_spec.rb b/spec/erb_lint/runner_spec.rb index 2e379837..ddb344fe 100644 --- a/spec/erb_lint/runner_spec.rb +++ b/spec/erb_lint/runner_spec.rb @@ -208,26 +208,11 @@ class FakeLinter4 < FakeLinter3; end end end - context "comment before offending lines" do - let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } - let(:file) { <<~FILE } - <%# erblint:disable FakeLinter3 %> - bad content - FILE - let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } - - it "does not report offense" do - expect(subject.size).to(eq(2)) - expect(subject[0].linter.class).to(eq(ERBLint::Linters::FakeLinter2)) - expect(subject[1].linter.class).to(eq(ERBLint::Linters::FakeLinter4)) - end - end - context "comment for multiple rules" do let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE } - <%# erblint:disable FakeLinter3, FakeLinter4 %> - bad content +
something
+ bad content <%# erblint:disable FakeLinter3, FakeLinter4 %> FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } From dc9c8d4ca4866197bb16bfe1cd7650c4c43ccd54 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 3 Mar 2023 09:51:39 -0500 Subject: [PATCH 12/31] * Add support for reporting that ignores inline comments --- lib/erb_lint/cli.rb | 7 ++++++- lib/erb_lint/linter.rb | 6 ++++-- lib/erb_lint/runner.rb | 11 ++++++++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/erb_lint/cli.rb b/lib/erb_lint/cli.rb index 6cb03395..be620d11 100644 --- a/lib/erb_lint/cli.rb +++ b/lib/erb_lint/cli.rb @@ -69,6 +69,7 @@ def run(args = ARGV) @options[:format] ||= :multiline @options[:fail_level] ||= severity_level_for_name(:refactor) + @options[:disable_inline_config] ||= false @stats.files = lint_files.size @stats.linters = enabled_linter_classes.size @stats.autocorrectable_linters = enabled_linter_classes.count(&:support_autocorrect?) @@ -76,7 +77,7 @@ def run(args = ARGV) reporter = Reporter.create_reporter(@options[:format], @stats, autocorrect?) reporter.preview - runner = ERBLint::Runner.new(file_loader, @config) + runner = ERBLint::Runner.new(file_loader, @config, @options[:disable_inline_config] || false) file_content = nil lint_files.each do |filename| @@ -374,6 +375,10 @@ def option_parser @options[:allow_no_files] = config end + opts.on("--disable-inline-config", "Report all offenses while ignoring inline disable comments") do + @options[:disable_inline_config] = true + end + opts.on( "-sFILE", "--stdin FILE", diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index 42a7b14f..8676e470 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -53,9 +53,11 @@ def run(_processed_source) raise NotImplementedError, "must implement ##{__method__}" end - def run_and_update_offense_status(processed_source) + def run_and_update_offense_status(processed_source, enable_inline_config = true) run(processed_source) - update_offense_status(processed_source) if @offenses.any? + if @offenses.any? && enable_inline_config + update_offense_status(processed_source) + end end def add_offense(source_range, message, context = nil, severity = nil) diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index ec3cbaf9..97c9f862 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -5,7 +5,7 @@ module ERBLint class Runner attr_reader :offenses - def initialize(file_loader, config) + def initialize(file_loader, config, disable_inline_config = false) @file_loader = file_loader @config = config || RunnerConfig.default raise ArgumentError, "expect `config` to be a RunnerConfig instance" unless @config.is_a?(RunnerConfig) @@ -17,6 +17,7 @@ def initialize(file_loader, config) linter_class.new(@file_loader, @config.for_linter(linter_class)) end @no_unused_disable = nil + @disable_inline_config = disable_inline_config @offenses = [] end @@ -24,7 +25,7 @@ def run(processed_source) @linters .reject { |linter| linter.excludes_file?(processed_source.filename) } .each do |linter| - linter.run_and_update_offense_status(processed_source) + linter.run_and_update_offense_status(processed_source, enable_inline_config?) @offenses.concat(linter.offenses) end report_unused_disable(processed_source) @@ -43,13 +44,17 @@ def restore_offenses(offenses) private + def enable_inline_config? + !@disable_inline_config + end + def no_unused_disable_enabled? LinterRegistry.linters.include?(ERBLint::Linters::NoUnusedDisable) && @config.for_linter(ERBLint::Linters::NoUnusedDisable).enabled? end def report_unused_disable(processed_source) - if no_unused_disable_enabled? + if no_unused_disable_enabled? && enable_inline_config? @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new( @file_loader, @config.for_linter(ERBLint::Linters::NoUnusedDisable) From fddd8832d1366c7d6bd3ada8e6c51449be6dffc4 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 3 Mar 2023 09:53:25 -0500 Subject: [PATCH 13/31] * Update README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fd18e5dd..4384621a 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,8 @@ Comment on offending lines To raise an error when there is a useless disable comment, enable `NoUnusedDisable`. +To disable inline comments and report all offenses, set `--no-inline-disable` option. + ## Exclude You can specify the exclude patterns both of global and lint-local. From 820f805dea06faeddd2dc9639bcd612eefb67701 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 3 Mar 2023 10:17:44 -0500 Subject: [PATCH 14/31] * Clean files --- lib/erb_lint/cli.rb | 2 +- lib/erb_lint/runner.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/erb_lint/cli.rb b/lib/erb_lint/cli.rb index be620d11..2a112ee8 100644 --- a/lib/erb_lint/cli.rb +++ b/lib/erb_lint/cli.rb @@ -77,7 +77,7 @@ def run(args = ARGV) reporter = Reporter.create_reporter(@options[:format], @stats, autocorrect?) reporter.preview - runner = ERBLint::Runner.new(file_loader, @config, @options[:disable_inline_config] || false) + runner = ERBLint::Runner.new(file_loader, @config, @options[:disable_inline_config]) file_content = nil lint_files.each do |filename| diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index 97c9f862..07687618 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -37,7 +37,7 @@ def clear_offenses @linters.each(&:clear_offenses) @no_unused_disable&.clear_offenses end - + def restore_offenses(offenses) @offenses.concat(offenses) end From f5d5b6644eff02e4ec30a08e0082848ff272ccfd Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 3 Mar 2023 10:22:17 -0500 Subject: [PATCH 15/31] * Remove redundant call, fix merge conflict gone wrong --- lib/erb_lint/runner.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index 07687618..c1136d12 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -63,11 +63,5 @@ def report_unused_disable(processed_source) @offenses.concat(@no_unused_disable.offenses) end end - - def clear_offenses - @offenses = [] - @linters.each(&:clear_offenses) - @no_unused_disable.clear_offenses if @no_unused_disable - end end end From d2656013759652efa1ae502597603813c7b0d620 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 3 Mar 2023 10:28:07 -0500 Subject: [PATCH 16/31] * Fix merge conflict blunder --- spec/erb_lint/runner_spec.rb | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/spec/erb_lint/runner_spec.rb b/spec/erb_lint/runner_spec.rb index ddb344fe..a529d19d 100644 --- a/spec/erb_lint/runner_spec.rb +++ b/spec/erb_lint/runner_spec.rb @@ -25,21 +25,11 @@ class FakeLinter2 < FakeLinter1; end end end - let(:file_loader) { ERBLint::FileLoader.new(".") } - let(:runner) { described_class.new(file_loader, config) } - describe "#run" do - before do - allow(ERBLint::LinterRegistry).to(receive(:linters) - .and_return([ERBLint::Linters::FakeLinter1, - ERBLint::Linters::FakeLinter2, - ERBLint::Linters::FinalNewline,])) - runner.run(processed_source) - end - let(:file) { "DummyFileContent" } let(:filename) { "/root/directory/somefolder/otherfolder/dummyfile.html.erb" } let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } + before { runner.run(processed_source) } subject { runner.offenses } context "when all linters are enabled" do From 28eb15fcb84bf92f1923d5c4cab18449fbd5c77e Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 3 Mar 2023 10:33:09 -0500 Subject: [PATCH 17/31] * Update test description --- spec/erb_lint/linters/no_unused_disable_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index 5979fefb..b23550e1 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -55,7 +55,7 @@ class Fake < ERBLint::Linter linter.run(processed_source, [offense]) end - it "reports the unused rule" do + it "reports the unused inline comment" do expect(subject.size).to(eq(1)) expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) end @@ -70,7 +70,7 @@ class Fake < ERBLint::Linter linter.run(processed_source, [offense]) end - it "reports the unused rule" do + it "reports the unused inline comment" do expect(subject.size).to(eq(1)) expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake2")) end @@ -92,7 +92,7 @@ class Fake < ERBLint::Linter linter.run(processed_source, [offense]) end - it "reports the unused rule" do + it "reports the unused inline comment" do expect(subject.size).to(eq(1)) expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) end From 2b47c0b4a6b05a7b55cc87803de229b7ba61f016 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 3 Mar 2023 10:34:29 -0500 Subject: [PATCH 18/31] * Run rubocop --- lib/erb_lint/linters/no_unused_disable.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb index 84c05d1b..629d077e 100644 --- a/lib/erb_lint/linters/no_unused_disable.rb +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -12,6 +12,7 @@ def run(processed_source, offenses) processed_source.source_buffer.source_lines.each_with_index do |line, index| rule_disable = disable_comment(line) next unless rule_disable + rule_disable.split(",").each do |rule| disabled_rules_and_line_number[rule.strip] = (disabled_rules_and_line_number[rule.strip] ||= []).push(index + 1) @@ -22,6 +23,7 @@ def run(processed_source, offenses) rule_name = offense.linter.class.simple_name line_numbers = disabled_rules_and_line_number[rule_name] next unless line_numbers + line_numbers.reject do |line_number| if (offense.source_range.line_span.first..offense.source_range.line_span.last).include?(line_number) disabled_rules_and_line_number[rule_name].delete(line_number) From 07a667bc4f915a646a6e9e4ab12423739cba4574 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:04:29 -0500 Subject: [PATCH 19/31] Swap to erblint:disable-line --- lib/erb_lint/linter.rb | 8 +++----- lib/erb_lint/linters/no_unused_disable.rb | 10 ++++------ lib/erb_lint/utils/inline_configs.rb | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 lib/erb_lint/utils/inline_configs.rb diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index 8676e470..4710fdaa 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "erb_lint/utils/inline_disables" + module ERBLint # Defines common functionality available to all linters. class Linter @@ -75,7 +77,7 @@ def update_offense_status(processed_source) offense_line_range = offense.source_range.line_range offense_lines = source_for_line_range(processed_source, offense_line_range) - if rule_disable_comment?(offense_lines) + if Utils::InlineDisables.new.rule_disable_comment_for_lines?(self.class.simple_name, offense_lines) offense.disabled = true end end @@ -84,9 +86,5 @@ def update_offense_status(processed_source) def source_for_line_range(processed_source, line_range) processed_source.source_buffer.source_lines[line_range.first - 1..line_range.last - 1].join end - - def rule_disable_comment?(lines) - lines.match(/<%# erblint:disable (?.*#{self.class.simple_name}).*%>/) - end end end diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb index 629d077e..eade0d65 100644 --- a/lib/erb_lint/linters/no_unused_disable.rb +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -34,16 +34,14 @@ def run(processed_source, offenses) disabled_rules_and_line_number.each do |rule, line_numbers| line_numbers.each do |line_number| add_offense(processed_source.source_buffer.line_range(line_number), - "Unused erblint:disable comment for #{rule}") + "Unused erblint:disable-line comment for #{rule}") end end end - private - - def disable_comment(line) - line.match(/<%# erblint:disable (?.*) %>/)&.named_captures&.fetch("rules") - end + # def disable_comment(line) + # line.match(/# erblint:disable-line (?.*) %>/)&.named_captures&.fetch("rules") + # end end end end diff --git a/lib/erb_lint/utils/inline_configs.rb b/lib/erb_lint/utils/inline_configs.rb new file mode 100644 index 00000000..519a61dc --- /dev/null +++ b/lib/erb_lint/utils/inline_configs.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module ERBLint + module Utils + class InlineConfigs + def rule_disable_comment_for_lines?(rule, lines) + lines.match?(/# erblint:disable-line (?.*#{rule}).*/) + end + + def disabled_rules(line) + line.match(/# erblint:disable-line (?.*) %>/)&.named_captures&.fetch("rules") + end + end + end +end From bfa90e22343d796be9358bbba0d64b288469b407 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:04:36 -0500 Subject: [PATCH 20/31] Update specs --- .../linters/no_unused_disable_spec.rb | 20 ++++----- spec/erb_lint/runner_spec.rb | 6 +-- .../utils/rule_disable_comment_spec.rb | 44 +++++++++++++++++++ 3 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 spec/lib/erb_lint/utils/rule_disable_comment_spec.rb diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index b23550e1..280566b0 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -21,16 +21,16 @@ class Fake < ERBLint::Linter describe "offenses" do subject { offenses } context "when file has unused disable comment" do - let(:file) { "<%# erblint:disable Fake %>" } + let(:file) { "<%# erblint:disable-line Fake %>" } before { linter.run(processed_source, []) } it do expect(subject.size).to(eq(1)) - expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) + expect(subject.first.message).to(eq("Unused erblint:disable-line comment for Fake")) end end context "when file has a disable comment and a corresponding offense" do - let(:file) { "<%# erblint:disable Fake %>" } + let(:file) { "<%# erblint:disable-line Fake %>" } before do offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), processed_source.to_source_range(1..6), "some fake linter message") @@ -45,7 +45,7 @@ class Fake < ERBLint::Linter context "when file has a disable comment in wrong place and a corresponding offense" do let(:file) { <<~FILE } - <%# erblint:disable Fake %> + <%# erblint:disable-line Fake %> bad content FILE before do @@ -57,12 +57,12 @@ class Fake < ERBLint::Linter it "reports the unused inline comment" do expect(subject.size).to(eq(1)) - expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) + expect(subject.first.message).to(eq("Unused erblint:disable-line comment for Fake")) end end context "when file has disable comment for multiple rules" do - let(:file) { "<%# erblint:disable Fake, Fake2 %>" } + let(:file) { "<%# erblint:disable-line Fake, Fake2 %>" } before do offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), processed_source.to_source_range(1..6), "some fake linter message") @@ -72,14 +72,14 @@ class Fake < ERBLint::Linter it "reports the unused inline comment" do expect(subject.size).to(eq(1)) - expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake2")) + expect(subject.first.message).to(eq("Unused erblint:disable-line comment for Fake2")) end end context "when file has multiple disable comments for one offense" do let(:file) { <<~ERB } - <%# erblint:disable Fake %> - <%# erblint:disable Fake %> + <%# erblint:disable-line Fake %> + <%# erblint:disable-line Fake %> ERB before do second_line_range = processed_source.source_buffer.line_range(2).to_range @@ -94,7 +94,7 @@ class Fake < ERBLint::Linter it "reports the unused inline comment" do expect(subject.size).to(eq(1)) - expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) + expect(subject.first.message).to(eq("Unused erblint:disable-line comment for Fake")) end end end diff --git a/spec/erb_lint/runner_spec.rb b/spec/erb_lint/runner_spec.rb index a529d19d..8832e15a 100644 --- a/spec/erb_lint/runner_spec.rb +++ b/spec/erb_lint/runner_spec.rb @@ -171,7 +171,7 @@ class FakeLinter4 < FakeLinter3; end let(:file) { <<~FILE }
something
bad content - <%# erblint:disable FakeLinter3 %> + <%# erblint:disable-line FakeLinter3 %> FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } @@ -187,7 +187,7 @@ class FakeLinter4 < FakeLinter3; end let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE }
something
- bad content<%# erblint:disable FakeLinter3 %> + bad content<%# erblint:disable-line FakeLinter3 %> FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } @@ -202,7 +202,7 @@ class FakeLinter4 < FakeLinter3; end let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE }
something
- bad content <%# erblint:disable FakeLinter3, FakeLinter4 %> + bad content <%# erblint:disable-line FakeLinter3, FakeLinter4 %> FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } diff --git a/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb b/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb new file mode 100644 index 00000000..ecd0f74d --- /dev/null +++ b/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe ERBLint::Utils::InlineDisables do + let(:utils) { described_class.new } + + context "rule_disable_comment_for_lines?" do + it "true when lines contain a erblint:disable-line comment for rule in ERB" do + offending_lines = '<%# erblint:disable-line AnchorRule %>' + expect(utils.rule_disable_comment_for_lines?("AnchorRule", offending_lines)).to(be(true)) + end + + it "true lines when lines contain a erblint:disable-line comment for rule in Ruby comment" do + offending_lines = '<% + button = { + role: "img" # erblint:disable-line IncorrectRoleRule + } + %>' + expect(utils.rule_disable_comment_for_lines?("IncorrectRoleRule", offending_lines)).to(be(true)) + end + + it "true lines when lines contain matching erblint:disable-line comment for rule in Ruby comment" do + offending_lines = '<% + button = { + role: "img" # erblint:disable-line IncorrectRoleRule, AnotherRule + } + %>' + expect(utils.rule_disable_comment_for_lines?("AnotherRule", offending_lines)).to(be(true)) + end + + it "false when lines contain erblint:disable-line comment that does not contain specified rule" do + offending_lines = '<%# erblint:disable-line AnchorRule %>' + expect(utils.rule_disable_comment_for_lines?("AnotherRule", offending_lines)).to(be(false)) + end + end + + context "disabled_rules" do + it "returns rule in ERB" do + lines = '<%# erblint:disable-line AnchorRule %>' + expect(utils.disabled_rule(lines)).to(eq(true)) + end + end +end From fb4a97ba18e4a89994628b7d909f91dfb5b4f899 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:04:45 -0500 Subject: [PATCH 21/31] update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4384621a..f4ae0e0c 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ You can disable a rule by placing a disable comment in the following format: Comment on offending lines ```.erb -
<%# erblint:disable SelfClosingTag %> +
<%# erblint:disable-line SelfClosingTag %> ``` To raise an error when there is a useless disable comment, enable `NoUnusedDisable`. From 0adc7551a8fd873ede31624a4a8be9066b5d84b5 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:10:35 -0500 Subject: [PATCH 22/31] Rename everything to inline config --- README.md | 2 +- lib/erb_lint/cli.rb | 2 +- lib/erb_lint/linter.rb | 4 ++-- lib/erb_lint/linters/no_unused_disable.rb | 4 ---- spec/lib/erb_lint/utils/rule_disable_comment_spec.rb | 9 +++++++-- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f4ae0e0c..efbf5762 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ Comment on offending lines To raise an error when there is a useless disable comment, enable `NoUnusedDisable`. -To disable inline comments and report all offenses, set `--no-inline-disable` option. +To disable inline comments and report all offenses, set `--disable-inline-configs` option. ## Exclude diff --git a/lib/erb_lint/cli.rb b/lib/erb_lint/cli.rb index 2a112ee8..712c54e0 100644 --- a/lib/erb_lint/cli.rb +++ b/lib/erb_lint/cli.rb @@ -375,7 +375,7 @@ def option_parser @options[:allow_no_files] = config end - opts.on("--disable-inline-config", "Report all offenses while ignoring inline disable comments") do + opts.on("--disable-inline-configs", "Report all offenses while ignoring inline disable comments") do @options[:disable_inline_config] = true end diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index 4710fdaa..b0c3090f 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require "erb_lint/utils/inline_disables" +require "erb_lint/utils/inline_configs" module ERBLint # Defines common functionality available to all linters. @@ -77,7 +77,7 @@ def update_offense_status(processed_source) offense_line_range = offense.source_range.line_range offense_lines = source_for_line_range(processed_source, offense_line_range) - if Utils::InlineDisables.new.rule_disable_comment_for_lines?(self.class.simple_name, offense_lines) + if Utils::InlineConfigs.new.rule_disable_comment_for_lines?(self.class.simple_name, offense_lines) offense.disabled = true end end diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb index eade0d65..9a724674 100644 --- a/lib/erb_lint/linters/no_unused_disable.rb +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -38,10 +38,6 @@ def run(processed_source, offenses) end end end - - # def disable_comment(line) - # line.match(/# erblint:disable-line (?.*) %>/)&.named_captures&.fetch("rules") - # end end end end diff --git a/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb b/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb index ecd0f74d..051e795b 100644 --- a/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb +++ b/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe ERBLint::Utils::InlineDisables do +describe ERBLint::Utils::InlineConfigs do let(:utils) { described_class.new } context "rule_disable_comment_for_lines?" do @@ -38,7 +38,12 @@ context "disabled_rules" do it "returns rule in ERB" do lines = '<%# erblint:disable-line AnchorRule %>' - expect(utils.disabled_rule(lines)).to(eq(true)) + expect(utils.disabled_rules(lines)).to(eq('AnchorRule')) + end + + it "returns rules in ERB" do + lines = '<%# erblint:disable-line Rule1, Rule2, Rule3 %>' + expect(utils.disabled_rules(lines)).to(eq('Rule1, Rule2, Rule3')) end end end From 43c0856d34c41c4baf57d8e7f332aa794d34e27d Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:21:45 -0500 Subject: [PATCH 23/31] Change methods to self. --- lib/erb_lint/linter.rb | 2 +- lib/erb_lint/linters/no_unused_disable.rb | 8 +++++--- lib/erb_lint/utils/inline_configs.rb | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index b0c3090f..fa536087 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -77,7 +77,7 @@ def update_offense_status(processed_source) offense_line_range = offense.source_range.line_range offense_lines = source_for_line_range(processed_source, offense_line_range) - if Utils::InlineConfigs.new.rule_disable_comment_for_lines?(self.class.simple_name, offense_lines) + if Utils::InlineConfigs.rule_disable_comment_for_lines?(self.class.simple_name, offense_lines) offense.disabled = true end end diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb index 9a724674..6456948d 100644 --- a/lib/erb_lint/linters/no_unused_disable.rb +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "erb_lint/utils/inline_configs" + module ERBLint module Linters # Checks for unused disable comments. @@ -10,10 +12,10 @@ def run(processed_source, offenses) disabled_rules_and_line_number = {} processed_source.source_buffer.source_lines.each_with_index do |line, index| - rule_disable = disable_comment(line) - next unless rule_disable + rule_disables = Utils::InlineConfigs.disabled_rules(line) + next unless rule_disables - rule_disable.split(",").each do |rule| + rule_disables.split(",").each do |rule| disabled_rules_and_line_number[rule.strip] = (disabled_rules_and_line_number[rule.strip] ||= []).push(index + 1) end diff --git a/lib/erb_lint/utils/inline_configs.rb b/lib/erb_lint/utils/inline_configs.rb index 519a61dc..12adfced 100644 --- a/lib/erb_lint/utils/inline_configs.rb +++ b/lib/erb_lint/utils/inline_configs.rb @@ -3,11 +3,11 @@ module ERBLint module Utils class InlineConfigs - def rule_disable_comment_for_lines?(rule, lines) + def self.rule_disable_comment_for_lines?(rule, lines) lines.match?(/# erblint:disable-line (?.*#{rule}).*/) end - def disabled_rules(line) + def self.disabled_rules(line) line.match(/# erblint:disable-line (?.*) %>/)&.named_captures&.fetch("rules") end end From ab1ab6afca5641b6c424502e7db0311a0d6bb816 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:23:37 -0500 Subject: [PATCH 24/31] Introduce new spec helper to more easily predict source range --- spec/erb_lint/linters/no_unused_disable_spec.rb | 2 +- spec/lib/erb_lint/utils/rule_disable_comment_spec.rb | 2 +- spec/spec_helper.rb | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index 280566b0..308e5c46 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -33,7 +33,7 @@ class Fake < ERBLint::Linter let(:file) { "<%# erblint:disable-line Fake %>" } before do offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), - processed_source.to_source_range(1..6), "some fake linter message") + processed_source.to_source_range(source_range_for_code(file, "")), "some fake linter message") offense.disabled = true linter.run(processed_source, [offense]) end diff --git a/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb b/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb index 051e795b..6beecf70 100644 --- a/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb +++ b/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" describe ERBLint::Utils::InlineConfigs do - let(:utils) { described_class.new } + let(:utils) { described_class } context "rule_disable_comment_for_lines?" do it "true when lines contain a erblint:disable-line comment for rule in ERB" do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ca57c26d..4d59ca22 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,8 @@ # frozen_string_literal: true require "erb_lint/all" + +def source_range_for_code(processed_source, code) + offending_source = processed_source.match(code) + processed_source.to_source_range(offending_source.begin(0)..offending_source.end(0)) +end From 0b460a8acbae4029f690d8bdeea7032e0b49ee3a Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:31:01 -0500 Subject: [PATCH 25/31] swap with new spec helper --- .../linters/no_unused_disable_spec.rb | 20 ++++++++++++------- .../utils/rule_disable_comment_spec.rb | 6 +++--- spec/spec_helper.rb | 6 +++--- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index 308e5c46..60f9c145 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -33,7 +33,8 @@ class Fake < ERBLint::Linter let(:file) { "<%# erblint:disable-line Fake %>" } before do offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), - processed_source.to_source_range(source_range_for_code(file, "")), "some fake linter message") + source_range_for_code(file, processed_source, ""), + "some fake linter message") offense.disabled = true linter.run(processed_source, [offense]) end @@ -49,8 +50,11 @@ class Fake < ERBLint::Linter bad content FILE before do - offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), - processed_source.to_source_range(28..52), "some fake linter message") + offense = ERBLint::Offense.new( + ERBLint::Linters::Fake.new(file_loader, linter_config), + source_range_for_code(file, processed_source, "bad content"), + "some fake linter message" + ) offense.disabled = true linter.run(processed_source, [offense]) end @@ -64,8 +68,11 @@ class Fake < ERBLint::Linter context "when file has disable comment for multiple rules" do let(:file) { "<%# erblint:disable-line Fake, Fake2 %>" } before do - offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), - processed_source.to_source_range(1..6), "some fake linter message") + offense = ERBLint::Offense.new( + ERBLint::Linters::Fake.new(file_loader, linter_config), + source_range_for_code(file, processed_source, ""), + "some fake linter message" + ) offense.disabled = true linter.run(processed_source, [offense]) end @@ -82,10 +89,9 @@ class Fake < ERBLint::Linter <%# erblint:disable-line Fake %> ERB before do - second_line_range = processed_source.source_buffer.line_range(2).to_range offense = ERBLint::Offense.new( ERBLint::Linters::Fake.new(file_loader, linter_config), - processed_source.to_source_range(second_line_range), + source_range_for_code(file, processed_source, ""), "some fake linter message" ) offense.disabled = true diff --git a/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb b/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb index 6beecf70..e0b701a5 100644 --- a/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb +++ b/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb @@ -38,12 +38,12 @@ context "disabled_rules" do it "returns rule in ERB" do lines = '<%# erblint:disable-line AnchorRule %>' - expect(utils.disabled_rules(lines)).to(eq('AnchorRule')) + expect(utils.disabled_rules(lines)).to(eq("AnchorRule")) end - it "returns rules in ERB" do + it "returns rules in ERB" do lines = '<%# erblint:disable-line Rule1, Rule2, Rule3 %>' - expect(utils.disabled_rules(lines)).to(eq('Rule1, Rule2, Rule3')) + expect(utils.disabled_rules(lines)).to(eq("Rule1, Rule2, Rule3")) end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4d59ca22..48500d10 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -2,7 +2,7 @@ require "erb_lint/all" -def source_range_for_code(processed_source, code) - offending_source = processed_source.match(code) - processed_source.to_source_range(offending_source.begin(0)..offending_source.end(0)) +def source_range_for_code(file, processed_source, code) + offending_source = file.match(code) + processed_source.to_source_range(offending_source.begin(0)...offending_source.end(0)) end From a9c799e1b99cf8aac12d0002e6effc750ba81525 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Tue, 7 Mar 2023 17:56:16 -0500 Subject: [PATCH 26/31] rename spec --- .../{rule_disable_comment_spec.rb => inline_configs_spec.rb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename spec/lib/erb_lint/utils/{rule_disable_comment_spec.rb => inline_configs_spec.rb} (100%) diff --git a/spec/lib/erb_lint/utils/rule_disable_comment_spec.rb b/spec/lib/erb_lint/utils/inline_configs_spec.rb similarity index 100% rename from spec/lib/erb_lint/utils/rule_disable_comment_spec.rb rename to spec/lib/erb_lint/utils/inline_configs_spec.rb From c46d46ef97c878bac3cab697a439116125d57d6c Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Tue, 7 Mar 2023 18:08:23 -0500 Subject: [PATCH 27/31] use plural name --- lib/erb_lint/cli.rb | 6 +++--- lib/erb_lint/linter.rb | 4 ++-- lib/erb_lint/runner.rb | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/erb_lint/cli.rb b/lib/erb_lint/cli.rb index 712c54e0..932a2276 100644 --- a/lib/erb_lint/cli.rb +++ b/lib/erb_lint/cli.rb @@ -69,7 +69,7 @@ def run(args = ARGV) @options[:format] ||= :multiline @options[:fail_level] ||= severity_level_for_name(:refactor) - @options[:disable_inline_config] ||= false + @options[:disable_inline_configs] ||= false @stats.files = lint_files.size @stats.linters = enabled_linter_classes.size @stats.autocorrectable_linters = enabled_linter_classes.count(&:support_autocorrect?) @@ -77,7 +77,7 @@ def run(args = ARGV) reporter = Reporter.create_reporter(@options[:format], @stats, autocorrect?) reporter.preview - runner = ERBLint::Runner.new(file_loader, @config, @options[:disable_inline_config]) + runner = ERBLint::Runner.new(file_loader, @config, @options[:disable_inline_configs]) file_content = nil lint_files.each do |filename| @@ -376,7 +376,7 @@ def option_parser end opts.on("--disable-inline-configs", "Report all offenses while ignoring inline disable comments") do - @options[:disable_inline_config] = true + @options[:disable_inline_configs] = true end opts.on( diff --git a/lib/erb_lint/linter.rb b/lib/erb_lint/linter.rb index fa536087..4eec7fd2 100644 --- a/lib/erb_lint/linter.rb +++ b/lib/erb_lint/linter.rb @@ -55,9 +55,9 @@ def run(_processed_source) raise NotImplementedError, "must implement ##{__method__}" end - def run_and_update_offense_status(processed_source, enable_inline_config = true) + def run_and_update_offense_status(processed_source, enable_inline_configs = true) run(processed_source) - if @offenses.any? && enable_inline_config + if @offenses.any? && enable_inline_configs update_offense_status(processed_source) end end diff --git a/lib/erb_lint/runner.rb b/lib/erb_lint/runner.rb index c1136d12..bdcdb346 100644 --- a/lib/erb_lint/runner.rb +++ b/lib/erb_lint/runner.rb @@ -5,7 +5,7 @@ module ERBLint class Runner attr_reader :offenses - def initialize(file_loader, config, disable_inline_config = false) + def initialize(file_loader, config, disable_inline_configs = false) @file_loader = file_loader @config = config || RunnerConfig.default raise ArgumentError, "expect `config` to be a RunnerConfig instance" unless @config.is_a?(RunnerConfig) @@ -17,7 +17,7 @@ def initialize(file_loader, config, disable_inline_config = false) linter_class.new(@file_loader, @config.for_linter(linter_class)) end @no_unused_disable = nil - @disable_inline_config = disable_inline_config + @disable_inline_configs = disable_inline_configs @offenses = [] end @@ -25,7 +25,7 @@ def run(processed_source) @linters .reject { |linter| linter.excludes_file?(processed_source.filename) } .each do |linter| - linter.run_and_update_offense_status(processed_source, enable_inline_config?) + linter.run_and_update_offense_status(processed_source, enable_inline_configs?) @offenses.concat(linter.offenses) end report_unused_disable(processed_source) @@ -44,8 +44,8 @@ def restore_offenses(offenses) private - def enable_inline_config? - !@disable_inline_config + def enable_inline_configs? + !@disable_inline_configs end def no_unused_disable_enabled? @@ -54,7 +54,7 @@ def no_unused_disable_enabled? end def report_unused_disable(processed_source) - if no_unused_disable_enabled? && enable_inline_config? + if no_unused_disable_enabled? && enable_inline_configs? @no_unused_disable = ERBLint::Linters::NoUnusedDisable.new( @file_loader, @config.for_linter(ERBLint::Linters::NoUnusedDisable) From 6e644fd6347ace1d56b7671b25fd0a24348a2f3b Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Tue, 7 Mar 2023 18:33:22 -0500 Subject: [PATCH 28/31] update source_range_for_code helper and use it --- spec/erb_lint/linters/no_unused_disable_spec.rb | 8 ++++---- spec/erb_lint/runner_spec.rb | 3 +-- spec/spec_helper.rb | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index 60f9c145..cea6856e 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -33,7 +33,7 @@ class Fake < ERBLint::Linter let(:file) { "<%# erblint:disable-line Fake %>" } before do offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), - source_range_for_code(file, processed_source, ""), + source_range_for_code(processed_source, ""), "some fake linter message") offense.disabled = true linter.run(processed_source, [offense]) @@ -52,7 +52,7 @@ class Fake < ERBLint::Linter before do offense = ERBLint::Offense.new( ERBLint::Linters::Fake.new(file_loader, linter_config), - source_range_for_code(file, processed_source, "bad content"), + source_range_for_code(processed_source, "bad content"), "some fake linter message" ) offense.disabled = true @@ -70,7 +70,7 @@ class Fake < ERBLint::Linter before do offense = ERBLint::Offense.new( ERBLint::Linters::Fake.new(file_loader, linter_config), - source_range_for_code(file, processed_source, ""), + source_range_for_code(processed_source, ""), "some fake linter message" ) offense.disabled = true @@ -91,7 +91,7 @@ class Fake < ERBLint::Linter before do offense = ERBLint::Offense.new( ERBLint::Linters::Fake.new(file_loader, linter_config), - source_range_for_code(file, processed_source, ""), + source_range_for_code(processed_source, ""), "some fake linter message" ) offense.disabled = true diff --git a/spec/erb_lint/runner_spec.rb b/spec/erb_lint/runner_spec.rb index 8832e15a..24943e8a 100644 --- a/spec/erb_lint/runner_spec.rb +++ b/spec/erb_lint/runner_spec.rb @@ -138,8 +138,7 @@ module ERBLint module Linters class FakeLinter3 < Linter def run(processed_source) - second_line_range = processed_source.source_buffer.line_range(2).to_range # reports second line of file - add_offense(processed_source.to_source_range(second_line_range), "#{self.class.name} error") + add_offense(source_range_for_code(processed_source, "bad content"), "#{self.class.name} error") end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 48500d10..aa48e0ff 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -2,7 +2,7 @@ require "erb_lint/all" -def source_range_for_code(file, processed_source, code) - offending_source = file.match(code) +def source_range_for_code(processed_source, code) + offending_source = processed_source.file_content.match(code) processed_source.to_source_range(offending_source.begin(0)...offending_source.end(0)) end From 9f95018fe7db18d7406369f7b171ce81f12db3ad Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Tue, 7 Mar 2023 18:42:04 -0500 Subject: [PATCH 29/31] add test for disable-inline-configs --- spec/erb_lint/cli_spec.rb | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/spec/erb_lint/cli_spec.rb b/spec/erb_lint/cli_spec.rb index 50da7582..c27ae1f1 100644 --- a/spec/erb_lint/cli_spec.rb +++ b/spec/erb_lint/cli_spec.rb @@ -98,6 +98,33 @@ def run(processed_source) end end + context "with --disable-inline-configs" do + module ERBLint + module Linters + class FakeLinter < Linter + def run(processed_source) + add_offense(source_range_for_code(processed_source, ""), + "#{self.class.name} error") + end + end + end + end + let(:linted_file) { "app/views/template.html.erb" } + let(:args) { ["--disable-inline-configs", "--enable-linter", "fake_linter", linted_file] } + let(:file_content) { " <%# erblint:disable-line FakeLinter %>" } + + before do + allow(ERBLint::LinterRegistry).to(receive(:linters) + .and_return([ERBLint::Linters::FakeLinter])) + FileUtils.mkdir_p(File.dirname(linted_file)) + File.write(linted_file, file_content) + end + + it "shows all errors regardless of inline disables " do + expect { subject }.to(output(/ERBLint::Linters::FakeLinter error/).to_stdout) + end + end + context "with --clear-cache" do let(:args) { ["--clear-cache"] } context "without a cache folder" do From f52fc0fd734236c9836b6d40ae551f9df12af628 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 17 Mar 2023 16:00:54 -0400 Subject: [PATCH 30/31] Move test helper to module --- spec/erb_lint/cli_spec.rb | 3 ++- spec/erb_lint/linters/no_unused_disable_spec.rb | 9 +++++---- spec/erb_lint/runner_spec.rb | 4 +++- spec/spec_helper.rb | 5 ----- spec/spec_utils.rb | 8 ++++++++ 5 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 spec/spec_utils.rb diff --git a/spec/erb_lint/cli_spec.rb b/spec/erb_lint/cli_spec.rb index c27ae1f1..a40ecf2d 100644 --- a/spec/erb_lint/cli_spec.rb +++ b/spec/erb_lint/cli_spec.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "spec_helper" +require "spec_utils" require "erb_lint/cli" require "erb_lint/cache" require "pp" @@ -103,7 +104,7 @@ module ERBLint module Linters class FakeLinter < Linter def run(processed_source) - add_offense(source_range_for_code(processed_source, ""), + add_offense(SpecUtils.source_range_for_code(processed_source, ""), "#{self.class.name} error") end end diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index cea6856e..40aa753f 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "spec_helper" +require "spec_utils" describe ERBLint::Linters::NoUnusedDisable do let(:linter_config) { described_class.config_schema.new } @@ -33,7 +34,7 @@ class Fake < ERBLint::Linter let(:file) { "<%# erblint:disable-line Fake %>" } before do offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), - source_range_for_code(processed_source, ""), + SpecUtils.source_range_for_code(processed_source, ""), "some fake linter message") offense.disabled = true linter.run(processed_source, [offense]) @@ -52,7 +53,7 @@ class Fake < ERBLint::Linter before do offense = ERBLint::Offense.new( ERBLint::Linters::Fake.new(file_loader, linter_config), - source_range_for_code(processed_source, "bad content"), + SpecUtils.source_range_for_code(processed_source, "bad content"), "some fake linter message" ) offense.disabled = true @@ -70,7 +71,7 @@ class Fake < ERBLint::Linter before do offense = ERBLint::Offense.new( ERBLint::Linters::Fake.new(file_loader, linter_config), - source_range_for_code(processed_source, ""), + SpecUtils.source_range_for_code(processed_source, ""), "some fake linter message" ) offense.disabled = true @@ -91,7 +92,7 @@ class Fake < ERBLint::Linter before do offense = ERBLint::Offense.new( ERBLint::Linters::Fake.new(file_loader, linter_config), - source_range_for_code(processed_source, ""), + SpecUtils.source_range_for_code(processed_source, ""), "some fake linter message" ) offense.disabled = true diff --git a/spec/erb_lint/runner_spec.rb b/spec/erb_lint/runner_spec.rb index 24943e8a..2869fdc2 100644 --- a/spec/erb_lint/runner_spec.rb +++ b/spec/erb_lint/runner_spec.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "spec_helper" +require "spec_utils" describe ERBLint::Runner do let(:file_loader) { ERBLint::FileLoader.new("/root/directory") } @@ -138,7 +139,8 @@ module ERBLint module Linters class FakeLinter3 < Linter def run(processed_source) - add_offense(source_range_for_code(processed_source, "bad content"), "#{self.class.name} error") + add_offense(SpecUtils.source_range_for_code(processed_source, "bad content"), + "#{self.class.name} error") end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index aa48e0ff..ca57c26d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,8 +1,3 @@ # frozen_string_literal: true require "erb_lint/all" - -def source_range_for_code(processed_source, code) - offending_source = processed_source.file_content.match(code) - processed_source.to_source_range(offending_source.begin(0)...offending_source.end(0)) -end diff --git a/spec/spec_utils.rb b/spec/spec_utils.rb new file mode 100644 index 00000000..c02435d5 --- /dev/null +++ b/spec/spec_utils.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +module SpecUtils + def self.source_range_for_code(processed_source, code) + offending_source = processed_source.file_content.match(code) + processed_source.to_source_range(offending_source.begin(0)...offending_source.end(0)) + end +end From 0afcd51e3be68b164830db3df00ba480eb6d0abd Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Fri, 24 Mar 2023 15:48:51 -0400 Subject: [PATCH 31/31] Use erblint:disable not erblint:disable-line to align with Rubocop --- README.md | 2 +- lib/erb_lint/linters/no_unused_disable.rb | 2 +- lib/erb_lint/utils/inline_configs.rb | 4 ++-- spec/erb_lint/cli_spec.rb | 2 +- .../linters/no_unused_disable_spec.rb | 20 +++++++++---------- spec/erb_lint/runner_spec.rb | 6 +++--- .../lib/erb_lint/utils/inline_configs_spec.rb | 20 +++++++++---------- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index efbf5762..06f3beef 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ You can disable a rule by placing a disable comment in the following format: Comment on offending lines ```.erb -
<%# erblint:disable-line SelfClosingTag %> +
<%# erblint:disable SelfClosingTag %> ``` To raise an error when there is a useless disable comment, enable `NoUnusedDisable`. diff --git a/lib/erb_lint/linters/no_unused_disable.rb b/lib/erb_lint/linters/no_unused_disable.rb index 6456948d..91f37317 100644 --- a/lib/erb_lint/linters/no_unused_disable.rb +++ b/lib/erb_lint/linters/no_unused_disable.rb @@ -36,7 +36,7 @@ def run(processed_source, offenses) disabled_rules_and_line_number.each do |rule, line_numbers| line_numbers.each do |line_number| add_offense(processed_source.source_buffer.line_range(line_number), - "Unused erblint:disable-line comment for #{rule}") + "Unused erblint:disable comment for #{rule}") end end end diff --git a/lib/erb_lint/utils/inline_configs.rb b/lib/erb_lint/utils/inline_configs.rb index 12adfced..c90eb54a 100644 --- a/lib/erb_lint/utils/inline_configs.rb +++ b/lib/erb_lint/utils/inline_configs.rb @@ -4,11 +4,11 @@ module ERBLint module Utils class InlineConfigs def self.rule_disable_comment_for_lines?(rule, lines) - lines.match?(/# erblint:disable-line (?.*#{rule}).*/) + lines.match?(/# erblint:disable (?.*#{rule}).*/) end def self.disabled_rules(line) - line.match(/# erblint:disable-line (?.*) %>/)&.named_captures&.fetch("rules") + line.match(/# erblint:disable (?.*) %>/)&.named_captures&.fetch("rules") end end end diff --git a/spec/erb_lint/cli_spec.rb b/spec/erb_lint/cli_spec.rb index a40ecf2d..bec01619 100644 --- a/spec/erb_lint/cli_spec.rb +++ b/spec/erb_lint/cli_spec.rb @@ -112,7 +112,7 @@ def run(processed_source) end let(:linted_file) { "app/views/template.html.erb" } let(:args) { ["--disable-inline-configs", "--enable-linter", "fake_linter", linted_file] } - let(:file_content) { " <%# erblint:disable-line FakeLinter %>" } + let(:file_content) { " <%# erblint:disable FakeLinter %>" } before do allow(ERBLint::LinterRegistry).to(receive(:linters) diff --git a/spec/erb_lint/linters/no_unused_disable_spec.rb b/spec/erb_lint/linters/no_unused_disable_spec.rb index 40aa753f..52c7c68b 100644 --- a/spec/erb_lint/linters/no_unused_disable_spec.rb +++ b/spec/erb_lint/linters/no_unused_disable_spec.rb @@ -22,16 +22,16 @@ class Fake < ERBLint::Linter describe "offenses" do subject { offenses } context "when file has unused disable comment" do - let(:file) { "<%# erblint:disable-line Fake %>" } + let(:file) { "<%# erblint:disable Fake %>" } before { linter.run(processed_source, []) } it do expect(subject.size).to(eq(1)) - expect(subject.first.message).to(eq("Unused erblint:disable-line comment for Fake")) + expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) end end context "when file has a disable comment and a corresponding offense" do - let(:file) { "<%# erblint:disable-line Fake %>" } + let(:file) { "<%# erblint:disable Fake %>" } before do offense = ERBLint::Offense.new(ERBLint::Linters::Fake.new(file_loader, linter_config), SpecUtils.source_range_for_code(processed_source, ""), @@ -47,7 +47,7 @@ class Fake < ERBLint::Linter context "when file has a disable comment in wrong place and a corresponding offense" do let(:file) { <<~FILE } - <%# erblint:disable-line Fake %> + <%# erblint:disable Fake %> bad content FILE before do @@ -62,12 +62,12 @@ class Fake < ERBLint::Linter it "reports the unused inline comment" do expect(subject.size).to(eq(1)) - expect(subject.first.message).to(eq("Unused erblint:disable-line comment for Fake")) + expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) end end context "when file has disable comment for multiple rules" do - let(:file) { "<%# erblint:disable-line Fake, Fake2 %>" } + let(:file) { "<%# erblint:disable Fake, Fake2 %>" } before do offense = ERBLint::Offense.new( ERBLint::Linters::Fake.new(file_loader, linter_config), @@ -80,14 +80,14 @@ class Fake < ERBLint::Linter it "reports the unused inline comment" do expect(subject.size).to(eq(1)) - expect(subject.first.message).to(eq("Unused erblint:disable-line comment for Fake2")) + expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake2")) end end context "when file has multiple disable comments for one offense" do let(:file) { <<~ERB } - <%# erblint:disable-line Fake %> - <%# erblint:disable-line Fake %> + <%# erblint:disable Fake %> + <%# erblint:disable Fake %> ERB before do offense = ERBLint::Offense.new( @@ -101,7 +101,7 @@ class Fake < ERBLint::Linter it "reports the unused inline comment" do expect(subject.size).to(eq(1)) - expect(subject.first.message).to(eq("Unused erblint:disable-line comment for Fake")) + expect(subject.first.message).to(eq("Unused erblint:disable comment for Fake")) end end end diff --git a/spec/erb_lint/runner_spec.rb b/spec/erb_lint/runner_spec.rb index 2869fdc2..a1531331 100644 --- a/spec/erb_lint/runner_spec.rb +++ b/spec/erb_lint/runner_spec.rb @@ -172,7 +172,7 @@ class FakeLinter4 < FakeLinter3; end let(:file) { <<~FILE }
something
bad content - <%# erblint:disable-line FakeLinter3 %> + <%# erblint:disable FakeLinter3 %> FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } @@ -188,7 +188,7 @@ class FakeLinter4 < FakeLinter3; end let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE }
something
- bad content<%# erblint:disable-line FakeLinter3 %> + bad content<%# erblint:disable FakeLinter3 %> FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } @@ -203,7 +203,7 @@ class FakeLinter4 < FakeLinter3; end let(:filename) { "somefolder/otherfolder/dummyfile.html.erb" } let(:file) { <<~FILE }
something
- bad content <%# erblint:disable-line FakeLinter3, FakeLinter4 %> + bad content <%# erblint:disable FakeLinter3, FakeLinter4 %> FILE let(:processed_source) { ERBLint::ProcessedSource.new(filename, file) } diff --git a/spec/lib/erb_lint/utils/inline_configs_spec.rb b/spec/lib/erb_lint/utils/inline_configs_spec.rb index e0b701a5..d13adb65 100644 --- a/spec/lib/erb_lint/utils/inline_configs_spec.rb +++ b/spec/lib/erb_lint/utils/inline_configs_spec.rb @@ -6,43 +6,43 @@ let(:utils) { described_class } context "rule_disable_comment_for_lines?" do - it "true when lines contain a erblint:disable-line comment for rule in ERB" do - offending_lines = '<%# erblint:disable-line AnchorRule %>' + it "true when lines contain a erblint:disable comment for rule in ERB" do + offending_lines = '<%# erblint:disable AnchorRule %>' expect(utils.rule_disable_comment_for_lines?("AnchorRule", offending_lines)).to(be(true)) end - it "true lines when lines contain a erblint:disable-line comment for rule in Ruby comment" do + it "true lines when lines contain a erblint:disable comment for rule in Ruby comment" do offending_lines = '<% button = { - role: "img" # erblint:disable-line IncorrectRoleRule + role: "img" # erblint:disable IncorrectRoleRule } %>' expect(utils.rule_disable_comment_for_lines?("IncorrectRoleRule", offending_lines)).to(be(true)) end - it "true lines when lines contain matching erblint:disable-line comment for rule in Ruby comment" do + it "true lines when lines contain matching erblint:disable comment for rule in Ruby comment" do offending_lines = '<% button = { - role: "img" # erblint:disable-line IncorrectRoleRule, AnotherRule + role: "img" # erblint:disable IncorrectRoleRule, AnotherRule } %>' expect(utils.rule_disable_comment_for_lines?("AnotherRule", offending_lines)).to(be(true)) end - it "false when lines contain erblint:disable-line comment that does not contain specified rule" do - offending_lines = '<%# erblint:disable-line AnchorRule %>' + it "false when lines contain erblint:disable comment that does not contain specified rule" do + offending_lines = '<%# erblint:disable AnchorRule %>' expect(utils.rule_disable_comment_for_lines?("AnotherRule", offending_lines)).to(be(false)) end end context "disabled_rules" do it "returns rule in ERB" do - lines = '<%# erblint:disable-line AnchorRule %>' + lines = '<%# erblint:disable AnchorRule %>' expect(utils.disabled_rules(lines)).to(eq("AnchorRule")) end it "returns rules in ERB" do - lines = '<%# erblint:disable-line Rule1, Rule2, Rule3 %>' + lines = '<%# erblint:disable Rule1, Rule2, Rule3 %>' expect(utils.disabled_rules(lines)).to(eq("Rule1, Rule2, Rule3")) end end