erblint-github 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/erblint-disable +53 -0
- data/config/accessibility.yml +4 -0
- data/lib/erblint-github/linters/custom_helpers.rb +1 -1
- data/lib/erblint-github/linters/github/accessibility/no_title_attribute.rb +2 -2
- data/lib/erblint-github/linters/github/accessibility/no_visually_hidden_interactive_elements.rb +33 -0
- metadata +14 -11
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9f1a4a94379042a57da340419014484f8395304da4ba9e60427b1314208b65ce
         | 
| 4 | 
            +
              data.tar.gz: a2412a3fcc727db9d01441c2fdd4c24e7f3d472e0b55f73bb1c79a6839275ad6
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 4fde78f77bdbeda8d2c8831b629eb2b45d81a1a48c535d1ae962c2c3c5b01a1aa36ba8880ff912d38e6332331d2dfffa2128fb51820a2c041e746b9ae3af6501
         | 
| 7 | 
            +
              data.tar.gz: a30c11c3dad20f668f334f67b9278057b06b72cce181ec32d37b2aedb3916826ef71a6c518db62c29a0d54e97e2d76c0870dee956157f8ff370d834eb1a7380f
         | 
    
        data/bin/erblint-disable
    ADDED
    
    | @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require "json"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # Accepts comma-separated args with simple rule name
         | 
| 7 | 
            +
            # e.g. script/erblint-disable SomeRule1,SomeRule2
         | 
| 8 | 
            +
            # e.g. script/erblint-disable GitHub::Accessibility::Rule1,SomeRule2
         | 
| 9 | 
            +
            rules = ARGV[0]
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            rules_array = rules.split(",")
         | 
| 12 | 
            +
            rules_map = {}
         | 
| 13 | 
            +
            rules_array.each do |rule|
         | 
| 14 | 
            +
              rule_underscored = rule.to_s.gsub("::", "/").
         | 
| 15 | 
            +
                gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
         | 
| 16 | 
            +
                gsub(/([a-z\d])([A-Z])/, '\1_\2').
         | 
| 17 | 
            +
                tr("-", "_").
         | 
| 18 | 
            +
                downcase.
         | 
| 19 | 
            +
                gsub("git_hub", "github") # corrects rule names with `GitHub` name to align with erb-lint expectations
         | 
| 20 | 
            +
              rules_map[rule] = rule_underscored
         | 
| 21 | 
            +
            end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            rules_map.each do |disable_comment_name, command_line_name|
         | 
| 24 | 
            +
              output = `bin/erblint --format json --enable-linters #{command_line_name} app/views app/components packages/**/app/components app/forms/**/`
         | 
| 25 | 
            +
              hashed_output = JSON.parse(output)
         | 
| 26 | 
            +
              hashed_output["files"].each do |file|
         | 
| 27 | 
            +
                path = file["path"]
         | 
| 28 | 
            +
                offenses = file["offenses"]
         | 
| 29 | 
            +
                line_numbers = offenses.map do |offense|
         | 
| 30 | 
            +
                  offense["location"]["last_line"]
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                File.open(path, "r+") do |file|
         | 
| 33 | 
            +
                  lines = file.each_line.to_a
         | 
| 34 | 
            +
                  line_numbers.each do |line_number|
         | 
| 35 | 
            +
                    line = lines[line_number - 1]
         | 
