rubomatic-html 1.1.0.pre.rc.4 → 1.1.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/CHANGELOG.adoc +25 -1
- data/config/default.yml +28 -0
- data/docs/cops/style/README.adoc +9 -0
- data/docs/cops/style/no_fields_for/README.adoc +28 -0
- data/docs/cops/style/no_form_for/README.adoc +28 -0
- data/docs/cops/style/no_form_tag/README.adoc +28 -0
- data/docs/cops/style/no_on_before_unload/README.adoc +29 -0
- data/docs/cops/style/no_on_click/README.adoc +29 -0
- data/docs/cops/style/no_on_drag/README.adoc +29 -0
- data/docs/cops/style/no_on_load/README.adoc +29 -0
- data/docs/cops/style/no_on_unload/README.adoc +29 -0
- data/docs/cops/style/no_on_wheel/README.adoc +29 -0
- data/exe/rubomatic-html +1 -1
- data/lib/rubomatic-html/cop/base.rb +58 -0
- data/lib/rubomatic-html/cop/cops.rb +19 -0
- data/lib/rubomatic-html/cop/layout/base.rb +17 -0
- data/lib/rubomatic-html/cop/layout/line_length.rb +28 -0
- data/lib/rubomatic-html/cop/layout/multiple_line_breaks.rb +42 -0
- data/lib/rubomatic-html/cop/layout/trailing_whitespace.rb +28 -0
- data/lib/rubomatic-html/cop/style/base.rb +17 -0
- data/lib/rubomatic-html/cop/style/no_fields_for.rb +28 -0
- data/lib/rubomatic-html/cop/style/no_form_for.rb +28 -0
- data/lib/rubomatic-html/cop/style/no_form_tag.rb +28 -0
- data/lib/rubomatic-html/cop/style/no_on_attribute.rb +31 -0
- data/lib/rubomatic-html/cop/style/no_on_before_unload.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_click.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_drag.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_load.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_unload.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_wheel.rb +27 -0
- data/lib/rubomatic-html/cop/style/partial_instance_variable.rb +44 -0
- data/lib/rubomatic-html/generator/cop_readme_injector.rb +48 -0
- data/lib/rubomatic-html/generator/dept_readme_injector.rb +111 -0
- data/lib/rubomatic-html/generator.rb +330 -0
- data/lib/rubomatic-html/inject.rb +19 -0
- data/lib/rubomatic-html/runner.rb +129 -0
- data/lib/rubomatic-html/version.rb +5 -0
- data/lib/rubomatic-html.rb +11 -1
- metadata +49 -20
- data/lib/rubomatic/html/cop/base.rb +0 -42
- data/lib/rubomatic/html/cop/cops.rb +0 -9
- data/lib/rubomatic/html/cop/layout/base.rb +0 -19
- data/lib/rubomatic/html/cop/layout/line_length.rb +0 -26
- data/lib/rubomatic/html/cop/layout/multiple_line_breaks.rb +0 -40
- data/lib/rubomatic/html/cop/layout/trailing_whitespace.rb +0 -26
- data/lib/rubomatic/html/cop/style/base.rb +0 -19
- data/lib/rubomatic/html/cop/style/partial_instance_variable.rb +0 -28
- data/lib/rubomatic/html/version.rb +0 -7
- data/lib/rubomatic/html.rb +0 -115
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Style
         | 
| 6 | 
            +
                  class NoOnAttribute < RubomaticHtml::Cop::Style::Base
         | 
| 7 | 
            +
                    # @return [String]
         | 
| 8 | 
            +
                    attr_accessor :html_attr
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                    # @see super
         | 
| 11 | 
            +
                    def run_for_line(line, index)
         | 
| 12 | 
            +
                      # `onclick:` or `onclick=`
         | 
