Note

3年後の自分のために書いています

rails stats コマンドで app 以下のディレクリを全て計測できるようにする

$ rails stats コマンドはデフォルトでは以下のディレクトリしか計測しないため、サービスクラスを app/services 以下に置いているような場合、その分は計測されない。

app/controllers
app/helpers
app/jobs
app/models
app/mailers
app/mailboxes
app/channels
app/assets/javascripts
app/javascript
lib/
app/apis
+ test 以下のディレクトリ

See. rails/statistics.rake at 3d428777b05701ca7211a1be723cb1ee0e094bd9 · rails/rails · GitHub

ちなみに上記のようにデフォルトではテストコードの計測は test 以下のディレクトリを対象にしているが、rspec-rails が計測ディレクリ名を test -> specs に上書きしているので、specs 以下のテストコードが計測されるようになっている。

See. rspec-rails/rspec.rake at 13a8a01cc07c93db97b5f1cd57229527441cd626 · rspec/rspec-rails · GitHub

👆 の rspec-rails の上書きを参考にしながら以下のようなコードをプロジェクトの Rakefile に追加してやれば、app 以下のディレクトリ(view 以外)全て計測できるようになる。

# Rakefile
# ...

task stats: "custom:statsetup"

namespace :custom do
  task :statsetup do
    # Push target directories to STATS_DIRECTORIES
    app_dirs = Dir.children('./app').map { |child| "app/#{child}" }
    stats_types = Hash[app_dirs.map { |dir| [dir.split('/').last, dir] }]
    stats_types.each do |type, dir|
      next if type == 'views'
      name = type.capitalize
      ::STATS_DIRECTORIES << [name, dir] unless ::STATS_DIRECTORIES.map(&:first).include?(name)
    end
  end
end

その他

前述のように rspec-rails が計測ディレクリ名を上書きしているため、もし rspec-rails を Gemfile の group :test に置いていると、$ rails stats コマンド実行時にこの上書きがされず、テストコードの計測ができないので group :development, :test などに置いてやる必要がある。

参考