Рубокоп полицейский, чтобы выяснить, есть ли метод в классе - PullRequest
0 голосов
/ 05 апреля 2019

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

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 Ответ

1 голос
/ 06 апреля 2019

Я не уверен насчет методов анализа Rubocop и узлов, но можете ли вы просто использовать обычный самоанализ Ruby?

XXX.instance_methods.include?(:authorized?)

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

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

...