rubocop 0.93.1 → 1.6.1
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 +36 -16
- data/config/default.yml +276 -82
- data/config/obsoletion.yml +196 -0
- data/exe/rubocop +1 -1
- data/lib/rubocop.rb +31 -2
- data/lib/rubocop/cli.rb +5 -1
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
- data/lib/rubocop/cli/command/execute_runner.rb +26 -11
- data/lib/rubocop/cli/command/suggest_extensions.rb +80 -0
- data/lib/rubocop/cli/command/version.rb +1 -1
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +4 -0
- data/lib/rubocop/config_loader.rb +34 -8
- data/lib/rubocop/config_loader_resolver.rb +12 -6
- data/lib/rubocop/config_obsoletion.rb +65 -247
- data/lib/rubocop/config_obsoletion/changed_enforced_styles.rb +33 -0
- data/lib/rubocop/config_obsoletion/changed_parameter.rb +21 -0
- data/lib/rubocop/config_obsoletion/cop_rule.rb +34 -0
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +44 -0
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +44 -0
- data/lib/rubocop/config_obsoletion/removed_cop.rb +41 -0
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +34 -0
- data/lib/rubocop/config_obsoletion/rule.rb +41 -0
- data/lib/rubocop/config_obsoletion/split_cop.rb +27 -0
- data/lib/rubocop/config_regeneration.rb +1 -1
- data/lib/rubocop/config_validator.rb +25 -10
- data/lib/rubocop/cop/autocorrect_logic.rb +21 -6
- data/lib/rubocop/cop/badge.rb +9 -24
- data/lib/rubocop/cop/base.rb +33 -16
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +26 -6
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/commissioner.rb +37 -23
- data/lib/rubocop/cop/cop.rb +2 -2
- data/lib/rubocop/cop/corrector.rb +3 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +6 -8
- data/lib/rubocop/cop/force.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -3
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +4 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +3 -10
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/class_structure.rb +22 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +15 -2
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +80 -10
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +6 -1
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -3
- data/lib/rubocop/cop/layout/end_of_line.rb +5 -5
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -2
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +7 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +4 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +12 -0
- data/lib/rubocop/cop/layout/line_length.rb +10 -13
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +7 -3
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +24 -18
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +4 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +35 -13
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +37 -13
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +2 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +26 -2
- data/lib/rubocop/cop/lint/debugger.rb +17 -28
- data/lib/rubocop/cop/lint/duplicate_branch.rb +93 -0
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +2 -12
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +77 -0
- data/lib/rubocop/cop/lint/else_layout.rb +29 -3
- data/lib/rubocop/cop/lint/empty_block.rb +82 -0
- data/lib/rubocop/cop/lint/empty_class.rb +93 -0
- data/lib/rubocop/cop/lint/flip_flop.rb +8 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +7 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +39 -7
- data/lib/rubocop/cop/lint/loop.rb +4 -4
- data/lib/rubocop/cop/lint/missing_super.rb +7 -4
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +14 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +58 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +46 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +27 -8
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +19 -16
- data/lib/rubocop/cop/lint/shadowed_exception.rb +4 -5
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -0
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +86 -0
- data/lib/rubocop/cop/lint/to_json.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +85 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +199 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -2
- data/lib/rubocop/cop/lint/useless_method_definition.rb +2 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +6 -1
- data/lib/rubocop/cop/metrics/abc_size.rb +25 -1
- data/lib/rubocop/cop/metrics/block_length.rb +13 -7
- data/lib/rubocop/cop/metrics/method_length.rb +7 -2
- data/lib/rubocop/cop/metrics/parameter_lists.rb +68 -2
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +20 -10
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +146 -0
- data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +6 -1
- data/lib/rubocop/cop/migration/department_name.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +4 -3
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +9 -1
- data/lib/rubocop/cop/mixin/ignored_methods.rb +36 -3
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -1
- data/lib/rubocop/cop/mixin/method_complexity.rb +6 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -4
- data/lib/rubocop/cop/mixin/string_help.rb +4 -1
- data/lib/rubocop/cop/mixin/visibility_help.rb +1 -3
- data/lib/rubocop/cop/naming/accessor_method_name.rb +15 -1
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +12 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +11 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +67 -18
- data/lib/rubocop/cop/naming/predicate_name.rb +2 -1
- data/lib/rubocop/cop/naming/variable_number.rb +100 -8
- data/lib/rubocop/cop/offense.rb +3 -3
- data/lib/rubocop/cop/security/open.rb +12 -10
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -1
- data/lib/rubocop/cop/style/and_or.rb +11 -3
- data/lib/rubocop/cop/style/arguments_forwarding.rb +142 -0
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +0 -4
- data/lib/rubocop/cop/style/case_like_if.rb +0 -4
- data/lib/rubocop/cop/style/character_literal.rb +10 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +8 -3
- data/lib/rubocop/cop/style/collection_compact.rb +91 -0
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +169 -0
- data/lib/rubocop/cop/style/documentation.rb +12 -1
- data/lib/rubocop/cop/style/double_negation.rb +6 -1
- data/lib/rubocop/cop/style/float_division.rb +44 -1
- data/lib/rubocop/cop/style/format_string.rb +8 -3
- data/lib/rubocop/cop/style/format_string_token.rb +47 -2
- data/lib/rubocop/cop/style/hash_syntax.rb +3 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +7 -2
- data/lib/rubocop/cop/style/if_inside_else.rb +37 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +39 -4
- data/lib/rubocop/cop/style/infinite_loop.rb +4 -0
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +12 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +10 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +8 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +7 -11
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +11 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +55 -7
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +106 -0
- data/lib/rubocop/cop/style/nil_lambda.rb +52 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +14 -11
- data/lib/rubocop/cop/style/perl_backrefs.rb +86 -9
- data/lib/rubocop/cop/style/raise_args.rb +21 -6
- data/lib/rubocop/cop/style/redundant_argument.rb +88 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +7 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +24 -8
- data/lib/rubocop/cop/style/redundant_self.rb +3 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +16 -4
- data/lib/rubocop/cop/style/semicolon.rb +3 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +30 -7
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +65 -3
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -13
- data/lib/rubocop/cop/style/static_class.rb +97 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +39 -2
- data/lib/rubocop/cop/style/string_literals.rb +14 -8
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +4 -3
- data/lib/rubocop/cop/style/swap_values.rb +108 -0
- data/lib/rubocop/cop/style/symbol_proc.rb +5 -3
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +3 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +9 -0
- data/lib/rubocop/cop/team.rb +6 -1
- data/lib/rubocop/cop/util.rb +6 -2
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/core_ext/hash.rb +20 -0
- data/lib/rubocop/ext/regexp_node.rb +36 -11
- data/lib/rubocop/ext/regexp_parser.rb +95 -0
- data/lib/rubocop/formatter/disabled_config_formatter.rb +21 -6
- data/lib/rubocop/formatter/emacs_style_formatter.rb +2 -0
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +47 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +2 -0
- data/lib/rubocop/formatter/tap_formatter.rb +2 -0
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +40 -0
- data/lib/rubocop/magic_comment.rb +2 -2
- data/lib/rubocop/options.rb +11 -1
- data/lib/rubocop/rake_task.rb +2 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/runner.rb +1 -1
- data/lib/rubocop/target_finder.rb +1 -1
- data/lib/rubocop/target_ruby.rb +65 -1
- data/lib/rubocop/version.rb +56 -6
- metadata +50 -9
- data/bin/console +0 -10
- data/bin/rubocop-profile +0 -32
- data/bin/setup +0 -7
@@ -25,7 +25,7 @@ module RuboCop
|
|
25
25
|
# spec.add_runtime_dependency 'gem_a'
|
26
26
|
# end
|
27
27
|
#
|
28
|
-
class RubyVersionGlobalsUsage <
|
28
|
+
class RubyVersionGlobalsUsage < Base
|
29
29
|
MSG = 'Do not use `RUBY_VERSION` in gemspec file.'
|
30
30
|
|
31
31
|
def_node_matcher :ruby_version?, '(const {cbase nil?} :RUBY_VERSION)'
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
# and spec file when given a valid qualified cop name.
|
9
9
|
# @api private
|
10
10
|
class Generator
|
11
|
-
#
|
11
|
+
# NOTE: RDoc 5.1.0 or lower has the following issue.
|
12
12
|
# https://github.com/rubocop-hq/rubocop/issues/7043
|
13
13
|
#
|
14
14
|
# The following `String#gsub` can be replaced with
|
@@ -17,7 +17,6 @@ module RuboCop
|
|
17
17
|
SOURCE_TEMPLATE = <<-RUBY.gsub(/^ {8}/, '')
|
18
18
|
# frozen_string_literal: true
|
19
19
|
|
20
|
-
# TODO: when finished, run `rake generate_cops_documentation` to update the docs
|
21
20
|
module RuboCop
|
22
21
|
module Cop
|
23
22
|
module %<department>s
|
@@ -134,13 +133,13 @@ module RuboCop
|
|
134
133
|
end
|
135
134
|
|
136
135
|
def inject_config(config_file_path: 'config/default.yml',
|
137
|
-
version_added:
|
136
|
+
version_added: '<<next>>')
|
138
137
|
injector =
|
139
138
|
ConfigurationInjector.new(configuration_file_path: config_file_path,
|
140
139
|
badge: badge,
|
141
140
|
version_added: version_added)
|
142
141
|
|
143
|
-
injector.inject do
|
142
|
+
injector.inject do # rubocop:disable Lint/UnexpectedBlockArity
|
144
143
|
output.puts(format(CONFIGURATION_ADDED_MESSAGE,
|
145
144
|
configuration_file_path: config_file_path))
|
146
145
|
end
|
@@ -213,12 +212,6 @@ module RuboCop
|
|
213
212
|
.gsub(/([A-Z])([A-Z][^A-Z\d]+)/, '\1_\2')
|
214
213
|
.downcase
|
215
214
|
end
|
216
|
-
|
217
|
-
def bump_minor_version
|
218
|
-
versions = RuboCop::Version::STRING.split('.')
|
219
|
-
|
220
|
-
"#{versions[0]}.#{versions[1].succ}"
|
221
|
-
end
|
222
215
|
end
|
223
216
|
end
|
224
217
|
end
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
VersionAdded: '%<version_added>s'
|
15
15
|
YAML
|
16
16
|
|
17
|
-
def initialize(configuration_file_path:, badge:, version_added:)
|
17
|
+
def initialize(configuration_file_path:, badge:, version_added: '<<next>>')
|
18
18
|
@configuration_file_path = configuration_file_path
|
19
19
|
@badge = badge
|
20
20
|
@version_added = version_added
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
38
38
|
|
39
39
|
def assertions_using_described_class_msg
|
40
40
|
described_class_msg(processed_source.ast).reject do |node|
|
41
|
-
node.ancestors.any?
|
41
|
+
node.ancestors.any? { |ancestor| rspec_expectation_on_msg?(ancestor) }
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -210,10 +210,9 @@ module RuboCop
|
|
210
210
|
end
|
211
211
|
|
212
212
|
def alt_start_msg(start_loc, source_line_column)
|
213
|
-
if style != :either
|
214
|
-
|
215
|
-
|
216
|
-
start_loc.column == source_line_column[:column]
|
213
|
+
if style != :either ||
|
214
|
+
(start_loc.line == source_line_column[:line] &&
|
215
|
+
start_loc.column == source_line_column[:column])
|
217
216
|
''
|
218
217
|
else
|
219
218
|
" or #{format_source_line_column(source_line_column)}"
|
@@ -147,6 +147,10 @@ module RuboCop
|
|
147
147
|
MSG = '`%<category>s` is supposed to appear before ' \
|
148
148
|
'`%<previous>s`.'
|
149
149
|
|
150
|
+
def_node_matcher :dynamic_constant?, <<~PATTERN
|
151
|
+
(casgn nil? _ (send ...))
|
152
|
+
PATTERN
|
153
|
+
|
150
154
|
# Validates code style on class declaration.
|
151
155
|
# Add offense when find a node out of expected order.
|
152
156
|
def on_class(class_node)
|
@@ -168,11 +172,10 @@ module RuboCop
|
|
168
172
|
|
169
173
|
# Autocorrect by swapping between two nodes autocorrecting them
|
170
174
|
def autocorrect(corrector, node)
|
171
|
-
node_classification = classify(node)
|
172
175
|
previous = node.left_siblings.find do |sibling|
|
173
|
-
|
174
|
-
!ignore?(classification) && node_classification != classification
|
176
|
+
!ignore_for_autocorrect?(node, sibling)
|
175
177
|
end
|
178
|
+
return unless previous
|
176
179
|
|
177
180
|
current_range = source_range_with_comment(node)
|
178
181
|
previous_range = source_range_with_comment(previous)
|
@@ -241,6 +244,15 @@ module RuboCop
|
|
241
244
|
expected_order.index(classification).nil?
|
242
245
|
end
|
243
246
|
|
247
|
+
def ignore_for_autocorrect?(node, sibling)
|
248
|
+
classification = classify(node)
|
249
|
+
sibling_class = classify(sibling)
|
250
|
+
|
251
|
+
ignore?(sibling_class) ||
|
252
|
+
classification == sibling_class ||
|
253
|
+
dynamic_constant?(node)
|
254
|
+
end
|
255
|
+
|
244
256
|
def humanize_node(node)
|
245
257
|
if node.def_type?
|
246
258
|
return :initializer if node.method?(:initialize)
|
@@ -265,6 +277,9 @@ module RuboCop
|
|
265
277
|
end
|
266
278
|
|
267
279
|
def end_position_for(node)
|
280
|
+
heredoc = find_heredoc(node)
|
281
|
+
return heredoc.location.heredoc_end.end_pos + 1 if heredoc
|
282
|
+
|
268
283
|
end_line = buffer.line_for_position(node.loc.expression.end_pos)
|
269
284
|
buffer.line_range(end_line).end_pos
|
270
285
|
end
|
@@ -284,6 +299,10 @@ module RuboCop
|
|
284
299
|
buffer.line_range(node.loc.line).begin_pos - 1
|
285
300
|
end
|
286
301
|
|
302
|
+
def find_heredoc(node)
|
303
|
+
node.each_node(:str, :dstr, :xstr).find(&:heredoc?)
|
304
|
+
end
|
305
|
+
|
287
306
|
def buffer
|
288
307
|
processed_source.buffer
|
289
308
|
end
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
6
|
# This cop checks the alignment of else keywords. Normally they should
|
7
|
-
# be aligned with an if/unless/while/until/begin/def keyword, but there
|
7
|
+
# be aligned with an if/unless/while/until/begin/def/rescue keyword, but there
|
8
8
|
# are special cases when they should follow the same rules as the
|
9
9
|
# alignment of end.
|
10
10
|
#
|
@@ -93,7 +93,13 @@ module RuboCop
|
|
93
93
|
case parent.type
|
94
94
|
when :def, :defs then base_for_method_definition(parent)
|
95
95
|
when :kwbegin then parent.loc.begin
|
96
|
-
when :block
|
96
|
+
when :block
|
97
|
+
assignment_node = assignment_node(parent)
|
98
|
+
if same_line?(parent, assignment_node)
|
99
|
+
assignment_node.source_range
|
100
|
+
else
|
101
|
+
parent.send_node.source_range
|
102
|
+
end
|
97
103
|
else node.loc.keyword
|
98
104
|
end
|
99
105
|
end
|
@@ -136,6 +142,13 @@ module RuboCop
|
|
136
142
|
)
|
137
143
|
add_offense(else_range, location: else_range, message: message)
|
138
144
|
end
|
145
|
+
|
146
|
+
def assignment_node(node)
|
147
|
+
assignment_node = node.ancestors.first
|
148
|
+
return unless assignment_node&.assignment?
|
149
|
+
|
150
|
+
assignment_node
|
151
|
+
end
|
139
152
|
end
|
140
153
|
end
|
141
154
|
end
|
@@ -3,17 +3,18 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This cop checks whether method definitions are
|
7
|
-
# separated by one empty
|
6
|
+
# This cop checks whether class/module/method definitions are
|
7
|
+
# separated by one or more empty lines.
|
8
8
|
#
|
9
9
|
# `NumberOfEmptyLines` can be an integer (default is 1) or
|
10
10
|
# an array (e.g. [1, 2]) to specify a minimum and maximum
|
11
11
|
# number of empty lines permitted.
|
12
12
|
#
|
13
13
|
# `AllowAdjacentOneLineDefs` configures whether adjacent
|
14
|
-
# one-line
|
14
|
+
# one-line definitions are considered an offense.
|
15
15
|
#
|
16
|
-
# @example
|
16
|
+
# @example EmptyLineBetweenMethodDefs: true (default)
|
17
|
+
# # checks for empty lines between method definitions.
|
17
18
|
#
|
18
19
|
# # bad
|
19
20
|
# def a
|
@@ -29,11 +30,57 @@ module RuboCop
|
|
29
30
|
#
|
30
31
|
# def b
|
31
32
|
# end
|
33
|
+
#
|
34
|
+
# @example EmptyLineBetweenClassDefs: true (default)
|
35
|
+
# # checks for empty lines between class definitions.
|
36
|
+
#
|
37
|
+
# # bad
|
38
|
+
# class A
|
39
|
+
# end
|
40
|
+
# class B
|
41
|
+
# end
|
42
|
+
# def b
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# @example
|
46
|
+
#
|
47
|
+
# # good
|
48
|
+
# class A
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# class B
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# def b
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# @example EmptyLineBetweenModuleDefs: true (default)
|
58
|
+
# # checks for empty lines between module definitions.
|
59
|
+
#
|
60
|
+
# # bad
|
61
|
+
# module A
|
62
|
+
# end
|
63
|
+
# module B
|
64
|
+
# end
|
65
|
+
# def b
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# @example
|
69
|
+
#
|
70
|
+
# # good
|
71
|
+
# module A
|
72
|
+
# end
|
73
|
+
#
|
74
|
+
# module B
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# def b
|
78
|
+
# end
|
32
79
|
class EmptyLineBetweenDefs < Base
|
33
80
|
include RangeHelp
|
34
81
|
extend AutoCorrector
|
35
82
|
|
36
|
-
MSG = 'Use empty lines between
|
83
|
+
MSG = 'Use empty lines between %<type>s definitions.'
|
37
84
|
|
38
85
|
def self.autocorrect_incompatible_with
|
39
86
|
[Layout::EmptyLines]
|
@@ -47,7 +94,7 @@ module RuboCop
|
|
47
94
|
def on_begin(node)
|
48
95
|
node.children.each_cons(2) do |prev, n|
|
49
96
|
nodes = [prev, n]
|
50
|
-
check_defs(nodes) if nodes.all?(
|
97
|
+
check_defs(nodes) if nodes.all? { |def_candidate| candidate?(def_candidate) }
|
51
98
|
end
|
52
99
|
end
|
53
100
|
|
@@ -57,8 +104,9 @@ module RuboCop
|
|
57
104
|
return if nodes.all?(&:single_line?) &&
|
58
105
|
cop_config['AllowAdjacentOneLineDefs']
|
59
106
|
|
60
|
-
|
61
|
-
|
107
|
+
correction_node = nodes.last
|
108
|
+
location = correction_node.loc.keyword.join(correction_node.loc.name)
|
109
|
+
add_offense(location, message: message(correction_node)) do |corrector|
|
62
110
|
autocorrect(corrector, *nodes)
|
63
111
|
end
|
64
112
|
end
|
@@ -83,10 +131,32 @@ module RuboCop
|
|
83
131
|
|
84
132
|
private
|
85
133
|
|
86
|
-
def
|
134
|
+
def candidate?(node)
|
87
135
|
return unless node
|
88
136
|
|
89
|
-
node
|
137
|
+
method_candidate?(node) || class_candidate?(node) || module_candidate?(node)
|
138
|
+
end
|
139
|
+
|
140
|
+
def method_candidate?(node)
|
141
|
+
cop_config['EmptyLineBetweenMethodDefs'] && (node.def_type? || node.defs_type?)
|
142
|
+
end
|
143
|
+
|
144
|
+
def class_candidate?(node)
|
145
|
+
cop_config['EmptyLineBetweenClassDefs'] && node.class_type?
|
146
|
+
end
|
147
|
+
|
148
|
+
def module_candidate?(node)
|
149
|
+
cop_config['EmptyLineBetweenModuleDefs'] && node.module_type?
|
150
|
+
end
|
151
|
+
|
152
|
+
def message(node)
|
153
|
+
type = case node.type
|
154
|
+
when :def, :defs
|
155
|
+
:method
|
156
|
+
else
|
157
|
+
node.type
|
158
|
+
end
|
159
|
+
format(MSG, type: type)
|
90
160
|
end
|
91
161
|
|
92
162
|
def multiple_blank_lines_groups?(first_def_node, second_def_node)
|
@@ -45,7 +45,8 @@ module RuboCop
|
|
45
45
|
MSG = 'Empty line detected around arguments.'
|
46
46
|
|
47
47
|
def on_send(node)
|
48
|
-
return if node.single_line? || node.arguments.empty?
|
48
|
+
return if node.single_line? || node.arguments.empty? ||
|
49
|
+
receiver_and_method_call_on_different_lines?(node)
|
49
50
|
|
50
51
|
extra_lines(node) do |range|
|
51
52
|
add_offense(range) do |corrector|
|
@@ -57,6 +58,10 @@ module RuboCop
|
|
57
58
|
|
58
59
|
private
|
59
60
|
|
61
|
+
def receiver_and_method_call_on_different_lines?(node)
|
62
|
+
node.receiver && node.receiver.loc.last_line != node.loc.selector&.line
|
63
|
+
end
|
64
|
+
|
60
65
|
def empty_lines(node)
|
61
66
|
lines = processed_lines(node)
|
62
67
|
lines.select! { |code, _| code.empty? }
|
@@ -137,10 +137,10 @@ module RuboCop
|
|
137
137
|
def asgn_variable_align_with(outer_node, inner_node)
|
138
138
|
expr = outer_node.source_range
|
139
139
|
|
140
|
-
if
|
141
|
-
range_between(expr.begin_pos, inner_node.loc.keyword.end_pos)
|
142
|
-
else
|
140
|
+
if line_break_before_keyword?(expr, inner_node)
|
143
141
|
inner_node.loc.keyword
|
142
|
+
else
|
143
|
+
range_between(expr.begin_pos, inner_node.loc.keyword.end_pos)
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -37,14 +37,14 @@ module RuboCop
|
|
37
37
|
# # good
|
38
38
|
# puts 'Hello' # Return character is CR+LF on all platfoms.
|
39
39
|
#
|
40
|
-
class EndOfLine <
|
40
|
+
class EndOfLine < Base
|
41
41
|
include ConfigurableEnforcedStyle
|
42
42
|
include RangeHelp
|
43
43
|
|
44
44
|
MSG_DETECTED = 'Carriage return character detected.'
|
45
45
|
MSG_MISSING = 'Carriage return character missing.'
|
46
46
|
|
47
|
-
def
|
47
|
+
def on_new_investigation
|
48
48
|
last_line = last_line(processed_source)
|
49
49
|
|
50
50
|
processed_source.raw_source.each_line.with_index do |line, index|
|
@@ -54,9 +54,9 @@ module RuboCop
|
|
54
54
|
next unless msg
|
55
55
|
next if unimportant_missing_cr?(index, last_line, line)
|
56
56
|
|
57
|
-
range =
|
58
|
-
|
59
|
-
add_offense(
|
57
|
+
range = source_range(processed_source.buffer, index + 1, 0, line.length)
|
58
|
+
|
59
|
+
add_offense(range, message: msg)
|
60
60
|
# Usually there will be carriage return characters on all or none
|
61
61
|
# of the lines in a file, so we report only one offense.
|
62
62
|
break
|
@@ -56,8 +56,7 @@ module RuboCop
|
|
56
56
|
aligned = Set[locs.first.line, locs.last.line]
|
57
57
|
locs.each_cons(3) do |before, loc, after|
|
58
58
|
col = loc.column
|
59
|
-
aligned << loc.line if col == before.column ||
|
60
|
-
col == after.column
|
59
|
+
aligned << loc.line if col == before.column || col == after.column
|
61
60
|
end
|
62
61
|
aligned
|
63
62
|
end
|
@@ -207,8 +207,13 @@ module RuboCop
|
|
207
207
|
PATTERN
|
208
208
|
|
209
209
|
def base_range(send_node, arg_node)
|
210
|
-
|
211
|
-
|
210
|
+
parent = send_node.parent
|
211
|
+
start_node = if parent && (parent.splat_type? || parent.kwsplat_type?)
|
212
|
+
send_node.parent
|
213
|
+
else
|
214
|
+
send_node
|
215
|
+
end
|
216
|
+
range_between(start_node.source_range.begin_pos, arg_node.source_range.begin_pos)
|
212
217
|
end
|
213
218
|
|
214
219
|
# Returns the column of the given range. For single line ranges, this
|
@@ -296,13 +296,13 @@ module RuboCop
|
|
296
296
|
# just give each lambda the same reference and they would all get the
|
297
297
|
# last value of each. A local variable fixes the problem.
|
298
298
|
|
299
|
-
if
|
300
|
-
delta_value = delta[:key] || 0
|
301
|
-
correct_no_value(corrector, delta_value, node.source_range)
|
302
|
-
else
|
299
|
+
if node.value
|
303
300
|
correct_key_value(corrector, delta, node.key.source_range,
|
304
301
|
node.value.source_range,
|
305
302
|
node.loc.operator)
|
303
|
+
else
|
304
|
+
delta_value = delta[:key] || 0
|
305
|
+
correct_no_value(corrector, delta_value, node.source_range)
|
306
306
|
end
|
307
307
|
end
|
308
308
|
|