From 841f923b5bf56449324ff37377f30eb59028ddff Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 27 Mar 2023 21:40:57 -0400 Subject: [PATCH 01/17] Start migrating `AvoidBothAriaAndAriaDisabled` away from counter --- README.md | 4 +- ... avoid-both-disabled-and-aria-disabled.md} | 0 ... avoid_both_disabled_and_aria_disabled.rb} | 23 ++++------- ...d_both_disabled_and_aria_disabled_test.rb} | 39 +++++++------------ 4 files changed, 24 insertions(+), 42 deletions(-) rename docs/rules/accessibility/{avoid-both-disabled-and-aria-disabled-counter.md => avoid-both-disabled-and-aria-disabled.md} (100%) rename lib/erblint-github/linters/github/accessibility/{avoid_both_disabled_and_aria_disabled_counter.rb => avoid_both_disabled_and_aria_disabled.rb} (60%) rename test/linters/accessibility/{avoid_both_disabled_and_aria_disabled_counter_test.rb => avoid_both_disabled_and_aria_disabled_test.rb} (67%) diff --git a/README.md b/README.md index 70528a8..70ef5f7 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ require "erblint-github/linters" ```yaml --- linters: - GitHub::Accessibility::AvoidBothDisabledAndAriaDisabledCounter: + GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled: enabled: true GitHub::Accessibility::AvoidGenericLinkTextCounter: enabled: true @@ -55,7 +55,7 @@ linters: ## Rules -- [GitHub::Accessibility::AvoidBothDisabledAndAriaDisabledCounter](./docs/rules/accessibility/avoid-both-disabled-and-aria-disabled-counter.md) +- [GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled](./docs/rules/accessibility/avoid-both-disabled-and-aria-disabled.md) - [GitHub::Accessibility::AvoidGenericLinkTextCounter](./docs/rules/accessibility/avoid-generic-link-text-counter.md) - [GitHub::Accessibility::DisabledAttributeCounter](./docs/rules/accessibility/disabled-attribute-counter.md) - [GitHub::Accessibility::LandmarkHasLabelCounter](./docs/rules/accessibility/landmark-has-label-counter.md) diff --git a/docs/rules/accessibility/avoid-both-disabled-and-aria-disabled-counter.md b/docs/rules/accessibility/avoid-both-disabled-and-aria-disabled.md similarity index 100% rename from docs/rules/accessibility/avoid-both-disabled-and-aria-disabled-counter.md rename to docs/rules/accessibility/avoid-both-disabled-and-aria-disabled.md diff --git a/lib/erblint-github/linters/github/accessibility/avoid_both_disabled_and_aria_disabled_counter.rb b/lib/erblint-github/linters/github/accessibility/avoid_both_disabled_and_aria_disabled.rb similarity index 60% rename from lib/erblint-github/linters/github/accessibility/avoid_both_disabled_and_aria_disabled_counter.rb rename to lib/erblint-github/linters/github/accessibility/avoid_both_disabled_and_aria_disabled.rb index 4c33929..56324e7 100644 --- a/lib/erblint-github/linters/github/accessibility/avoid_both_disabled_and_aria_disabled_counter.rb +++ b/lib/erblint-github/linters/github/accessibility/avoid_both_disabled_and_aria_disabled.rb @@ -6,13 +6,18 @@ module ERBLint module Linters module GitHub module Accessibility - class AvoidBothDisabledAndAriaDisabledCounter < Linter + class AvoidBothDisabledAndAriaDisabled < Linter include ERBLint::Linters::CustomHelpers include LinterRegistry ELEMENTS_WITH_NATIVE_DISABLED_ATTRIBUTE_SUPPORT = %w[button fieldset input optgroup option select textarea].freeze MESSAGE = "[aria-disabled] may be used in place of native HTML [disabled] to allow tab-focus on an otherwise ignored element. Setting both attributes is contradictory." + class ConfigSchema < LinterConfig + property :counter_enabled, accepts: [true, false], default: false, reader: :counter_enabled? + end + self.config_schema = ConfigSchema + def run(processed_source) tags(processed_source).each do |tag| next if tag.closing? @@ -22,20 +27,8 @@ def run(processed_source) generate_offense(self.class, processed_source, tag) end - counter_correct?(processed_source) - end - - def autocorrect(processed_source, offense) - return unless offense.context - - lambda do |corrector| - if processed_source.file_content.include?("erblint:counter #{simple_class_name}") - # update the counter if exists - corrector.replace(offense.source_range, offense.context) - else - # add comment with counter if none - corrector.insert_before(processed_source.source_buffer.source_range, "#{offense.context}\n") - end + if @config.counter_enabled? + counter_correct?(processed_source) end end end diff --git a/test/linters/accessibility/avoid_both_disabled_and_aria_disabled_counter_test.rb b/test/linters/accessibility/avoid_both_disabled_and_aria_disabled_test.rb similarity index 67% rename from test/linters/accessibility/avoid_both_disabled_and_aria_disabled_counter_test.rb rename to test/linters/accessibility/avoid_both_disabled_and_aria_disabled_test.rb index b8da83c..84a2e66 100644 --- a/test/linters/accessibility/avoid_both_disabled_and_aria_disabled_counter_test.rb +++ b/test/linters/accessibility/avoid_both_disabled_and_aria_disabled_test.rb @@ -4,7 +4,7 @@ class AvoidBothDisabledAndAriaDisabled < LinterTestCase def linter_class - ERBLint::Linters::GitHub::Accessibility::AvoidBothDisabledAndAriaDisabledCounter + ERBLint::Linters::GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled end ELEMENTS_WITH_NATIVE_DISABLED_ATTRIBUTE_SUPPORT = %w[button fieldset input optgroup option select textarea].freeze @@ -15,7 +15,7 @@ def test_warns_if_both_disabled_and_aria_disabled_set_on_html_elements_with_disa end.join @linter.run(processed_source) - assert_equal @linter.offenses.count, 8 + assert_equal @linter.offenses.count, 7 end def test_does_not_warn_if_only_disabled_attribute_is_set @@ -36,35 +36,24 @@ def test_does_not_warn_if_only_aria_disabled_attribute_is_set assert_empty @linter.offenses end - def test_does_not_raise_when_ignore_comment_with_correct_count - @file = <<~ERB - <%# erblint:counter GitHub::Accessibility::AvoidBothDisabledAndAriaDisabledCounter 1 %> - - ERB - - assert_equal @file, corrected_content + assert_equal @linter.offenses.count, 8 + assert_match(/If you must, add <%# erblint:counter GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled 7 %> to bypass this check/, @linter.offenses.last.message) end - def test_does_autocorrect_when_ignores_are_not_correct + def test_does_not_raise_when_ignore_comment_with_correct_count_if_counter_enabled @file = <<~ERB - - ERB - refute_equal @file, corrected_content - - expected_content = <<~ERB <%# erblint:counter GitHub::Accessibility::AvoidBothDisabledAndAriaDisabledCounter 1 %> - + ERB @linter.config.counter_enabled = true @linter.run(processed_source) From adc20b0636c2a5a806ccac874d7838dd9f34bf70 Mon Sep 17 00:00:00 2001 From: Kate Higa <16447748+khiga8@users.noreply.github.com> Date: Mon, 3 Apr 2023 08:52:50 -0400 Subject: [PATCH 05/17] Migrate link_has_href, landmark_has_label, and disabled_attribute --- README.md | 16 ++-- .../disabled-attribute-counter.md | 2 +- .../landmark-has-label-counter.md | 2 +- .../accessibility/link-has-href-counter.md | 2 +- ...ibute_counter.rb => disabled_attribute.rb} | 11 ++- ...label_counter.rb => landmark_has_label.rb} | 11 ++- ...k_has_href_counter.rb => link_has_href.rb} | 11 ++- .../disabled_attribute_counter_test.rb | 59 --------------- .../accessibility/disabled_attribute_test.rb | 36 +++++++++ .../landmark_has_label_counter_test.rb | 75 ------------------- .../accessibility/landmark_has_label_test.rb | 33 ++++++++ .../link_has_href_counter_test.rb | 59 --------------- .../accessibility/link_has_href_test.rb | 36 +++++++++ 13 files changed, 143 insertions(+), 210 deletions(-) rename lib/erblint-github/linters/github/accessibility/{disabled_attribute_counter.rb => disabled_attribute.rb} (79%) rename lib/erblint-github/linters/github/accessibility/{landmark_has_label_counter.rb => landmark_has_label.rb} (89%) rename lib/erblint-github/linters/github/accessibility/{link_has_href_counter.rb => link_has_href.rb} (79%) delete mode 100644 test/linters/accessibility/disabled_attribute_counter_test.rb create mode 100644 test/linters/accessibility/disabled_attribute_test.rb delete mode 100644 test/linters/accessibility/landmark_has_label_counter_test.rb create mode 100644 test/linters/accessibility/landmark_has_label_test.rb delete mode 100644 test/linters/accessibility/link_has_href_counter_test.rb create mode 100644 test/linters/accessibility/link_has_href_test.rb diff --git a/README.md b/README.md index e08d6c6..9cc982f 100644 --- a/README.md +++ b/README.md @@ -27,15 +27,15 @@ linters: enabled: true GitHub::Accessibility::AvoidGenericLinkTextCounter: enabled: true - GitHub::Accessibility::DisabledAttributeCounter: + GitHub::Accessibility::DisabledAttribute: enabled: true GitHub::Accessibility::IframeHasTitleCounter: enabled: true GitHub::Accessibility::ImageHasAltCounter: enabled: true - GitHub::Accessibility::LandmarkHasLabelCounter: + GitHub::Accessibility::LandmarkHasLabel: enabled: true - GitHub::Accessibility::LinkHasHrefCounter: + GitHub::Accessibility::LinkHasHref: enabled: true GitHub::Accessibility::NestedInteractiveElementsCounter: enabled: true @@ -57,9 +57,9 @@ linters: - [GitHub::Accessibility::AvoidBothDisabledAndAriaDisabledCounter](./docs/rules/accessibility/avoid-both-disabled-and-aria-disabled.md) - [GitHub::Accessibility::AvoidGenericLinkTextCounter](./docs/rules/accessibility/avoid-generic-link-text-counter.md) -- [GitHub::Accessibility::DisabledAttributeCounter](./docs/rules/accessibility/disabled-attribute-counter.md) -- [GitHub::Accessibility::LandmarkHasLabelCounter](./docs/rules/accessibility/landmark-has-label-counter.md) -- [GitHub::Accessibility::LinkHasHrefCounter](./docs/rules/accessibility/link-has-href-counter.md) +- [GitHub::Accessibility::DisabledAttribute](./docs/rules/accessibility/disabled-attribute.md) +- [GitHub::Accessibility::LandmarkHasLabel](./docs/rules/accessibility/landmark-has-label.md) +- [GitHub::Accessibility::LinkHasHref](./docs/rules/accessibility/link-has-href.md) - [GitHub::Accessibility::NestedInteractiveElementsCounter](./docs/rules/accessibility/nested-interactive-elements-counter.md) - [GitHub::Accessibility::IframeHasTitleCounter](./docs/rules/accessibility/iframe-has-title-counter.md) - [GitHub::Accessibility::ImageHasAltCounter](./docs/rules/accessibility/image-has-alt-counter.md) @@ -79,10 +79,10 @@ _This is an experimental feature which should ideally be upstreamed to erblint_ Rules that are marked as `Counter` can be disabled by adding a comment with the offense count that matches the number of offenses within the file like: ```.html.erb -<%# erblint:counter GitHub::Accessibility::LinkHasHrefCounter 1 %> +<%# erblint:counter GitHub::Accessibility::LinkHasHref 1 %> ``` -In this comment example, when a new `LinkHasHrefCounter` offense has been added, the counter will need to be bumped up to 2. More recent rules use a `Counter` format. +In this comment example, when a new `LinkHasHref` offense has been added, the counter will need to be bumped up to 2. More recent rules use a `Counter` format. If you are enabling a rule for the first time and your codebase has a lot of offenses, you can use the `-a` command to automatically add these counter comments in the appropriate places. diff --git a/docs/rules/accessibility/disabled-attribute-counter.md b/docs/rules/accessibility/disabled-attribute-counter.md index 84fa789..e726446 100644 --- a/docs/rules/accessibility/disabled-attribute-counter.md +++ b/docs/rules/accessibility/disabled-attribute-counter.md @@ -1,4 +1,4 @@ -# Disabled attribute counter +# Disabled attribute ## Rule Details diff --git a/docs/rules/accessibility/landmark-has-label-counter.md b/docs/rules/accessibility/landmark-has-label-counter.md index 46f6011..6b6856f 100644 --- a/docs/rules/accessibility/landmark-has-label-counter.md +++ b/docs/rules/accessibility/landmark-has-label-counter.md @@ -1,4 +1,4 @@ -# Landmark Has Label Counter +# Landmark Has Label ## Rule Details diff --git a/docs/rules/accessibility/link-has-href-counter.md b/docs/rules/accessibility/link-has-href-counter.md index e902dd9..433e382 100644 --- a/docs/rules/accessibility/link-has-href-counter.md +++ b/docs/rules/accessibility/link-has-href-counter.md @@ -1,4 +1,4 @@ -# Link Has Href counter +# Link Has Href ## Rule Details diff --git a/lib/erblint-github/linters/github/accessibility/disabled_attribute_counter.rb b/lib/erblint-github/linters/github/accessibility/disabled_attribute.rb similarity index 79% rename from lib/erblint-github/linters/github/accessibility/disabled_attribute_counter.rb rename to lib/erblint-github/linters/github/accessibility/disabled_attribute.rb index 4e2de42..3e16dc7 100644 --- a/lib/erblint-github/linters/github/accessibility/disabled_attribute_counter.rb +++ b/lib/erblint-github/linters/github/accessibility/disabled_attribute.rb @@ -6,13 +6,18 @@ module ERBLint module Linters module GitHub module Accessibility - class DisabledAttributeCounter < Linter + class DisabledAttribute < Linter include ERBLint::Linters::CustomHelpers include LinterRegistry VALID_DISABLED_TAGS = %w[button input textarea option select fieldset optgroup task-lists].freeze MESSAGE = "`disabled` is only valid on #{VALID_DISABLED_TAGS.join(', ')}." + class ConfigSchema < LinterConfig + property :counter_enabled, accepts: [true, false], default: false, reader: :counter_enabled? + end + self.config_schema = ConfigSchema + def run(processed_source) tags(processed_source).each do |tag| next if tag.closing? @@ -22,7 +27,9 @@ def run(processed_source) generate_offense(self.class, processed_source, tag) end - counter_correct?(processed_source) + if @config.counter_enabled? + counter_correct?(processed_source) + end end def autocorrect(processed_source, offense) diff --git a/lib/erblint-github/linters/github/accessibility/landmark_has_label_counter.rb b/lib/erblint-github/linters/github/accessibility/landmark_has_label.rb similarity index 89% rename from lib/erblint-github/linters/github/accessibility/landmark_has_label_counter.rb rename to lib/erblint-github/linters/github/accessibility/landmark_has_label.rb index b67ca22..af3b96a 100644 --- a/lib/erblint-github/linters/github/accessibility/landmark_has_label_counter.rb +++ b/lib/erblint-github/linters/github/accessibility/landmark_has_label.rb @@ -6,7 +6,7 @@ module ERBLint module Linters module GitHub module Accessibility - class LandmarkHasLabelCounter < Linter + class LandmarkHasLabel < Linter include ERBLint::Linters::CustomHelpers include LinterRegistry @@ -36,6 +36,11 @@ def get_additional_message(tag, roles) end end + class ConfigSchema < LinterConfig + property :counter_enabled, accepts: [true, false], default: false, reader: :counter_enabled? + end + self.config_schema = ConfigSchema + def run(processed_source) tags(processed_source).each do |tag| next if tag.closing? @@ -52,7 +57,9 @@ def run(processed_source) end end - counter_correct?(processed_source) + if @config.counter_enabled? + counter_correct?(processed_source) + end end def autocorrect(processed_source, offense) diff --git a/lib/erblint-github/linters/github/accessibility/link_has_href_counter.rb b/lib/erblint-github/linters/github/accessibility/link_has_href.rb similarity index 79% rename from lib/erblint-github/linters/github/accessibility/link_has_href_counter.rb rename to lib/erblint-github/linters/github/accessibility/link_has_href.rb index 47d1698..8e3e7b4 100644 --- a/lib/erblint-github/linters/github/accessibility/link_has_href_counter.rb +++ b/lib/erblint-github/linters/github/accessibility/link_has_href.rb @@ -6,12 +6,17 @@ module ERBLint module Linters module GitHub module Accessibility - class LinkHasHrefCounter < Linter + class LinkHasHref < Linter include ERBLint::Linters::CustomHelpers include LinterRegistry MESSAGE = "Links should go somewhere, you probably want to use a `" - @linter.run(processed_source) - - assert_empty @linter.offenses - end - - def test_does_not_warn_if_link_has_href_attribute_and_has_correct_counter_comment - @file = <<~ERB - <%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 1 %> - Go to GitHub - ERB - @linter.run(processed_source) - - assert_equal 0, @linter.offenses.count - end - - def test_does_not_autocorrect_when_ignores_are_correct - @file = <<~ERB - <%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 1 %> - Go to GitHub - ERB - - assert_equal @file, corrected_content - end - - def test_does_autocorrect_when_ignores_are_not_correct - @file = <<~ERB - <%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 3 %> - Go to GitHub - ERB - refute_equal @file, corrected_content - - expected_content = <<~ERB - <%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 1 %> - Go to GitHub - ERB - assert_equal expected_content, corrected_content - end -end diff --git a/test/linters/accessibility/disabled_attribute_test.rb b/test/linters/accessibility/disabled_attribute_test.rb new file mode 100644 index 0000000..fd76478 --- /dev/null +++ b/test/linters/accessibility/disabled_attribute_test.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require "test_helper" + +class DisabledAttribute < LinterTestCase + def linter_class + ERBLint::Linters::GitHub::Accessibility::DisabledAttribute + end + + def test_warns_if_invalid_element_has_disabled_attribute + @file = "Go to GitHub" + @linter.run(processed_source) + + assert_equal(1, @linter.offenses.count) + error_messages = @linter.offenses.map(&:message).sort + assert_match(/`disabled` is only valid on button, input, textarea, option, select, fieldset, optgroup, task-lists./, error_messages.last) + end + + def test_does_not_warn_if_valid_element_has_disabled_attribute + @file = "" + @linter.run(processed_source) + + assert_empty @linter.offenses + end + + def test_does_not_warn_if_link_has_href_attribute_and_has_correct_counter_comment + @file = <<~ERB + <%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 1 %> + Go to GitHub + ERB + @linter.config.counter_enabled = true + @linter.run(processed_source) + + assert_equal 0, @linter.offenses.count + end +end diff --git a/test/linters/accessibility/landmark_has_label_counter_test.rb b/test/linters/accessibility/landmark_has_label_counter_test.rb deleted file mode 100644 index 3fe56e9..0000000 --- a/test/linters/accessibility/landmark_has_label_counter_test.rb +++ /dev/null @@ -1,75 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class LandmarkHasLabelCounter < LinterTestCase - def linter_class - ERBLint::Linters::GitHub::Accessibility::LandmarkHasLabelCounter - end - - def test_warns_if_landmark_has_no_label - @file = <<~ERB -
-

