我正在开发一个工具来分析如何在代码库的某些区域使用(启用/禁用)和修复(不包括在待办事项列表中)RuboCop.考虑到大量的配置选项,我正在寻找一种方法,以编程方式询问RuboCop是否给定了文件或文件夹,是否启用了特定规则,以及是否通过TODO排除了该文件.有针对这一点的API吗?
到目前为止,我已经在https://github.com/rubocop/rubocop个地方探索过了,看看我是否能找到一个API...通过SO和谷歌搜索,什么也找不到.
我正在开发一个工具来分析如何在代码库的某些区域使用(启用/禁用)和修复(不包括在待办事项列表中)RuboCop.考虑到大量的配置选项,我正在寻找一种方法,以编程方式询问RuboCop是否给定了文件或文件夹,是否启用了特定规则,以及是否通过TODO排除了该文件.有针对这一点的API吗?
到目前为止,我已经在https://github.com/rubocop/rubocop个地方探索过了,看看我是否能找到一个API...通过SO和谷歌搜索,什么也找不到.
我不认为你想要什么就有什么公共接口.This mobilize_team
method in the Runner是RuboCop::Cop::Team
的实例化.Team对象确定在this roundup_relevant_cops
method中使用的警察.这两种方法都是私有的,但您可以使用send
来解决这一问题.
例如,假设我们有一个项目,其中包含名为test_one.rb
和test_two.rb
的两个文件.
.rubocop_todo.yml
表示,其中一个文件仍需处理:
# .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
由于this special condition in enable_cop?
,Lint/Syntax
COP始终处于启用状态.由于test_one.rb
不包括在TODO列表中,它是唯一符合第Style/FrozenStringLiteralComment
个COP的文件.