rubocop 0.52.0 → 0.52.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 +6 -5
- data/config/default.yml +1 -11
- data/config/disabled.yml +5 -0
- data/config/enabled.yml +6 -8
- data/lib/rubocop.rb +13 -2
- data/lib/rubocop/ast/node.rb +23 -15
- data/lib/rubocop/cli.rb +25 -2
- data/lib/rubocop/config.rb +23 -8
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -0
- data/lib/rubocop/cop/commissioner.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +121 -0
- data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +62 -0
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
- data/lib/rubocop/cop/correctors/space_corrector.rb +34 -0
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +31 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -0
- data/lib/rubocop/cop/generator.rb +18 -87
- data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/align_array.rb +5 -1
- data/lib/rubocop/cop/layout/align_hash.rb +1 -1
- data/lib/rubocop/cop/layout/align_parameters.rb +5 -1
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +2 -2
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +17 -19
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +4 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +4 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -0
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +4 -0
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +4 -0
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/indent_array.rb +6 -2
- data/lib/rubocop/cop/layout/indent_assignment.rb +6 -2
- data/lib/rubocop/cop/layout/indent_hash.rb +5 -1
- data/lib/rubocop/cop/layout/indentation_consistency.rb +5 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +5 -1
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +3 -3
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -1
- data/lib/rubocop/cop/layout/space_after_comma.rb +4 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +4 -0
- data/lib/rubocop/cop/layout/space_before_comma.rb +4 -0
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -7
- data/lib/rubocop/cop/layout/tab.rb +1 -1
- data/lib/rubocop/cop/lint/block_alignment.rb +1 -1
- data/lib/rubocop/cop/lint/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/lint/end_alignment.rb +3 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/unused_block_argument.rb +4 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +6 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -1
- data/lib/rubocop/cop/mixin/alignment.rb +70 -0
- data/lib/rubocop/cop/mixin/array_hash_indentation.rb +2 -0
- data/lib/rubocop/cop/mixin/array_syntax.rb +2 -0
- data/lib/rubocop/cop/mixin/code_length.rb +2 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +2 -0
- data/lib/rubocop/cop/mixin/def_node.rb +3 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -15
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -25
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +0 -6
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +5 -9
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +2 -2
- data/lib/rubocop/cop/mixin/ignored_pattern.rb +2 -0
- data/lib/rubocop/cop/mixin/integer_node.rb +2 -0
- data/lib/rubocop/cop/mixin/match_range.rb +2 -0
- data/lib/rubocop/cop/mixin/min_body_length.rb +2 -0
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +9 -48
- data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -16
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +12 -31
- data/lib/rubocop/cop/mixin/parentheses.rb +2 -19
- data/lib/rubocop/cop/mixin/percent_literal.rb +3 -3
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +2 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +2 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +2 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -3
- data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -2
- data/lib/rubocop/cop/mixin/string_help.rb +2 -0
- data/lib/rubocop/cop/mixin/string_literals_help.rb +2 -13
- data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -21
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -10
- data/lib/rubocop/cop/mixin/unused_argument.rb +2 -15
- data/lib/rubocop/cop/performance/case_when_splat.rb +1 -1
- data/lib/rubocop/cop/rails/action_filter.rb +3 -2
- data/lib/rubocop/cop/rails/active_support_aliases.rb +3 -2
- data/lib/rubocop/cop/rails/application_job.rb +6 -0
- data/lib/rubocop/cop/rails/application_record.rb +6 -0
- data/lib/rubocop/cop/rails/blank.rb +10 -9
- data/lib/rubocop/cop/rails/date.rb +22 -14
- data/lib/rubocop/cop/rails/delegate.rb +1 -1
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +3 -2
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +4 -2
- data/lib/rubocop/cop/rails/environment_comparison.rb +2 -2
- data/lib/rubocop/cop/rails/file_path.rb +1 -1
- data/lib/rubocop/cop/rails/find_by.rb +2 -2
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +15 -7
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +2 -2
- data/lib/rubocop/cop/rails/inverse_of.rb +130 -8
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +3 -3
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +3 -2
- data/lib/rubocop/cop/rails/presence.rb +31 -18
- data/lib/rubocop/cop/rails/present.rb +11 -8
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +52 -10
- data/lib/rubocop/cop/rails/request_referer.rb +2 -3
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +9 -2
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +38 -10
- data/lib/rubocop/cop/style/class_and_module_children.rb +76 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +24 -4
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +46 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +14 -0
- data/lib/rubocop/cop/style/method_def_parentheses.rb +79 -0
- data/lib/rubocop/cop/style/mixin_usage.rb +13 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +19 -0
- data/lib/rubocop/cop/style/negated_if.rb +1 -1
- data/lib/rubocop/cop/style/negated_while.rb +6 -4
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -1
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +4 -0
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +4 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/string_literals.rb +4 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +4 -0
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -0
- data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +4 -0
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +33 -24
- data/lib/rubocop/options.rb +33 -10
- data/lib/rubocop/path_util.rb +7 -0
- data/lib/rubocop/token.rb +4 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +14 -4
- data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -149
- data/lib/rubocop/cop/style/extend_self.rb +0 -92
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c220d66052a5e9bbd4c5c4b8152f9eb198def00
|
4
|
+
data.tar.gz: 3b3e355cef47c417d03265e565f7bf1fe94c7b9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cba8acef3a405e92862d9ae1e1783bbeb6f9d4675fe978068a519a759598a26b2b79b10e0bc688fe0ee2c1b8a0c640316395c65f94903179b0b45a9b091f63b9
|
7
|
+
data.tar.gz: 3e31e510ef57bd3ccd4b2085398c22b1da1a0a137efa487c4f110b5c1d0d8ad568197d899f05a3b79bd9d281c9933ee8c6d19f134b0d052344ca778e50c07739
|
data/README.md
CHANGED
@@ -6,7 +6,8 @@
|
|
6
6
|
[](https://codeclimate.com/github/bbatsov/rubocop)
|
7
7
|
[](http://inch-ci.org/github/bbatsov/rubocop)
|
8
8
|
|
9
|
-
[](https://www.patreon.com/bbatsov)
|
10
|
+
[](https://liberapay.com/bbatsov/donate)
|
10
11
|
[](#open-collective-backers)
|
11
12
|
[](#open-collective-sponsors)
|
12
13
|
|
@@ -51,7 +52,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
|
|
51
52
|
might want to use a conservative version locking in your `Gemfile`:
|
52
53
|
|
53
54
|
```rb
|
54
|
-
gem 'rubocop', '~> 0.52.
|
55
|
+
gem 'rubocop', '~> 0.52.1', require: false
|
55
56
|
```
|
56
57
|
|
57
58
|
## Quickstart
|
@@ -129,9 +130,9 @@ to become a RuboCop sponsor.
|
|
129
130
|
|
130
131
|
You can support the development of RuboCop via
|
131
132
|
[Salt](https://salt.bountysource.com/teams/rubocop),
|
132
|
-
[
|
133
|
-
|
134
|
-
[
|
133
|
+
[Patreon](https://www.patreon.com/bbatsov),
|
134
|
+
[Liberapay](https://liberapay.com/bbatsov/donate),
|
135
|
+
and [Open Collective](https://opencollective.com/rubocop).
|
135
136
|
|
136
137
|
### Open Collective Backers
|
137
138
|
|
data/config/default.yml
CHANGED
@@ -490,7 +490,7 @@ Layout/SpaceBeforeBlockBraces:
|
|
490
490
|
SupportedStyles:
|
491
491
|
- space
|
492
492
|
- no_space
|
493
|
-
EnforcedStyleForEmptyBraces:
|
493
|
+
EnforcedStyleForEmptyBraces: space
|
494
494
|
SupportedStylesForEmptyBraces:
|
495
495
|
- space
|
496
496
|
- no_space
|
@@ -552,9 +552,6 @@ Layout/SpaceInsideStringInterpolation:
|
|
552
552
|
- no_space
|
553
553
|
|
554
554
|
Layout/ClassStructure:
|
555
|
-
Description: 'Enforces a configured order of definitions within a class body.'
|
556
|
-
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-classes'
|
557
|
-
Enabled: false
|
558
555
|
Categories:
|
559
556
|
module_inclusion:
|
560
557
|
- include
|
@@ -930,12 +927,6 @@ Style/EmptyMethod:
|
|
930
927
|
- compact
|
931
928
|
- expanded
|
932
929
|
|
933
|
-
Style/ExtendSelf:
|
934
|
-
EnforcedStyle: module_function
|
935
|
-
SupportedStyles:
|
936
|
-
- module_function
|
937
|
-
- extend_self
|
938
|
-
|
939
930
|
# Checks use of for or each in multiline loops.
|
940
931
|
Style/For:
|
941
932
|
EnforcedStyle: each
|
@@ -1003,7 +994,6 @@ Style/HashSyntax:
|
|
1003
994
|
PreferHashRocketsForNonAlnumEndingSymbols: false
|
1004
995
|
|
1005
996
|
Style/InverseMethods:
|
1006
|
-
Enabled: true
|
1007
997
|
# `InverseMethods` are methods that can be inverted by a not (`not` or `!`)
|
1008
998
|
# The relationship of inverse methods only needs to be defined in one direction.
|
1009
999
|
# Keys and values both need to be defined as symbols.
|
data/config/disabled.yml
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# These are all the cops that are disabled in the default configuration.
|
2
2
|
|
3
|
+
Layout/ClassStructure:
|
4
|
+
Description: 'Enforces a configured order of definitions within a class body.'
|
5
|
+
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-classes'
|
6
|
+
Enabled: false
|
7
|
+
|
3
8
|
Layout/FirstArrayElementLineBreak:
|
4
9
|
Description: >-
|
5
10
|
Checks for a line break before the first element in a
|
data/config/enabled.yml
CHANGED
@@ -1327,6 +1327,12 @@ Style/CharacterLiteral:
|
|
1327
1327
|
Style/ClassAndModuleChildren:
|
1328
1328
|
Description: 'Checks style of children classes and modules.'
|
1329
1329
|
StyleGuide: '#namespace-definition'
|
1330
|
+
# Moving from compact to nested children requires knowledge of whether the
|
1331
|
+
# outer parent is a module or a class. Moving from nested to compact requires
|
1332
|
+
# verification that the outer parent is defined elsewhere. Rubocop does not
|
1333
|
+
# have the knowledge to perform either operation safely and thus requires
|
1334
|
+
# manual oversight.
|
1335
|
+
AutoCorrect: false
|
1330
1336
|
Enabled: true
|
1331
1337
|
|
1332
1338
|
Style/ClassCheck:
|
@@ -1459,14 +1465,6 @@ Style/EvenOdd:
|
|
1459
1465
|
StyleGuide: '#predicate-methods'
|
1460
1466
|
Enabled: true
|
1461
1467
|
|
1462
|
-
Style/ExtendSelf:
|
1463
|
-
Description: 'Checks for uses of extend self.'
|
1464
|
-
StyleGuide: '#module-function'
|
1465
|
-
Enabled: true
|
1466
|
-
# Using `module_function` results in private visibility scope when the
|
1467
|
-
# module is included, so auto-correction is unsafe.
|
1468
|
-
Autocorrect: false
|
1469
|
-
|
1470
1468
|
Style/FlipFlop:
|
1471
1469
|
Description: 'Checks for flip flops'
|
1472
1470
|
StyleGuide: '#no-flip-flops'
|
data/lib/rubocop.rb
CHANGED
@@ -74,6 +74,7 @@ require_relative 'rubocop/cop/corrector'
|
|
74
74
|
require_relative 'rubocop/cop/force'
|
75
75
|
require_relative 'rubocop/cop/severity'
|
76
76
|
require_relative 'rubocop/cop/generator'
|
77
|
+
require_relative 'rubocop/cop/generator/require_file_injector'
|
77
78
|
|
78
79
|
require_relative 'rubocop/cop/variable_force'
|
79
80
|
require_relative 'rubocop/cop/variable_force/branch'
|
@@ -88,7 +89,7 @@ require_relative 'rubocop/cop/mixin/annotation_comment'
|
|
88
89
|
require_relative 'rubocop/cop/mixin/array_hash_indentation'
|
89
90
|
require_relative 'rubocop/cop/mixin/array_min_size'
|
90
91
|
require_relative 'rubocop/cop/mixin/array_syntax'
|
91
|
-
require_relative 'rubocop/cop/mixin/
|
92
|
+
require_relative 'rubocop/cop/mixin/alignment'
|
92
93
|
require_relative 'rubocop/cop/mixin/check_assignment'
|
93
94
|
require_relative 'rubocop/cop/mixin/configurable_max'
|
94
95
|
require_relative 'rubocop/cop/mixin/code_length' # relies on configurable_max
|
@@ -139,6 +140,17 @@ require_relative 'rubocop/cop/mixin/too_many_lines'
|
|
139
140
|
require_relative 'rubocop/cop/mixin/trailing_comma'
|
140
141
|
require_relative 'rubocop/cop/mixin/unused_argument'
|
141
142
|
|
143
|
+
require_relative 'rubocop/cop/correctors/alignment_corrector'
|
144
|
+
require_relative 'rubocop/cop/correctors/condition_corrector'
|
145
|
+
require_relative 'rubocop/cop/correctors/empty_line_corrector'
|
146
|
+
require_relative 'rubocop/cop/correctors/multiline_literal_brace_corrector'
|
147
|
+
require_relative 'rubocop/cop/correctors/ordered_gem_corrector'
|
148
|
+
require_relative 'rubocop/cop/correctors/parentheses_corrector'
|
149
|
+
require_relative 'rubocop/cop/correctors/punctuation_corrector'
|
150
|
+
require_relative 'rubocop/cop/correctors/space_corrector'
|
151
|
+
require_relative 'rubocop/cop/correctors/string_literal_corrector'
|
152
|
+
require_relative 'rubocop/cop/correctors/unused_arg_corrector'
|
153
|
+
|
142
154
|
require_relative 'rubocop/cop/bundler/duplicated_gem'
|
143
155
|
require_relative 'rubocop/cop/bundler/insecure_protocol_source'
|
144
156
|
require_relative 'rubocop/cop/bundler/ordered_gems'
|
@@ -390,7 +402,6 @@ require_relative 'rubocop/cop/style/encoding'
|
|
390
402
|
require_relative 'rubocop/cop/style/end_block'
|
391
403
|
require_relative 'rubocop/cop/style/eval_with_location'
|
392
404
|
require_relative 'rubocop/cop/style/even_odd'
|
393
|
-
require_relative 'rubocop/cop/style/extend_self'
|
394
405
|
require_relative 'rubocop/cop/style/flip_flop'
|
395
406
|
require_relative 'rubocop/cop/style/for'
|
396
407
|
require_relative 'rubocop/cop/style/format_string'
|
data/lib/rubocop/ast/node.rb
CHANGED
@@ -259,6 +259,27 @@ module RuboCop
|
|
259
259
|
loc.expression
|
260
260
|
end
|
261
261
|
|
262
|
+
def first_line
|
263
|
+
loc.line
|
264
|
+
end
|
265
|
+
|
266
|
+
def last_line
|
267
|
+
loc.last_line
|
268
|
+
end
|
269
|
+
|
270
|
+
def line_count
|
271
|
+
return 0 unless source_range
|
272
|
+
source_range.last_line - source_range.first_line + 1
|
273
|
+
end
|
274
|
+
|
275
|
+
def nonempty_line_count
|
276
|
+
source.lines.grep(/\S/).size
|
277
|
+
end
|
278
|
+
|
279
|
+
def source_length
|
280
|
+
source_range ? source_range.size : 0
|
281
|
+
end
|
282
|
+
|
262
283
|
## Destructuring
|
263
284
|
|
264
285
|
def_node_matcher :receiver, <<-PATTERN
|
@@ -322,21 +343,8 @@ module RuboCop
|
|
322
343
|
line_count == 1
|
323
344
|
end
|
324
345
|
|
325
|
-
def
|
326
|
-
|
327
|
-
source_range.last_line - source_range.first_line + 1
|
328
|
-
end
|
329
|
-
|
330
|
-
def nonempty_line_count
|
331
|
-
source.lines.grep(/\S/).size
|
332
|
-
end
|
333
|
-
|
334
|
-
def empty?
|
335
|
-
length.zero?
|
336
|
-
end
|
337
|
-
|
338
|
-
def length
|
339
|
-
source_range ? source_range.size : 0
|
346
|
+
def empty_source?
|
347
|
+
source_length.zero?
|
340
348
|
end
|
341
349
|
|
342
350
|
def asgn_method_call?
|
data/lib/rubocop/cli.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Metrics/ClassLength
|
3
4
|
module RuboCop
|
4
5
|
# The CLI is a class responsible of handling all the command line interface
|
5
6
|
# logic.
|
6
7
|
class CLI
|
7
8
|
include Formatter::TextUtil
|
8
9
|
|
10
|
+
SKIPPED_PHASE_1 = 'Phase 1 of 2: run Metrics/LineLength cop (skipped ' \
|
11
|
+
'because the default Metrics/LineLength:Max is ' \
|
12
|
+
'overridden)'.freeze
|
13
|
+
|
9
14
|
class Finished < RuntimeError; end
|
10
15
|
|
11
16
|
attr_reader :options, :config_store
|
@@ -23,6 +28,8 @@ module RuboCop
|
|
23
28
|
#
|
24
29
|
# @param args [Array<String>] command line arguments
|
25
30
|
# @return [Integer] UNIX exit code
|
31
|
+
#
|
32
|
+
# rubocop:disable Metrics/MethodLength
|
26
33
|
def run(args = ARGV)
|
27
34
|
@options, paths = Options.new.parse(args)
|
28
35
|
validate_options_vs_config
|
@@ -34,11 +41,15 @@ module RuboCop
|
|
34
41
|
return 2
|
35
42
|
rescue Finished
|
36
43
|
return 0
|
44
|
+
rescue IncorrectCopNameError => e
|
45
|
+
warn e.message
|
46
|
+
return 2
|
37
47
|
rescue StandardError, SyntaxError, LoadError => e
|
38
48
|
warn e.message
|
39
49
|
warn e.backtrace
|
40
50
|
return 2
|
41
51
|
end
|
52
|
+
# rubocop:enable Metrics/MethodLength
|
42
53
|
|
43
54
|
def trap_interrupt(runner)
|
44
55
|
Signal.trap('INT') do
|
@@ -54,13 +65,24 @@ module RuboCop
|
|
54
65
|
def execute_runners(paths)
|
55
66
|
if @options[:auto_gen_config]
|
56
67
|
reset_config_and_auto_gen_file
|
57
|
-
line_length_contents =
|
68
|
+
line_length_contents =
|
69
|
+
if max_line_length(@config_store.for(Dir.pwd)) ==
|
70
|
+
max_line_length(ConfigLoader.default_configuration)
|
71
|
+
run_line_length_cop_auto_gen_config(paths)
|
72
|
+
else
|
73
|
+
puts Rainbow(SKIPPED_PHASE_1).yellow
|
74
|
+
''
|
75
|
+
end
|
58
76
|
run_all_cops_auto_gen_config(line_length_contents, paths)
|
59
77
|
else
|
60
78
|
execute_runner(paths)
|
61
79
|
end
|
62
80
|
end
|
63
81
|
|
82
|
+
def max_line_length(config)
|
83
|
+
config.for_cop('Metrics/LineLength')['Max']
|
84
|
+
end
|
85
|
+
|
64
86
|
# Do an initial run with only Metrics/LineLength so that cops that depend
|
65
87
|
# on Metrics/LineLength:Max get the correct value for that parameter.
|
66
88
|
def run_line_length_cop_auto_gen_config(paths)
|
@@ -89,7 +111,7 @@ module RuboCop
|
|
89
111
|
|
90
112
|
def reset_config_and_auto_gen_file
|
91
113
|
@config_store = ConfigStore.new
|
92
|
-
File.open(ConfigLoader::AUTO_GENERATED_FILE, 'w'){}
|
114
|
+
File.open(ConfigLoader::AUTO_GENERATED_FILE, 'w') {}
|
93
115
|
ConfigLoader.add_inheritance_from_auto_generated_file
|
94
116
|
end
|
95
117
|
|
@@ -243,3 +265,4 @@ module RuboCop
|
|
243
265
|
end
|
244
266
|
end
|
245
267
|
end
|
268
|
+
# rubocop:enable Metrics/ClassLength
|
data/lib/rubocop/config.rb
CHANGED
@@ -19,6 +19,7 @@ module RuboCop
|
|
19
19
|
DEFAULT_RUBY_VERSION = 2.1
|
20
20
|
KNOWN_RUBIES = [2.1, 2.2, 2.3, 2.4, 2.5].freeze
|
21
21
|
OBSOLETE_RUBIES = { 1.9 => '0.50', 2.0 => '0.50' }.freeze
|
22
|
+
RUBY_VERSION_FILENAME = '.ruby-version'.freeze
|
22
23
|
DEFAULT_RAILS_VERSION = 5.0
|
23
24
|
OBSOLETE_COPS = {
|
24
25
|
'Style/TrailingComma' =>
|
@@ -195,7 +196,7 @@ module RuboCop
|
|
195
196
|
|
196
197
|
def check
|
197
198
|
deprecation_check do |deprecation_message|
|
198
|
-
warn("#{
|
199
|
+
warn("#{loaded_path} - #{deprecation_message}")
|
199
200
|
end
|
200
201
|
validate
|
201
202
|
make_excludes_absolute
|
@@ -383,12 +384,10 @@ module RuboCop
|
|
383
384
|
@target_ruby_version_source = :rubocop_yml
|
384
385
|
|
385
386
|
for_all_cops['TargetRubyVersion']
|
386
|
-
elsif
|
387
|
-
|
387
|
+
elsif target_ruby_version_from_version_file
|
388
|
+
@target_ruby_version_source = :ruby_version_file
|
388
389
|
|
389
|
-
|
390
|
-
|
391
|
-
version.to_f
|
390
|
+
target_ruby_version_from_version_file
|
392
391
|
else
|
393
392
|
DEFAULT_RUBY_VERSION
|
394
393
|
end
|
@@ -513,13 +512,29 @@ module RuboCop
|
|
513
512
|
|
514
513
|
def target_ruby_source
|
515
514
|
case @target_ruby_version_source
|
516
|
-
when :
|
517
|
-
|
515
|
+
when :ruby_version_file
|
516
|
+
"`#{RUBY_VERSION_FILENAME}`"
|
518
517
|
when :rubocop_yml
|
519
518
|
"`TargetRubyVersion` parameter (in #{smart_loaded_path})"
|
520
519
|
end
|
521
520
|
end
|
522
521
|
|
522
|
+
def ruby_version_file
|
523
|
+
@ruby_version_file ||=
|
524
|
+
PathUtil.find_file_upwards(RUBY_VERSION_FILENAME,
|
525
|
+
base_dir_for_path_parameters)
|
526
|
+
end
|
527
|
+
|
528
|
+
def target_ruby_version_from_version_file
|
529
|
+
file = ruby_version_file
|
530
|
+
return unless file && File.file?(file)
|
531
|
+
|
532
|
+
@target_ruby_version_from_version_file ||=
|
533
|
+
File.read(file).match(/\A(ruby-)?(?<version>\d+\.\d+)/) do |md|
|
534
|
+
md[:version].to_f
|
535
|
+
end
|
536
|
+
end
|
537
|
+
|
523
538
|
def reject_mutually_exclusive_defaults
|
524
539
|
disabled_by_default = for_all_cops['DisabledByDefault']
|
525
540
|
enabled_by_default = for_all_cops['EnabledByDefault']
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
register_offense(
|
38
38
|
node,
|
39
39
|
node.first_argument.to_a.first,
|
40
|
-
nodes.first.
|
40
|
+
nodes.first.first_line
|
41
41
|
)
|
42
42
|
end
|
43
43
|
end
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
def register_offense(node, gem_name, line_of_first_occurrence)
|
58
58
|
line_range = node.loc.column...node.loc.last_column
|
59
59
|
offense_location =
|
60
|
-
source_range(processed_source.buffer, node.
|
60
|
+
source_range(processed_source.buffer, node.first_line, line_range)
|
61
61
|
message = format(
|
62
62
|
MSG,
|
63
63
|
gem_name: gem_name,
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# This class does auto-correction of nodes that should just be moved to
|
6
|
+
# the left or to the right, amount being determined by the instance
|
7
|
+
# variable column_delta.
|
8
|
+
class AlignmentCorrector
|
9
|
+
extend Util
|
10
|
+
extend Alignment
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_reader :processed_source
|
14
|
+
|
15
|
+
def correct(processed_source, node, column_delta)
|
16
|
+
return unless node
|
17
|
+
@processed_source = processed_source
|
18
|
+
expr = node.respond_to?(:loc) ? node.loc.expression : node
|
19
|
+
return if block_comment_within?(expr)
|
20
|
+
|
21
|
+
lambda do |corrector|
|
22
|
+
each_line(expr) do |line_begin_pos|
|
23
|
+
autocorrect_line(corrector, line_begin_pos, expr, column_delta,
|
24
|
+
heredoc_ranges(node))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def align_end(processed_source, node, align_to)
|
30
|
+
@processed_source = processed_source
|
31
|
+
whitespace = whitespace_range(node)
|
32
|
+
return false unless whitespace.source.strip.empty?
|
33
|
+
|
34
|
+
column = alignment_column(align_to)
|
35
|
+
->(corrector) { corrector.replace(whitespace, ' ' * column) }
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def autocorrect_line(corrector, line_begin_pos, expr, column_delta,
|
41
|
+
heredoc_ranges)
|
42
|
+
range = calculate_range(expr, line_begin_pos, column_delta)
|
43
|
+
# We must not change indentation of heredoc strings.
|
44
|
+
return if heredoc_ranges.any? { |h| within?(range, h) }
|
45
|
+
|
46
|
+
if column_delta > 0
|
47
|
+
unless range.source == "\n"
|
48
|
+
corrector.insert_before(range, ' ' * column_delta)
|
49
|
+
end
|
50
|
+
elsif range.source =~ /\A[ \t]+\z/
|
51
|
+
remove(range, corrector)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def heredoc_ranges(node)
|
56
|
+
return [] unless node.is_a?(Parser::AST::Node)
|
57
|
+
|
58
|
+
node.each_node(:dstr)
|
59
|
+
.select { |n| n.loc.respond_to?(:heredoc_body) }
|
60
|
+
.map { |n| n.loc.heredoc_body.join(n.loc.heredoc_end) }
|
61
|
+
end
|
62
|
+
|
63
|
+
def block_comment_within?(expr)
|
64
|
+
processed_source.comments.select(&:document?).any? do |c|
|
65
|
+
within?(c.loc.expression, expr)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def calculate_range(expr, line_begin_pos, column_delta)
|
70
|
+
starts_with_space = expr.source_buffer.source[line_begin_pos] =~ / /
|
71
|
+
pos_to_remove = if column_delta > 0 || starts_with_space
|
72
|
+
line_begin_pos
|
73
|
+
else
|
74
|
+
line_begin_pos - column_delta.abs
|
75
|
+
end
|
76
|
+
|
77
|
+
range_between(pos_to_remove, pos_to_remove + column_delta.abs)
|
78
|
+
end
|
79
|
+
|
80
|
+
def remove(range, corrector)
|
81
|
+
original_stderr = $stderr
|
82
|
+
$stderr = StringIO.new # Avoid error messages on console
|
83
|
+
corrector.remove(range)
|
84
|
+
rescue RuntimeError
|
85
|
+
range = range_between(range.begin_pos + 1, range.end_pos + 1)
|
86
|
+
retry if range.source =~ /^ +$/
|
87
|
+
ensure
|
88
|
+
$stderr = original_stderr
|
89
|
+
end
|
90
|
+
|
91
|
+
def each_line(expr)
|
92
|
+
line_begin_pos = expr.begin_pos
|
93
|
+
expr.source.each_line do |line|
|
94
|
+
yield line_begin_pos
|
95
|
+
line_begin_pos += line.length
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def begins_its_line?(range)
|
100
|
+
(range.source_line =~ /\S/) == range.column
|
101
|
+
end
|
102
|
+
|
103
|
+
def whitespace_range(node)
|
104
|
+
begin_pos = node.loc.end.begin_pos
|
105
|
+
|
106
|
+
range_between(begin_pos - node.loc.end.column, begin_pos)
|
107
|
+
end
|
108
|
+
|
109
|
+
def alignment_column(align_to)
|
110
|
+
if !align_to
|
111
|
+
0
|
112
|
+
elsif align_to.respond_to?(:loc)
|
113
|
+
align_to.source_range.column
|
114
|
+
else
|
115
|
+
align_to.column
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|