diff --git a/rails/rubocop-for-gem.yml b/rails/rubocop-for-gem.yml index e124e5ab6d66e5a988325849c6d284eea1c1c50f..106faf82c40166e23edce09fdf9b61c120d1d8b3 100644 --- a/rails/rubocop-for-gem.yml +++ b/rails/rubocop-for-gem.yml @@ -1,17 +1,13 @@ +inherit_from: "https://git-ce.rwth-aachen.de/noc-public/noc-netze-gitlab-cicd/-/raw/main/rails/rubocop-base.yml" + plugins: - - rubocop-minitest - rubocop-packaging - - rubocop-performance - - rubocop-rails # gem "rubocop", "1.74.0", require: false # gem "rubocop-minitest", "0.37.1", require: false # gem "rubocop-packaging", "0.6.0", require: false # gem "rubocop-performance", "1.24.0", require: false # gem "rubocop-rails", "2.30.3", require: false -AllCops: - NewCops: enable # pending cops get enabled by default and must be disabled by hand, if needed - # BEGIN Customizations # BEGIN Gemspec @@ -20,169 +16,9 @@ Gemspec/RequireMFA: Enabled: false # END Gemspec -# BEGIN Layout -# align case with its 'end' to forbid deep indentation and be consistent with variable assignments -Layout/CaseIndentation: - EnforcedStyle: end # default: case - -# only before, enforcing also after adds too many blank lines -Layout/EmptyLinesAroundAccessModifier: - EnforcedStyle: only_before # default: around - -# prevent unnecessary deep indentation by enforcing 'end' to be at the start of the line -Layout/EndAlignment: - EnforcedStyleAlignWith: start_of_line # default: keyword - -# indent first element one level deeper than the 'parent' -Layout/FirstArrayElementIndentation: - EnforcedStyle: consistent # default: special_inside_parentheses - -# indent first element one level deeper than the 'parent' -Layout/FirstHashElementIndentation: - EnforcedStyle: consistent # default: special_inside_parentheses - -# every screen should be able to handle 150 characters -Layout/LineLength: - Max: 150 # default: 120 - -# indent each method call one level deeper than the 'parent' -Layout/MultilineMethodCallIndentation: - EnforcedStyle: indented # default: aligned -# END Layout - - -# BEGIN Metrics -# too restrictive, this kind of high complexity is needed at times -Metrics/AbcSize: - Enabled: false - -# default is too restrictive, however, having some restriction incentivizes to use helper methods -Metrics/BlockLength: - AllowedMethods: ['class_eval', 'module_eval', 'refine'] # default: 'refine' - CountAsOne: &array_hash_heredoc_method_call ['array', 'hash', 'heredoc', 'method_call'] # default: [] - Exclude: &test_config_db_gemspec_subconfig ['test/**/*', 'config/**/*', 'db/**/*', '*.gemspec', '**/*/*config.rb'] - -# default is too restrictive, having some restriction incentivizes to split up overly large classes -Metrics/ClassLength: - CountAsOne: *array_hash_heredoc_method_call # default: [] - Max: 300 # default: 100 - Exclude: *test_config_db_gemspec_subconfig - -# default is too restrictive, allow higher complexity -Metrics/CyclomaticComplexity: - Max: 14 # default: 7 - -# default is too restrictive, allow longer methods -Metrics/MethodLength: - CountAsOne: *array_hash_heredoc_method_call # default: [] - Max: 30 # default: 10 - Exclude: *test_config_db_gemspec_subconfig - -# default is too restrictive, allow longer modules -Metrics/ModuleLength: - CountAsOne: *array_hash_heredoc_method_call # default: [] - Max: 300 # default: 100 - Exclude: *test_config_db_gemspec_subconfig - -# long parameter lists add too much complexity, keyword args are named and thus more obvious what is expected, ignore them -Metrics/ParameterLists: - CountKeywordArgs: false # default: true - -# default is too restrictive, allow higher complexity -Metrics/PerceivedComplexity: - Max: 16 # default: 8 -# END Metrics - - -# BEGIN Minitest -# seems kind of buggy, when a custom message is given, this is flagged -Minitest/AssertWithExpectedArgument: - Enabled: false - -# allow more assertions than default, but also not too many -Minitest/MultipleAssertions: - Max: 8 # default: 3 -# END Minitest - - # BEGIN Naming # the default gem module must be named like the gem, so allow dashes Naming/FileName: Exclude: ['lib/*.rb'] # END Naming - - -# BEGIN Rails -# file paths should be built with arguments instead of a single string -Rails/ApplicationController: - Exclude: ['app/controllers/api/**/*', 'app/controllers/a_p_i/**/*'] # exclude API namespace, but not others (convention) - -# exclude migrations since non-ApplicationRecord behavior might be desired -Rails/ApplicationRecord: - Exclude: ['db/migrate/*'] - -# ensure paths are built using a filesystem agnostic way, i.e. arguments instead of a single string -Rails/FilePath: - EnforcedStyle: arguments # default: slashes - -# no reason not to use an established Rails feature if developers see fit -Rails/HasAndBelongsToMany: - Enabled: false - -# prevent puts, but exclude test, config, db since Rails Logger may not have been loaded -Rails/Output: - Exclude: ['test/**/*', 'config/**/*', 'db/**/*'] - -# allow usage of methods that skip validations; we trust developers know what they are doing -Rails/SkipsModelValidations: - Enabled: false - -# allow usage of three-state boolean columns, it may be an STI table -Rails/ThreeStateBooleanColumn: - Enabled: false -# END Rails - - -# BEGIN Style -# allow compact style for gems that contain app directory for rails integration -Style/ClassAndModuleChildren: - Exclude: ['app/**/*'] - -# documentation of classes in migrations and tests is not needed -Style/Documentation: - Exclude: *test_config_db_gemspec_subconfig - -# allow in auto-generated files -Style/GlobalStdStream: - Exclude: *test_config_db_gemspec_subconfig - -# allow empty parentheses to differentiate method calls vs attributes -Style/MethodCallWithoutArgsParentheses: - Enabled: false - -# explicit returns are nice and convey meaning, so allow them -Style/RedundantReturn: - Enabled: false - -# allow for explicit calls to self to help differentiate between method calls vs local variables -Style/RedundantSelf: - Enabled: false - -# enforce double quotes in string literals -Style/StringLiterals: - EnforcedStyle: double_quotes # default: single_quotes - -# enforce double quotes inside string interpolations -Style/StringLiteralsInInterpolation: - EnforcedStyle: double_quotes # default: single_quotes - -# allow only brackets, not %i or %I -Style/SymbolArray: - EnforcedStyle: brackets # default: percent - MinSize: 1 # default: 2 - -# allow only brackets, not %w or %W -Style/WordArray: - EnforcedStyle: brackets # default: percent - MinSize: 1 # default: 2 -# END Style +# END Customizations diff --git a/rails/rubocop.yml b/rails/rubocop.yml index 45210986d562115764e1ed9deb3c1e0f891b3466..5dae786c6992653870d9a939bf23d3ee665e16ec 100644 --- a/rails/rubocop.yml +++ b/rails/rubocop.yml @@ -1,176 +1,19 @@ +inherit_from: "https://git-ce.rwth-aachen.de/noc-public/noc-netze-gitlab-cicd/-/raw/main/rails/rubocop/rubocop-base.yml" + plugins: - rubocop-capybara - - rubocop-minitest - - rubocop-performance - - rubocop-rails # gem "rubocop", "1.74.0", require: false # gem "rubocop-capybara", "2.22.1", require: false # gem "rubocop-minitest", "0.37.1", require: false # gem "rubocop-performance", "1.24.0", require: false # gem "rubocop-rails", "2.30.3", require: false -AllCops: - NewCops: enable # pending cops get enabled by default and must be disabled by hand, if needed - # BEGIN Customizations -# BEGIN Layout -# align case with its 'end' to forbid deep indentation and be consistent with variable assignments -Layout/CaseIndentation: - EnforcedStyle: end # default: case - -# only before, enforcing also after adds too many blank lines -Layout/EmptyLinesAroundAccessModifier: - EnforcedStyle: only_before # default: around - -# prevent unnecessary deep indentation by enforcing 'end' to be at the start of the line -Layout/EndAlignment: - EnforcedStyleAlignWith: start_of_line # default: keyword - -# indent first element one level deeper than the 'parent' -Layout/FirstArrayElementIndentation: - EnforcedStyle: consistent # default: special_inside_parentheses - -# indent first element one level deeper than the 'parent' -Layout/FirstHashElementIndentation: - EnforcedStyle: consistent # default: special_inside_parentheses - -# every screen should be able to handle 150 characters -Layout/LineLength: - Max: 150 # default: 120 - -# indent each method call one level deeper than the 'parent' -Layout/MultilineMethodCallIndentation: - EnforcedStyle: indented # default: aligned -# END Layout - - -# BEGIN Metrics -# too restrictive, this kind of high complexity is needed at times -Metrics/AbcSize: - Enabled: false - -# default is too restrictive, however, having some restriction incentivizes to use helper methods -Metrics/BlockLength: - AllowedMethods: ['class_eval', 'module_eval', 'refine'] # default: 'refine' - CountAsOne: &array_hash_heredoc_method_call ['array', 'hash', 'heredoc', 'method_call'] # default: [] - Exclude: &test_config_db ['test/**/*', 'config/**/*', 'db/**/*'] - -# default is too restrictive, having some restriction incentivizes to split up overly large classes -Metrics/ClassLength: - CountAsOne: *array_hash_heredoc_method_call # default: [] - Max: 300 # default: 100 - Exclude: *test_config_db - -# default is too restrictive, allow higher complexity -Metrics/CyclomaticComplexity: - Max: 14 # default: 7 - -# default is too restrictive, allow longer methods -Metrics/MethodLength: - CountAsOne: *array_hash_heredoc_method_call # default: [] - Max: 30 # default: 10 - Exclude: *test_config_db - -# default is too restrictive, allow longer modules -Metrics/ModuleLength: - CountAsOne: *array_hash_heredoc_method_call # default: [] - Max: 300 # default: 100 - Exclude: *test_config_db - -# long parameter lists add too much complexity, keyword args are named and thus more obvious what is expected, ignore them -Metrics/ParameterLists: - CountKeywordArgs: false # default: true - -# default is too restrictive, allow higher complexity -Metrics/PerceivedComplexity: - Max: 16 # default: 8 -# END Metrics - - -# BEGIN Minitest -# seems kind of buggy, when a custom message is given, this is flagged -Minitest/AssertWithExpectedArgument: - Enabled: false - -# allow more assertions than default, but also not too many -Minitest/MultipleAssertions: - Max: 8 # default: 3 -# END Minitest - - -# BEGIN Rails -# file paths should be built with arguments instead of a single string -Rails/ApplicationController: - Exclude: ['app/controllers/api/**/*', 'app/controllers/a_p_i/**/*'] # exclude API namespace, but not others (convention) - -# exclude migrations since non-ApplicationRecord behavior might be desired -Rails/ApplicationRecord: - Exclude: ['db/migrate/*'] - -# ensure paths are built using a filesystem agnostic way, i.e. arguments instead of a single string -Rails/FilePath: - EnforcedStyle: arguments # default: slashes - -# no reason not to use an established Rails feature if developers see fit -Rails/HasAndBelongsToMany: - Enabled: false - -# prevent puts, but exclude test, config, db since Rails Logger may not have been loaded -Rails/Output: - Exclude: ['test/**/*', 'config/**/*', 'db/**/*'] - -# allow usage of methods that skip validations; we trust developers know what they are doing -Rails/SkipsModelValidations: - Enabled: false - -# allow usage of three-state boolean columns, it may be an STI table -Rails/ThreeStateBooleanColumn: - Enabled: false -# END Rails - - # BEGIN Style # prefer compact style, since Zeitwerk handles initialization of modules Style/ClassAndModuleChildren: EnforcedStyle: compact # default: nested Exclude: ['config/application.rb'] - -# documentation of classes in migrations and tests is not needed -Style/Documentation: - Exclude: *test_config_db - -# allow in auto-generated files -Style/GlobalStdStream: - Exclude: *test_config_db - -# allow empty parentheses to differentiate method calls vs attributes -Style/MethodCallWithoutArgsParentheses: - Enabled: false - -# explicit returns are nice and convey meaning, so allow them -Style/RedundantReturn: - Enabled: false - -# allow for explicit calls to self to help differentiate between method calls vs local variables -Style/RedundantSelf: - Enabled: false - -# enforce double quotes in string literals -Style/StringLiterals: - EnforcedStyle: double_quotes # default: single_quotes - -# enforce double quotes inside string interpolations -Style/StringLiteralsInInterpolation: - EnforcedStyle: double_quotes # default: single_quotes - -# allow only brackets, not %i or %I -Style/SymbolArray: - EnforcedStyle: brackets # default: percent - MinSize: 1 # default: 2 - -# allow only brackets, not %w or %W -Style/WordArray: - EnforcedStyle: brackets # default: percent - MinSize: 1 # default: 2 # END Style +# END Customizations diff --git a/rails/rubocop/rubocop-base.yml b/rails/rubocop/rubocop-base.yml index a007554820ce167f37017143238a2eddd51deea0..371266acf864ccee23e16b1824b2b1712cdea2c6 100644 --- a/rails/rubocop/rubocop-base.yml +++ b/rails/rubocop/rubocop-base.yml @@ -1,8 +1,12 @@ plugins: + - rubocop-minitest - rubocop-performance + - rubocop-rails -# gem 'rubocop', '1.73.2', require: false -# gem 'rubocop-performance', '1.24.0', require: false +# gem "rubocop", "1.74.0", require: false +# gem "rubocop-minitest", "0.37.1", require: false +# gem "rubocop-performance", "1.24.0", require: false +# gem "rubocop-rails", "2.30.3", require: false AllCops: NewCops: enable # pending cops get enabled by default and must be disabled by hand, if needed @@ -48,13 +52,13 @@ Metrics/AbcSize: Metrics/BlockLength: AllowedMethods: ['class_eval', 'module_eval', 'refine'] # default: 'refine' CountAsOne: &array_hash_heredoc_method_call ['array', 'hash', 'heredoc', 'method_call'] # default: [] - Exclude: &test_config_db ['test/**/*', 'config/**/*', 'db/**/*'] + Exclude: &test_config_db_gemspec_subconfig ['test/**/*', 'config/**/*', 'db/**/*', '*.gemspec', '**/*/*config.rb'] # default is too restrictive, having some restriction incentivizes to split up overly large classes Metrics/ClassLength: CountAsOne: *array_hash_heredoc_method_call # default: [] Max: 300 # default: 100 - Exclude: *test_config_db + Exclude: *test_config_db_gemspec_subconfig # default is too restrictive, allow higher complexity Metrics/CyclomaticComplexity: @@ -64,13 +68,13 @@ Metrics/CyclomaticComplexity: Metrics/MethodLength: CountAsOne: *array_hash_heredoc_method_call # default: [] Max: 30 # default: 10 - Exclude: *test_config_db + Exclude: *test_config_db_gemspec_subconfig # default is too restrictive, allow longer modules Metrics/ModuleLength: CountAsOne: *array_hash_heredoc_method_call # default: [] Max: 300 # default: 100 - Exclude: *test_config_db + Exclude: *test_config_db_gemspec_subconfig # long parameter lists add too much complexity, keyword args are named and thus more obvious what is expected, ignore them Metrics/ParameterLists: @@ -82,19 +86,64 @@ Metrics/PerceivedComplexity: # END Metrics +# BEGIN Minitest +# seems kind of buggy, when a custom message is given, this is flagged +Minitest/AssertWithExpectedArgument: + Enabled: false + +# allow more assertions than default, but also not too many +Minitest/MultipleAssertions: + Max: 8 # default: 3 +# END Minitest + + +# BEGIN Rails +# exclude API namespace, but not others (ITC convention) +Rails/ApplicationController: + Exclude: ['app/controllers/api/**/*', 'app/controllers/a_p_i/**/*'] + +# exclude migrations since non-ApplicationRecord behavior might be desired +Rails/ApplicationRecord: + Exclude: ['db/migrate/*'] + +# ensure paths are built using a filesystem agnostic way, i.e. arguments instead of a single string +Rails/FilePath: + EnforcedStyle: arguments # default: slashes + +# no reason not to use an established Rails feature if developers see fit +Rails/HasAndBelongsToMany: + Enabled: false + +# prevent puts, but exclude test, config, db since Rails Logger may not have been loaded +Rails/Output: + Exclude: *test_config_db_gemspec_subconfig + +# allow usage of methods that skip validations; we trust developers know what they are doing +Rails/SkipsModelValidations: + Enabled: false +# END Rails + + # BEGIN Style -# prefer compact style, since Zeitwerk handles initialization of modules -Style/ClassAndModuleChildren: - EnforcedStyle: compact # default: nested - Exclude: ['config/application.rb'] +# prevent getting around most cops, but allow a few that may be impossible to resolve otherwise, f.e.: +# Lint/UnusedMethodArgument: subclasses that are passed unused keyword args, but not using them must be allowed +# Naming/PredicateName: allow DSL style methods like Rails 'has_one' +# Naming/VariableNumber: allow passing keyword args to other libraries that violate naming conventions +# Rails/CreateTableWithTimestamps: audited does not include 'updated_at', may also be true for other libraries, ultimately leave the choice to end-user +# Rails/DangerousColumnNames: mainly to allow adding and changing column named 'id' +# Rails/NegateInclude: allow classes to define include? and not force to also define exclude?, like IPAddr +# Rails/ThreeStateBooleanColumn: allow usage of three-state boolean columns, it may be an STI table +Style/DisableCopsWithinSourceCodeDirective: + Enabled: true + AllowedCops: ['Lint/UnusedMethodArgument', 'Naming/PredicateName', 'Naming/VariableNumber', 'Rails/CreateTableWithTimestamps', 'Rails/DangerousColumnNames', 'Rails/NegateInclude', 'Rails/ThreeStateBooleanColumn'] # documentation of classes in migrations and tests is not needed Style/Documentation: - Exclude: *test_config_db + Exclude: *test_config_db_gemspec_subconfig # allow in auto-generated files Style/GlobalStdStream: - Exclude: *test_config_db + Exclude: *test_config_db_gemspec_subconfig # allow empty parentheses to differentiate method calls vs attributes Style/MethodCallWithoutArgsParentheses: @@ -126,3 +175,4 @@ Style/WordArray: EnforcedStyle: brackets # default: percent MinSize: 1 # default: 2 # END Style +# END Customizations diff --git a/rails/rubocop/rubocop-minitest.yml b/rails/rubocop/rubocop-minitest.yml deleted file mode 100644 index a6f453f55c281cc145f775ddc7249f3816246617..0000000000000000000000000000000000000000 --- a/rails/rubocop/rubocop-minitest.yml +++ /dev/null @@ -1,19 +0,0 @@ -plugins: - - rubocop-minitest - -# gem 'rubocop', '1.73.2', require: false -# gem 'rubocop-minitest', '0.37.1', require: false -AllCops: - NewCops: enable # pending cops get enabled by default and must be disabled by hand, if needed - - -# BEGIN Customizations -# BEGIN Minitest -# seems kind of buggy, when a custom message is given, this is flagged -Minitest/AssertWithExpectedArgument: - Enabled: false - -# allow more assertions than default, but also not too many -Minitest/MultipleAssertions: - Max: 8 # default: 3 -# END Minitest diff --git a/rails/rubocop/rubocop-rails.yml b/rails/rubocop/rubocop-rails.yml deleted file mode 100644 index 391bfb298be3dd71f4116b6b37b9e61fc419b7da..0000000000000000000000000000000000000000 --- a/rails/rubocop/rubocop-rails.yml +++ /dev/null @@ -1,39 +0,0 @@ -plugins: - - rubocop-rails - -# gem 'rubocop', '1.73.2', require: false -# gem 'rubocop-rails', '2.30.3', require: false -AllCops: - NewCops: enable # pending cops get enabled by default and must be disabled by hand, if needed - - -# BEGIN Customizations -# BEGIN Rails -# file paths should be built with arguments instead of a single string -Rails/ApplicationController: - Exclude: ['app/controllers/api/**/*', 'app/controllers/a_p_i/**/*'] # exclude API namespace, but not others (ITC convention) - -# exclude migrations since non-ApplicationRecord behavior might be desired -Rails/ApplicationRecord: - Exclude: ['db/migrate/*'] - -# ensure paths are built using a filesystem agnostic way, i.e. arguments instead of a single string -Rails/FilePath: - EnforcedStyle: arguments # default: slashes - -# no reason not to use an established Rails feature if developers see fit -Rails/HasAndBelongsToMany: - Enabled: false - -# prevent puts, but exclude test, config, db since Rails Logger may not have been loaded -Rails/Output: - Exclude: ['test/**/*', 'config/**/*', 'db/**/*'] - -# allow usage of methods that skip validations; we trust developers know what they are doing -Rails/SkipsModelValidations: - Enabled: false - -# allow usage of three-state boolean columns, it may be an STI table -Rails/ThreeStateBooleanColumn: - Enabled: false -# END Rails