开发

本页介绍了开发 RSpec 特定 cop 时需要考虑的事项。它旨在作为对一般 RuboCop 开发文档 的补充。

创建新的 cop

克隆仓库并运行 bundle install(如果尚未完成)。以下 rake 任务只能在 rubocop 项目目录本身中运行。

使用捆绑的 rake 任务 new_cop 生成 cop 模板

$ bundle exec rake 'new_cop[RSpec/CopName]'
[create] lib/rubocop/cop/rspec/cop_name.rb
[create] spec/rubocop/cop/rspec/cop_name_spec.rb
[modify] lib/rubocop/cop/rspec_cops.rb - `require_relative 'rspec/cop_name'` was injected.
[modify] A configuration for the cop is added into config/default.yml.
Do 4 steps:
  1. Modify the description of RSpec/CopName in config/default.yml
  2. Implement your new cop in the generated file!
  3. Add an entry about new cop to CHANGELOG.md
  4. Commit your new cop with a message such as
     e.g. "Add new `#{badge}` cop"

选择名称

使用以下规则为新的 cop 命名

  • 选择一个部门。请参阅 现有部门列表

  • 名称具有自解释性

  • 名称解释了 cop 检测到的违规行为,例如 ExtraSpacing

  • 名称以名词开头,而不是动词,例如 ArrayAlignment 而不是 AlignArray

  • 名称易于理解,例如 IndentationStyle 而不是 Tab

  • 名称具有特异性,例如 DuplicateHashKey 而不是 DuplicateKey

  • 名称在可能的情况下保持中立,并在可行的情况下适应多种风格,例如 EmptyLineBeforeBegin

  • 名称使用常用术语,例如 RedundantPercentI 而不是 RedundantPercentSymbolArray

  • 名称使用正确的术语,例如方法调用中的参数,以及方法签名中的参数

  • 没有符号的行称为“空”,而不是“空白”,例如 LeadingEmptyLines 而不是 LeadingBlankLines

  • 优先使用“冗余”而不是“不必要”,例如 RedundantSelf 而不是 UnneededSelf

请参阅 "config/obsoletion.yml 中的“重命名”部分,以获取好的和不好的示例(旧名称在左侧,新名称在右侧)。

基类

RuboCop::Cop::RSpec::Base 类包含方便的 节点模式 DSL 匹配器,这些匹配器将自动考虑任何 自定义 RSpec DSL 配置

例如,如果项目将 let_it_be 定义为 Helper,那么所有 cop 在使用 let? 匹配器时都会找到 let_it_be

编写规范

在处理 RSpec 特定 cop 时,请确保为所有 RSpec 规范加载 默认语言配置。例如

require 'rubocop/rspec/shared_contexts/default_rspec_language_config_context'

RSpec.config do |config|
  # Set metadata on all cop specs
  config.define_derived_metadata(file_path: %r{/spec/rubocop/cop/}) do |meta|
    meta[:type] = :cop_spec
  end

  # Include RuboCop's config shared context for all cop specs
  config.define_derived_metadata(type: :cop_spec) do |meta|
    meta[:config] = true
  end

  config.include_context 'with default RSpec/Language config', :config
end