Где я могу найти активно развивающийся инструмент lint для Ruby?

Большая часть кода, который я пишу, написана на Ruby, и время от времени я делаю опечатки, которые обнаруживаются только через некоторое время. Это раздражает, когда мои скрипты выполняют длинные задачи, а я возвращаюсь и обнаруживаю опечатку.

Есть ли активно разрабатываемый инструмент lint для Ruby, который мог бы помочь мне решить эту проблему? Можно ли использовать его в системе, которая работает с большим количеством исходных файлов, некоторые из которых загружаются динамически?

В качестве примера возьмем этот фрагмент:

a = 20
b = 30
puts c

Чтобы выиграть награду, покажите мне инструмент, который определит, что переменная c не создана / не определена.


person Geo    schedule 26.11.2009    source источник
comment
Вы понимаете, что эта программа не запускается? Ruby выдаст test.rb:1: undefined local variable or method c 'для main: Object (NameError) `. Похоже, вы должны довольно быстро устранить эти ошибки без инструмента для удаления ворса.   -  person meagar    schedule 28.10.2010
comment
Вы понимаете, что это пример? И что Ruby обнаружит эту проблему на RUNTIME?   -  person Geo    schedule 28.10.2010
comment
Вы спросили об этом 3 года назад. В настоящее время с Ruby 2.0 вы можете использовать ruby ​​-wc, который также выдает предупреждения. В вашем случае он предупредит вас о том, что a и b не использовались. Но он не предупредит вас об использовании c (потому что он не должен).   -  person Niccolo M.    schedule 14.11.2013
comment
... и есть еще «рубиновый ворс», который кажется неплохим.   -  person Niccolo M.    schedule 14.11.2013
comment
@NiccoloM. ruby-lint кажется хорошим ответом. Отправьте сообщение в качестве ответа, и я поставлю +1. Или я могу опубликовать это как вики сообщества, если хотите.   -  person John McCarthy    schedule 20.02.2014


Ответы (9)


Вы можете попробовать Diamondback Ruby. Он выполняет статическую проверку типов кода Ruby и, таким образом, обвиняет вас в использовании неопределенной переменной.

Хотя DRuby - это постоянный исследовательский проект, он уже достаточно хорошо работает для небольших автономных скриптов Ruby. В настоящее время он не может анализировать большую часть стандартной библиотеки Ruby «из коробки». В настоящее время они работают над вводом Ruby on Rails (см. Их последние статьи ).

