From 8b2f3c60abe0cc42af05e2efecb0d2dfca744080 Mon Sep 17 00:00:00 2001 From: Hugo Hache Date: Mon, 20 Sep 2021 15:51:56 +0200 Subject: [PATCH] Add new Style/NumberedParameters cop --- ...new_add_new_stylenumberedparameters_cop.md | 3 ++ config/default.yml | 9 ++++ lib/rubocop.rb | 1 + lib/rubocop/cop/style/numbered_parameters.rb | 46 +++++++++++++++++++ .../cop/style/numbered_parameters_spec.rb | 35 ++++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 changelog/new_add_new_stylenumberedparameters_cop.md create mode 100644 lib/rubocop/cop/style/numbered_parameters.rb create mode 100644 spec/rubocop/cop/style/numbered_parameters_spec.rb diff --git a/changelog/new_add_new_stylenumberedparameters_cop.md b/changelog/new_add_new_stylenumberedparameters_cop.md new file mode 100644 index 00000000000..5fac75f2765 --- /dev/null +++ b/changelog/new_add_new_stylenumberedparameters_cop.md @@ -0,0 +1,3 @@ +* [#10100](https://github.com/rubocop/rubocop/pull/10100): Add new Style/NumberedParameters cop. ([@Hugo-Hache][]) + +[@Hugo-Hache]: https://github.com/Hugo-Hache diff --git a/config/default.yml b/config/default.yml index d491dfdb64a..6e99897a826 100644 --- a/config/default.yml +++ b/config/default.yml @@ -4135,6 +4135,15 @@ Style/Not: VersionAdded: '0.9' VersionChanged: '0.20' +Style/NumberedParameters: + Description: 'Restrict the usage of numbered parameters.' + Enabled: pending + VersionAdded: '<>' + EnforcedStyle: allow_single_line + SupportedStyles: + - allow_single_line + - disallow + Style/NumberedParametersLimit: Description: 'Avoid excessive numbered params in a single block.' Enabled: pending diff --git a/lib/rubocop.rb b/lib/rubocop.rb index 1298bc2bd87..2815286fca1 100644 --- a/lib/rubocop.rb +++ b/lib/rubocop.rb @@ -513,6 +513,7 @@ require_relative 'rubocop/cop/style/method_call_without_args_parentheses' require_relative 'rubocop/cop/style/method_call_with_args_parentheses' require_relative 'rubocop/cop/style/multiline_in_pattern_then' +require_relative 'rubocop/cop/style/numbered_parameters' require_relative 'rubocop/cop/style/redundant_assignment' require_relative 'rubocop/cop/style/redundant_fetch_block' require_relative 'rubocop/cop/style/redundant_file_extension_in_require' diff --git a/lib/rubocop/cop/style/numbered_parameters.rb b/lib/rubocop/cop/style/numbered_parameters.rb new file mode 100644 index 00000000000..9f13ca31747 --- /dev/null +++ b/lib/rubocop/cop/style/numbered_parameters.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Style + # This cop checks for numbered parameters. + # + # It can either restrict the use of numbered parameters to + # single-lined blocks, or disallow completely numbered parameters. + # + # @example EnforcedStyle: allow_single_line (default) + # # bad + # collection.each do + # puts _1 + # end + # + # # good + # collection.each { puts _1 } + # + # @example EnforcedStyle: disallow + # # bad + # collection.each { puts _1 } + # + # # good + # collection.each { |item| puts item } + # + class NumberedParameters < Base + include ConfigurableEnforcedStyle + extend TargetRubyVersion + + MSG_DISALLOW = 'Avoid using numbered parameters.' + MSG_MULTI_LINE = 'Avoid using numbered parameters for multi-line blocks.' + + minimum_target_ruby_version 2.7 + + def on_numblock(node) + if style == :disallow + add_offense(node, message: MSG_DISALLOW) + elsif node.multiline? + add_offense(node, message: MSG_MULTI_LINE) + end + end + end + end + end +end diff --git a/spec/rubocop/cop/style/numbered_parameters_spec.rb b/spec/rubocop/cop/style/numbered_parameters_spec.rb new file mode 100644 index 00000000000..0feeee0fbfb --- /dev/null +++ b/spec/rubocop/cop/style/numbered_parameters_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +RSpec.describe RuboCop::Cop::Style::NumberedParameters, :config do + context '>= Ruby 2.7', :ruby27 do + context 'EnforcedStyle: allow_single_line' do + let(:cop_config) { { 'EnforcedStyle' => 'allow_single_line' } } + + it 'registers an offense when using numbered parameters with multi-line blocks' do + expect_offense(<<~RUBY) + collection.each do + ^^^^^^^^^^^^^^^^^^ Avoid using numbered parameters for multi-line blocks. + puts _1 + end + RUBY + end + + it 'does not register an offense when using numbered parameters with single-line blocks' do + expect_no_offenses(<<~RUBY) + collection.each { puts _1 } + RUBY + end + end + + context 'EnforcedStyle: disallow' do + let(:cop_config) { { 'EnforcedStyle' => 'disallow' } } + + it 'does an offense when using numbered parameters even with single-line blocks' do + expect_offense(<<~RUBY) + collection.each { puts _1 } + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid using numbered parameters. + RUBY + end + end + end +end