rubocop rspec ruby2.4-strict 规则 MultilineBlockLayout 和 NamedSubject 冲突
rubocop rspec ruby2.4-strict rule MultilineBlockLayout and NamedSubject conflict
我有以下 rspec ruby 代码。我正在测试一些木偶模块。它会引发 linting 错误。
Block body expression is on the same line as the block start. (convention:Layout/MultilineBlockLayout)
describe "on #{os}" do
let(:facts) { facts }
it { is_expected.to contain_class('windows_some_thing::some_suite') }
context 'with some_suite_enabled' do
let(:params) { { cipher_suite: %w[ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ] } }
it { is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=11=]0000\Functions').with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
}
end
我可以使用 rubocop -a
来修复它。但是,这会按以下方式更正代码。然后得到一个不同的 linting 错误
Name your test subject if you need to reference it explicitly. (convention:RSpec/NamedSubject)
it {
expect(subject).to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=12=]0000\Functions').with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
}
如何为 ruby-2.4-strict
解决这个问题?我有超过 10000 个 linting 错误需要修复。分布在多个文件和模块中。所以我需要一个实用的直接解决方案。我知道这会非常耗时。但我不希望它花费一年的时间来完成。
对
更简单更直接的修正
Block body expression is on the same line as the block start.
(convention:Layout/MultilineBlockLayout)
会涉及到这个:
it {
is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=10=]0000\Functions').with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
}
规则是 多行 块的开始和结束分隔符必须出现在与块主体中的任何内容(空格除外)分开的行上。
那也仍然会升起一面旗帜,但更正的旗帜更明显。 linter 希望您使用 do
和 end
来分隔多行块,所以这是您最终想要成为的地方:
it do
is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=11=]0000\Functions').with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
end
或者甚至在这里:
it do
is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=12=]0000\Functions')
.with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
end
我发现最后一个更具可读性,特别是如果你想链接额外的谓词。
我有以下 rspec ruby 代码。我正在测试一些木偶模块。它会引发 linting 错误。
Block body expression is on the same line as the block start. (convention:Layout/MultilineBlockLayout)
describe "on #{os}" do
let(:facts) { facts }
it { is_expected.to contain_class('windows_some_thing::some_suite') }
context 'with some_suite_enabled' do
let(:params) { { cipher_suite: %w[ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ] } }
it { is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=11=]0000\Functions').with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
}
end
我可以使用 rubocop -a
来修复它。但是,这会按以下方式更正代码。然后得到一个不同的 linting 错误
Name your test subject if you need to reference it explicitly. (convention:RSpec/NamedSubject)
it {
expect(subject).to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=12=]0000\Functions').with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
}
如何为 ruby-2.4-strict
解决这个问题?我有超过 10000 个 linting 错误需要修复。分布在多个文件和模块中。所以我需要一个实用的直接解决方案。我知道这会非常耗时。但我不希望它花费一年的时间来完成。
对
更简单更直接的修正
Block body expression is on the same line as the block start. (convention:Layout/MultilineBlockLayout)
会涉及到这个:
it {
is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=10=]0000\Functions').with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
}
规则是 多行 块的开始和结束分隔符必须出现在与块主体中的任何内容(空格除外)分开的行上。
那也仍然会升起一面旗帜,但更正的旗帜更明显。 linter 希望您使用 do
和 end
来分隔多行块,所以这是您最终想要成为的地方:
it do
is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=11=]0000\Functions').with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
end
或者甚至在这里:
it do
is_expected.to contain_registry_value('HKLM\SOFTWARE\Policies\Microsoft\something\something\something[=12=]0000\Functions')
.with(
ensure: 'present',
type: 'string',
data: 'ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521,ABC_ECDHE_JKL_WITH_ABC_123_RET_ABC_384_521 ',
)
end
我发现最后一个更具可读性,特别是如果你想链接额外的谓词。