Rails/FilePath の false positive を直した

RuboCop のイシューが 280 を突破していたので、イシューの数を減らすのに bug ラベルを見てたりした。

ちょうど以下が2つ分のイシューを減らせる感じだったので対応しておいた。結果としてレポートからだいたい1年越しくらいの対応になっている。

github.com

そのときの再現 tip を書き残しておく。

まずイシューに書かれた (的確な) 再現ケースは解決の最初の糸口になる。自分の場合は /tmp とか適当なディレクトリに a.rb や b.rb といった Ruby ファイルを作って再現コードをコピペして rubocop コマンドを実行するところから始める。その場合、Rails department の場合は rubocop --only Rails/FilePath といった形で Rails department を指定しないと非 Rails プロジェクトの /tmp/a.rb では適用されないのだった (を失念してしばらく ? になった) 。

% cat /tmp/rep.rb
# frozen_string_literal: true

system "rm -rf #{Rails.root.join('public', 'system')}"

--only Rails/FilePath cop 指定なし

% rubocop /tmp/rep.rb
Inspecting 1 file
.

1 file inspected, no offenses detected

false positive が再現しない。

--only Rails/FilePath cop 指定あり

% rubocop --only Rails/FilePath /tmp/rep.rb
Inspecting 1 file
C

Offenses:

/tmp/rep.rb:3:8: C: Rails/FilePath: Please use Rails.root.join('path', 'to') instead.
system "rm -rf #{Rails.root.join('public', 'system')}"
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected

false positive が再現する。

bbatsov/rubocop#5283を見た

イシューの内容はともかく、起票してた人が METALLICA の T シャツを着ているアイコンだったので気になっていたのを見てた。

github.com

jq コマンドと RuboCop::PathUtil.smart_path について知る良い機会になった。

あと RuboCop::PathUtil.smart_path を見て知ったこととして module_function はこんな書き方ができるんですね。

module Foo
  module_function

  def hello
    puts 'hello'
  end

  def bye
    puts 'bye'
  end
end

Foo.hello #=> hello
Foo.bye   #=> bye

iTMSで桜花忍法帖を買った

気がついたら音源というものをあまり板で買わなくなってた。

桜花忍法帖

桜花忍法帖

backport_yield_self をリリースした

Ruby 2.5.0 で導入された Kernel#yield_self を使いたいけれど、諸般の事情で Ruby 2.5.0 にアップグレードできていない人たち向けに backport_yield_self という Gem をリリースした。名前のとおり Kernel#yield_self のバックポートで Ruby 2.2 から Ruby 2.4 で使えるようにした。

RUBY_VERSION #=> "2.4.3"

'hi'.yield_self { |str| str.upcase } #=> "HI"

Ruby 本体から切り出し Gemify したバックポートということで、ネイティブビルドという点が類似の Gem との違いだろう。

github.com

なお、Ruby 2.1 以下は EOL のためサポート対象外にしている。

Devise 4.4.0 へのアップグレード

去年の暮れにリリースされた Devise 4.4.0 で、Devise で発生していた Ruby 2.5.0 でのシンタックスエラーが解決されて、以下の koic/devise を使わなくても Ruby 2.5.0 で Devise を使えるようになった。

koic.hatenablog.com