From ed7a718071cca07eb2ed3fb8c21358f39d30c15f Mon Sep 17 00:00:00 2001
From: Kate Higa <16447748+khiga8@users.noreply.github.com>
Date: Wed, 5 Apr 2023 20:55:56 -0400
Subject: [PATCH 1/9] Add new rule to flag downcased aria-label
---
README.md | 3 +
.../aria_label_is_well_formatted.rb | 37 +++++++++++
.../aria_label_is_well_formatted_test.rb | 62 +++++++++++++++++++
3 files changed, 102 insertions(+)
create mode 100644 lib/erblint-github/linters/github/accessibility/aria_label_is_well_formatted.rb
create mode 100644 test/linters/accessibility/aria_label_is_well_formatted_test.rb
diff --git a/README.md b/README.md
index af7e20a..0e1bdb2 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,8 @@ require "erblint-github/linters"
```yaml
---
linters:
+ GitHub::Accessibility::AriaLabelIsWellFormatted:
+ enabled: true
GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled:
enabled: true
GitHub::Accessibility::AvoidGenericLinkText:
@@ -55,6 +57,7 @@ linters:
## Rules
+- [GitHub::Accessibility::AriaLabelIsWellFormatted](./docs/rules/accessibility/aria-label-is-well-formatted.md)
- [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)
diff --git a/lib/erblint-github/linters/github/accessibility/aria_label_is_well_formatted.rb b/lib/erblint-github/linters/github/accessibility/aria_label_is_well_formatted.rb
new file mode 100644
index 0000000..4f9073f
--- /dev/null
+++ b/lib/erblint-github/linters/github/accessibility/aria_label_is_well_formatted.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require_relative "../../custom_helpers"
+
+module ERBLint
+ module Linters
+ module GitHub
+ module Accessibility
+ class AriaLabelIsWellFormatted < Linter
+ include ERBLint::Linters::CustomHelpers
+ include LinterRegistry
+
+ MESSAGE = "[aria-label] text should be formatted the same as you would visual text. Use sentence case."
+
+ class ConfigSchema < LinterConfig
+ property :exceptions, accepts: array_of?(String),
+ default: -> { [] }
+ end
+ self.config_schema = ConfigSchema
+
+ def run(processed_source)
+ tags(processed_source).each do |tag|
+ next if tag.closing?
+
+ aria_label = possible_attribute_values(tag, "aria-label").join
+ next if aria_label.empty?
+
+ if aria_label.match?(/^[a-z]/) && !@config.exceptions.include?(aria_label)
+ generate_offense(self.class, processed_source, tag)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/test/linters/accessibility/aria_label_is_well_formatted_test.rb b/test/linters/accessibility/aria_label_is_well_formatted_test.rb
new file mode 100644
index 0000000..7fc2043
--- /dev/null
+++ b/test/linters/accessibility/aria_label_is_well_formatted_test.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require "test_helper"
+
+class AriaLabelIsWellFormatted < LinterTestCase
+ def linter_class
+ ERBLint::Linters::GitHub::Accessibility::AriaLabelIsWellFormatted
+ end
+
+ def test_warns_when_aria_label_starts_with_downcase
+ @file = <<~HTML
+
+
+
+
+ HTML
+ @linter.run(processed_source)
+
+ assert_equal 4, @linter.offenses.count
+ end
+
+ def test_does_not_warn_when_aria_labelledby_starts_with_downcase
+ @file = "