rubocop 0.77.0 → 0.78.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +37 -25
  4. data/lib/rubocop.rb +5 -2
  5. data/lib/rubocop/cli/command/auto_genenerate_config.rb +7 -7
  6. data/lib/rubocop/config.rb +1 -1
  7. data/lib/rubocop/config_obsoletion.rb +3 -3
  8. data/lib/rubocop/config_validator.rb +6 -4
  9. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  10. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
  11. data/lib/rubocop/cop/cop.rb +3 -1
  12. data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
  13. data/lib/rubocop/cop/layout/heredoc_indentation.rb +4 -4
  14. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +5 -78
  15. data/lib/rubocop/cop/layout/space_around_operators.rb +31 -6
  16. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  17. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  18. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  19. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +2 -2
  20. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -4
  21. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  22. data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
  23. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  24. data/lib/rubocop/cop/mixin/statement_modifier.rb +2 -2
  25. data/lib/rubocop/cop/mixin/trailing_comma.rb +6 -3
  26. data/lib/rubocop/cop/offense.rb +11 -0
  27. data/lib/rubocop/cop/style/attr.rb +8 -0
  28. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
  29. data/lib/rubocop/cop/style/guard_clause.rb +3 -2
  30. data/lib/rubocop/cop/style/if_unless_modifier.rb +38 -3
  31. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  32. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  33. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  34. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  35. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  36. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  37. data/lib/rubocop/node_pattern.rb +1 -1
  38. data/lib/rubocop/options.rb +8 -8
  39. data/lib/rubocop/result_cache.rb +2 -0
  40. data/lib/rubocop/runner.rb +5 -1
  41. data/lib/rubocop/version.rb +1 -1
  42. metadata +6 -3
@@ -49,8 +49,9 @@ module RuboCop
49
49
 
50
50
  if body.if_type?
51
51
  check_ending_if(body)
52
- elsif body.begin_type? && body.children.last.if_type?
53
- check_ending_if(body.children.last)
52
+ elsif body.begin_type?
53
+ final_expression = body.children.last
54
+ check_ending_if(final_expression) if final_expression&.if_type?
54
55
  end
55
56
  end
56
57
  alias on_defs on_def
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # written as modifier `if`/`unless`. The cop also checks for modifier
8
8
  # `if`/`unless` lines that exceed the maximum line length.
9
9
  #
10
- # The maximum line length is configured in the `Metrics/LineLength`
10
+ # The maximum line length is configured in the `Layout/LineLength`
11
11
  # cop. The tab size is configured in the `IndentationWidth` of the
12
12
  # `Layout/Tab` cop.
13
13
  #
@@ -32,6 +32,8 @@ module RuboCop
32
32
  # end
33
33
  class IfUnlessModifier < Cop
34
34
  include StatementModifier
35
+ include LineLengthHelp
36
+ include IgnoredPattern
35
37
 
36
38
  MSG_USE_MODIFIER = 'Favor modifier `%<keyword>s` usage when having a ' \
37
39
  'single-line body. Another good alternative is ' \
@@ -66,6 +68,10 @@ module RuboCop
66
68
 
67
69
  private
68
70
 
71
+ def ignored_patterns
72
+ config.for_cop('Layout/LineLength')['IgnoredPatterns'] || []
73
+ end
74
+
69
75
  def too_long_single_line?(node)
70
76
  return false unless max_line_length
71
77
 
@@ -73,12 +79,41 @@ module RuboCop
73
79
  return false unless range.first_line == range.last_line
74
80
  return false unless line_length_enabled_at_line?(range.first_line)
75
81
 
