Skip to content

Commit ba77a1d

Browse files
author
Adrián Bolonio
authored
Merge pull request #39 from github/accessibility/issues/1293/migrate-a11y-erblint-rule-a11y-disabled-attribute
Migrate accessibility rule `a11y_disabled_attribute` from dotcom to erblint-github
2 parents 4565b54 + 0c4ee0a commit ba77a1d

File tree

4 files changed

+131
-0
lines changed

4 files changed

+131
-0
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ linters:
2727
enabled: true
2828
GitHub::Accessibility::AvoidGenericLinkTextCounter:
2929
enabled: true
30+
GitHub::Accessibility::DisabledAttributeCounter:
31+
enabled: true
3032
GitHub::Accessibility::IframeHasTitle:
3133
enabled: true
3234
GitHub::Accessibility::ImageHasAlt:
@@ -47,6 +49,7 @@ linters:
4749
4850
- [GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled](./docs/rules/accessibility/avoid-both-disabled-and-aria-disabled.md)
4951
- [GitHub::Accessibility::AvoidGenericLinkTextCounter](./docs/rules/accessibility/avoid-generic-link-text-counter.md)
52+
- [GitHub::Accessibility::DisabledAttributeCounter](./docs/rules/accessibility/disabled-attribute-counter-test)
5053
- [GitHub::Accessibility::IframeHasTitle](./docs/rules/accessibility/iframe-has-title.md)
5154
- [GitHub::Accessibility::ImageHasAlt](./docs/rules/accessibility/image-has-alt.md)
5255
- [GitHub::Accessibility::LinkHasHrefCounter](./docs/rules/accessibility/link_has_href-counter.md)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Disabled attribute counter
2+
3+
## Rule Details
4+
5+
The attribute `disabled` is only valid on the following elements: button, input, textarea, option, select, fieldset, optgroup, task-lists.
6+
7+
## Resources
8+
9+
- [HTML attribute: `disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled)
10+
11+
## Examples
12+
### **Incorrect** code for this rule 👎
13+
14+
```erb
15+
<!-- incorrect -->
16+
<a href='https://github.com/' disabled>Go to GitHub</a>
17+
```
18+
19+
### **Correct** code for this rule 👍
20+
21+
```erb
22+
<!-- correct -->
23+
<button disabled>Continue</button>
24+
```
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "../../custom_helpers"
4+
5+
module ERBLint
6+
module Linters
7+
module GitHub
8+
module Accessibility
9+
class DisabledAttributeCounter < Linter
10+
include ERBLint::Linters::CustomHelpers
11+
include LinterRegistry
12+
13+
VALID_DISABLED_TAGS = %w[button input textarea option select fieldset optgroup task-lists].freeze
14+
MESSAGE = "`disabled` is only valid on #{VALID_DISABLED_TAGS.join(', ')}."
15+
16+
def run(processed_source)
17+
tags(processed_source).each do |tag|
18+
next if tag.closing?
19+
next if VALID_DISABLED_TAGS.include?(tag.name)
20+
next if tag.attributes["disabled"].nil?
21+
22+
generate_offense(self.class, processed_source, tag)
23+
end
24+
25+
counter_correct?(processed_source)
26+
end
27+
28+
def autocorrect(processed_source, offense)
29+
return unless offense.context
30+
31+
lambda do |corrector|
32+
if processed_source.file_content.include?("erblint:counter #{simple_class_name}")
33+
# update the counter if exists
34+
corrector.replace(offense.source_range, offense.context)
35+
else
36+
# add comment with counter if none
37+
corrector.insert_before(processed_source.source_buffer.source_range, "#{offense.context}\n")
38+
end
39+
end
40+
end
41+
end
42+
end
43+
end
44+
end
45+
end
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
class DisabledAttributeCounter < LinterTestCase
6+
def linter_class
7+
ERBLint::Linters::GitHub::Accessibility::DisabledAttributeCounter
8+
end
9+
10+
def test_warns_if_invalid_element_has_disabled_attribute
11+
@file = "<a href='https://github.com/' disabled>Go to GitHub</a>"
12+
@linter.run(processed_source)
13+
14+
assert_equal(2, @linter.offenses.count)
15+
error_messages = @linter.offenses.map(&:message).sort
16+
assert_match(/If you must, add <%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 1 %> to bypass this check./, error_messages.first)
17+
assert_match(/`disabled` is only valid on button, input, textarea, option, select, fieldset, optgroup, task-lists./, error_messages.last)
18+
end
19+
20+
def test_does_not_warn_if_valid_element_has_disabled_attribute
21+
@file = "<button disabled>Continue</button>"
22+
@linter.run(processed_source)
23+
24+
assert_empty @linter.offenses
25+
end
26+
27+
def test_does_not_warn_if_link_has_href_attribute_and_has_correct_counter_comment
28+
@file = <<~ERB
29+
<%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 1 %>
30+
<a href='https://github.com/' disabled>Go to GitHub</a>
31+
ERB
32+
@linter.run(processed_source)
33+
34+
assert_equal 0, @linter.offenses.count
35+
end
36+
37+
def test_does_not_autocorrect_when_ignores_are_correct
38+
@file = <<~ERB
39+
<%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 1 %>
40+
<a href='https://github.com/' disabled>Go to GitHub</a>
41+
ERB
42+
43+
assert_equal @file, corrected_content
44+
end
45+
46+
def test_does_autocorrect_when_ignores_are_not_correct
47+
@file = <<~ERB
48+
<%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 3 %>
49+
<a href='https://github.com/' disabled>Go to GitHub</a>
50+
ERB
51+
refute_equal @file, corrected_content
52+
53+
expected_content = <<~ERB
54+
<%# erblint:counter GitHub::Accessibility::DisabledAttributeCounter 1 %>
55+
<a href='https://github.com/' disabled>Go to GitHub</a>
56+
ERB
57+
assert_equal expected_content, corrected_content
58+
end
59+
end

0 commit comments

Comments
 (0)