| 13 | 
            +
                      has_on_click = line.match?(/#{html_attr}[:=]/i)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                      # `:onclick=>` or `:onclick =>`
         | 
| 16 | 
            +
                      has_on_click ||= line.match?(/:#{html_attr} ?=>/i)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                      # `'onclick'=>` or `'onclick' =>`
         | 
| 19 | 
            +
                      has_on_click ||= line.match?(/'#{html_attr}' ?=>/i)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                      # `"onclick"=>` or `"onclick" =>`
         | 
| 22 | 
            +
                      has_on_click ||= line.match?(/"#{html_attr}" ?=>/i)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      return unless has_on_click
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      puts("#{file}:#{index}: might use an #{html_attr} attribute")
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Style
         | 
| 6 | 
            +
                  class NoOnBeforeUnload < RubomaticHtml::Cop::Style::NoOnAttribute
         | 
| 7 | 
            +
                    class << self
         | 
| 8 | 
            +
                      # @see super
         | 
| 9 | 
            +
                      def abstract_cop?
         | 
| 10 | 
            +
                        false
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      # @see super
         | 
| 14 | 
            +
                      def name
         | 
| 15 | 
            +
                        [department, 'NoOnBeforeUnload'].join('/')
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def initialize(...)
         | 
| 20 | 
            +
                      super(...)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      @html_attr = 'onbeforeunload'
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Style
         | 
| 6 | 
            +
                  class NoOnClick < RubomaticHtml::Cop::Style::NoOnAttribute
         | 
| 7 | 
            +
                    class << self
         | 
| 8 | 
            +
                      # @see super
         | 
| 9 | 
            +
                      def abstract_cop?
         | 
| 10 | 
            +
                        false
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      # @see super
         | 
| 14 | 
            +
                      def name
         | 
| 15 | 
            +
                        [department, 'NoOnClick'].join('/')
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def initialize(...)
         | 
| 20 | 
            +
                      super(...)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      @html_attr = 'onclick'
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Style
         | 
| 6 | 
            +
                  class NoOnDrag < RubomaticHtml::Cop::Style::NoOnAttribute
         | 
| 7 | 
            +
                    class << self
         | 
| 8 | 
            +
                      # @see super
         | 
| 9 | 
            +
                      def abstract_cop?
         | 
| 10 | 
            +
                        false
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      # @see super
         | 
| 14 | 
            +
                      def name
         | 
| 15 | 
            +
                        [department, 'NoOnDrag'].join('/')
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def initialize(...)
         | 
| 20 | 
            +
                      super(...)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      @html_attr = 'ondrag'
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Style
         | 
| 6 | 
            +
                  class NoOnLoad < RubomaticHtml::Cop::Style::NoOnAttribute
         | 
| 7 | 
            +
                    class << self
         | 
| 8 | 
            +
                      # @see super
         | 
| 9 | 
            +
                      def abstract_cop?
         | 
| 10 | 
            +
                        false
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      # @see super
         | 
| 14 | 
            +
                      def name
         | 
| 15 | 
            +
                        [department, 'NoOnLoad'].join('/')
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def initialize(...)
         | 
| 20 | 
            +
                      super(...)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      @html_attr = 'onload'
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Style
         | 
| 6 | 
            +
                  class NoOnUnload < RubomaticHtml::Cop::Style::NoOnAttribute
         | 
| 7 | 
            +
                    class << self
         | 
| 8 | 
            +
                      # @see super
         | 
| 9 | 
            +
                      def abstract_cop?
         | 
| 10 | 
            +
                        false
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      # @see super
         | 
| 14 | 
            +
                      def name
         | 
| 15 | 
            +
                        [department, 'NoOnUnload'].join('/')
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def initialize(...)
         | 
| 20 | 
            +
                      super(...)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      @html_attr = 'onunload'
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Style
         | 
| 6 | 
            +
                  class NoOnWheel < RubomaticHtml::Cop::Style::NoOnAttribute
         | 
| 7 | 
            +
                    class << self
         | 
| 8 | 
            +
                      # @see super
         | 
| 9 | 
            +
                      def abstract_cop?
         | 
| 10 | 
            +
                        false
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      # @see super
         | 
| 14 | 
            +
                      def name
         | 
| 15 | 
            +
                        [department, 'NoOnWheel'].join('/')
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def initialize(...)
         | 
| 20 | 
            +
                      super(...)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      @html_attr = 'onwheel'
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              module Cop
         | 
| 5 | 
            +
                module Style
         | 
| 6 | 
            +
                  class PartialInstanceVariable < RubomaticHtml::Cop::Style::Base
         | 
| 7 | 
            +
                    class << self
         | 
| 8 | 
            +
                      # @see super
         | 
| 9 | 
            +
                      def abstract_cop?
         | 
| 10 | 
            +
                        false
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      # @see super
         | 
| 14 | 
            +
                      def name
         | 
| 15 | 
            +
                        [department, 'PartialInstanceVariable'].join('/')
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                      # @see super
         | 
| 19 | 
            +
                      def allowed_config_transform
         | 
| 20 | 
            +
                        super.merge({ 'AllowedIdentifiers' => :allowed_identifiers }).freeze
         | 
| 21 | 
            +
                      end
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    # @see super
         | 
| 25 | 
            +
                    def run_for_line(line, index)
         | 
| 26 | 
            +
                      return unless File.basename(file).match?(/^_/i)
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                      return unless line.match?(/@/i)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                      return if allowed_identifiers.any? { |ai| line[/@.+/].start_with?(ai) }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                      puts("#{file}:#{index}: uses an instance variable")
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    private
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                      # @return [Array<String>]
         | 
| 38 | 
            +
                      def allowed_identifiers
         | 
| 39 | 
            +
                        @allowed_identifiers ||= Array(config.dig(:allowed_identifiers))
         | 
| 40 | 
            +
                      end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
| @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              class Generator
         | 
| 5 | 
            +
                class CopReadmeInjector < DeptReadmeInjector
         | 
| 6 | 
            +
                  TEMPLATE =
         | 
| 7 | 
            +
                    '* xref:./%{cop_folder}/README.adoc[``%{department}/%{cop}``]'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  # :nodoc:
         | 
| 10 | 
            +
                  def initialize(badge:, **kwargs)
         | 
| 11 | 
            +
                    super(badge: badge, **kwargs)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    @cop = badge.cop_name
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    # @return [String]
         | 
| 19 | 
            +
                    attr_reader :cop
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    # @see super
         | 
| 22 | 
            +
                    def new_readme_entry
         | 
| 23 | 
            +
                      format(TEMPLATE, {
         | 
| 24 | 
            +
                        department_folder: snake_case(department),
         | 
| 25 | 
            +
                        cop_folder: snake_case(cop),
         | 
| 26 | 
            +
                        department: department,
         | 
| 27 | 
            +
                        cop: cop
         | 
| 28 | 
            +
                      })
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    # @see super
         | 
| 32 | 
            +
                    def line_is_good?(line)
         | 
| 33 | 
            +
                      return true if super
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                      matches = line.match(target_regex)
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                      return false if matches.nil?
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                      department == matches[:department] && cop < matches[:cop]
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    # @see super
         | 
| 43 | 
            +
                    def target_regex
         | 
| 44 | 
            +
                      %r{\* xref:\./[a-z_]+/README\.adoc\[``(?<department>[a-zA-Z_]+)/(?<cop>[a-zA-Z_]+)``\]}
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
| @@ -0,0 +1,111 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubomaticHtml
         | 
| 4 | 
            +
              class Generator
         | 
| 5 | 
            +
                class DeptReadmeInjector
         | 
| 6 | 
            +
                  TEMPLATE = '* xref:./docs/cops/%{department_folder}/README.adoc[``%{department}``]'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  # :nodoc:
         | 
| 9 | 
            +
                  def initialize(readme_file_path:, badge:, department:)
         | 
| 10 | 
            +
                    @readme_file_path = readme_file_path
         | 
| 11 | 
            +
                    @badge = badge
         | 
| 12 | 
            +
                    @department = department
         | 
| 13 | 
            +
                    @output = output
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  # Performs the actual string injection into the file
         | 
| 17 | 
            +
                  # modified version of `inject` from RuboCop::Cop::Generator::ConfigurationInjector
         | 
| 18 | 
            +
                  # Named `inject_string` becuase rubocop thought when called it was `Array#inject`
         | 
| 19 | 
            +
                  #
         | 
| 20 | 
            +
                  # @return [void]
         | 
| 21 | 
            +
                  #
         | 
| 22 | 
            +
                  def inject_string
         | 
| 23 | 
            +
                    if readme_entries.none?("#{new_readme_entry}\n")
         | 
| 24 | 
            +
                      target_line = find_target_line
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      if target_line
         | 
| 27 | 
            +
                        readme_entries.insert(target_line, "#{new_readme_entry}\n")
         | 
| 28 | 
            +
                      else
         | 
| 29 | 
            +
                        readme_entries.push(new_readme_entry)
         | 
| 30 | 
            +
                      end
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    File.write(readme_file_path, readme_entries.join(''))
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    yield if block_given?
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  private
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                    # @return [String]
         | 
| 41 | 
            +
                    attr_reader :readme_file_path
         | 
| 42 | 
            +
                    # @return [RuboCop::Cop::Badge]
         | 
| 43 | 
            +
                    attr_reader :badge
         | 
| 44 | 
            +
                    # @return [String]
         | 
| 45 | 
            +
                    attr_reader :department
         | 
| 46 | 
            +
                    # @return [*] Default $stdout
         | 
| 47 | 
            +
                    attr_reader :output
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    # Lines in <department>/README.adoc
         | 
| 50 | 
            +
                    #
         | 
| 51 | 
            +
                    # @return [Array<String>]
         | 
| 52 | 
            +
                    #
         | 
| 53 | 
            +
                    def readme_entries
         | 
| 54 | 
            +
                      @readme_entries ||= File.readlines(readme_file_path)
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    # Modified version from Rubocop::Cop::Generator::ConfigurationInjector
         | 
| 58 | 
            +
                    #
         | 
| 59 | 
            +
                    # @return [String]
         | 
| 60 | 
            +
                    #
         | 
| 61 | 
            +
                    def new_readme_entry
         | 
| 62 | 
            +
                      format(TEMPLATE, {
         | 
| 63 | 
            +
                        department_folder: snake_case(department),
         | 
| 64 | 
            +
                        department: department
         | 
| 65 | 
            +
                      })
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    # Modified version from Rubocop::Cop::Generator::ConfigurationInjector
         | 
| 69 | 
            +
                    #
         | 
| 70 | 
            +
                    # @return [Integer, Nil]
         | 
| 71 | 
            +
                    #
         | 
| 72 | 
            +
                    def find_target_line
         | 
| 73 | 
            +
                      readme_entries.find_index do |line|
         | 
| 74 | 
            +
                        line_is_good?(line)
         | 
| 75 | 
            +
                      end
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    # Determines if the given line is the same type we're trying to add and if it's alphabetically before
         | 
| 79 | 
            +
                    #
         | 
| 80 | 
            +
                    # @return [Boolean]
         | 
| 81 | 
            +
                    #
         | 
| 82 | 
            +
                    def line_is_good?(line)
         | 
| 83 | 
            +
                      matches = line.match(target_regex)
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                      return false if matches.nil?
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                      department < line.match(target_regex)[:department]
         | 
| 88 | 
            +
                    end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                    # Regex to look for in the readme
         | 
| 91 | 
            +
                    #
         | 
| 92 | 
            +
                    # @return [Regexp]
         | 
| 93 | 
            +
                    #
         | 
| 94 | 
            +
                    def target_regex
         | 
| 95 | 
            +
                      %r{\* xref:\./docs/cops/[a-z_]+/README\.adoc\[``(?<department>[a-zA-Z_]+)``\]}
         | 
| 96 | 
            +
                    end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                    # Copied from Rubocop::Cop::Generator
         | 
| 99 | 
            +
                    #
         | 
| 100 | 
            +
                    # @return [String]
         | 
| 101 | 
            +
                    #
         | 
| 102 | 
            +
                    def snake_case(camel_case_string)
         | 
| 103 | 
            +
                      camel_case_string
         | 
| 104 | 
            +
                        .gsub('RSpec', 'Rspec')
         | 
| 105 | 
            +
                        .gsub(%r{([^A-Z/])([A-Z]+)}, '\1_\2')
         | 
| 106 | 
            +
                        .gsub(%r{([A-Z])([A-Z][^A-Z\d/]+)}, '\1_\2')
         | 
| 107 | 
            +
                        .downcase
         | 
| 108 | 
            +
                    end
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
              end
         | 
| 111 | 
            +
            end
         |