Class: RuboCop::Cop::Bundler::GemComment

Inherits:
RuboCop::Cop::Base show all
Includes:
DefNode, GemDeclaration
Defined in:
lib/rubocop/cop/bundler/gem_comment.rb

Overview

Each gem in the Gemfile should have a comment explaining its purpose in the project, or the reason for its version or source.

The optional “OnlyFor” configuration array can be used to only register offenses when the gems use certain options or have version specifiers.

When “version_specifiers” is included, a comment will be enforced if the gem has any version specifier.

When “restrictive_version_specifiers” is included, a comment will be enforced if the gem has a version specifier that holds back the version of the gem.

For any other value in the array, a comment will be enforced for a gem if an option by the same name is present. A useful use case is to enforce a comment when using options that change the source of a gem:

  • `bitbucket`

  • `gist`

  • `git`

  • `github`

  • `source`

For a full list of options supported by bundler, see bundler.io/man/gemfile.5.html .

Examples:

OnlyFor: [] (default)

# bad

gem 'foo'

# good

# Helpers for the foo things.
gem 'foo'

OnlyFor: ['version_specifiers']

# bad

gem 'foo', '< 2.1'

# good

# Version 2.1 introduces breaking change baz
gem 'foo', '< 2.1'

OnlyFor: ['restrictive_version_specifiers']

# bad

gem 'foo', '< 2.1'

# good

gem 'foo', '>= 1.0'

# Version 2.1 introduces breaking change baz
gem 'foo', '< 2.1'

OnlyFor: ['version_specifiers', 'github']

# bad

gem 'foo', github: 'some_account/some_fork_of_foo'

gem 'bar', '< 2.1'

# good

# Using this fork because baz
gem 'foo', github: 'some_account/some_fork_of_foo'

# Version 2.1 introduces breaking change baz
gem 'bar', '< 2.1'

Constant Summary collapse

MSG =
'Missing gem description comment.'
CHECKED_OPTIONS_CONFIG =
'OnlyFor'
VERSION_SPECIFIERS_OPTION =
'version_specifiers'
RESTRICTIVE_VERSION_SPECIFIERS_OPTION =
'restrictive_version_specifiers'
RESTRICTIVE_VERSION_PATTERN =
/<|~>/.freeze
RESTRICT_ON_SEND =
%i[gem].freeze

Constants included from DefNode

DefNode::NON_PUBLIC_MODIFIERS

Instance Attribute Summary

Attributes inherited from RuboCop::Cop::Base

#config, #processed_source

Instance Method Summary collapse

Methods included from GemDeclaration

#gem_declaration?

Methods inherited from RuboCop::Cop::Base

#add_global_offense, #add_offense, autocorrect_incompatible_with, badge, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #ready, #relevant_file?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#on_send(node) ⇒ Object


94
95
96
97
98
99
100
101
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 94

def on_send(node)
  return unless gem_declaration?(node)
  return if ignored_gem?(node)
  return if commented_any_descendant?(node)
  return if cop_config[CHECKED_OPTIONS_CONFIG].any? && !checked_options_present?(node)

  add_offense(node)
end