Class: Yard::Lint::Validators::Semantic::AbstractMethods::Validator

Inherits:
Base
  • Object
show all
Defined in:
lib/yard/lint/validators/semantic/abstract_methods/validator.rb

Overview

Validator to check @abstract methods have proper implementation

Instance Attribute Summary

Attributes inherited from Base

#config, #selection

Instance Method Summary collapse

Methods inherited from Base

in_process, in_process?, in_process_visibility, #initialize, validator_name

Constructor Details

This class inherits a constructor from Yard::Lint::Validators::Base

Instance Method Details

#in_process_query(object, collector) ⇒ void

This method returns an undefined value.

Execute query for a single object during in-process execution. Checks if @abstract methods have implementation.

Parameters:

  • object (YARD::CodeObjects::Base)

    the code object to query

  • collector (Executor::ResultCollector)

    collector for output



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/yard/lint/validators/semantic/abstract_methods/validator.rb', line 18

def in_process_query(object, collector)
  return unless object.has_tag?(:abstract)
  return unless object.is_a?(YARD::CodeObjects::MethodObject)

  # Check if method has actual implementation (not just NotImplementedError)
  source = begin
    object.source
  rescue StandardError
    nil
  end
  return unless source && !source.empty?

  # Simple heuristic: abstract methods should be empty or raise NotImplementedError
  lines = source.split("\n").map(&:strip).reject(&:empty?)
  # Skip def line and end
  body_lines = lines[1...-1] || []

  has_real_implementation = body_lines.any? do |line|
    !line.start_with?('#') &&
      !line.include?('NotImplementedError') &&
      !line.include?('raise') &&
      line != 'end'
  end

  return unless has_real_implementation

  collector.puts "#{object.file}:#{object.line}: #{object.title}"
  collector.puts 'has_implementation'
end