diff --git a/Gemfile.lock b/Gemfile.lock index 25a3d46..9040dca 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - erblint-github (0.1.3) + erblint-github (0.2.0) GEM remote: https://rubygems.org/ diff --git a/README.md b/README.md index 70528a8..af7e20a 100644 --- a/README.md +++ b/README.md @@ -23,56 +23,56 @@ require "erblint-github/linters" ```yaml --- linters: - GitHub::Accessibility::AvoidBothDisabledAndAriaDisabledCounter: + GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled: enabled: true - GitHub::Accessibility::AvoidGenericLinkTextCounter: + GitHub::Accessibility::AvoidGenericLinkText: enabled: true - GitHub::Accessibility::DisabledAttributeCounter: + GitHub::Accessibility::DisabledAttribute: enabled: true - GitHub::Accessibility::IframeHasTitleCounter: + GitHub::Accessibility::IframeHasTitle: enabled: true - GitHub::Accessibility::ImageHasAltCounter: + GitHub::Accessibility::ImageHasAlt: enabled: true - GitHub::Accessibility::LandmarkHasLabelCounter: + GitHub::Accessibility::LandmarkHasLabel: enabled: true - GitHub::Accessibility::LinkHasHrefCounter: + GitHub::Accessibility::LinkHasHref: enabled: true - GitHub::Accessibility::NestedInteractiveElementsCounter: + GitHub::Accessibility::NestedInteractiveElements: enabled: true - GitHub::Accessibility::NoAriaHiddenOnFocusableCounter: + GitHub::Accessibility::NoAriaHiddenOnFocusable: enabled: true - GitHub::Accessibility::NoAriaLabelMisuseCounter: + GitHub::Accessibility::NoAriaLabelMisuse: enabled: true - GitHub::Accessibility::NoPositiveTabIndexCounter: + GitHub::Accessibility::NoPositiveTabIndex: enabled: true - GitHub::Accessibility::NoRedundantImageAltCounter: + GitHub::Accessibility::NoRedundantImageAlt: enabled: true - GitHub::Accessibility::NoTitleAttributeCounter: + GitHub::Accessibility::NoTitleAttribute: enabled: true - GitHub::Accessibility::SvgHasAccessibleTextCounter: + GitHub::Accessibility::SvgHasAccessibleText: enabled: true ``` ## Rules -- [GitHub::Accessibility::AvoidBothDisabledAndAriaDisabledCounter](./docs/rules/accessibility/avoid-both-disabled-and-aria-disabled-counter.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::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) -- [GitHub::Accessibility::NoAriaHiddenOnFocusableCounter](./docs/rules/accessibility/no-aria-hidden-on-focusable-counter.md) -- [GitHub::Accessibility::NoAriaLabelMisuseCounter](./docs/rules/accessibility/no-aria-label-misuse-counter.md) -- [GitHub::Accessibility::NoPositiveTabIndexCounter](./docs/rules/accessibility/no-positive-tab-index-counter.md) -- [GitHub::Accessibility::NoRedundantImageAltCounter](./docs/rules/accessibility/no-redundant-image-alt-counter.md) -- [GitHub::Accessibility::NoTitleAttributeCounter](./docs/rules/accessibility/no-title-attribute-counter.md) -- [GitHub::Accessibility::SvgHasAccessibleTextCounter](./docs/rules/accessibility/svg-has-accessible-text-counter.md) - -## Disabling a rule (experimental) - -_This is an experimental feature which should ideally be upstreamed to erblint_ +- [GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled](./docs/rules/accessibility/avoid-both-disabled-and-aria-disabled.md) +- [GitHub::Accessibility::AvoidGenericLinkText](./docs/rules/accessibility/avoid-generic-link-text.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::NestedInteractiveElements](./docs/rules/accessibility/nested-interactive-elements.md) +- [GitHub::Accessibility::IframeHasTitle](./docs/rules/accessibility/iframe-has-title.md) +- [GitHub::Accessibility::ImageHasAlt](./docs/rules/accessibility/image-has-alt.md) +- [GitHub::Accessibility::NoAriaHiddenOnFocusable](./docs/rules/accessibility/no-aria-hidden-on-focusable.md) +- [GitHub::Accessibility::NoAriaLabelMisuse](./docs/rules/accessibility/no-aria-label-misuse.md) +- [GitHub::Accessibility::NoPositiveTabIndex](./docs/rules/accessibility/no-positive-tab-index.md) +- [GitHub::Accessibility::NoRedundantImageAlt](./docs/rules/accessibility/no-redundant-image-alt.md) +- [GitHub::Accessibility::NoTitleAttribute](./docs/rules/accessibility/no-title-attribute.md) +- [GitHub::Accessibility::SvgHasAccessibleText](./docs/rules/accessibility/svg-has-accessible-text.md) + +## Disabling a rule (Deprecated) + +_This is a soon-to-be deprecated feature. Do not use. See [migration guide](./docs/counter-migration-guide.md)_ `erblint` does not natively support rule disables. At GitHub, we've implemented these rules in a way to allow rules to be disabled at an offense-level via counters or disabled at a file-level because often times, we want to enable a rule but aren't able to address all offenses at once. We achieve this in one of two ways. @@ -82,7 +82,7 @@ Rules that are marked as `Counter` can be disabled by adding a comment with the <%# erblint:counter GitHub::Accessibility::LinkHasHrefCounter 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/counter-migration-guide.md b/docs/counter-migration-guide.md new file mode 100644 index 0000000..8733cea --- /dev/null +++ b/docs/counter-migration-guide.md @@ -0,0 +1,62 @@ +# Counter migration guide + +[ERBLint v0.4.0](https://github.com/Shopify/erb-lint/releases/tag/v0.4.0) introduces support for inline lint rule disables. + +Since an inline disable feature is now natively available, it is time to move away from the in-house (hacky) counter system we've used internally over the years and in this library. 🎉 + +Our latest `erblint-github` release removes the `-Counter` prefix from all of the lint rules. Please update your `.erb-lint.yml` accordingly. + +If your configuration looks something like: + +```yaml +--- +linters: + GitHub::Accessibility::AvoidBothDisabledAndAriaCounter: + enabled: true + GitHub::Accessibility::AvoidGenericLinkTextCounter: + enabled: true + GitHub::Accessibility::DisabledAttributeCounter: + enabled: true +``` + +It should become the following, with `-Counter` removed to make sure the rules run correctly. + +```yaml +--- +linters: + GitHub::Accessibility::AvoidBothDisabledAndAria: + enabled: true + GitHub::Accessibility::AvoidGenericLinkText: + enabled: true + GitHub::Accessibility::DisabledAttribute: + enabled: true +``` + +## Easing migration + +In order to ease migration for codebases where counter comments are in place (especially large codebases), we will continue to support counters for existing lint rules for a few releases until we deprecate it completely. This should allow you to migrate rules one-by-one, rather than all at once. + +With this release, the counter system will now be toggled off by default, so please explicitly enable them in your `.erb-lint.yml` config if you would like to enable counters. + +```yaml +--- +linters: + GitHub::Accessibility::AvoidBothDisabledAndAria: + enabled: true + counter_enabled: true + GitHub::Accessibility::AvoidGenericLinkText: + enabled: true + counter_enabled: true +``` + +With this `counter_enabled: true` config, your counter comments like `<%# erblint:counter GitHub::Accessibility::AvoidBothDisabledAndAriaCounter 1` should work as it did before. + +However, we will drop support for the counter system within the next few releases so please take time to migrate your counter comments to native inline disable comments. Any new rules added to this library will not support the counter system. + +Once your files do not have any counter comments, remove the `counter_enabled: true` from your configuration to ensure no new ones are added. + +## Automate migration + +Adding inline disables for large codebases can be extremely tedious. We recommend using a script to automate this process. + + 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/docs/rules/accessibility/avoid-generic-link-text-counter.md b/docs/rules/accessibility/avoid-generic-link-text.md similarity index 100% rename from docs/rules/accessibility/avoid-generic-link-text-counter.md rename to docs/rules/accessibility/avoid-generic-link-text.md diff --git a/docs/rules/accessibility/disabled-attribute-counter.md b/docs/rules/accessibility/disabled-attribute.md similarity index 94% rename from docs/rules/accessibility/disabled-attribute-counter.md rename to docs/rules/accessibility/disabled-attribute.md index 84fa789..e726446 100644 --- a/docs/rules/accessibility/disabled-attribute-counter.md +++ b/docs/rules/accessibility/disabled-attribute.md @@ -1,4 +1,4 @@ -# Disabled attribute counter +# Disabled attribute ## Rule Details diff --git a/docs/rules/accessibility/iframe-has-title-counter.md b/docs/rules/accessibility/iframe-has-title.md similarity index 100% rename from docs/rules/accessibility/iframe-has-title-counter.md rename to docs/rules/accessibility/iframe-has-title.md diff --git a/docs/rules/accessibility/image-has-alt-counter.md b/docs/rules/accessibility/image-has-alt.md similarity index 100% rename from docs/rules/accessibility/image-has-alt-counter.md rename to docs/rules/accessibility/image-has-alt.md diff --git a/docs/rules/accessibility/landmark-has-label-counter.md b/docs/rules/accessibility/landmark-has-label.md similarity index 94% rename from docs/rules/accessibility/landmark-has-label-counter.md rename to docs/rules/accessibility/landmark-has-label.md index 46f6011..6b6856f 100644 --- a/docs/rules/accessibility/landmark-has-label-counter.md +++ b/docs/rules/accessibility/landmark-has-label.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.md similarity index 96% rename from docs/rules/accessibility/link-has-href-counter.md rename to docs/rules/accessibility/link-has-href.md index e902dd9..433e382 100644 --- a/docs/rules/accessibility/link-has-href-counter.md +++ b/docs/rules/accessibility/link-has-href.md @@ -1,4 +1,4 @@ -# Link Has Href counter +# Link Has Href ## Rule Details diff --git a/docs/rules/accessibility/nested-interactive-elements-counter.md b/docs/rules/accessibility/nested-interactive-elements.md similarity index 95% rename from docs/rules/accessibility/nested-interactive-elements-counter.md rename to docs/rules/accessibility/nested-interactive-elements.md index 931433a..fe1306c 100644 --- a/docs/rules/accessibility/nested-interactive-elements-counter.md +++ b/docs/rules/accessibility/nested-interactive-elements.md @@ -1,4 +1,4 @@ -# Nested Interactive Elements Counter +# Nested Interactive Elements ## Rule Details diff --git a/docs/rules/accessibility/no-aria-hidden-on-focusable-counter.md b/docs/rules/accessibility/no-aria-hidden-on-focusable.md similarity index 96% rename from docs/rules/accessibility/no-aria-hidden-on-focusable-counter.md rename to docs/rules/accessibility/no-aria-hidden-on-focusable.md index 1d53513..cf7ca27 100644 --- a/docs/rules/accessibility/no-aria-hidden-on-focusable-counter.md +++ b/docs/rules/accessibility/no-aria-hidden-on-focusable.md @@ -1,4 +1,4 @@ -# No aria-hidden on focusable counter +# No aria-hidden on focusable ## Rule Details diff --git a/docs/rules/accessibility/no-aria-label-misuse-counter.md b/docs/rules/accessibility/no-aria-label-misuse.md similarity index 98% rename from docs/rules/accessibility/no-aria-label-misuse-counter.md rename to docs/rules/accessibility/no-aria-label-misuse.md index 9437d08..f339cfe 100644 --- a/docs/rules/accessibility/no-aria-label-misuse-counter.md +++ b/docs/rules/accessibility/no-aria-label-misuse.md @@ -1,4 +1,4 @@ -# No aria label misuse counter +# No aria label misuse ## Rule Details diff --git a/docs/rules/accessibility/no-positive-tab-index-counter.md b/docs/rules/accessibility/no-positive-tab-index.md similarity index 100% rename from docs/rules/accessibility/no-positive-tab-index-counter.md rename to docs/rules/accessibility/no-positive-tab-index.md diff --git a/docs/rules/accessibility/no-redundant-image-alt-counter.md b/docs/rules/accessibility/no-redundant-image-alt.md similarity index 100% rename from docs/rules/accessibility/no-redundant-image-alt-counter.md rename to docs/rules/accessibility/no-redundant-image-alt.md diff --git a/docs/rules/accessibility/no-title-attribute-counter.md b/docs/rules/accessibility/no-title-attribute.md similarity index 98% rename from docs/rules/accessibility/no-title-attribute-counter.md rename to docs/rules/accessibility/no-title-attribute.md index 3bab99c..17efd86 100644 --- a/docs/rules/accessibility/no-title-attribute-counter.md +++ b/docs/rules/accessibility/no-title-attribute.md @@ -1,4 +1,4 @@ -# No title attribute counter +# No title attribute ## Rule Details diff --git a/docs/rules/accessibility/svg-has-accessible-text-counter.md b/docs/rules/accessibility/svg-has-accessible-text.md similarity index 96% rename from docs/rules/accessibility/svg-has-accessible-text-counter.md rename to docs/rules/accessibility/svg-has-accessible-text.md index c117c7d..4873e6c 100644 --- a/docs/rules/accessibility/svg-has-accessible-text-counter.md +++ b/docs/rules/accessibility/svg-has-accessible-text.md @@ -1,4 +1,4 @@ -# SVG has accessible text counter +# SVG has accessible text ## Rule Details diff --git a/erblint-github.gemspec b/erblint-github.gemspec index 0089120..0930369 100644 --- a/erblint-github.gemspec +++ b/erblint-github.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |s| s.name = "erblint-github" - s.version = "0.1.3" + s.version = "0.2.0" s.summary = "erblint GitHub" s.description = "Template style checking for GitHub Ruby repositories" s.homepage = "https://github.com/github/erblint-github" 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/lib/erblint-github/linters/github/accessibility/avoid_generic_link_text_counter.rb b/lib/erblint-github/linters/github/accessibility/avoid_generic_link_text.rb similarity index 89% rename from lib/erblint-github/linters/github/accessibility/avoid_generic_link_text_counter.rb rename to lib/erblint-github/linters/github/accessibility/avoid_generic_link_text.rb index 5f92921..9d24c6b 100644 --- a/lib/erblint-github/linters/github/accessibility/avoid_generic_link_text_counter.rb +++ b/lib/erblint-github/linters/github/accessibility/avoid_generic_link_text.rb @@ -6,7 +6,7 @@ module ERBLint module Linters module GitHub module Accessibility - class AvoidGenericLinkTextCounter < Linter + class AvoidGenericLinkText < Linter include ERBLint::Linters::CustomHelpers include LinterRegistry @@ -22,6 +22,11 @@ class AvoidGenericLinkTextCounter < Linter MESSAGE = "Avoid using generic link text such as #{BANNED_GENERIC_TEXT.join(', ')} which do not make sense in isolation." + class ConfigSchema < LinterConfig + property :counter_enabled, accepts: [true, false], default: false, reader: :counter_enabled? + end + self.config_schema = ConfigSchema + def run(processed_source) processed_source.ast.children.each_with_index do |node, index| next unless node.methods.include?(:type) && node.type == :text @@ -93,20 +98,8 @@ def run(processed_source) banned_text = nil end 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 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 56% 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..6ad9fda 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,23 @@ 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 + + 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 +32,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/lib/erblint-github/linters/github/accessibility/iframe_has_title_counter.rb b/lib/erblint-github/linters/github/accessibility/iframe_has_title.rb similarity index 61% rename from lib/erblint-github/linters/github/accessibility/iframe_has_title_counter.rb rename to lib/erblint-github/linters/github/accessibility/iframe_has_title.rb index 8f35507..74af566 100644 --- a/lib/erblint-github/linters/github/accessibility/iframe_has_title_counter.rb +++ b/lib/erblint-github/linters/github/accessibility/iframe_has_title.rb @@ -6,13 +6,18 @@ module ERBLint module Linters module GitHub module Accessibility - class IframeHasTitleCounter < Linter + class IframeHasTitle < Linter include ERBLint::Linters::CustomHelpers include LinterRegistry MESSAGE = "`