Class: RuboCop::Cop::Naming::PredicateName
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::AllowedMethods ,
::RuboCop::Cop::Base ,
::RuboCop::Cop::AutocorrectLogic ,
::RuboCop::Cop::IgnoredNode ,
::RuboCop::Util ,
RuboCop::AST::Sexp
|
|
Inherits: |
RuboCop::Cop::Base
|
Defined in: | lib/rubocop/cop/naming/predicate_name.rb |
Overview
Checks that predicate methods names end with a question mark and do not start with a forbidden prefix.
A method is determined to be a predicate method if its name starts
with one of the prefixes defined in the NamePrefix
configuration.
You can change what prefixes are considered by changing this option.
Any method name that starts with one of these prefixes is required by
the cop to end with a ?
. Other methods can be allowed by adding to
the AllowedMethods
configuration.
Note
|
The is_a? method is allowed by default.
|
If ForbiddenPrefixes
is set, methods that start with the configured
prefixes will not be allowed and will be removed by autocorrection.
In other words, if ForbiddenPrefixes
is empty, a method named is_foo
will register an offense only due to the lack of question mark (and will be
autocorrected to is_foo?
). If ForbiddenPrefixes
contains is_
,
is_foo
will register an offense both because the ? is missing and because of
the is_
prefix, and will be corrected to foo?
.
Note
|
ForbiddenPrefixes is only applied to prefixes in NamePrefix ;
a prefix in the former but not the latter will not be considered by
this cop.
|
Constant Summary
::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 |
.builtin? |
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 | Cops (other than builtin) are encouraged to implement this. |
.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
- #dynamic_method_define(node)
- #on_def(node) (also: #on_defs)
-
#on_defs(node)
Alias for #on_def.
- #on_send(node)
- #allowed_method_name?(method_name, prefix) ⇒ Boolean private
- #expected_name(method_name, prefix) private
- #forbidden_prefixes private
- #message(method_name, new_name) private
- #method_definition_macros(macro_name) private
- #predicate_prefixes private
::RuboCop::Cop::AllowedMethods
- Included
#allowed_method?, #allowed_methods, #cop_config_allowed_methods, #cop_config_deprecated_values, | |
#ignored_method? | Alias for AllowedMethods#allowed_method?. |
::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 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_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, #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, #max_line_length, | |
#range_by_lines | Expand the given range to include all of any lines it covers. |
#range_of_first_line, #surrounding_heredoc, #surrounding_percent_array |
::RuboCop::Cop::IgnoredNode
- Included
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Method Details
#allowed_method_name?(method_name, prefix) ⇒ Boolean
(private)
# File 'lib/rubocop/cop/naming/predicate_name.rb', line 98
def allowed_method_name?(method_name, prefix) !(method_name.start_with?(prefix) && # cheap check to avoid allocating Regexp method_name.match?(/^#{prefix}[^0-9]/)) || method_name == expected_name(method_name, prefix) || method_name.end_with?('=') || allowed_method?(method_name) end
#dynamic_method_define(node)
[ GitHub ]# File 'lib/rubocop/cop/naming/predicate_name.rb', line 63
def_node_matcher :dynamic_method_define, <<~PATTERN (send nil? #method_definition_macros (sym $_) ...) PATTERN
#expected_name(method_name, prefix) (private)
[ GitHub ]# File 'lib/rubocop/cop/naming/predicate_name.rb', line 106
def expected_name(method_name, prefix) new_name = if forbidden_prefixes.include?(prefix) method_name.sub(prefix, '') else method_name.dup end new_name << '?' unless method_name.end_with?('?') new_name end
#forbidden_prefixes (private)
[ GitHub ]# File 'lib/rubocop/cop/naming/predicate_name.rb', line 120
def forbidden_prefixes cop_config['ForbiddenPrefixes'] end
#message(method_name, new_name) (private)
[ GitHub ]# File 'lib/rubocop/cop/naming/predicate_name.rb', line 116
def (method_name, new_name) "Rename `#{method_name}` to `#{new_name}`." end
#method_definition_macros(macro_name) (private)
[ GitHub ]# File 'lib/rubocop/cop/naming/predicate_name.rb', line 128
def method_definition_macros(macro_name) cop_config['MethodDefinitionMacros'].include?(macro_name.to_s) end
#on_def(node) Also known as: #on_defs
[ GitHub ]# File 'lib/rubocop/cop/naming/predicate_name.rb', line 82
def on_def(node) predicate_prefixes.each do |prefix| method_name = node.method_name.to_s next if allowed_method_name?(method_name, prefix) add_offense( node.loc.name, message: (method_name, expected_name(method_name, prefix)) ) end end
#on_defs(node)
Alias for #on_def.
# File 'lib/rubocop/cop/naming/predicate_name.rb', line 94
alias on_defs on_def
#on_send(node)
[ GitHub ]# File 'lib/rubocop/cop/naming/predicate_name.rb', line 69
def on_send(node) dynamic_method_define(node) do |method_name| predicate_prefixes.each do |prefix| next if allowed_method_name?(method_name.to_s, prefix) add_offense( node.first_argument.source_range, message: (method_name, expected_name(method_name.to_s, prefix)) ) end end end
#predicate_prefixes (private)
[ GitHub ]# File 'lib/rubocop/cop/naming/predicate_name.rb', line 124
def predicate_prefixes cop_config['NamePrefix'] end