rake notesを使ってTODOが多くなったらCIで検知する

コード内で長い年月熟成されたTODOに頭を抱えているRailsエンジニアの方々、お疲れ様です。

これ以上のTODOが生まれないように、CIで検知するためのコード書いたので、参考にどうぞ。

参考

rails/source_annotation_extractor.rb at master · rails/rails https://github.com/rails/rails/blob/master/railties/lib/rails/source_annotation_extractor.rb

コード

Rails 4.2.5 で動作確認してます。
ソースコード見る限り、たぶん Rails 5.0.0.beta1 でも動くと思う。

# Rakefile
unless Rails.env.production?
  require_relative 'lib/tasks/monkey/rails'
end

# lib/tasks/monkey/rails.rb
class SourceAnnotationExtractor
  class Annotation
    def self.max_size
      ENV['SOURCE_ANNOTATION_MAX_SIZE'].to_i
    end
  end

  def self.enumerate(tag, options={})
    extractor = new(tag)
    dirs = options.delete(:dirs) || Annotation.directories
    results = extractor.find(dirs)
    extractor.display(results, options)

    results_size = results.values.flatten.size
    if results_size > 0
      puts "#{tag}: #{results_size}"
      puts
      exit 1 if Annotation.max_size < results_size
    end
  end
end

使い方

% bin/rake notes
app/models/user.rb:
  * [12] [FIXME] Please implement someone a feature. I cannot do it.

OPTIMIZE|FIXME|TODO: 1

% echo $?
1

現在の該当行数が表示されるので、頑張って0を目指しましょう。

また、環境変数SOURCE_ANNOTATION_MAX_SIZE閾値を調整できるようにしてあります。 新たなTODOが生まれないように(もし生まれても、短期間で直すように)CIに設定しておきましょう。