Class: RuboCop::Cop::Bundler::GemComment
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
::RuboCop::Cop::Base,
::RuboCop::ExcludeLimit,
NodePattern::Macros,
RuboCop::AST::Sexp
|
|
|
Instance Chain:
self,
::RuboCop::Cop::GemDeclaration,
::RuboCop::Cop::Base,
::RuboCop::Cop::AutocorrectLogic,
::RuboCop::Cop::IgnoredNode,
::RuboCop::Util,
RuboCop::AST::Sexp
|
|
| Inherits: |
RuboCop::Cop::Base
|
| 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 https://bundler.io/man/gemfile.5.html .
Constant Summary
-
CHECKED_OPTIONS_CONFIG =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 87'OnlyFor' -
MSG =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 86'Missing gem description comment.' -
RESTRICTIVE_VERSION_PATTERN =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 90/\A\s*(?:<|~>|\d|=)/.freeze
-
RESTRICTIVE_VERSION_SPECIFIERS_OPTION =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 89'restrictive_version_specifiers' -
RESTRICT_ON_SEND =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 91%i[gem].freeze
-
VERSION_SPECIFIERS_OPTION =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 88'version_specifiers'
::RuboCop::Cop::Base - Inherited
Class Attribute Summary
::RuboCop::Cop::Base - Inherited
| .gem_requirements, .lint?, | |
| .support_autocorrect? | Returns if class supports autocorrect. |
| .support_multiple_source? | Override if your cop should be called repeatedly for multiple investigations Between calls to |
Class Method Summary
::RuboCop::Cop::Base - Inherited
| .autocorrect_incompatible_with | List of cops that should not try to autocorrect at the same time as this cop. |
| .badge | Naming. |
| .callbacks_needed, .cop_name, .department, | |
| .documentation_url | Returns a url to view this cops documentation online. |
| .exclude_from_registry | Call for abstract Cop classes. |
| .inherited, | |
| .joining_forces | Override and return the Force class(es) you need to join. |
| .match? | Returns true if the cop name or the cop namespace matches any of the given names. |
| .new, | |
| .requires_gem | Register a version requirement for the given gem name. |
| .restrict_on_send | Reserved for Commissioner. |
::RuboCop::ExcludeLimit - Extended
| exclude_limit | Sets up a configuration option to have an exclude limit tracked. |
| transform | |
Instance Attribute Summary
::RuboCop::Cop::Base - Inherited
| #active_support_extensions_enabled?, #always_autocorrect?, #config, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #disabled_autocorrect?, | |
| #preview? | Whether the user opted in to unstable behavior, with |
| #processed_source, #project_index, #string_literals_frozen_by_default?, #target_satisfies_all_gem_version_requirements? | |
::RuboCop::Cop::AutocorrectLogic - Included
| #autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?, | |
| #skipped_unsafe_correction_with_disable_uncorrectable? | Whether a correction exists but is skipped because it is unsafe in a safe autocorrect run, while |
| #contextual_autocorrect_held_back? | When LSP is enabled or the |
Instance Method Summary
- #on_send(node)
- #checked_options_present?(node) ⇒ Boolean private
- #commented?(node) ⇒ Boolean private
- #commented_any_descendant?(node) ⇒ Boolean private
- #contains_checked_options?(node) ⇒ Boolean private
- #gem_options(node) private
- #ignored_gem?(node) ⇒ Boolean private
-
#precede?(node1, node2) ⇒ Boolean
private
The args node1 & node2 may represent a RuboCop::AST::Node or a Parser::Source::Comment.
- #preceding_comment?(node1, node2) ⇒ Boolean private
- #preceding_lines(node) private
-
#restrictive_version_specified_gem?(node) ⇒ Boolean
private
Version specifications that restrict all updates going forward.
-
#version_specified_gem?(node) ⇒ Boolean
private
Besides the gem name, all other positional arguments to
gemare version specifiers, as long as it has one we know there’s at least one version specifier.
::RuboCop::Cop::GemDeclaration - Included
::RuboCop::Cop::Base - Inherited
| #add_global_offense | Adds an offense that has no particular location. |
| #add_offense | Adds an offense on the specified range (or node with an expression) Unless that offense is disabled for this range, a corrector will be yielded to provide the cop the opportunity to autocorrect the offense. |
| #begin_investigation | Called before any investigation. |
| #callbacks_needed | — grouped under the Commissioner heading above. |
| #cop_config | Configuration Helpers. |
| #cop_name, #excluded_file?, | |
| #external_dependency_checksum | This method should be overridden when a cop’s behavior depends on state that lives outside of these locations: |
| #inspect, | |
| #message | Gets called if no message is specified when calling |
| #name | Alias for RuboCop::Cop::Base#cop_name. |
| #offenses, | |
| #on_investigation_end | Called after all on_… |
| #on_new_investigation | Called before all on_… |
| #on_other_file | Called instead of all on_… |
| #parse | There should be very limited reasons for a Cop to do it’s own parsing. |
| #parser_engine, | |
| #ready | Called between investigations. |
| #relevant_file?, | |
| #target_gem_version | Returns the version of a gem in the target, by default its locked version (i.e. from Gemfile.lock or gems.locked). |
| #target_rails_version, #target_ruby_version, #annotate, #apply_correction, #attempt_correction, | |
| #callback_argument | Reserved for Cop::Cop. |
| #complete_investigation | Called to complete an investigation. |
| #correct, #covering_disabled_range, #current_corrector, | |
| #current_offense_locations | Reserved for Commissioner: |
| #current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, | |
| #enabled_lines? | A multi-line offense is suppressed by a directive on any line of its range, not only its first line, matching the intuition that the directive is attached to the offending code. |
| #file_name_matches_any?, #find_message, #find_severity, #matches_absolute_include_pattern?, #new_offense, #range_for_original, #range_from_node_or_range, | |
| #reset_investigation | Actually private methods. |
| #suppression_reason | The |
| #use_corrector | |
::RuboCop::Cop::AutocorrectLogic - Included
::RuboCop::Cop::IgnoredNode - Included
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Method Details
#checked_options_present?(node) ⇒ Boolean (private)
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 134
def (node) (cop_config[CHECKED_OPTIONS_CONFIG].include?(VERSION_SPECIFIERS_OPTION) && version_specified_gem?(node)) || (cop_config[CHECKED_OPTIONS_CONFIG].include?(RESTRICTIVE_VERSION_SPECIFIERS_OPTION) && restrictive_version_specified_gem?(node)) || (node) end
#commented?(node) ⇒ Boolean (private)
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 108
def commented?(node) preceding_lines = preceding_lines(node) preceding_comment?(node, preceding_lines.last) end
#commented_any_descendant?(node) ⇒ Boolean (private)
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 104
def commented_any_descendant?(node) commented?(node) || node.each_descendant.any? { |n| commented?(n) } end
#contains_checked_options?(node) ⇒ Boolean (private)
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 158
def (node) (Array(cop_config[CHECKED_OPTIONS_CONFIG]) & (node).map(&:to_s)).any? end
#gem_options(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 162
def (node) return [] unless node.last_argument&.hash_type? # Only literal keys carry an option name to check; a non-literal key # (e.g. a variable or method call) has no `value` and must be skipped. node.last_argument.keys.filter_map { |key| key.value if key.type?(:sym, :str) } end
#ignored_gem?(node) ⇒ Boolean (private)
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 129
def ignored_gem?(node) allowed_gems = Array(cop_config['AllowedGems']) allowed_gems.include?(node.first_argument.value) end
#on_send(node)
[ GitHub ]# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 93
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? && !(node) add_offense(node) end
#precede?(node1, node2) ⇒ Boolean (private)
The args node1 & node2 may represent a RuboCop::AST::Node or a Parser::Source::Comment. Both respond to #loc.
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 115
def precede?(node1, node2) node2.loc.line - node1.loc.line <= 1 end
#preceding_comment?(node1, node2) ⇒ Boolean (private)
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 125
def preceding_comment?(node1, node2) node1 && node2 && precede?(node2, node1) && comment_line?(node2.source) end
#preceding_lines(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 119
def preceding_lines(node) processed_source.ast_with_comments[node].select do |line| line.loc.line <= node.loc.line end end
#restrictive_version_specified_gem?(node) ⇒ Boolean (private)
Version specifications that restrict all updates going forward. This excludes versions like ">= 1.0" or "!= 2.0.3".
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 151
def restrictive_version_specified_gem?(node) return false unless version_specified_gem?(node) node.arguments[1..] .any? { |arg| arg&.str_type? && RESTRICTIVE_VERSION_PATTERN.match?(arg.value) } end
#version_specified_gem?(node) ⇒ Boolean (private)
Besides the gem name, all other positional arguments to gem are version specifiers,
as long as it has one we know there’s at least one version specifier.
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 144
def version_specified_gem?(node) # arguments[0] is the gem name node.arguments[1]&.str_type? end