76
- range.last_column > max_line_length
82
+ line = range.source_line
83
+ return false if line_length(line) <= max_line_length
84
+
85
+ too_long_line_based_on_config?(range, line)
86
+ end
87
+
88
+ def too_long_line_based_on_config?(range, line)
89
+ return false if matches_ignored_pattern?(line)
90
+
91
+ too_long = too_long_line_based_on_ignore_cop_directives?(range, line)
92
+ return too_long unless too_long == :undetermined
93
+
94
+ too_long_line_based_on_allow_uri?(line)
95
+ end
96
+
97
+ def too_long_line_based_on_ignore_cop_directives?(range, line)
98
+ if ignore_cop_directives? && directive_on_source_line?(range.line - 1)
99
+ return line_length_without_directive(line) > max_line_length
100
+ end
101
+
102
+ :undetermined
103
+ end
104
+
105
+ def too_long_line_based_on_allow_uri?(line)
106
+ if allow_uri?
107
+ uri_range = find_excessive_uri_range(line)
108
+ return false if uri_range && allowed_uri_position?(line, uri_range)
109
+ end
110
+
111
+ true
77
112
  end
78
113
 
79
114
  def line_length_enabled_at_line?(line)
80
115
  processed_source.comment_config
81
- .cop_enabled_at_line?('Metrics/LineLength', line)
116
+ .cop_enabled_at_line?('Layout/LineLength', line)
82
117
  end
83
118
 
84
119
  def named_capture_in_condition?(node)
@@ -58,7 +58,7 @@ module RuboCop
58
58
  # `loop do` without further modification. The reason is that a
59
59
  # variable that's introduced inside a while/until loop is in scope
60
60
  # outside of that loop too, but a variable that's assigned for the
61
- # first time inside a block can not be accessed after the block. In
61
+ # first time inside a block cannot be accessed after the block. In
62
62
  # those more complicated cases we don't report an offense.
63
63
  return if @variables.any? do |var|
64
64
  assigned_inside_loop?(var, range) &&
@@ -53,7 +53,7 @@ module RuboCop
53
53
  end
54
54
 
55
55
  def max_line_length
56
- config.for_cop('Metrics/LineLength')['Max'] || 80
56
+ config.for_cop('Layout/LineLength')['Max'] || 80
57
57
  end
58
58
  end
59
59
  end
@@ -20,8 +20,14 @@ module RuboCop
20
20
  # a, *b, _ = foo()
21
21
  # # => The correction `a, *b, = foo()` is a syntax error
22
22
  #
23
- # # good if AllowNamedUnderscoreVariables is true
23
+ # @example AllowNamedUnderscoreVariables: true (default)
24
+ # # good
24
25
  # a, b, _something = foo()
26
+ #
27
+ # @example AllowNamedUnderscoreVariables: false
28
+ # # bad
29
+ # a, b, _something = foo()
30
+ #
25
31
  class TrailingUnderscoreVariable < Cop
26
32
  include SurroundingSpace
27
33
  include RangeHelp
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Style
6
6
  # Checks for while and until statements that would fit on one line
7
7
  # if written as a modifier while/until. The maximum line length is
8
- # configured in the `Metrics/LineLength` cop.
8
+ # configured in the `Layout/LineLength` cop.
9
9
  #
10
10
  # @example
11
11
  # # bad
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/LineLength
3
+ # rubocop:disable Layout/LineLength
4
4
 
5
5
  module RuboCop
6
6
  module Formatter
@@ -41,7 +41,7 @@ module RuboCop
41
41
  # * `#finished`
42
42
  #
43
43
  class BaseFormatter
44
- # rubocop:enable Metrics/LineLength
44
+ # rubocop:enable Layout/LineLength
45
45
 
46
46
  # @api public
47
47
  #
@@ -53,11 +53,12 @@ module RuboCop
53
53
 
54
54
  def hash_for_offense(offense)
55
55
  {
56
- severity: offense.severity.name,
57
- message: offense.message,
58
- cop_name: offense.cop_name,
59
- corrected: offense.corrected?,
60
- location: hash_for_location(offense)
56
+ severity: offense.severity.name,
57
+ message: offense.message,
58
+ cop_name: offense.cop_name,
59
+ corrected: offense.corrected?,
60
+ correctable: offense.correctable?,
61
+ location: hash_for_location(offense)
61
62
  }
