FSS XIIII を買った

毎度のように前巻の内容を忘れてしまっているわけで、脳内のセーブデータなしでざっと読んでもよく分からなったため、もう何度か読むと思う。

`Style/ExpandPathArguments` copを実装した

実装していたのは4日、5日前くらいで今回マージされた cop となる。

github.com

Ruby 2.0 で導入された擬似変数 __dir__File.expand_pathPathname() の引数に使える局面で __FILE__ より好んで使いましょうということをチェックする。

PR の Description から引用するとこうなる。特に最後に示している引数が変数や式展開のケースは渡ってくるパスが特定できないのでチェックをしないようにしている。

Summary

This cop checks for use of the File.expand_path arguments.

# bad
File.expand_path('..', __FILE__)

# good
File.expand_path(__dir__)

Likewise, it also checks for the Pathname.new argument.

# bad
Pathname.new(__FILE__).parent.expand_path

# good
Pathname.new(__dir__).expand_path

Basically, replace __FILE__ with __dir_, but also warn about arguments that specify unnecessary current directory as follows.

# bad
File.expand_path('.', __FILE__)

# good
File.expand_path(__FILE__)

This cop has autocorrect for these. This commit autocorrected some offenses that had occurred in RuboCop itself using this Style/ExpandPathArguments cop.

Other Information

If other than str_type is used as an argument to expand_path, it will not be checked because the path cannot be determined.

For example, in the following cases.

File.expand_path(path, __FILE__)
File.expand_path("#{path_to_file}.png", __FILE__)

`Rails/FilePath` cop へのリグレッションを直した

先日直したつもりでいた Rails/FilePath cop への false positive についてリグレッションを作っていたのを直した。

(当然だけど) 非 Rails アプリケーションである RuboCop には Rails 部署の cop はデフォルトで効かないのと、既存テストで担保されていない分でロジックが及んでいなかったということで埋め込んでいたもの。

github.com

サンプルで実験するときは、最小限の1行コードのために Rails アプリケーションを使うのも手間なので --only オプションで明示的な指定をして再現をしたりしていた。

% cat /tmp/a.rb
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')

% rubocop --only Rails/FilePath /tmp/a.rb
/tmp/a.rb:1:13: C: Rails/FilePath: Please use Rails.root.join('path', 'to') instead.
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected

Edge のコードを使ってのレポートをしてくれた Issue の起票者に感謝。

GitHubの草が途切れた

ブラウザのシークレットモードで見たら草が生えていたけれど、それはたぶん GitHub のバグ。

この日の草への水やりはしていたものと思っていたら、実はしていなかったという。以下の Cop 実装に手をかけていたこともあり、それほど注意していなかったというのはある。

github.com

草といえば Write Code Everyday からの影響がはじまりで、 2015 年から意図的に手段と目的を入れ替えて「草を生やすことが目的」としていたが、こんかい意図せず草が途切れても想像よりずっと衝撃が小さくて「まあ、いいか」という感想に自分が軽く驚いていた。

気がついたら「草を生やすことが目的」ではなくなっていたのかもしれない。

2018年2月10日追記: 翌日に出していた PR がマージされた際に、PR に含んでいたコミットがこの日のものだったようで結果的に草が繋がった。

`Lint/OrderedMagicComments` copを実装した

znz さんが開いてくれた Issue をもとに2日くらい前に実装した Lint/OrderedMagicComments cop がマージされた。次の RuboCop のリリースで足されると思う。

github.com

サンプル (もとは Issue) からの抜粋が Cop の説明になると思う。

#
#   # bad
#
#   # frozen_string_literal: true
#   # encoding: ascii
#   p [''.frozen?, ''.encoding] #=> [true, #<Encoding:UTF-8>]
#
#   # good
#
#   # encoding: ascii
#   # frozen_string_literal: true
#   p [''.frozen?, ''.encoding] #=> [true, #<Encoding:US-ASCII>]
#
#   # good
#
#   #!/usr/bin/env ruby
#   # encoding: ascii
#   # frozen_string_literal: true
#   p [''.frozen?, ''.encoding] #=> [true, #<Encoding:US-ASCII>]
#

マジックコメントの順序で結果が変わるのはなるほどだったので、また少し Ruby 詳しくなれた。

ちなみにこの Cop を実装しようと思った時に、ファイルのどの範囲までマジックコメントを探すようにするかが懸念点だったけれど、frozen_string_literal マジックコメントまわりの Cop 実装についてコードリーディングしている中で FrozenStringLiteral#leading_comment_lines メソッドを見つけたときに懸念が解消した感があってそれを使っている。

def leading_comment_lines
  processed_source[0..2].compact
end

沖縄Ruby会議02へのCFPがとおった

ActiveRecord::ConnectionAdapters の下の世界』というタイトルで話します。

ruby.okinawa

CFP の概要に書いた内容は以下でした。

Active Record を構成する要素の中でも ConnectionAdapters の下の世界にフォーカスした話です。とりわけ Active Record の 3rd party adapter のひとつである Oracle enhanced adapter を中心に、ActiveRecord::ConnectionAdapters の下の世界で行われている開発事例について取り挙げる予定です。

沖縄で会いましょう。