This is a text

-
- ERB - @linter.run(processed_source) - - assert_equal(2, @linter.offenses.count) - error_messages = @linter.offenses.map(&:message).sort - assert_match(/If you must, add <%# erblint:counter GitHub::Accessibility::LandmarkHasLabelCounter 1 %> to bypass this check./, error_messages.first) - assert_match(/Landmark elements should have an aria-label attribute, or aria-labelledby if a heading elements exists in the landmark./, error_messages.last) - end - - def test_does_not_warn_if_landmark_has_label - @file = <<~ERB -
-

This is a text

-
- ERB - @linter.run(processed_source) - - assert_empty @linter.offenses - end - - def test_does_not_warn_if_landmark_has_label_and_has_correct_counter_comment - @file = <<~ERB - <%# erblint:counter GitHub::Accessibility::LandmarkHasLabelCounter 1 %> -
-

This is a text

-
- ERB - @linter.run(processed_source) - - assert_equal 0, @linter.offenses.count - end - - def test_does_not_autocorrect_when_ignores_are_correct - @file = <<~ERB - <%# erblint:counter GitHub::Accessibility::LandmarkHasLabelCounter 1 %> -
-

This is a text

-
- ERB - - assert_equal @file, corrected_content - end - - def test_does_autocorrect_when_ignores_are_not_correct - @file = <<~ERB - <%# erblint:counter GitHub::Accessibility::LandmarkHasLabelCounter 3 %> -
-

This is a text

-
- ERB - refute_equal @file, corrected_content - - expected_content = <<~ERB - <%# erblint:counter GitHub::Accessibility::LandmarkHasLabelCounter 1 %> -
-

This is a text

-
- ERB - assert_equal expected_content, corrected_content - end -end diff --git a/test/linters/accessibility/landmark_has_label_test.rb b/test/linters/accessibility/landmark_has_label_test.rb new file mode 100644 index 0000000..431c22c --- /dev/null +++ b/test/linters/accessibility/landmark_has_label_test.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require "test_helper" + +class LandmarkHasLabel < LinterTestCase + def linter_class + ERBLint::Linters::GitHub::Accessibility::LandmarkHasLabel + end + + def test_warns_if_landmark_has_no_label + @file = <<~ERB +
+

This is a text

+
+ ERB + @linter.run(processed_source) + + assert_equal(1, @linter.offenses.count) + error_messages = @linter.offenses.map(&:message).sort + assert_match(/Landmark elements should have an aria-label attribute, or aria-labelledby if a heading elements exists in the landmark./, error_messages.last) + end + + def test_does_not_warn_if_landmark_has_label + @file = <<~ERB +
+

This is a text

+
+ ERB + @linter.run(processed_source) + + assert_empty @linter.offenses + end +end diff --git a/test/linters/accessibility/link_has_href_counter_test.rb b/test/linters/accessibility/link_has_href_counter_test.rb deleted file mode 100644 index db6066d..0000000 --- a/test/linters/accessibility/link_has_href_counter_test.rb +++ /dev/null @@ -1,59 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class LinkHasHrefCounter < LinterTestCase - def linter_class - ERBLint::Linters::GitHub::Accessibility::LinkHasHrefCounter - end - - def test_warns_if_link_has_no_href_attribute - @file = "Go to GitHub" - @linter.run(processed_source) - - assert_equal(2, @linter.offenses.count) - error_messages = @linter.offenses.map(&:message).sort - assert_match(/If you must, add <%# erblint:counter GitHub::Accessibility::LinkHasHrefCounter 1 %> to bypass this check./, error_messages.first) - assert_match(/Links should go somewhere, you probably want to use a `