RuboCop 0.59.2 がリリースされた

RuboCop 0.59.2 がリリースされた。おそらく 0.59 系で最強のリリースになっている。

github.com

今回の変更履歴の内容を取り上げる。

Bug fixes

#6266: Fix a false positive for Rails/HasManyOrHasOneDependent when using associations of Active Resource. (@tejasbubane, @koic)

has_many といった association メソッドについて、Active Resource で偽陽性が出ていたものへの修正。当初、ApplicationRecordActiveRecord::Base を継承したものに絞った PR がマージされていたが、それだと Mix-in するモジュールに association メソッドがある場合に偽陰性が出てしまうので更に修正を加えたものがリリースされている。ActiveModelSerializer 利用時にも Active Resource 利用時と同様の問題があるとのことで、将来的に何らかのパッチを後続する気持ち。

#6296: Fix an auto-correct error for Style/For when setting EnforcedStyle: each and for dose not have do or semicolon. (@autopp)

Style/For での auto-correct 時のエラーを修正している。Style/For の auto-correct のエラーについては今回もうひとつ直されているものがある (後述) 。

#6300: Fix a false positive for Layout/EmptyLineAfterGuardClause when guard clause including heredoc. (@koic)

RuboCop 0.59.1 でのバグ修正をしたつもりがリグレッションを生んでいたものを更に修正した。

付随して以下のようなケースをガード条件と見なすようにした。後置 if などは Ruby 独特の書き方で、それらを備えていない言語の場合はこれもガード条件となるだろうというのを判断基準としている。

 if truthy
   raise <<-MSG
     This is an error.
   MSG
 end
+
 value

RuboCop core team としてはユーザーの様子を見てみましょうといったところ。

#6287: Fix AllowURI option for Metrics/LineLength cop with disabled Layut/Tab cop. (@AlexWayfer)

LineLength cop には URL を含む行については長さ制限をしないという AllowURI というデフォルトで有効のオプションがあるが、そのオプションに関する不具合を直している。

#5338: Move checking of class- and module defining blocks from Metrics/BlockLength into the respective length cops. (@drenmi)

以下のようなクラスやモジュール生成にブロックを使うケースは Metrics/BlockLength ではなく、それぞれ Metrics/ClassLength / Metrics/ModuleLength で検査するように移動されている。

Foo = Class.new do
  do_something
  ...
end
Bar = Module.new do
  do_something
  ...
end

#2841: Fix Style/ZeroLengthPredicate false positives when inspecting Tempfile, StringIO, and File::Stat objects. (@drenmi)

Ruby 標準 APIempty を備えていないケースでの偽陽性に対して Style/ZeroLengthPredicate を修正している。

例えば以下のようなケースは妥当としている。

File.stat(foo).size == 0
StringIO.new('foo').size == 0
StringIO.new.size == 0
Tempfile.new('foo').size == 0

#6305: Fix infinite loop for Layout/EmptyLinesAroundAccessModifier and Layout/EmptyLinesAroundAccessModifier when specifying a superclass that breaks the line. (@koic)

Layout/EmptyLinesAroundAccessModifier cop と Layout/EmptyLinesAroundClassBody cop がそれぞれ、クラス定義でスーパークラスを改行して指定している次の行とアクセス修飾子の前の行にあたる同一行を消そうとするのと挿入しようとする操作で競合して、InfiniteCorrectionLoop エラーが発生するという問題だった。

以下の日記に記したパッチ。

koic.hatenablog.com

#6007: Fix false positive in Style/IfUnlessModifier when using named capture. (@drenmi)

以下のように正規表現の named capture をもちいた際の偽陽性を修正している。

if /(?<foo>\d)/ =~ "bar"
  foo
end

#6311: Prevent Style/Semicolon from breaking on single line if-then-else in assignment. (@drenmi)

以下のコードに対する Style/Semicolon cop のエラーを修正したもの。

def foo
  bar = baz if qux else quux
end

こんな書き方できるんですねと思ったイシューだった。

#6315: Fix an error for Rails/HasManyOrHasOneDependent when an Active Record model does not have any relations. (@koic)

このエントリは最終的に #6266 に統合して RuboCop 0.59.1 からのユーザー影響のある変更ではないため消したつもりが、自分が rebase したときに蘇ったか、squash merge されたタイミングで蘇ったかしていたっぽい。ので、気にされず。

.gitattributes の merge=union での弱点を踏んだのではと思う。

#6316: Fix an auto-correct error for Style/For when setting EnforcedStyle: each with range provided to the for loop without a do keyword or semicolon and without enclosing parenthesis. (@lukasz-wojcik)

Style/For まわりの auto-correct でエラーが発生していたものへの修正その2。

以下のように Range オブジェクトを使ったケースに対応されている。

for n in 1...value do
  puts n
end

auto-correct して each にしたときには括弧が必要になるため、そのあたりも対応されている。

(1...value).each do
  puts n
end

Changes

#6286: Allow exclusion of certain methods for Metrics/MethodLength. (@akanoi)

Metrics/MethodLength cop に ExcludedMethods オプションが追加されている。

このオプションにメソッド名を指定したメソッドは、Metrics/MethodLength cop への除外リストに入る。デフォルトは指定なしの空である。