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:
|
|
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 88'OnlyFor'
-
MSG =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 87'Missing gem description comment.'
-
RESTRICTIVE_VERSION_PATTERN =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 91/\A\s*(?:<|~>|\d|=)/.freeze
-
RESTRICTIVE_VERSION_SPECIFIERS_OPTION =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 90'restrictive_version_specifiers'
-
RESTRICT_ON_SEND =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 92%i[gem].freeze
-
VERSION_SPECIFIERS_OPTION =
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 89'version_specifiers'
::RuboCop::Cop::Base
- Inherited
EMPTY_OFFENSES, RESTRICT_ON_SEND
::RuboCop::Cop::VisibilityHelp
- Included
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 |
::RuboCop::ExcludeLimit
- Extended
exclude_limit | Sets up a configuration option to have an exclude limit tracked. |
transform |
Instance Attribute Summary
::RuboCop::Cop::Base
- Inherited
::RuboCop::Cop::AutocorrectLogic
- Included
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
gem
are version specifiers, as long as it has one we know there’s at least one version specifier.
::RuboCop::Cop::GemDeclaration
- Included
::RuboCop::Cop::DefNode
- Included
::RuboCop::Cop::VisibilityHelp
- 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, | |
#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 a gems locked versions (i.e. |
#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, #current_corrector, | |
#current_offense_locations | Reserved for Commissioner: |
#current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, #file_name_matches_any?, #find_message, #find_severity, #range_for_original, #range_from_node_or_range, | |
#reset_investigation | Actually private methods. |
#use_corrector |
::RuboCop::Cop::AutocorrectLogic
- Included
#disable_offense, #disable_offense_at_end_of_line, #disable_offense_before_and_after, #disable_offense_with_eol_or_surround_comment, #heredoc_range, #max_line_length, #multiline_ranges, #multiline_string?, | |
#range_by_lines | Expand the given range to include all of any lines it covers. |
#range_of_first_line, #range_overlaps_offense?, #string_continuation?, #surrounding_heredoc?, #surrounding_percent_array? |
::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 135
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 109
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 105
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 159
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 163
def (node) return [] unless node.last_argument&.type == :hash node.last_argument.keys.map(&:value) end
#ignored_gem?(node) ⇒ Boolean
(private)
# File 'lib/rubocop/cop/bundler/gem_comment.rb', line 130
def ignored_gem?(node) ignored_gems = Array(cop_config['IgnoredGems']) ignored_gems.include?(node.first_argument.value) end
#on_send(node)
[ GitHub ]# 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? && ! (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 116
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 126
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 120
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 152
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 145
def version_specified_gem?(node) # arguments[0] is the gem name node.arguments[1]&.str_type? end