62
63
  end
63
64
 
@@ -380,7 +380,7 @@ module RuboCop
380
380
  def compile_seq_head
381
381
  return unless seq_head?
382
382
 
383
- fail_due_to 'sequences can not start with <' \
383
+ fail_due_to 'sequences cannot start with <' \
384
384
  if @terms[0].respond_to? :call
385
385
 
386
386
  with_seq_head_context(@terms[0])
@@ -264,18 +264,18 @@ module RuboCop
264
264
  # rubocop:disable Metrics/AbcSize
265
265
  def validate_compatibility # rubocop:disable Metrics/MethodLength
266
266
  if only_includes_redundant_disable?
267
- raise OptionArgumentError, 'Lint/RedundantCopDisableDirective can ' \
268
- 'not be used with --only.'
267
+ raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot ' \
268
+ 'be used with --only.'
269
269
  end
270
270
  if except_syntax?
271
- raise OptionArgumentError, 'Syntax checking can not be turned off.'
271
+ raise OptionArgumentError, 'Syntax checking cannot be turned off.'
272
272
  end
273
273
  unless boolean_or_empty_cache?
274
274
  raise OptionArgumentError, '-C/--cache argument must be true or false'
275
275
  end
276
276
 
277
277
  if display_only_fail_level_offenses_with_autocorrect?
278
- raise OptionArgumentError, '--autocorrect can not be used with ' \
278
+ raise OptionArgumentError, '--autocorrect cannot be used with ' \
279
279
  '--display-only-fail-level-offenses'
280
280
  end
281
281
  validate_auto_gen_config
@@ -329,8 +329,8 @@ module RuboCop
329
329
  auto_gen_config: '-P/--parallel uses caching to speed up execution, ' \
330
330
  'while --auto-gen-config needs a non-cached run, ' \
331
331
  'so they cannot be combined.',
332
- fail_fast: '-P/--parallel can not be combined with -F/--fail-fast.',
333
- auto_correct: '-P/--parallel can not be combined with --auto-correct.'
332
+ fail_fast: '-P/--parallel cannot be combined with -F/--fail-fast.',
333
+ auto_correct: '-P/--parallel cannot be combined with --auto-correct.'
334
334
  }
335
335
 
336
336
  combos.each do |key, msg|
@@ -373,7 +373,7 @@ module RuboCop
373
373
  # This module contains help texts for command line options.
374
374
  module OptionsHelp
375
375
  MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
376
- # rubocop:disable Metrics/LineLength
376
+ # rubocop:disable Layout/LineLength
377
377
  FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
378
378
 
379
379
  TEXT = {
@@ -455,6 +455,6 @@ module RuboCop
455
455
  'reports. This is useful for editor integration.'],
456
456
  init: 'Generate a .rubocop.yml file in the current directory.'
457
457
  }.freeze
458
- # rubocop:enable Metrics/LineLength
458
+ # rubocop:enable Layout/LineLength
459
459
  end
460
460
  end
@@ -186,6 +186,8 @@ module RuboCop
186
186
  options.to_s.gsub(/[^a-z]+/i, '_')
187
187
  end
188
188
 
189
+ # The external dependency checksums are cached per RuboCop team so that
190
+ # the checksums don't need to be recomputed for each file.
189
191
  def team_checksum(team)
190
192
  @checksum_by_team ||= {}
191
193
  @checksum_by_team[team.object_id] ||= team.external_dependency_checksum
@@ -214,7 +214,7 @@ module RuboCop
214
214
  @config_store.for(Dir.pwd).for_all_cops['UseCache']) &&
215
215
  # When running --auto-gen-config, there's some processing done in the
216
216
  # cops related to calculating the Max parameters for Metrics cops. We
217
- # need to do that processing and can not use caching.
217
+ # need to do that processing and cannot use caching.
218
218
  !@options[:auto_gen_config] &&
