RuboCop 0.59.2 がリリースされた。おそらく 0.59 系で最強のリリースになっている。
今回の変更履歴の内容を取り上げる。
Bug fixes
#6266: Fix a false positive for Rails/HasManyOrHasOneDependent
when using associations of Active Resource. (@tejasbubane, @koic)
has_many
といった association メソッドについて、Active Resource で偽陽性が出ていたものへの修正。当初、ApplicationRecord
か ActiveRecord::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 標準 API で empty
を備えていないケースでの偽陽性に対して 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
エラーが発生するという問題だった。
以下の日記に記したパッチ。
#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 への除外リストに入る。デフォルトは指定なしの空である。