ruby 如何查询哪些RuboCop规则适用于文件?

9rnv2umw  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(123)

我正在开发一个工具来分析rubocop在代码库的某些区域中是如何使用(启用/禁用)和修复(排除在todo列表中)的。考虑到众多的配置选项,我 * 认为 * 我正在寻找一种方法,以编程方式询问RuboCop是否给定一个文件或文件夹,启用了某个规则,以及是否通过todo排除该文件。是否有一个API用于此?
到目前为止,我已经在https://github.com/rubocop/rubocop中进行了探索,看看是否能找到一个API.我在google和so上搜索了一下,什么都没找到。

2exbekwf

2exbekwf1#

我不认为有你想要的公共接口。Runner中的mobilize_team方法示例化了一个RuboCop::Cop::Team。team对象决定在这个roundup_relevant_cops方法中使用的cop。这两个方法都是私有的,但是您可以使用send来解决这个问题。
例如,假设我们有一个项目,其中包含两个名为test_one.rbtest_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

由于enable_cop?中的这种特殊情况,Lint/Syntax cop始终处于启用状态。由于test_one.rb不包括在TODO列表中,因此它是唯一符合Style/FrozenStringLiteralComment cop的文件。

相关问题