From 9ffd1cc5a9237bbda94a87148bea14aa1544ec23 Mon Sep 17 00:00:00 2001 From: Tejas Bubane Date: Sun, 31 May 2020 00:17:16 +0530 Subject: [PATCH] [Fix #8063] Add new `AllowedNames` option for `Naming/ClassAndModuleCamelCase` Closes #8063 --- CHANGELOG.md | 1 + config/default.yml | 5 ++++ docs/modules/ROOT/pages/cops_naming.adoc | 20 ++++++++++++++- .../cop/naming/class_and_module_camel_case.rb | 12 ++++++++- .../class_and_module_camel_case_spec.rb | 25 ++++++++++++++++--- 5 files changed, 58 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fae20108e65..12e09889306 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * [#8069](https://github.com/rubocop-hq/rubocop/issues/8069): New option for `expect_offense` to help format offense templates. ([@marcandre][]) * [#7908](https://github.com/rubocop-hq/rubocop/pull/7908): Add new `Style/RedundantRegexpEscape` cop. ([@owst][]) * [#7978](https://github.com/rubocop-hq/rubocop/pull/7978): Add new option `OnlyFor` to the `Bundler/GemComment` cop. ([@ric2b][]) +* [#8063](https://github.com/rubocop-hq/rubocop/issues/8063): Add new `AllowedNames` option for `Naming/ClassAndModuleCamelCase`. ([@tejasbubane][]) ### Bug fixes diff --git a/config/default.yml b/config/default.yml index 2ae3ecf2aec..73231e26bce 100644 --- a/config/default.yml +++ b/config/default.yml @@ -2006,6 +2006,11 @@ Naming/ClassAndModuleCamelCase: StyleGuide: '#camelcase-classes' Enabled: true VersionAdded: '0.50' + VersionChanged: '0.85' + # Allowed class/module names can be specified here. + # These can be full or part of the name. + AllowedNames: + - module_parent Naming/ConstantName: Description: 'Constants should use SCREAMING_SNAKE_CASE.' diff --git a/docs/modules/ROOT/pages/cops_naming.adoc b/docs/modules/ROOT/pages/cops_naming.adoc index bba4fbd380d..b82e2a2ab8f 100644 --- a/docs/modules/ROOT/pages/cops_naming.adoc +++ b/docs/modules/ROOT/pages/cops_naming.adoc @@ -200,12 +200,18 @@ baz { |age, height, gender| do_stuff(age, height, gender) } | Yes | No | 0.50 -| - +| 0.85 |=== This cop checks for class and module names with an underscore in them. +`AllowedNames` config takes an array of permitted names. +Its default value is `['module_parent']`. +These names can be full class/module names or part of the name. +eg. Adding `my_class` to the `AllowedNames` config will allow names like +`my_class`, `my_class::User`, `App::my_class`, `App::my_class::User`, etc. + === Examples [source,ruby] @@ -221,8 +227,20 @@ class MyClass end module MyModule end +class module_parent::MyModule +end ---- +=== Configurable attributes + +|=== +| Name | Default value | Configurable values + +| AllowedNames +| `module_parent` +| Array +|=== + === References * https://rubystyle.guide#camelcase-classes diff --git a/lib/rubocop/cop/naming/class_and_module_camel_case.rb b/lib/rubocop/cop/naming/class_and_module_camel_case.rb index e21ff27d6a6..7cde76bacf4 100644 --- a/lib/rubocop/cop/naming/class_and_module_camel_case.rb +++ b/lib/rubocop/cop/naming/class_and_module_camel_case.rb @@ -6,6 +6,12 @@ module Naming # This cop checks for class and module names with # an underscore in them. # + # `AllowedNames` config takes an array of permitted names. + # Its default value is `['module_parent']`. + # These names can be full class/module names or part of the name. + # eg. Adding `my_class` to the `AllowedNames` config will allow names like + # `my_class`, `my_class::User`, `App::my_class`, `App::my_class::User`, etc. + # # @example # # bad # class My_Class @@ -18,11 +24,15 @@ module Naming # end # module MyModule # end + # class module_parent::MyModule + # end class ClassAndModuleCamelCase < Cop MSG = 'Use CamelCase for classes and modules.' def on_class(node) - return unless /_/.match?(node.loc.name.source) + allowed = /#{cop_config['AllowedNames'].join('|')}/ + name = node.loc.name.source.gsub(allowed, '') + return unless /_/.match?(name) add_offense(node, location: :name) end diff --git a/spec/rubocop/cop/naming/class_and_module_camel_case_spec.rb b/spec/rubocop/cop/naming/class_and_module_camel_case_spec.rb index 7b24e552aeb..eaa22fb863e 100644 --- a/spec/rubocop/cop/naming/class_and_module_camel_case_spec.rb +++ b/spec/rubocop/cop/naming/class_and_module_camel_case_spec.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true -RSpec.describe RuboCop::Cop::Naming::ClassAndModuleCamelCase do - subject(:cop) { described_class.new } - +RSpec.describe RuboCop::Cop::Naming::ClassAndModuleCamelCase, :config do it 'registers an offense for underscore in class and module name' do expect_offense(<<~RUBY) class My_Class @@ -36,4 +34,25 @@ module Mine end RUBY end + + it 'allows module_parent method' do + expect_no_offenses(<<~RUBY) + class module_parent::MyClass + end + RUBY + end + + context 'custom allowed names' do + let(:cop_config) { { 'AllowedNames' => %w[getter_class setter_class] } } + + it 'does not register offense for multiple allowed names' do + expect_no_offenses(<<~RUBY) + class getter_class::MyClass + end + + class setter_class::MyClass + end + RUBY + end + end end