ファイルに適用される 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 コップの対象となる唯一のファイルです。