219
219
  # We can't cache results from code which is piped in to stdin
220
220
  !@options[:stdin]
@@ -366,6 +366,10 @@ module RuboCop
366
366
  end
367
367
  end
368
368
 
369
+ # A Cop::Team instance is stateful and may change when inspecting.
370
+ # The "standby" team for a given config is an initialized but
371
+ # otherwise dormant team that can be used for config- and option-
372
+ # level caching in ResultCache.
369
373
  def standby_team(config)
370
374
  @team_by_config ||= {}
371
375
  @team_by_config[config.object_id] ||=
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '0.77.0'
6
+ STRING = '0.78.0'
7
7
 
8
8
  MSG = '%<version>s (using Parser %<parser_version>s, running on ' \
9
9
  '%<ruby_engine>s %<ruby_version>s %<ruby_platform>s)'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.77.0
4
+ version: 0.78.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-11-27 00:00:00.000000000 Z
13
+ date: 2019-12-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: jaro_winkler
@@ -302,6 +302,7 @@ files:
302
302
  - lib/rubocop/cop/layout/initial_indentation.rb
303
303
  - lib/rubocop/cop/layout/leading_comment_space.rb
304
304
  - lib/rubocop/cop/layout/leading_empty_lines.rb
305
+ - lib/rubocop/cop/layout/line_length.rb
305
306
  - lib/rubocop/cop/layout/multiline_array_brace_layout.rb
306
307
  - lib/rubocop/cop/layout/multiline_array_line_breaks.rb
307
308
  - lib/rubocop/cop/layout/multiline_assignment_layout.rb
@@ -380,6 +381,7 @@ files:
380
381
  - lib/rubocop/cop/lint/nested_method_definition.rb
381
382
  - lib/rubocop/cop/lint/nested_percent_literal.rb
382
383
  - lib/rubocop/cop/lint/next_without_accumulator.rb
384
+ - lib/rubocop/cop/lint/non_deterministic_require_order.rb
383
385
  - lib/rubocop/cop/lint/non_local_exit_from_iterator.rb
384
386
  - lib/rubocop/cop/lint/number_conversion.rb
385
387
  - lib/rubocop/cop/lint/ordered_magic_comments.rb
@@ -429,7 +431,6 @@ files:
429
431
  - lib/rubocop/cop/metrics/block_nesting.rb
430
432
  - lib/rubocop/cop/metrics/class_length.rb
431
433
  - lib/rubocop/cop/metrics/cyclomatic_complexity.rb
432
- - lib/rubocop/cop/metrics/line_length.rb
433
434
  - lib/rubocop/cop/metrics/method_length.rb
434
435
  - lib/rubocop/cop/metrics/module_length.rb
435
436
  - lib/rubocop/cop/metrics/parameter_lists.rb
@@ -464,6 +465,7 @@ files:
464
465
  - lib/rubocop/cop/mixin/ignored_pattern.rb
465
466
  - lib/rubocop/cop/mixin/integer_node.rb
466
467
  - lib/rubocop/cop/mixin/interpolation.rb
468
+ - lib/rubocop/cop/mixin/line_length_help.rb
467
469
  - lib/rubocop/cop/mixin/match_range.rb
468
470
  - lib/rubocop/cop/mixin/method_complexity.rb
469
471
  - lib/rubocop/cop/mixin/method_preference.rb
@@ -483,6 +485,7 @@ files:
483
485
  - lib/rubocop/cop/mixin/preceding_following_alignment.rb
484
486
  - lib/rubocop/cop/mixin/preferred_delimiters.rb
485
487
  - lib/rubocop/cop/mixin/range_help.rb
488
+ - lib/rubocop/cop/mixin/rational_literal.rb
486
489
  - lib/rubocop/cop/mixin/rescue_node.rb
487
490
  - lib/rubocop/cop/mixin/safe_assignment.rb
488
491
  - lib/rubocop/cop/mixin/space_after_punctuation.rb