Techioz Blog

ファイルに適用される RuboCop ルールをクエリするにはどうすればよいですか?

概要

私は、コードベースの特定の領域でrubocopがどのように使用されているか(有効化/無効化されているか)、修正されているか(todoリストに除外されているか)を分析するツールに取り組んでいます。多数の構成オプションを考慮すると、ファイルまたはフォルダーが指定されているか、特定のルールが有効になっているか、このファイルが todo によって除外されているかどうかをプログラムで RuboCop に問い合わせる方法を探していると思います。これ用の API はありますか?

私はこれまで https://github.com/rubocop/rubocop を調べて API を見つけられるかどうかを確認しました…SO と Google で検索しましたが、何も見つかりませんでした。

解決策

あなたが望むもののためのパブリックインターフェイスはないと思います。ランナー内のこの Mobize_team メソッドは、RuboCop::Cop::Team をインスタンス化します。チーム オブジェクトは、このroundup_relevant_copsメソッドで使用する警官を決定します。これらのメソッドは両方ともプライベートですが、send を使用してこれを回避できます。

たとえば、test_one.rb と test_two.rb という 2 つのファイルを含むプロジェクトがあるとします。

.rubocop_todo.yml には、ファイルの 1 つをまだ処理する必要があることが示されています。

# .rubocop_todo.yml
Style/FrozenStringLiteralComment:
  Exclude:
    - 'test_two.rb'

.rubocop.yml 設定では、Style/FrozenStringLiteralComment のみを考慮する必要があると述べています。

# .rubocop.yml
inherit_from: .rubocop_todo.yml

AllCops:
  DisabledByDefault: true

Style/FrozenStringLiteralComment:
  Enabled: true

これを実行すると、RuboCop が各ファイルに適用する警官を確認できます。

require 'rubocop'

# Set up the Runner. Assumes no special command line options are involved.
options, _paths = RuboCop::Options.new.parse([])
config_store = RuboCop::ConfigStore.new
runner = RuboCop::Runner.new(options, config_store)

# For each file, figure out which cops are enabled for that file
['test_one.rb', 'test_two.rb'].each do |filename|
  full_path = File.join(Dir.pwd, filename)
  config = config_store.for_file(full_path)
  source = RuboCop::ProcessedSource.from_file(full_path, config.target_ruby_version)
  team = runner.send(:mobilize_team, source)
  cops = team.send(:roundup_relevant_cops, source)
  puts "#{filename}: #{cops.map(&:name).join(', ')}"
end

これにより、次の出力が表示されます。

test_one.rb: Lint/Syntax, Style/FrozenStringLiteralComment
test_two.rb: Lint/Syntax

Enable_cop のこの特殊な条件のせいでしょうか? Lint/Syntax cop は常に有効になっています。また、test_one.rb は TODO リストに含まれていないため、Style/FrozenStringLiteralComment コップの対象となる唯一のファイルです。