| 36 | 
            +
                    unless line.match?(/erblint:disable (?<rules>.*#{disable_comment_name}).*/)
         | 
| 37 | 
            +
                      existing_disable = line.match(/(?<=# erblint:disable)(.*) (?=%>)/)
         | 
| 38 | 
            +
                      if existing_disable
         | 
| 39 | 
            +
                        existing_disable_string = existing_disable.captures[0]
         | 
| 40 | 
            +
                        add_new_disable = "#{existing_disable_string}, #{disable_comment_name}"
         | 
| 41 | 
            +
                        lines[line_number - 1] = lines[line_number - 1].gsub(existing_disable_string, add_new_disable)
         | 
| 42 | 
            +
                      else
         | 
| 43 | 
            +
                        lines[line_number - 1] = lines[line_number - 1].gsub("\n", "") + "<%# erblint:disable #{disable_comment_name} %>\n"
         | 
| 44 | 
            +
                      end
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                  file.rewind
         | 
| 48 | 
            +
                  file.write(lines.join)
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            exit 0
         | 
    
        data/config/accessibility.yml
    CHANGED
    
    | @@ -1,5 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            linters:
         | 
| 3 | 
            +
              NoUnusedDisable:
         | 
| 4 | 
            +
                enabled: true
         | 
| 3 5 | 
             
              GitHub::Accessibility::AriaLabelIsWellFormatted:
         | 
| 4 6 | 
             
                enabled: true
         | 
| 5 7 | 
             
              GitHub::Accessibility::AvoidBothDisabledAndAriaDisabled:
         | 
| @@ -30,3 +32,5 @@ linters: | |
| 30 32 | 
             
                enabled: true
         | 
| 31 33 | 
             
              GitHub::Accessibility::SvgHasAccessibleText:
         | 
| 32 34 | 
             
                enabled: true
         | 
| 35 | 
            +
              GitHub::Accessibility::NoVisuallyHiddenInteractiveElements:
         | 
| 36 | 
            +
                enabled: true
         | 
| @@ -47,7 +47,7 @@ module ERBLint | |
| 47 47 | 
             
                    if offenses_count.zero?
         | 
| 48 48 | 
             
                      # have to adjust to get `\n` so we delete the whole line
         | 
| 49 49 | 
             
                      add_offense(processed_source.to_source_range(comment_node.loc.adjust(end_pos: 1)), "Unused erblint:counter comment for #{rule_name}", "") if comment_node
         | 
| 50 | 
            -
                      return
         | 
| 50 | 
            +
                      return false
         | 
| 51 51 | 
             
                    end
         | 
| 52 52 |  | 
| 53 53 | 
             
                    first_offense = @offenses[0]
         | 
| @@ -10,11 +10,11 @@ module ERBLint | |
| 10 10 | 
             
                      include ERBLint::Linters::CustomHelpers
         | 
| 11 11 | 
             
                      include LinterRegistry
         | 
| 12 12 |  | 
| 13 | 
            -
                      MESSAGE = "The title attribute should never be used  | 
| 13 | 
            +
                      MESSAGE = "The title attribute should never be used as it is inaccessible for several groups of users. Exceptions are provided for <iframe> and <link>."
         | 
| 14 14 |  | 
| 15 15 | 
             
                      def run(processed_source)
         | 
| 16 16 | 
             
                        tags(processed_source).each do |tag|
         | 
| 17 | 
            -
                          next if tag.name == "iframe"
         | 
| 17 | 
            +
                          next if tag.name == "iframe" || tag.name == "link"
         | 
| 18 18 | 
             
                          next if tag.closing?
         | 
| 19 19 |  | 
| 20 20 | 
             
                          title = possible_attribute_values(tag, "title")
         | 
    
        data/lib/erblint-github/linters/github/accessibility/no_visually_hidden_interactive_elements.rb
    ADDED
    
    | @@ -0,0 +1,33 @@ | |
| 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 NoVisuallyHiddenInteractiveElements < Linter
         | 
| 10 | 
            +
                      include ERBLint::Linters::CustomHelpers
         | 
| 11 | 
            +
                      include LinterRegistry
         | 
| 12 | 
            +
                      INTERACTIVE_ELEMENTS = %w[a button summary select option textarea].freeze
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                      MESSAGE = "Avoid visually hidding interactive elements. Visually hiding interactive elements can be confusing to sighted keyboard users as it appears their focus has been lost when they navigate to the hidden element"
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                      def run(processed_source)
         | 
| 17 | 
            +
                        visually_hidden = false
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                        tags(processed_source).each do |tag|
         | 
| 20 | 
            +
                          next if tag.closing?
         | 
| 21 | 
            +
                          classes = possible_attribute_values(tag, "class")
         | 
| 22 | 
            +
                          visually_hidden = true if classes.include?("sr-only")
         | 
| 23 | 
            +
                          next unless classes.include?("sr-only") || visually_hidden
         | 
| 24 | 
            +
                          if INTERACTIVE_ELEMENTS.include?(tag.name)
         | 
| 25 | 
            +
                            generate_offense(self.class, processed_source, tag)
         | 
| 26 | 
            +
                          end
         | 
| 27 | 
            +
                        end
         | 
| 28 | 
            +
                      end
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: erblint-github
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.5.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - GitHub Open Source
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023- | 
| 11 | 
            +
            date: 2023-10-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: erb_lint
         | 
| @@ -16,42 +16,42 @@ dependencies: | |
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - "~>"
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: 0. | 
| 19 | 
            +
                    version: 0.5.0
         | 
| 20 20 | 
             
              type: :development
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: 0. | 
| 26 | 
            +
                    version: 0.5.0
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 28 | 
             
              name: minitest
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - "~>"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: 5. | 
| 33 | 
            +
                    version: 5.20.0
         | 
| 34 34 | 
             
              type: :development
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: 5. | 
| 40 | 
            +
                    version: 5.20.0
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: mocha
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - "~>"
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version: 2.0 | 
| 47 | 
            +
                    version: 2.1.0
         | 
| 48 48 | 
             
              type: :development
         | 
| 49 49 | 
             
              prerelease: false
         | 
| 50 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - "~>"
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: 2.0 | 
| 54 | 
            +
                    version: 2.1.0
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 56 | 
             
              name: rake
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -72,14 +72,14 @@ dependencies: | |
| 72 72 | 
             
                requirements:
         | 
| 73 73 | 
             
                - - '='
         | 
| 74 74 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: 1. | 
| 75 | 
            +
                    version: 1.56.4
         | 
| 76 76 | 
             
              type: :development
         | 
| 77 77 | 
             
              prerelease: false
         | 
| 78 78 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 79 | 
             
                requirements:
         | 
| 80 80 | 
             
                - - '='
         | 
| 81 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: 1. | 
| 82 | 
            +
                    version: 1.56.4
         | 
| 83 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 84 84 | 
             
              name: rubocop-github
         | 
| 85 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -97,12 +97,14 @@ dependencies: | |
| 97 97 | 
             
            description: Template style checking for GitHub Ruby repositories
         | 
| 98 98 | 
             
            email:
         | 
| 99 99 | 
             
            - opensource+erblint-github@github.com
         | 
| 100 | 
            -
            executables: | 
| 100 | 
            +
            executables:
         | 
| 101 | 
            +
            - erblint-disable
         | 
| 101 102 | 
             
            extensions: []
         | 
| 102 103 | 
             
            extra_rdoc_files: []
         | 
| 103 104 | 
             
            files:
         | 
| 104 105 | 
             
            - LICENSE
         | 
| 105 106 | 
             
            - README.md
         | 
| 107 | 
            +
            - bin/erblint-disable
         | 
| 106 108 | 
             
            - config/accessibility.yml
         | 
| 107 109 | 
             
            - lib/erblint-github/linters.rb
         | 
| 108 110 | 
             
            - lib/erblint-github/linters/custom_helpers.rb
         | 
| @@ -120,6 +122,7 @@ files: | |
| 120 122 | 
             
            - lib/erblint-github/linters/github/accessibility/no_positive_tab_index.rb
         | 
| 121 123 | 
             
            - lib/erblint-github/linters/github/accessibility/no_redundant_image_alt.rb
         | 
| 122 124 | 
             
            - lib/erblint-github/linters/github/accessibility/no_title_attribute.rb
         | 
| 125 | 
            +
            - lib/erblint-github/linters/github/accessibility/no_visually_hidden_interactive_elements.rb
         | 
| 123 126 | 
             
            - lib/erblint-github/linters/github/accessibility/svg_has_accessible_text.rb
         | 
| 124 127 | 
             
            - lib/tasks/docs.rake
         | 
| 125 128 | 
             
            - lib/tasks/tests.rake
         |