rubocop 1.18.1 → 1.22.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +116 -23
- data/lib/rubocop/cli.rb +18 -0
- data/lib/rubocop/config.rb +5 -0
- data/lib/rubocop/config_loader.rb +5 -3
- data/lib/rubocop/config_loader_resolver.rb +22 -7
- data/lib/rubocop/config_validator.rb +27 -6
- data/lib/rubocop/cop/base.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_comment.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_filename.rb +103 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +45 -21
- data/lib/rubocop/cop/bundler/ordered_gems.rb +3 -12
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +11 -10
- data/lib/rubocop/cop/correctors/require_library_corrector.rb +23 -0
- data/lib/rubocop/cop/documentation.rb +1 -1
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -12
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +31 -24
- data/lib/rubocop/cop/generator.rb +14 -8
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +60 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +71 -0
- data/lib/rubocop/cop/internal_affairs.rb +3 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
- data/lib/rubocop/cop/layout/class_structure.rb +7 -2
- data/lib/rubocop/cop/layout/dot_position.rb +34 -5
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +9 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -4
- data/lib/rubocop/cop/layout/end_alignment.rb +9 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +22 -18
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +0 -7
- data/lib/rubocop/cop/layout/indentation_style.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +36 -17
- data/lib/rubocop/cop/layout/line_length.rb +9 -7
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -3
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +23 -10
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +15 -4
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -0
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +12 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_comment.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_parens.rb +78 -32
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +24 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +111 -0
- data/lib/rubocop/cop/lint/ambiguous_range.rb +105 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +5 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -5
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +18 -5
- data/lib/rubocop/cop/lint/boolean_symbol.rb +5 -0
- data/lib/rubocop/cop/lint/debugger.rb +2 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
- data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -2
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +24 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +8 -5
- data/lib/rubocop/cop/lint/else_layout.rb +10 -6
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +12 -3
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +67 -0
- data/lib/rubocop/cop/lint/interpolation_check.rb +5 -0
- data/lib/rubocop/cop/lint/loop.rb +4 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +5 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +12 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +4 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +10 -0
- data/lib/rubocop/cop/lint/raise_exception.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +5 -4
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +50 -0
- data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -3
- data/lib/rubocop/cop/lint/useless_method_definition.rb +3 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +7 -4
- data/lib/rubocop/cop/lint/useless_times.rb +5 -4
- data/lib/rubocop/cop/metrics/abc_size.rb +6 -0
- data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +57 -34
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +5 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -2
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -4
- data/lib/rubocop/cop/mixin/heredoc.rb +5 -0
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -2
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +9 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +18 -7
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +9 -1
- data/lib/rubocop/cop/mixin/require_library.rb +59 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +2 -2
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -1
- data/lib/rubocop/cop/mixin/string_literals_help.rb +5 -1
- data/lib/rubocop/cop/mixin/trailing_body.rb +1 -1
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +0 -3
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +27 -10
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +5 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +7 -0
- data/lib/rubocop/cop/security/io_methods.rb +49 -0
- data/lib/rubocop/cop/security/json_load.rb +8 -7
- data/lib/rubocop/cop/security/open.rb +4 -0
- data/lib/rubocop/cop/security/yaml_load.rb +4 -0
- data/lib/rubocop/cop/style/accessor_grouping.rb +2 -2
- data/lib/rubocop/cop/style/and_or.rb +5 -0
- data/lib/rubocop/cop/style/arguments_forwarding.rb +13 -2
- data/lib/rubocop/cop/style/array_coercion.rb +21 -3
- data/lib/rubocop/cop/style/ascii_comments.rb +0 -3
- data/lib/rubocop/cop/style/block_delimiters.rb +50 -2
- data/lib/rubocop/cop/style/case_equality.rb +6 -9
- data/lib/rubocop/cop/style/case_like_if.rb +5 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +9 -0
- data/lib/rubocop/cop/style/collection_compact.rb +7 -5
- data/lib/rubocop/cop/style/collection_methods.rb +8 -6
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +55 -25
- data/lib/rubocop/cop/style/commented_keyword.rb +9 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +19 -5
- data/lib/rubocop/cop/style/date_time.rb +5 -0
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
- data/lib/rubocop/cop/style/documentation.rb +23 -8
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -7
- data/lib/rubocop/cop/style/double_negation.rb +27 -6
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/encoding.rb +26 -15
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +46 -11
- data/lib/rubocop/cop/style/float_division.rb +10 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +14 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +4 -0
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +11 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -0
- data/lib/rubocop/cop/style/hash_except.rb +4 -3
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -6
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +32 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +18 -4
- data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -2
- data/lib/rubocop/cop/style/lambda_call.rb +1 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +6 -6
- data/lib/rubocop/cop/style/method_def_parentheses.rb +10 -1
- data/lib/rubocop/cop/style/missing_else.rb +7 -0
- data/lib/rubocop/cop/style/module_function.rb +8 -9
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +79 -14
- data/lib/rubocop/cop/style/negated_if.rb +1 -1
- data/lib/rubocop/cop/style/negated_unless.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +2 -2
- data/lib/rubocop/cop/style/not.rb +2 -2
- data/lib/rubocop/cop/style/numbered_parameters.rb +46 -0
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +50 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -8
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -0
- data/lib/rubocop/cop/style/optional_arguments.rb +4 -0
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +14 -4
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -4
- data/lib/rubocop/cop/style/quoted_symbols.rb +10 -6
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +19 -9
- data/lib/rubocop/cop/style/redundant_begin.rb +25 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +12 -3
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self.rb +10 -0
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +83 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +53 -20
- data/lib/rubocop/cop/style/regexp_literal.rb +3 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +139 -0
- data/lib/rubocop/cop/style/semicolon.rb +32 -24
- data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +3 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +25 -15
- data/lib/rubocop/cop/style/slicing_with_range.rb +13 -0
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +25 -0
- data/lib/rubocop/cop/style/static_class.rb +5 -5
- data/lib/rubocop/cop/style/string_chars.rb +4 -2
- data/lib/rubocop/cop/style/string_concatenation.rb +5 -1
- data/lib/rubocop/cop/style/string_hash_keys.rb +4 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +4 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -2
- data/lib/rubocop/cop/style/symbol_array.rb +3 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +26 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +19 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +23 -5
- data/lib/rubocop/cop/style/yoda_condition.rb +24 -7
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -0
- data/lib/rubocop/cop/util.rb +22 -6
- data/lib/rubocop/cops_documentation_generator.rb +17 -5
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -1
- data/lib/rubocop/magic_comment.rb +44 -15
- data/lib/rubocop/options.rb +127 -113
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/result_cache.rb +3 -3
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/parallel_formatter.rb +90 -0
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/runner.rb +2 -3
- data/lib/rubocop/target_finder.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +14 -2
- metadata +21 -5
@@ -5,9 +5,18 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
#
|
7
7
|
# This cop looks for uses of Perl-style global variables.
|
8
|
+
# Correcting to global variables in the 'English' library
|
9
|
+
# will add a require statement to the top of the file if
|
10
|
+
# enabled by RequireEnglish config.
|
11
|
+
#
|
12
|
+
# @safety
|
13
|
+
# Autocorrection is marked as unsafe because if `RequireEnglish` is not
|
14
|
+
# true, replacing perl-style variables with english variables will break.
|
8
15
|
#
|
9
16
|
# @example EnforcedStyle: use_english_names (default)
|
10
17
|
# # good
|
18
|
+
# require 'English' # or this could be in another file.
|
19
|
+
#
|
11
20
|
# puts $LOAD_PATH
|
12
21
|
# puts $LOADED_FEATURES
|
13
22
|
# puts $PROGRAM_NAME
|
@@ -50,6 +59,8 @@ module RuboCop
|
|
50
59
|
#
|
51
60
|
class SpecialGlobalVars < Base
|
52
61
|
include ConfigurableEnforcedStyle
|
62
|
+
include RangeHelp
|
63
|
+
include RequireLibrary
|
53
64
|
extend AutoCorrector
|
54
65
|
|
55
66
|
MSG_BOTH = 'Prefer `%<prefer>s` from the stdlib \'English\' ' \
|
@@ -90,6 +101,8 @@ module RuboCop
|
|
90
101
|
# Anything *not* in this set is provided by the English library.
|
91
102
|
NON_ENGLISH_VARS = Set.new(%i[$LOAD_PATH $LOADED_FEATURES $PROGRAM_NAME ARGV]).freeze
|
92
103
|
|
104
|
+
LIBRARY_NAME = 'English'
|
105
|
+
|
93
106
|
def on_gvar(node)
|
94
107
|
global_var, = *node
|
95
108
|
|
@@ -117,6 +130,8 @@ module RuboCop
|
|
117
130
|
def autocorrect(corrector, node, global_var)
|
118
131
|
node = node.parent while node.parent&.begin_type? && node.parent.children.one?
|
119
132
|
|
133
|
+
ensure_required(corrector, node, LIBRARY_NAME) if should_require_english?(global_var)
|
134
|
+
|
120
135
|
corrector.replace(node, replacement(node, global_var))
|
121
136
|
end
|
122
137
|
|
@@ -172,6 +187,16 @@ module RuboCop
|
|
172
187
|
|
173
188
|
"{#{preferred_name}}"
|
174
189
|
end
|
190
|
+
|
191
|
+
def add_require_english?
|
192
|
+
cop_config['RequireEnglish']
|
193
|
+
end
|
194
|
+
|
195
|
+
def should_require_english?(global_var)
|
196
|
+
style == :use_english_names &&
|
197
|
+
add_require_english? &&
|
198
|
+
!NON_ENGLISH_VARS.include?(preferred_names(global_var).first)
|
199
|
+
end
|
175
200
|
end
|
176
201
|
end
|
177
202
|
end
|
@@ -7,9 +7,10 @@ module RuboCop
|
|
7
7
|
# replaced with a module. Classes should be used only when it makes sense to create
|
8
8
|
# instances out of them.
|
9
9
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
10
|
+
# @safety
|
11
|
+
# This cop is unsafe, because it is possible that this class is a parent
|
12
|
+
# for some other subclass, monkey-patched with instance methods or
|
13
|
+
# a dummy instance is instantiated from it somewhere.
|
13
14
|
#
|
14
15
|
# @example
|
15
16
|
# # bad
|
@@ -60,8 +61,7 @@ module RuboCop
|
|
60
61
|
return false if nodes.empty?
|
61
62
|
|
62
63
|
nodes.all? do |node|
|
63
|
-
node_visibility(node) == :public &&
|
64
|
-
node.defs_type? ||
|
64
|
+
(node_visibility(node) == :public && node.defs_type?) ||
|
65
65
|
sclass_convertible_to_module?(node) ||
|
66
66
|
node.equals_asgn? ||
|
67
67
|
extend_call?(node)
|
@@ -5,8 +5,10 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# Checks for uses of `String#split` with empty string or regexp literal argument.
|
7
7
|
#
|
8
|
-
#
|
9
|
-
#
|
8
|
+
# @safety
|
9
|
+
# This cop is unsafe because it cannot be guaranteed that the receiver
|
10
|
+
# is actually a string. If another class has a `split` method with
|
11
|
+
# different behaviour, it would be registered as a false positive.
|
10
12
|
#
|
11
13
|
# @example
|
12
14
|
# # bad
|
@@ -23,6 +23,10 @@ module RuboCop
|
|
23
23
|
# This is useful when the receiver is some expression that returns string like `Pathname`
|
24
24
|
# instead of a string literal.
|
25
25
|
#
|
26
|
+
# @safety
|
27
|
+
# This cop is unsafe in `aggressive` mode, as it cannot be guaranteed that
|
28
|
+
# the receiver is actually a string, which can result in a false positive.
|
29
|
+
#
|
26
30
|
# @example Mode: aggressive (default)
|
27
31
|
# # bad
|
28
32
|
# email_with_name = user.name + ' <' + user.email + '>'
|
@@ -93,7 +97,7 @@ module RuboCop
|
|
93
97
|
|
94
98
|
def offensive_for_mode?(receiver_node)
|
95
99
|
mode = cop_config['Mode'].to_sym
|
96
|
-
mode == :aggressive || mode == :conservative && receiver_node.str_type?
|
100
|
+
mode == :aggressive || (mode == :conservative && receiver_node.str_type?)
|
97
101
|
end
|
98
102
|
|
99
103
|
def line_end_concatenation?(node)
|
@@ -6,6 +6,10 @@ module RuboCop
|
|
6
6
|
# This cop checks for the use of strings as keys in hashes. The use of
|
7
7
|
# symbols is preferred instead.
|
8
8
|
#
|
9
|
+
# @safety
|
10
|
+
# This cop is unsafe because while symbols are preferred for hash keys,
|
11
|
+
# there are instances when string keys are required.
|
12
|
+
#
|
9
13
|
# @example
|
10
14
|
# # bad
|
11
15
|
# { 'one' => 1, 'two' => 2, 'three' => 3 }
|
@@ -5,6 +5,10 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# This cop checks for inheritance from Struct.new.
|
7
7
|
#
|
8
|
+
# @safety
|
9
|
+
# Auto-correction is unsafe because it will change the inheritance
|
10
|
+
# tree (e.g. return value of `Module#ancestors`) of the constant.
|
11
|
+
#
|
8
12
|
# @example
|
9
13
|
# # bad
|
10
14
|
# class Person < Struct.new(:first_name, :last_name)
|
@@ -4,8 +4,10 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
6
|
# This cop enforces the use of shorthand-style swapping of 2 variables.
|
7
|
-
#
|
8
|
-
#
|
7
|
+
#
|
8
|
+
# @safety
|
9
|
+
# Autocorrection is unsafe, because the temporary variable used to
|
10
|
+
# swap variables will be removed, but may be referred to elsewhere.
|
9
11
|
#
|
10
12
|
# @example
|
11
13
|
# # bad
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
extend AutoCorrector
|
36
36
|
|
37
37
|
PERCENT_MSG = 'Use `%i` or `%I` for an array of symbols.'
|
38
|
-
ARRAY_MSG = 'Use `
|
38
|
+
ARRAY_MSG = 'Use `%<prefer>s` for an array of symbols.'
|
39
39
|
|
40
40
|
class << self
|
41
41
|
attr_accessor :largest_brackets
|
@@ -60,7 +60,7 @@ module RuboCop
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
def
|
63
|
+
def build_bracketed_array(node)
|
64
64
|
syms = node.children.map do |c|
|
65
65
|
if c.dsym_type?
|
66
66
|
string_literal = to_string_literal(c.source)
|
@@ -71,7 +71,7 @@ module RuboCop
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
|
74
|
+
"[#{syms.join(', ')}]"
|
75
75
|
end
|
76
76
|
|
77
77
|
def to_symbol_literal(string)
|
@@ -8,6 +8,32 @@ module RuboCop
|
|
8
8
|
# If you prefer a style that allows block for method with arguments,
|
9
9
|
# please set `true` to `AllowMethodsWithArguments`.
|
10
10
|
#
|
11
|
+
# @safety
|
12
|
+
# This cop is unsafe because `proc`s and blocks work differently
|
13
|
+
# when additional arguments are passed in. A block will silently
|
14
|
+
# ignore additional arguments, but a `proc` will raise
|
15
|
+
# an `ArgumentError`.
|
16
|
+
#
|
17
|
+
# For example:
|
18
|
+
#
|
19
|
+
# [source,ruby]
|
20
|
+
# ----
|
21
|
+
# class Foo
|
22
|
+
# def bar
|
23
|
+
# :bar
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# def call(options = {}, &block)
|
28
|
+
# block.call(Foo.new, options)
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# call { |x| x.bar }
|
32
|
+
# #=> :bar
|
33
|
+
# call(&:bar)
|
34
|
+
# # ArgumentError: wrong number of arguments (given 1, expected 0)
|
35
|
+
# ----
|
36
|
+
#
|
11
37
|
# @example
|
12
38
|
# # bad
|
13
39
|
# something.map { |s| s.upcase }
|
@@ -8,6 +8,25 @@ module RuboCop
|
|
8
8
|
# that comma to be present. Blocks with more than one argument never
|
9
9
|
# require a trailing comma.
|
10
10
|
#
|
11
|
+
# @safety
|
12
|
+
# This cop is unsafe because a trailing comma can indicate there are
|
13
|
+
# more parameters that are not used.
|
14
|
+
#
|
15
|
+
# For example:
|
16
|
+
# [source,ruby]
|
17
|
+
# ----
|
18
|
+
# # with a trailing comma
|
19
|
+
# {foo: 1, bar: 2, baz: 3}.map {|key,| key }
|
20
|
+
# #=> [:foo, :bar, :baz]
|
21
|
+
#
|
22
|
+
# # without a trailing comma
|
23
|
+
# {foo: 1, bar: 2, baz: 3}.map {|key| key }
|
24
|
+
# #=> [[:foo, 1], [:bar, 2], [:baz, 3]]
|
25
|
+
# ----
|
26
|
+
#
|
27
|
+
# This can be fixed by replacing the trailing comma with a placeholder
|
28
|
+
# argument (such as `|key, _value|`).
|
29
|
+
#
|
11
30
|
# @example
|
12
31
|
# # bad
|
13
32
|
# add { |foo, bar,| foo + bar }
|
@@ -9,6 +9,9 @@ module RuboCop
|
|
9
9
|
# Alternatively, it can check for uses of the %w() syntax, in projects
|
10
10
|
# which do not want to include that syntax.
|
11
11
|
#
|
12
|
+
# NOTE: When using the `percent` style, %w() arrays containing a space
|
13
|
+
# will be registered as offenses.
|
14
|
+
#
|
12
15
|
# Configuration option: MinSize
|
13
16
|
# If set, arrays with fewer elements than this value will not trigger the
|
14
17
|
# cop. For example, a `MinSize` of `3` will not enforce a style on an
|
@@ -21,12 +24,18 @@ module RuboCop
|
|
21
24
|
# # bad
|
22
25
|
# ['foo', 'bar', 'baz']
|
23
26
|
#
|
27
|
+
# # bad (contains spaces)
|
28
|
+
# %w[foo\ bar baz\ quux]
|
29
|
+
#
|
24
30
|
# @example EnforcedStyle: brackets
|
25
31
|
# # good
|
26
32
|
# ['foo', 'bar', 'baz']
|
27
33
|
#
|
28
34
|
# # bad
|
29
35
|
# %w[foo bar baz]
|
36
|
+
#
|
37
|
+
# # good (contains spaces)
|
38
|
+
# ['foo bar', 'baz quux']
|
30
39
|
class WordArray < Base
|
31
40
|
include ArrayMinSize
|
32
41
|
include ArraySyntax
|
@@ -35,7 +44,7 @@ module RuboCop
|
|
35
44
|
extend AutoCorrector
|
36
45
|
|
37
46
|
PERCENT_MSG = 'Use `%w` or `%W` for an array of words.'
|
38
|
-
ARRAY_MSG = 'Use `
|
47
|
+
ARRAY_MSG = 'Use `%<prefer>s` for an array of words.'
|
39
48
|
|
40
49
|
class << self
|
41
50
|
attr_accessor :largest_brackets
|
@@ -53,18 +62,27 @@ module RuboCop
|
|
53
62
|
|
54
63
|
private
|
55
64
|
|
56
|
-
def complex_content?(strings)
|
65
|
+
def complex_content?(strings, complex_regex: word_regex)
|
57
66
|
strings.any? do |s|
|
67
|
+
next unless s.str_content
|
68
|
+
|
58
69
|
string = s.str_content.dup.force_encoding(::Encoding::UTF_8)
|
59
|
-
!string.valid_encoding? ||
|
70
|
+
!string.valid_encoding? ||
|
71
|
+
(complex_regex && !complex_regex.match?(string)) ||
|
72
|
+
/ /.match?(string)
|
60
73
|
end
|
61
74
|
end
|
62
75
|
|
76
|
+
def invalid_percent_array_contents?(node)
|
77
|
+
# Disallow %w() arrays that contain invalid encoding or spaces
|
78
|
+
complex_content?(node.values, complex_regex: false)
|
79
|
+
end
|
80
|
+
|
63
81
|
def word_regex
|
64
82
|
Regexp.new(cop_config['WordRegex'])
|
65
83
|
end
|
66
84
|
|
67
|
-
def
|
85
|
+
def build_bracketed_array(node)
|
68
86
|
words = node.children.map do |word|
|
69
87
|
if word.dstr_type?
|
70
88
|
string_literal = to_string_literal(word.source)
|
@@ -75,7 +93,7 @@ module RuboCop
|
|
75
93
|
end
|
76
94
|
end
|
77
95
|
|
78
|
-
|
96
|
+
"[#{words.join(', ')}]"
|
79
97
|
end
|
80
98
|
end
|
81
99
|
end
|
@@ -7,6 +7,26 @@ module RuboCop
|
|
7
7
|
# i.e. comparison operations where the order of expression is reversed.
|
8
8
|
# eg. `5 == x`
|
9
9
|
#
|
10
|
+
# @safety
|
11
|
+
# This cop is unsafe because comparison operators can be defined
|
12
|
+
# differently on different classes, and are not guaranteed to
|
13
|
+
# have the same result if reversed.
|
14
|
+
#
|
15
|
+
# For example:
|
16
|
+
#
|
17
|
+
# [source,ruby]
|
18
|
+
# ----
|
19
|
+
# class MyKlass
|
20
|
+
# def ==(other)
|
21
|
+
# true
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# obj = MyKlass.new
|
26
|
+
# obj == 'string' #=> true
|
27
|
+
# 'string' == obj #=> false
|
28
|
+
# ----
|
29
|
+
#
|
10
30
|
# @example EnforcedStyle: forbid_for_all_comparison_operators (default)
|
11
31
|
# # bad
|
12
32
|
# 99 == foo
|
@@ -58,14 +78,11 @@ module RuboCop
|
|
58
78
|
extend AutoCorrector
|
59
79
|
|
60
80
|
MSG = 'Reverse the order of the operands `%<source>s`.'
|
61
|
-
|
62
81
|
REVERSE_COMPARISON = { '<' => '>', '<=' => '>=', '>' => '<', '>=' => '<=' }.freeze
|
63
|
-
|
64
82
|
EQUALITY_OPERATORS = %i[== !=].freeze
|
65
|
-
|
66
83
|
NONCOMMUTATIVE_OPERATORS = %i[===].freeze
|
67
|
-
|
68
84
|
PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
|
85
|
+
RESTRICT_ON_SEND = RuboCop::AST::Node::COMPARISON_OPERATORS
|
69
86
|
|
70
87
|
# @!method file_constant_equal_program_name?(node)
|
71
88
|
def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
|
@@ -74,7 +91,7 @@ module RuboCop
|
|
74
91
|
|
75
92
|
def on_send(node)
|
76
93
|
return unless yoda_compatible_condition?(node)
|
77
|
-
return if equality_only? && non_equality_operator?(node) ||
|
94
|
+
return if (equality_only? && non_equality_operator?(node)) ||
|
78
95
|
file_constant_equal_program_name?(node)
|
79
96
|
|
80
97
|
valid_yoda?(node) || add_offense(node) do |corrector|
|
@@ -102,8 +119,8 @@ module RuboCop
|
|
102
119
|
lhs = node.receiver
|
103
120
|
rhs = node.first_argument
|
104
121
|
|
105
|
-
return true if lhs.literal? && rhs.literal? ||
|
106
|
-
!lhs.literal? && !rhs.literal? ||
|
122
|
+
return true if (lhs.literal? && rhs.literal?) ||
|
123
|
+
(!lhs.literal? && !rhs.literal?) ||
|
107
124
|
interpolation?(lhs)
|
108
125
|
|
109
126
|
enforce_yoda? ? lhs.literal? : rhs.literal?
|
@@ -9,6 +9,12 @@ module RuboCop
|
|
9
9
|
# receiver.length < 1 and receiver.size == 0 that can be
|
10
10
|
# replaced by receiver.empty? and !receiver.empty?.
|
11
11
|
#
|
12
|
+
# @safety
|
13
|
+
# This cop is unsafe because it cannot be guaranteed that the receiver
|
14
|
+
# has an `empty?` method that is defined in terms of `length`. If there
|
15
|
+
# is a non-standard class that redefines `length` or `empty?`, the cop
|
16
|
+
# may register a false positive.
|
17
|
+
#
|
12
18
|
# @example
|
13
19
|
# # bad
|
14
20
|
# [1, 2, 3].length == 0
|
data/lib/rubocop/cop/util.rb
CHANGED
@@ -46,8 +46,13 @@ module RuboCop
|
|
46
46
|
|
47
47
|
def args_begin(node)
|
48
48
|
loc = node.loc
|
49
|
-
selector =
|
50
|
-
|
49
|
+
selector = if node.super_type? || node.yield_type?
|
50
|
+
loc.keyword
|
51
|
+
elsif node.def_type? || node.defs_type?
|
52
|
+
loc.name
|
53
|
+
else
|
54
|
+
loc.selector
|
55
|
+
end
|
51
56
|
selector.end.resize(1)
|
52
57
|
end
|
53
58
|
|
@@ -108,7 +113,8 @@ module RuboCop
|
|
108
113
|
if needs_escaping?(string) && compatible_external_encoding_for?(string)
|
109
114
|
string.inspect
|
110
115
|
else
|
111
|
-
|
116
|
+
# In a single-quoted strings, double quotes don't need to be escaped
|
117
|
+
"'#{string.gsub('\"', '"').gsub('\\') { '\\\\' }}'"
|
112
118
|
end
|
113
119
|
end
|
114
120
|
|
@@ -120,12 +126,22 @@ module RuboCop
|
|
120
126
|
StringInterpreter.interpret(string)
|
121
127
|
end
|
122
128
|
|
129
|
+
def line(node_or_range)
|
130
|
+
if node_or_range.respond_to?(:line)
|
131
|
+
node_or_range.line
|
132
|
+
elsif node_or_range.respond_to?(:loc)
|
133
|
+
node_or_range.loc.line
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
123
137
|
def same_line?(node1, node2)
|
124
|
-
|
138
|
+
line1 = line(node1)
|
139
|
+
line2 = line(node2)
|
140
|
+
line1 && line2 && line1 == line2
|
125
141
|
end
|
126
142
|
|
127
|
-
def indent(node)
|
128
|
-
' ' * node.loc.column
|
143
|
+
def indent(node, offset: 0)
|
144
|
+
' ' * (node.loc.column + offset)
|
129
145
|
end
|
130
146
|
|
131
147
|
def to_supported_styles(enforced_style)
|
@@ -33,11 +33,12 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
33
33
|
cops.with_department(department).sort!
|
34
34
|
end
|
35
35
|
|
36
|
-
def cops_body(cop, description, examples_objects, pars)
|
36
|
+
def cops_body(cop, description, examples_objects, safety_objects, pars) # rubocop:disable Metrics/AbcSize
|
37
37
|
content = h2(cop.cop_name)
|
38
38
|
content << required_ruby_version(cop)
|
39
39
|
content << properties(cop)
|
40
40
|
content << "#{description}\n"
|
41
|
+
content << safety_object(safety_objects) if safety_objects.any? { |s| !s.text.blank? }
|
41
42
|
content << examples(examples_objects) if examples_objects.count.positive?
|
42
43
|
content << configurations(pars)
|
43
44
|
content << references(cop)
|
@@ -52,6 +53,16 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
56
|
+
def safety_object(safety_object_objects)
|
57
|
+
safety_object_objects.each_with_object(h3('Safety').dup) do |safety_object, content|
|
58
|
+
next if safety_object.text.blank?
|
59
|
+
|
60
|
+
content << "\n" unless content.end_with?("\n\n")
|
61
|
+
content << safety_object.text
|
62
|
+
content << "\n"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
55
66
|
def required_ruby_version(cop)
|
56
67
|
return '' unless cop.respond_to?(:required_minimum_ruby_version)
|
57
68
|
|
@@ -61,8 +72,8 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
61
72
|
# rubocop:disable Metrics/MethodLength
|
62
73
|
def properties(cop)
|
63
74
|
header = [
|
64
|
-
'Enabled by default', 'Safe', 'Supports autocorrection', '
|
65
|
-
'
|
75
|
+
'Enabled by default', 'Safe', 'Supports autocorrection', 'Version Added',
|
76
|
+
'Version Changed'
|
66
77
|
]
|
67
78
|
autocorrect = if cop.support_autocorrect?
|
68
79
|
"Yes#{' (Unsafe)' unless cop.new(config).safe_autocorrect?}"
|
@@ -217,12 +228,13 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
217
228
|
]
|
218
229
|
pars = cop_config.reject { |k| non_display_keys.include? k }
|
219
230
|
description = 'No documentation'
|
220
|
-
examples_object = []
|
231
|
+
examples_object = safety_object = []
|
221
232
|
cop_code(cop) do |code_object|
|
222
233
|
description = code_object.docstring unless code_object.docstring.blank?
|
223
234
|
examples_object = code_object.tags('example')
|
235
|
+
safety_object = code_object.tags('safety')
|
224
236
|
end
|
225
|
-
cops_body(cop, description, examples_object, pars)
|
237
|
+
cops_body(cop, description, examples_object, safety_object, pars)
|
226
238
|
end
|
227
239
|
|
228
240
|
def cop_code(cop)
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
output.printf(
|
34
34
|
"\n::%<severity>s file=%<file>s,line=%<line>d,col=%<column>d::%<message>s\n",
|
35
35
|
severity: github_severity(offense),
|
36
|
-
file: file,
|
36
|
+
file: PathUtil.smart_path(file),
|
37
37
|
line: offense.line,
|
38
38
|
column: offense.real_column,
|
39
39
|
message: github_escape(offense.message)
|
@@ -7,6 +7,11 @@ module RuboCop
|
|
7
7
|
class MagicComment
|
8
8
|
# @see https://git.io/vMC1C IRB's pattern for matching magic comment tokens
|
9
9
|
TOKEN = /[[:alnum:]\-_]+/.freeze
|
10
|
+
KEYWORDS = {
|
11
|
+
encoding: '(?:en)?coding',
|
12
|
+
frozen_string_literal: 'frozen[_-]string[_-]literal',
|
13
|
+
shareable_constant_value: 'shareable[_-]constant[_-]value'
|
14
|
+
}.freeze
|
10
15
|
|
11
16
|
# Detect magic comment format and pass it to the appropriate wrapper.
|
12
17
|
#
|
@@ -15,8 +20,8 @@ module RuboCop
|
|
15
20
|
# @return [RuboCop::MagicComment]
|
16
21
|
def self.parse(comment)
|
17
22
|
case comment
|
18
|
-
when EmacsComment::
|
19
|
-
when VimComment::
|
23
|
+
when EmacsComment::REGEXP then EmacsComment.new(comment)
|
24
|
+
when VimComment::REGEXP then VimComment.new(comment)
|
20
25
|
else
|
21
26
|
SimpleComment.new(comment)
|
22
27
|
end
|
@@ -30,6 +35,10 @@ module RuboCop
|
|
30
35
|
frozen_string_literal_specified? || encoding_specified? || shareable_constant_value_specified?
|
31
36
|
end
|
32
37
|
|
38
|
+
def valid?
|
39
|
+
@comment.start_with?('#') && any?
|
40
|
+
end
|
41
|
+
|
33
42
|
# Does the magic comment enable the frozen string literal feature.
|
34
43
|
#
|
35
44
|
# Test whether the frozen string literal value is `true`. Cannot
|
@@ -111,6 +120,18 @@ module RuboCop
|
|
111
120
|
#
|
112
121
|
# @abstract
|
113
122
|
class EditorComment < MagicComment
|
123
|
+
def encoding
|
124
|
+
match(self.class::KEYWORDS[:encoding])
|
125
|
+
end
|
126
|
+
|
127
|
+
# Rewrite the comment without a given token type
|
128
|
+
def without(type)
|
129
|
+
remaining = tokens.grep_v(/\A#{self.class::KEYWORDS[type.to_sym]}/)
|
130
|
+
return '' if remaining.empty?
|
131
|
+
|
132
|
+
self.class::FORMAT % remaining.join(self.class::SEPARATOR)
|
133
|
+
end
|
134
|
+
|
114
135
|
private
|
115
136
|
|
116
137
|
# Find a token starting with the provided keyword and extract its value.
|
@@ -135,7 +156,7 @@ module RuboCop
|
|
135
156
|
#
|
136
157
|
# @return [Array<String>]
|
137
158
|
def tokens
|
138
|
-
extract(self.class::
|
159
|
+
extract(self.class::REGEXP).split(self.class::SEPARATOR).map(&:strip)
|
139
160
|
end
|
140
161
|
end
|
141
162
|
|
@@ -151,22 +172,19 @@ module RuboCop
|
|
151
172
|
# @see https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html
|
152
173
|
# @see https://git.io/vMCXh Emacs handling in Ruby's parse.y
|
153
174
|
class EmacsComment < EditorComment
|
154
|
-
|
175
|
+
REGEXP = /-\*-(.+)-\*-/.freeze
|
176
|
+
FORMAT = '# -*- %s -*-'
|
155
177
|
SEPARATOR = ';'
|
156
178
|
OPERATOR = ':'
|
157
179
|
|
158
|
-
def encoding
|
159
|
-
match('(?:en)?coding')
|
160
|
-
end
|
161
|
-
|
162
180
|
private
|
163
181
|
|
164
182
|
def extract_frozen_string_literal
|
165
|
-
match(
|
183
|
+
match(KEYWORDS[:frozen_string_literal])
|
166
184
|
end
|
167
185
|
|
168
186
|
def extract_shareable_constant_value
|
169
|
-
match(
|
187
|
+
match(KEYWORDS[:shareable_constant_value])
|
170
188
|
end
|
171
189
|
end
|
172
190
|
|
@@ -179,9 +197,11 @@ module RuboCop
|
|
179
197
|
#
|
180
198
|
# comment.encoding # => 'ascii-8bit'
|
181
199
|
class VimComment < EditorComment
|
182
|
-
|
200
|
+
REGEXP = /#\s*vim:\s*(.+)/.freeze
|
201
|
+
FORMAT = '# vim: %s'
|
183
202
|
SEPARATOR = ', '
|
184
203
|
OPERATOR = '='
|
204
|
+
KEYWORDS = MagicComment::KEYWORDS.merge(encoding: 'fileencoding').freeze
|
185
205
|
|
186
206
|
# For some reason the fileencoding keyword only works if there
|
187
207
|
# is at least one other token included in the string. For example
|
@@ -193,7 +213,7 @@ module RuboCop
|
|
193
213
|
# # vim: foo=bar, fileencoding=ascii-8bit
|
194
214
|
#
|
195
215
|
def encoding
|
196
|
-
|
216
|
+
super if tokens.size > 1
|
197
217
|
end
|
198
218
|
|
199
219
|
# Vim comments cannot specify frozen string literal behavior.
|
@@ -219,7 +239,16 @@ module RuboCop
|
|
219
239
|
class SimpleComment < MagicComment
|
220
240
|
# Match `encoding` or `coding`
|
221
241
|
def encoding
|
222
|
-
extract(/\A\s*\#.*\b
|
242
|
+
extract(/\A\s*\#.*\b#{KEYWORDS[:encoding]}: (#{TOKEN})/io)
|
243
|
+
end
|
244
|
+
|
245
|
+
# Rewrite the comment without a given token type
|
246
|
+
def without(type)
|
247
|
+
if @comment.match?(/\A#\s*#{self.class::KEYWORDS[type.to_sym]}/)
|
248
|
+
''
|
249
|
+
else
|
250
|
+
@comment
|
251
|
+
end
|
223
252
|
end
|
224
253
|
|
225
254
|
private
|
@@ -232,11 +261,11 @@ module RuboCop
|
|
232
261
|
# Case-insensitive and dashes/underscores are acceptable.
|
233
262
|
# @see https://git.io/vM7Mg
|
234
263
|
def extract_frozen_string_literal
|
235
|
-
extract(/\A\s*#\s
|
264
|
+
extract(/\A\s*#\s*#{KEYWORDS[:frozen_string_literal]}:\s*(#{TOKEN})\s*\z/io)
|
236
265
|
end
|
237
266
|
|
238
267
|
def extract_shareable_constant_value
|
239
|
-
extract(/\A\s*#\s
|
268
|
+
extract(/\A\s*#\s*#{KEYWORDS[:shareable_constant_value]}:\s*(#{TOKEN})\s*\z/io)
|
240
269
|
end
|
241
270
|
end
|
242
271
|
end
|