Rubocop проверяет, присутствует ли метод в классе

#ruby #rubocop

#ruby #rubocop

Вопрос:

У меня есть следующий класс:

 class XXX
  def aa
  end

  def authorized?
    false
  end

  def bb
  end
end
  

И хочет убедиться, что метод authorized? присутствует в Rubocop. Следующий код работает в консоли Rubocop:

 code = "
class XXX
  def aa
  end

  def authorized?
    false
  end

  def bb
  end
end
"
node = RuboCop::ProcessedSource.new(code, RUBY_VERSION.to_f).ast
NodePattern.new('(class ... (begin (def :aa ...)(def :authorized? ...)(def :bb ...) ) )').match(node)
  

Последняя строка возвращает true . Однако я не хочу зависеть от каких-либо методов. Поэтому я заменил последнюю строку на

 NodePattern.new('(class ... (begin (...)(def :authorized? ...)(...) ) )').match(node)
  

И это работает, код не зависит от имени методов. Но! Я также хочу заставить его работать, когда нет других методов, или если есть еще какие-либо методы.

По сути, конечная цель — проверить, определен ли метод в классе. Как мне это сделать?

Ответ №1:

Я не уверен в методах синтаксического анализа Rubocop и node, которые являются частью этого, но можете ли вы просто использовать обычный Ruby-самоанализ?

XXX.instance_methods.include?(:authorized?)

Если он должен быть в самом XXX классе (в отличие от любых включенных модулей или суперклассов),

XXX.instance_methods.include?(:authorized?) amp;amp; XXX.instance_method(:authorized?).owner == XXX