person akuhn    schedule 07.12.2009
comment
Похоже, Diamondback Ruby не обновлялся с 2009 года. :( - person Mark Rushakoff; 30.04.2013

  • ruby -c myfile.rb проверит правильность синтаксиса Ruby.
  • Reek проверяет код Ruby на наличие общих запахов кода.
  • Roodi проверяет код Ruby на предмет распространенных проблем объектно-ориентированного проектирования.
  • Flog может предупредить вас о необычно сложном коде.

[Plug] Если ваш проект находится в общедоступном репозитории Github, Caliper может запускать последние три инструмента и другие инструменты в вашем коде. каждый раз, когда вы совершаете коммит. (Отказ от ответственности: я работаю над суппортом)

person Avdi    schedule 27.11.2009
comment
Может ли кто-нибудь из них обнаружить опечатки в именах переменных? - person Geo; 27.11.2009
comment
Я запустил Reek, Roodi и Flog в предоставленном мной фрагменте, и ни один из них не сказал, что что-то не так с переменной c. - person Geo; 27.11.2009
comment
Добро пожаловать в мир динамических языков. Вы получаете огромную гибкость, но теряете возможность делать статические утверждения о коде, как будто все символы, на которые я ссылался, действительны во время выполнения. Это компромисс. Тем не менее, я думаю, что некоторые из недавних IDE пытаются выявить подобные ошибки. Вы можете изучить RubyMine или Netbeans. Лично я согласен с предыдущим комментатором, что лучше всего использовать модульные тесты. Если вы хотите быстро получать уведомления об ошибках, используйте что-то вроде автотеста, чтобы постоянно запускать тесты. - person Avdi; 28.11.2009
comment
Чтобы объяснить дальше, c в этом месте может ссылаться на локальную переменную; переменная, определенная во включающей лексической области видимости; метод экземпляра; одноэлементный метод; метод, определенный в суперклассе или модуле ... и т. д. Инструмент не может точно знать, что c недействителен и, следовательно, опечатка без фактического запуска кода - и это возвращает нас к модульным тестам. - person Avdi; 28.11.2009
comment
Фактически, «c» в вашем начальном примере будет анализироваться как вызов метода. И вообще Ruby (и любой другой инструмент Ruby) не может провести достаточный статический анализ, когда он читает код, чтобы выяснить, что метод c () не определен в области видимости. - person kevinrutherford; 02.12.2009
comment
Я бы не стал возражать, если код будет изменен, чтобы выяснить, что переменная не определена. - person Geo; 02.12.2009
comment
Чтобы оценить код, вам нужно как-то его вызвать. Это называется тестом. - person Avdi; 02.12.2009

RubyMine (http://www.jetbrains.com/ruby) делает свое дело:

альтернативный текст http://img707.imageshack.us/img707/5688/31911448.png

Ни один из нижеперечисленных вариантов не выполняет весь анализ, который выполняет RubyMine.

  • Пакет NetBeans Ruby
  • Аптана RadRails
  • gVIM (с синтастическим плагином от scrooloose)

Каждый из них способен выявлять синтаксические ошибки, такие как неправильное количество скобок, слишком много определений, концов, фигурных скобок и т. Д. Но ни один из них не идентифицирует недопустимые вызовы методов, как это делает RubyMine.

И вот почему: это сложно.

Поскольку Ruby чрезвычайно динамичен (и такие методы, как 'c', могут быть легко сгенерированы на лету), любой редактор, который пытается идентифицировать несуществующие переменные / методы, должен иметь большую часть всей загруженной среды и несколько путей выполнения программы. постоянно тестируется для получения точных результатов «достоверности». Это намного сложнее, чем в Java, где почти все программирование статично (по крайней мере, так было, когда я сбросил эту шляпу).

Эта способность легко генерировать методы на лету - одна из причин, по которой сообщество так высоко ценит тестирование. Я действительно рекомендую вам попробовать и тестирование.

person btelles    schedule 05.12.2009

Взгляните на RuboCop. Это средство проверки стиля кода Ruby, основанное на Руководстве по стилю Ruby. Он поддерживается довольно активно и поддерживает все основные реализации Ruby. Он хорошо работает с Ruby 1.9 и 2.0 и имеет отличную интеграцию с Emacs.

person Bozhidar Batsov    schedule 17.04.2013

да. Test::Unit

Хорошо, я знаю, что вы уже знаете это и что в некотором смысле это бесполезный ответ, но вы поднимаете отрицательные последствия утиного набора текста, что (в настоящее время) нет способа просто написать больше тестов чем может понадобиться что-то вроде Java.

Итак, для записи см. Test::Unit в стандартной библиотеке Ruby или в одной из других сред тестирования.

Наличие модульных тестов, которые вы можете запускать и повторно запускать, - лучший способ выявлять ошибки, и вам действительно нужно их больше (тесты, а не ошибки :-) на динамических языках, таких как Ruby ...

person DigitalRoss    schedule 26.11.2009
comment
Я знаю, что тесты - это хорошо :). Я просто хотел бы иметь что-то доступное для запуска и сообщать мне, есть ли у меня опечатки или необычно плохой код. Что-то вроде pylint logilab.org/857. - person Geo; 26.11.2009
comment
Думаю, я согласен, что это было бы полезно. Единственное, что часто люди сознательно передают методу разные типы. Представьте себе f x=nil;...;end; f(1);. - person DigitalRoss; 26.11.2009
comment
Я не вижу причин, по которым вам нужно их больше в динамических языках. Компиляторы решают только одну из бесконечного числа возможных ошибок, которые могли произойти. - person Jim Deville; 05.12.2009
comment
Представьте себе жизненный цикл сложной программной системы. В конце концов, что-то серьезное будет переработано. С Java это можно сделать с уверенностью. В конце процесса все ожидают, какие типы они получат на самом деле. В Ruby может быть любое количество неожиданных типов, просто ожидающих динамической передачи, даже без какого-либо рефакторинга. Это общепринятое мнение и обычный аргумент в пользу статической типизации. - person DigitalRoss; 07.12.2009

nitpick может быть тем, что вы ищете.

С помощью этого кода:

class MyString < String
  def awesome
    self.gsub("e", "3").gsub("l", "1").uppercase
  end
end

puts MyString.new("leet").awesome

... он выводит:

$ nitpick misspelling.rb 
*** Nitpick had trouble loading "misspelling.rb":
    NoMethodError undefined method `uppercase' for "133t":MyString
Nothing to report boss! He's clean!
person phiggy    schedule 27.10.2010

Еще не использовал, но звучит многообещающе (обновлю, когда я это протестирую).

https://github.com/michaeledgar/laser

Статический анализ и линтер стилей для кода Ruby.

person cvshepherd    schedule 24.12.2011

Pelusa хороша, но работает только в Rubinius. Однако это не должно быть проблемой для людей, знакомых с RVM.

person phil pirozhkov    schedule 29.08.2012

avdi@lazarus:~$ irb
>> a = 20
=> 20
>> b = 30
=> 30
>> puts c
NameError: undefined local variable or method `c' for main:Object
        from (irb):3
>>

Итак, инструмент называется «IRB». Получу ли я награду?

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

person Avdi    schedule 02.12.2009
comment
Подождите немного, прежде чем вы получите награду :) - person Geo; 02.12.2009
comment
Гм, это не просто irb, это Ruby. Ruby выдаст предупреждение, когда вы попытаетесь получить доступ к неназначенной переменной. - person meagar; 28.10.2010