Есть ли что-то похожее на Nokogiri для анализа кода Ruby? - PullRequest
9 голосов
/ 17 июня 2011

Нокогири - это круто.Я могу делать такие вещи, как #css('.bla'), который будет возвращать первый соответствующий элемент.

Прямо сейчас нам нужно выполнить некоторый анализ исходного кода Ruby - найти все методы в классе и т. Д. Мы используем ruby_parser gem, но все, что он делает, это прочесывает ваш исходный код и выплевывает S-выражения.Есть ли что-то вроде Нокогири для этих S-выражений, которое может выполнять такие действия, как «вернуть S-выражение для первого найденного метода с именем 'foo'"?

Ответы [ 4 ]

2 голосов
/ 21 июня 2011

Хотя я принимаю ответ Йорга, потому что он более полный, я в конечном итоге обнаружил кое-что еще, что я в итоге использовал.ruby_parser устанавливает зависимый гем с именем sexp_processor (именно в этом геме фактически определен класс Sexp).Если вы просматриваете документацию class , есть несколько методов, которые помогут с базовыми искателями Ruby.Вот пример:

class Sexp
  def name          # convenience method
    self.sexp_body.first
  end
end    

# Print out all instance methods within classes. Beware - if "code" sexp itself
# is a class, it will NOT be included!
code = RubyParser.new.parse(IO.read('/src/file'))
code.each_of_type(:class){ |klass|
  klass.each_of_type(:defn){ |meth|
    puts meth.name
  }
}
2 голосов
/ 17 июня 2011

Единственное, о чем я могу думать, это Библиотека Адама Сандерсона SExpPath .

0 голосов
/ 18 июня 2011

Вы можете проверить парсер Rubinius, он может помочь вам сделать то, что вы хотите.

0 голосов
/ 17 июня 2011

Я ничего не знаю о gem, который вы ищете, но вы можете найти все методы в классе, используя instance_methods:

class Foo
  def bar
  end
end

irb(main):005:0> Foo.instance_methods - Object.instance_methods
=> [:bar]
...