diff --git a/.rubocop.yml b/.rubocop.yml index 802a6e6..9c49771 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,6 +1,9 @@ -inherit_from: ./config/default.yml +inherit_from: + - ./config/default.yml Naming/FileName: Enabled: true Exclude: - "rubocop-github.gemspec" + - "lib/rubocop-github.rb" + - "lib/rubocop-github-rails.rb" diff --git a/Gemfile.lock b/Gemfile.lock index 41c4de2..e0932d2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,6 +31,8 @@ GEM crass (~> 1.0.2) nokogiri (>= 1.5.9) minitest (5.16.1) + nokogiri (1.13.6-arm64-darwin) + racc (~> 1.4) nokogiri (1.13.6-x86_64-darwin) racc (~> 1.4) parallel (1.22.1) @@ -71,6 +73,7 @@ GEM unicode-display_width (2.2.0) PLATFORMS + arm64-darwin-21 x86_64-darwin-19 x86_64-darwin-20 diff --git a/README.md b/README.md index da68674..541fbe3 100644 --- a/README.md +++ b/README.md @@ -4,22 +4,32 @@ This repository provides recommended RuboCop configuration and additional Cops f ## Usage -**Gemfile** - -``` ruby -gem "rubocop-github" -gem "rubocop-performance", require: false -gem "rubocop-rails", require: false -``` - -**.rubocop.yml** - -``` yaml -inherit_gem: - rubocop-github: - - config/default.yml - - config/rails.yml -``` +Add `rubocop-github` to your Gemfile, along with its dependencies: + + ```ruby + gem "rubocop-github", require: false + gem "rubocop-performance", require: false + gem "rubocop-rails", require: false + ``` + +Inherit all of the stylistic rules and cops through an inheritance declaration in your `.rubocop.yml`: + + ```yaml + # .rubocop.yml + inherit_from: + rubocop-github: + - config/default.yml # generic Ruby rules and cops + - config/rails.yml # Rails-specific rules and cops + ``` + +Alternatively, only require the additional custom cops in your `.rubocop.yml` without inheriting/enabling the other stylistic rules: + + ```yaml + # .rubocop.yml + require: + - rubocop-github # generic Ruby cops only + - rubocop-github-rails # Rails-specific cops only + ``` 💭 Looking for `config/accessibility.yml` and the `GitHub/Accessibility` configs? They have been moved to [a new gem](https://github.com/github/rubocop-rails-accessibility). diff --git a/config/default.yml b/config/default.yml index 67af72a..d5952dc 100644 --- a/config/default.yml +++ b/config/default.yml @@ -1,5 +1,5 @@ require: - - rubocop/cop/github + - rubocop-github - rubocop-performance AllCops: diff --git a/config/default_cops.yml b/config/default_cops.yml new file mode 100644 index 0000000..00b5ea0 --- /dev/null +++ b/config/default_cops.yml @@ -0,0 +1,3 @@ +GitHub/InsecureHashAlgorithm: + Description: 'Encourage usage of secure hash algorithms' + Enabled: pending diff --git a/config/rails.yml b/config/rails.yml index ab16d61..2782574 100644 --- a/config/rails.yml +++ b/config/rails.yml @@ -1,4 +1,5 @@ require: + - rubocop-github-rails - rubocop-rails Rails/OutputSafety: @@ -22,63 +23,30 @@ GitHub/RailsApplicationRecord: GitHub/RailsControllerRenderActionSymbol: Enabled: true - Include: - - 'app/controllers/**/*.rb' GitHub/RailsControllerRenderLiteral: Enabled: true - StyleGuide: https://github.com/github/rubocop-github/blob/master/guides/rails-render-literal.md - Include: - - 'app/controllers/**/*.rb' GitHub/RailsControllerRenderPathsExist: Enabled: true - ViewPath: - - 'app/views' - Include: - - 'app/controllers/**/*.rb' GitHub/RailsControllerRenderShorthand: Enabled: true - StyleGuide: https://github.com/github/rubocop-github/blob/master/guides/rails-controller-render-shorthand.md - Include: - - 'app/controllers/**/*.rb' GitHub/RailsRenderInline: Enabled: true - StyleGuide: https://github.com/github/rubocop-github/blob/master/guides/rails-controller-render-inline.md - Include: - - 'app/controllers/**/*.rb' - - 'app/helpers/**/*.rb' - - 'app/view_models/**/*.rb' - - 'app/views/**/*.erb' GitHub/RailsRenderObjectCollection: Enabled: false GitHub/RailsViewRenderLiteral: Enabled: true - StyleGuide: https://github.com/github/rubocop-github/blob/master/guides/rails-render-literal.md - Include: - - 'app/helpers/**/*.rb' - - 'app/view_models/**/*.rb' - - 'app/views/**/*.erb' GitHub/RailsViewRenderPathsExist: Enabled: true - ViewPath: - - 'app/views' - Include: - - 'app/helpers/**/*.rb' - - 'app/view_models/**/*.rb' - - 'app/views/**/*.erb' GitHub/RailsViewRenderShorthand: Enabled: true - Include: - - 'app/helpers/**/*.rb' - - 'app/view_models/**/*.rb' - - 'app/views/**/*.erb' # Exclude Rails ERB files from incompatible cops diff --git a/config/rails_cops.yml b/config/rails_cops.yml new file mode 100644 index 0000000..ef3d9a4 --- /dev/null +++ b/config/rails_cops.yml @@ -0,0 +1,62 @@ +GitHub/RailsApplicationRecord: + Enabled: pending + +GitHub/RailsControllerRenderActionSymbol: + Enabled: pending + Include: + - 'app/controllers/**/*.rb' + +GitHub/RailsControllerRenderLiteral: + Enabled: pending + StyleGuide: https://github.com/github/rubocop-github/blob/master/guides/rails-render-literal.md + Include: + - 'app/controllers/**/*.rb' + +GitHub/RailsControllerRenderPathsExist: + Enabled: pending + ViewPath: + - 'app/views' + Include: + - 'app/controllers/**/*.rb' + +GitHub/RailsControllerRenderShorthand: + Enabled: pending + StyleGuide: https://github.com/github/rubocop-github/blob/master/guides/rails-controller-render-shorthand.md + Include: + - 'app/controllers/**/*.rb' + +GitHub/RailsRenderInline: + Enabled: pending + StyleGuide: https://github.com/github/rubocop-github/blob/master/guides/rails-controller-render-inline.md + Include: + - 'app/controllers/**/*.rb' + - 'app/helpers/**/*.rb' + - 'app/view_models/**/*.rb' + - 'app/views/**/*.erb' + +GitHub/RailsRenderObjectCollection: + Enabled: pending + +GitHub/RailsViewRenderLiteral: + Enabled: pending + StyleGuide: https://github.com/github/rubocop-github/blob/master/guides/rails-render-literal.md + Include: + - 'app/helpers/**/*.rb' + - 'app/view_models/**/*.rb' + - 'app/views/**/*.erb' + +GitHub/RailsViewRenderPathsExist: + Enabled: pending + ViewPath: + - 'app/views' + Include: + - 'app/helpers/**/*.rb' + - 'app/view_models/**/*.rb' + - 'app/views/**/*.erb' + +GitHub/RailsViewRenderShorthand: + Enabled: pending + Include: + - 'app/helpers/**/*.rb' + - 'app/view_models/**/*.rb' + - 'app/views/**/*.erb' diff --git a/lib/rubocop-github-rails.rb b/lib/rubocop-github-rails.rb new file mode 100644 index 0000000..02aa6ad --- /dev/null +++ b/lib/rubocop-github-rails.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require "rubocop" +require "rubocop/github" +require "rubocop/github/inject" + +RuboCop::GitHub::Inject.rails_defaults! + +require "rubocop/cop/github/rails_application_record" +require "rubocop/cop/github/rails_controller_render_action_symbol" +require "rubocop/cop/github/rails_controller_render_literal" +require "rubocop/cop/github/rails_controller_render_paths_exist" +require "rubocop/cop/github/rails_controller_render_shorthand" +require "rubocop/cop/github/rails_render_inline" +require "rubocop/cop/github/rails_render_object_collection" +require "rubocop/cop/github/rails_view_render_literal" +require "rubocop/cop/github/rails_view_render_paths_exist" +require "rubocop/cop/github/rails_view_render_shorthand" diff --git a/lib/rubocop-github.rb b/lib/rubocop-github.rb new file mode 100644 index 0000000..17c07e7 --- /dev/null +++ b/lib/rubocop-github.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require "rubocop" +require "rubocop/github" +require "rubocop/github/inject" + +RuboCop::GitHub::Inject.default_defaults! + +require "rubocop/cop/github/insecure_hash_algorithm" diff --git a/lib/rubocop/cop/github.rb b/lib/rubocop/cop/github.rb index e978c2b..fa55c2d 100644 --- a/lib/rubocop/cop/github.rb +++ b/lib/rubocop/cop/github.rb @@ -1,13 +1,4 @@ # frozen_string_literal: true -require "rubocop/cop/github/insecure_hash_algorithm" -require "rubocop/cop/github/rails_application_record" -require "rubocop/cop/github/rails_controller_render_action_symbol" -require "rubocop/cop/github/rails_controller_render_literal" -require "rubocop/cop/github/rails_controller_render_paths_exist" -require "rubocop/cop/github/rails_controller_render_shorthand" -require "rubocop/cop/github/rails_render_inline" -require "rubocop/cop/github/rails_render_object_collection" -require "rubocop/cop/github/rails_view_render_literal" -require "rubocop/cop/github/rails_view_render_paths_exist" -require "rubocop/cop/github/rails_view_render_shorthand" +require "rubocop-github" +require "rubocop-rails" diff --git a/lib/rubocop/github.rb b/lib/rubocop/github.rb new file mode 100644 index 0000000..d367f81 --- /dev/null +++ b/lib/rubocop/github.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module RuboCop + module GitHub + PROJECT_ROOT = Pathname.new(__dir__).parent.parent.expand_path.freeze + CONFIG_DEFAULT = PROJECT_ROOT.join("config", "default_cops.yml").freeze + CONFIG_RAILS = PROJECT_ROOT.join("config", "rails_cops.yml").freeze + end +end diff --git a/lib/rubocop/github/inject.rb b/lib/rubocop/github/inject.rb new file mode 100644 index 0000000..697a580 --- /dev/null +++ b/lib/rubocop/github/inject.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module RuboCop + module GitHub + # Because RuboCop doesn't yet support plugins, we have to monkey patch in a + # bit of our configuration. Borrowed from: + # https://github.com/rubocop/rubocop-rails/blob/f36121946359615a26c9a941763abd1470693e8d/lib/rubocop/rails/inject.rb + module Inject + def self.default_defaults! + _load_config(CONFIG_DEFAULT) + end + + def self.rails_defaults! + _load_config(CONFIG_RAILS) + end + + def self._load_config(path) + path = path.to_s + hash = ConfigLoader.send(:load_yaml_configuration, path) + config = Config.new(hash, path).tap(&:make_excludes_absolute) + puts "configuration from #{path}" if ConfigLoader.debug? + config = ConfigLoader.merge_with_default(config, path, unset_nil: false) + ConfigLoader.instance_variable_set(:@default_configuration, config) + end + end + end +end