Sha256: f0b7cc9a44960309367fca497c74e3122efa5a0aabce3b35ce0a4b89179c8c74

Contents?: true

Size: 1.85 KB

Versions: 35

Compression:

Stored size: 1.85 KB

Contents

# frozen_string_literal: true

module RuboCop
  module RSpec
    # Extracts cop descriptions from YARD docstrings
    class DescriptionExtractor
      def initialize(yardocs)
        @code_objects = yardocs.map(&CodeObject.public_method(:new))
      end

      def to_h
        code_objects
          .select(&:rspec_cop?)
          .map(&:configuration)
          .reduce(:merge)
      end

      private

      attr_reader :code_objects

      # Decorator of a YARD code object for working with documented rspec cops
      class CodeObject
        COP_CLASS_NAME = 'RuboCop::Cop::RSpec::Base'
        RSPEC_NAMESPACE = 'RuboCop::Cop::RSpec'

        def initialize(yardoc)
          @yardoc = yardoc
        end

        # Test if the YARD code object documents a concrete rspec cop class
        #
        # @return [Boolean]
        def rspec_cop?
          class_documentation? &&
            rspec_cop_namespace? &&
            cop_subclass? &&
            !abstract?
        end

        # Configuration for the documented cop that would live in default.yml
        #
        # @return [Hash]
        def configuration
          { cop_name => { 'Description' => description } }
        end

        private

        def cop_name
          Object.const_get(documented_constant).cop_name
        end

        def description
          yardoc.docstring.split("\n\n").first.to_s
        end

        def class_documentation?
          yardoc.type.equal?(:class)
        end

        def rspec_cop_namespace?
          documented_constant.start_with?(RSPEC_NAMESPACE)
        end

        def documented_constant
          yardoc.to_s
        end

        def cop_subclass?
          yardoc.superclass.path == COP_CLASS_NAME
        end

        def abstract?
          yardoc.tags.any? { |tag| tag.tag_name.eql?('abstract') }
        end

        attr_reader :yardoc
      end
    end
  end
end

Version data entries

35 entries across 31 versions & 2 rubygems

Version Path
rubocop-rspec-2.7.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.6.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.5.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.4.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.3.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.2.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.1.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.0.1 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.0.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-2.0.0.pre lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-1.44.1 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-1.44.0 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-1.43.2 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-1.43.1 lib/rubocop/rspec/description_extractor.rb
rubocop-rspec-1.43.0 lib/rubocop/rspec/description_extractor.rb