rubocop 0.37.0 → 0.37.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubocop might be problematic. Click here for more details.

Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +2 -3
  4. data/config/enabled.yml +2 -2
  5. data/lib/rubocop.rb +2 -1
  6. data/lib/rubocop/ast_node.rb +34 -17
  7. data/lib/rubocop/ast_node/traversal.rb +2 -1
  8. data/lib/rubocop/config.rb +1 -1
  9. data/lib/rubocop/cop/commissioner.rb +5 -5
  10. data/lib/rubocop/cop/corrector.rb +17 -3
  11. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  12. data/lib/rubocop/cop/lint/nested_method_definition.rb +5 -1
  13. data/lib/rubocop/cop/lint/unneeded_disable.rb +1 -1
  14. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  15. data/lib/rubocop/cop/performance/redundant_match.rb +2 -1
  16. data/lib/rubocop/cop/performance/redundant_merge.rb +1 -2
  17. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  18. data/lib/rubocop/cop/style/block_end_newline.rb +1 -1
  19. data/lib/rubocop/cop/style/conditional_assignment.rb +25 -7
  20. data/lib/rubocop/cop/style/empty_line_between_defs.rb +13 -7
  21. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -12
  22. data/lib/rubocop/cop/style/guard_clause.rb +3 -1
  23. data/lib/rubocop/cop/style/initial_indentation.rb +1 -1
  24. data/lib/rubocop/cop/style/line_end_concatenation.rb +1 -1
  25. data/lib/rubocop/cop/style/multiline_block_layout.rb +14 -12
  26. data/lib/rubocop/cop/style/not.rb +1 -1
  27. data/lib/rubocop/cop/style/semicolon.rb +14 -7
  28. data/lib/rubocop/cop/style/space_around_keyword.rb +13 -4
  29. data/lib/rubocop/cop/style/space_around_operators.rb +2 -2
  30. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +32 -27
  31. data/lib/rubocop/cop/style/word_array.rb +1 -1
  32. data/lib/rubocop/cop/team.rb +20 -9
  33. data/lib/rubocop/cop/util.rb +4 -5
  34. data/lib/rubocop/formatter/formatter_set.rb +3 -3
  35. data/lib/rubocop/version.rb +1 -1
  36. metadata +5 -43
  37. data/.yardopts +0 -2
  38. data/CHANGELOG.md +0 -1941
  39. data/CONTRIBUTING.md +0 -68
  40. data/assets/logo.png +0 -0
  41. data/assets/output.html.erb +0 -247
  42. data/logo/rubo-logo-horizontal.png +0 -0
  43. data/logo/rubo-logo-square.png +0 -0
  44. data/logo/rubo-logo-symbol.png +0 -0
  45. data/relnotes/v0.19.0.md +0 -94
  46. data/relnotes/v0.19.1.md +0 -16
  47. data/relnotes/v0.20.0.md +0 -69
  48. data/relnotes/v0.20.1.md +0 -24
  49. data/relnotes/v0.21.0.md +0 -56
  50. data/relnotes/v0.22.0.md +0 -77
  51. data/relnotes/v0.23.0.md +0 -79
  52. data/relnotes/v0.24.0.md +0 -77
  53. data/relnotes/v0.24.1.md +0 -15
  54. data/relnotes/v0.25.0.md +0 -91
  55. data/relnotes/v0.26.0.md +0 -89
  56. data/relnotes/v0.26.1.md +0 -12
  57. data/relnotes/v0.27.0.md +0 -77
  58. data/relnotes/v0.27.1.md +0 -66
  59. data/relnotes/v0.28.0.md +0 -90
  60. data/relnotes/v0.29.0.md +0 -116
  61. data/relnotes/v0.29.1.md +0 -12
  62. data/relnotes/v0.30.0.md +0 -145
  63. data/relnotes/v0.30.1.md +0 -103
  64. data/relnotes/v0.31.0.md +0 -120
  65. data/relnotes/v0.32.0.md +0 -139
  66. data/relnotes/v0.32.1.md +0 -122
  67. data/relnotes/v0.33.0.md +0 -157
  68. data/relnotes/v0.34.0.md +0 -182
  69. data/relnotes/v0.34.1.md +0 -129
  70. data/relnotes/v0.34.2.md +0 -139
  71. data/relnotes/v0.35.0.md +0 -210
  72. data/relnotes/v0.36.0.md +0 -307
  73. data/relnotes/v0.37.0.md +0 -200
  74. data/rubocop.gemspec +0 -49
@@ -16,11 +16,8 @@ module RuboCop
16
16
  MSG = 'Missing frozen string literal comment.'.freeze
17
17
  SHEBANG = '#!'.freeze
18
18
 
19
- def_node_matcher :frozen_strings, '{(send {dstr str} :<< ...)
20
- (send {dstr str} :freeze)}'
21
-
22
19
  def investigate(processed_source)
23
- return unless style == :always
20
+ return if style == :when_needed && target_ruby_version < 2.3
24
21
  return if processed_source.buffer.source.empty?
25
22
 
26
23
  return if frozen_string_literal_comment_exists?(processed_source)
@@ -28,14 +25,6 @@ module RuboCop
28
25
  offense(processed_source)
29
26
  end
30
27
 
31
- def on_send(node)
32
- return unless style == :when_needed
33
- return if target_ruby_version < 2.3
34
- return if frozen_string_literal_comment_exists?(processed_source)
35
-
36
- frozen_strings(node) { offense(processed_source) }
37
- end
38
-
39
28
  def autocorrect(_node)
40
29
  lambda do |corrector|
41
30
  last_special_comment = last_special_comment(processed_source)
@@ -82,7 +82,9 @@ module RuboCop
82
82
  end
83
83
 
84
84
  def elsif?(node)
85
- node.children.last.if_type?
85
+ return false unless node.parent && node.parent.if_type?
86
+ _condition, _if_branch, else_branch = *node.parent
87
+ else_branch.equal?(node)
86
88
  end
87
89
 
88
90
  def check_trailing_if(node)
@@ -17,7 +17,7 @@ module RuboCop
17
17
  return if first_token.pos.column == 0
18
18
 
19
19
  with_space = range_with_surrounding_space(first_token.pos, :left,
20
- nil, !:with_newline)
20
+ !:with_newline)
21
21
  # If the file starts with a byte order mark (BOM), the column can be
22
22
  # non-zero, but then we find out here if there's no space to the left
23
23
  # of the first token.
@@ -39,7 +39,7 @@ module RuboCop
39
39
  def autocorrect(operator_range)
40
40
  # Include any trailing whitespace so we don't create a syntax error.
41
41
  operator_range = range_with_surrounding_space(operator_range,
42
- :right, nil,
42
+ :right,
43
43
  !:with_newline)
44
44
  ->(corrector) { corrector.replace(operator_range, '\\') }
45
45
  end
@@ -53,8 +53,7 @@ module RuboCop
53
53
  _block_start, args, last_expression = node.children
54
54
 
55
55
  unless args.children.empty?
56
- line = args.loc.end.nil? ? args.loc.line : args.loc.end.line
57
- if do_loc.line != line
56
+ if do_loc.line != args.loc.last_line
58
57
  add_offense_for_expression(node, args, ARG_MSG)
59
58
  end
60
59
  end
@@ -77,9 +76,8 @@ module RuboCop
77
76
  def autocorrect(node)
78
77
  lambda do |corrector|
79
78
  _method, args, block_body = *node
80
- unless args.children.empty? ||
81
- args.loc.end.line == node.loc.begin.line
82
- autocorrect_arguments(corrector, node, args, block_body)
79
+ unless args.children.empty? || args.loc.last_line == node.loc.line
80
+ autocorrect_arguments(corrector, node, args)
83
81
  expr_before_body = args.source_range.end
84
82
  end
85
83
 
@@ -92,12 +90,10 @@ module RuboCop
92
90
  end
93
91
  end
94
92
 
95
- def autocorrect_arguments(corrector, node, args, block_body)
96
- end_pos = if block_body
97
- block_body.source_range.begin_pos
98
- else
99
- node.loc.end.begin.begin_pos - 1
100
- end
93
+ def autocorrect_arguments(corrector, node, args)
94
+ end_pos =
95
+ range_with_surrounding_space(args.source_range, :right, false)
96
+ .end_pos
101
97
  range = Parser::Source::Range.new(args.source_range.source_buffer,
102
98
  node.loc.begin.end.begin_pos,
103
99
  end_pos)
@@ -118,7 +114,13 @@ module RuboCop
118
114
  end
119
115
 
120
116
  def block_arg_string(args)
121
- args.children.map(&:source).join(', ')
117
+ args.children.map do |arg|
118
+ if arg.mlhs_type?
119
+ "(#{block_arg_string(arg)})"
120
+ else
121
+ arg.source
122
+ end
123
+ end.join(', ')
122
124
  end
123
125
  end
124
126
  end
@@ -19,7 +19,7 @@ module RuboCop
19
19
  private
20
20
 
21
21
  def correction(node)
22
- new_source = node.source.sub(/not\s+/, '!')
22
+ new_source = node.source.sub(/not\s*/, '!')
23
23
  ->(corrector) { corrector.replace(node.source_range, new_source) }
24
24
  end
25
25
  end
@@ -13,7 +13,7 @@ module RuboCop
13
13
  return unless processed_source.ast
14
14
  @processed_source = processed_source
15
15
 
16
- check_for_line_terminator
16
+ check_for_line_terminator_or_opener
17
17
  end
18
18
 
19
19
  def on_begin(node)
@@ -33,26 +33,33 @@ module RuboCop
33
33
  # if the first semicolon on the line is a separator of
34
34
  # expressions. It's just a guess.
35
35
  column = @processed_source[line - 1].index(';')
36
- convention_on(line, column, !:last_on_line)
36
+ convention_on(line, column, false)
37
37
  end
38
38
  end
39
39
 
40
40
  private
41
41
 
42
- def check_for_line_terminator
42
+ def check_for_line_terminator_or_opener
43
43
  tokens_for_lines = @processed_source.tokens.group_by do |token|
44
44
  token.pos.line
45
45
  end
46
46
 
47
47
  tokens_for_lines.each do |line, tokens|
48
- next unless tokens.last.type == :tSEMI
49
- convention_on(line, tokens.last.pos.column, :last_on_line)
48
+ if tokens.last.type == :tSEMI
49
+ convention_on(line, tokens.last.pos.column, true)
50
+ end
51
+
52
+ if tokens.first.type == :tSEMI
53
+ convention_on(line, tokens.first.pos.column, true)
54
+ end
50
55
  end
51
56
  end
52
57
 
53
- def convention_on(line, column, last_on_line)
58
+ def convention_on(line, column, autocorrect)
54
59
  range = source_range(@processed_source.buffer, line, column)
55
- add_offense(last_on_line ? range : nil, range)
60
+ # Don't attempt to autocorrect if semicolon is separating statements
61
+ # on the same line
62
+ add_offense(autocorrect ? range : nil, range)
56
63
  end
57
64
 
58
65
  def autocorrect(range)
@@ -30,7 +30,8 @@ module RuboCop
30
30
  MSG_AFTER = 'Space after keyword `%s` is missing.'.freeze
31
31
 
32
32
  DO = 'do'.freeze
33
- ACCEPT_LEFT_PAREN = %w(break next not return super yield).freeze
33
+ ACCEPT_LEFT_PAREN =
34
+ %w(break next not return super yield defined?).freeze
34
35
 
35
36
  def on_and(node)
36
37
  check(node, [:operator].freeze) if node.keyword?
@@ -100,6 +101,10 @@ module RuboCop
100
101
  check(node, [:keyword].freeze)
101
102
  end
102
103
 
104
+ def on_zsuper(node)
105
+ check(node, [:keyword].freeze)
106
+ end
107
+
103
108
  def on_until(node)
104
109
  check(node, [:begin, :end, :keyword].freeze)
105
110
  end
@@ -116,6 +121,10 @@ module RuboCop
116
121
  check(node, [:keyword].freeze)
117
122
  end
118
123
 
124
+ def on_defined?(node)
125
+ check(node, [:keyword].freeze)
126
+ end
127
+
119
128
  private
120
129
 
121
130
  def check(node, locations, begin_keyword = DO)
@@ -167,10 +176,10 @@ module RuboCop
167
176
  def space_after_missing?(range)
168
177
  pos = range.end_pos
169
178
  char = range.source_buffer.source[pos]
170
- return false unless range.source_buffer.source[pos]
179
+ return false unless char
171
180
  return false if accept_left_parenthesis?(range) && char == '('.freeze
172
181
 
173
- char !~ /[\s;,#\\\)\}\]]/
182
+ char !~ /[\s;,#\\\)\}\]\.]/
174
183
  end
175
184
 
176
185
  def accept_left_parenthesis?(range)
@@ -182,7 +191,7 @@ module RuboCop
182
191
  return false unless ancestor
183
192
  return true if ancestor.and_type? || ancestor.or_type?
184
193
  return false unless ancestor.send_type?
185
- operator?(ancestor.loc.selector.source.to_sym)
194
+ operator?(ancestor.method_name)
186
195
  end
187
196
 
188
197
  def autocorrect(range)
@@ -40,8 +40,8 @@ module RuboCop
40
40
  if node.loc.operator # aref assignment, attribute assignment
41
41
  on_special_asgn(node)
42
42
  elsif !node.unary_operation? && !called_with_dot?(node)
43
- op = node.loc.selector
44
- if operator?(op.source.to_sym)
43
+ op = node.method_name
44
+ if op != :[] && op != :! && operator?(op)
45
45
  _, _, right, = *node
46
46
  check_operator(node.loc.selector, right.source_range)
47
47
  end
@@ -21,41 +21,25 @@ module RuboCop
21
21
  class TrailingUnderscoreVariable < Cop
22
22
  include SurroundingSpace
23
23
 
24
- MSG = 'Do not use trailing `_`s in parallel assignment.'.freeze
24
+ MSG = 'Do not use trailing `_`s in parallel assignment. ' \
25
+ 'Prefer `%s`.'.freeze
25
26
  UNDERSCORE = '_'.freeze
26
27
 
27
28
  def on_masgn(node)
28
- left, = *node
29
- variables = *left
30
- first_offense = find_first_offense(variables)
29
+ return unless (range = unneeded_range(node))
31
30
 
32
- return if first_offense.nil?
31
+ good_code = node.source
32
+ offset = range.begin_pos - node.source_range.begin_pos
33
+ good_code[offset, range.size] = ''
33
34
 
34
- range =
35
- Parser::Source::Range.new(node.source_range.source_buffer,
36
- first_offense.source_range.begin_pos,
37
- variables.last.source_range.end_pos)
38
- add_offense(node, range)
35
+ add_offense(node, range, format(MSG, good_code))
39
36
  end
40
37
 
41
38
  def autocorrect(node)
42
- left, right = *node
43
- variables = *left
44
- first_offense = find_first_offense(variables)
45
-
46
- end_position =
47
- if first_offense.source_range == variables.first.source_range
48
- right.source_range.begin_pos
49
- else
50
- node.loc.operator.begin_pos
51
- end
52
-
53
- range =
54
- Parser::Source::Range.new(node.source_range.source_buffer,
55
- first_offense.source_range.begin_pos,
56
- end_position)
57
-
58
- ->(corrector) { corrector.remove(range) unless range.nil? }
39
+ lambda do |corrector|
40
+ range = unneeded_range(node)
41
+ corrector.remove(range) if range
42
+ end
59
43
  end
60
44
 
61
45
  private
@@ -88,6 +72,27 @@ module RuboCop
88
72
  @allow_named_underscore_variables ||=
89
73
  cop_config['AllowNamedUnderscoreVariables']
90
74
  end
75
+
76
+ def unneeded_range(node)
77
+ left, right = *node
78
+ variables = *left
79
+ first_offense = find_first_offense(variables)
80
+
81
+ return unless first_offense
82
+
83
+ end_position =
84
+ if first_offense.source_range == variables.first.source_range
85
+ right.source_range.begin_pos
86
+ else
87
+ node.loc.operator.begin_pos
88
+ end
89
+
90
+ range =
91
+ Parser::Source::Range.new(node.source_range.source_buffer,
92
+ first_offense.source_range.begin_pos,
93
+ end_position)
94
+ range_with_surrounding_space(range, :right)
95
+ end
91
96
  end
92
97
  end
93
98
  end
@@ -64,7 +64,7 @@ module RuboCop
64
64
  def complex_content?(strings)
65
65
  strings.any? do |s|
66
66
  string = s.str_content
67
- string !~ word_regex || string =~ / /
67
+ !string.valid_encoding? || string !~ word_regex || string =~ / /
68
68
  end
69
69
  end
70
70
 
@@ -5,6 +5,13 @@ module RuboCop
5
5
  module Cop
6
6
  # FIXME
7
7
  class Team
8
+ # If these cops try to autocorrect the same file at the same time,
9
+ # bad things are liable to happen
10
+ INCOMPATIBLE_COPS = {
11
+ Style::SymbolProc => [Style::SpaceBeforeBlockBraces],
12
+ Style::SpaceBeforeBlockBraces => [Style::SymbolProc]
13
+ }.freeze
14
+
8
15
  attr_reader :errors, :warnings, :updated_source_file
9
16
 
10
17
  alias updated_source_file? updated_source_file
@@ -90,7 +97,7 @@ module RuboCop
90
97
  @updated_source_file = false
91
98
  return unless autocorrect?
92
99
 
93
- new_source = autocorrect_one_cop(buffer, cops)
100
+ new_source = autocorrect_all_cops(buffer, cops)
94
101
 
95
102
  return if new_source == buffer.source
96
103
 
@@ -104,15 +111,19 @@ module RuboCop
104
111
  @updated_source_file = true
105
112
  end
106
113
 
107
- # Does an auto-correction run by correcting for just one cop. The
108
- # re-running of auto-corrections will make sure that the full set of
109
- # auto-corrections is tried again after this method has finished.
110
- def autocorrect_one_cop(buffer, cops)
111
- cop_with_corrections = cops.find { |cop| cop.corrections.any? }
114
+ def autocorrect_all_cops(buffer, cops)
115
+ corrector = Corrector.new(buffer)
116
+ skip = Set.new
117
+
118
+ cops.each do |cop|
119
+ next if cop.corrections.empty?
120
+ next if skip.include?(cop.class)
121
+ corrector.corrections.concat(cop.corrections)
122
+ incompatible = INCOMPATIBLE_COPS[cop.class]
123
+ skip.merge(incompatible) if incompatible
124
+ end
112
125
 
113
- if cop_with_corrections
114
- corrections = cop_with_corrections.corrections
115
- corrector = Corrector.new(buffer, corrections)
126
+ if !corrector.corrections.empty?
116
127
  corrector.rewrite
117
128
  else
118
129
  buffer.source
@@ -129,8 +129,8 @@ module RuboCop
129
129
  end
130
130
  end
131
131
 
132
- def range_with_surrounding_comma(range, side = :both, buffer = nil)
133
- buffer ||= @processed_source.buffer
132
+ def range_with_surrounding_comma(range, side = :both)
133
+ buffer = @processed_source.buffer
134
134
  src = buffer.source
135
135
 
136
136
  go_left, go_right = directions(side)
@@ -143,9 +143,8 @@ module RuboCop
143
143
  Parser::Source::Range.new(buffer, begin_pos, end_pos)
144
144
  end
145
145
 
146
- def range_with_surrounding_space(range, side = :both, buffer = nil,
147
- with_newline = true)
148
- buffer ||= @processed_source.buffer
146
+ def range_with_surrounding_space(range, side = :both, with_newline = true)
147
+ buffer = @processed_source.buffer
149
148
  src = buffer.source
150
149
 
151
150
  go_left, go_right = directions(side)
@@ -80,9 +80,9 @@ module RuboCop
80
80
  key.start_with?(specified_key)
81
81
  end
82
82
 
83
- if matching_keys.empty?
84
- raise %(No formatter for "#{specified_key}")
85
- elsif matching_keys.size > 1
83
+ raise %(No formatter for "#{specified_key}") if matching_keys.empty?
84
+
85
+ if matching_keys.size > 1
86
86
  raise %(Cannot determine formatter for "#{specified_key}")
87
87
  end
88
88
 
@@ -4,7 +4,7 @@
4
4
  module RuboCop
5
5
  # This module holds the RuboCop version information.
6
6
  module Version
7
- STRING = '0.37.0'.freeze
7
+ STRING = '0.37.1'.freeze
8
8
 
9
9
  MSG = '%s (using Parser %s, running on %s %s %s)'.freeze
10
10
 
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.37.0
4
+ version: 0.37.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-02-04 00:00:00.000000000 Z
13
+ date: 2016-02-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rainbow
@@ -38,7 +38,7 @@ dependencies:
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: 2.3.0.2
41
+ version: 2.3.0.4
42
42
  - - "<"
43
43
  - !ruby/object:Gem::Version
44
44
  version: '3.0'
@@ -48,7 +48,7 @@ dependencies:
48
48
  requirements:
49
49
  - - ">="
50
50
  - !ruby/object:Gem::Version
51
- version: 2.3.0.2
51
+ version: 2.3.0.4
52
52
  - - "<"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
@@ -119,13 +119,8 @@ extra_rdoc_files:
119
119
  - LICENSE.txt
120
120
  - README.md
121
121
  files:
122
- - ".yardopts"
123
- - CHANGELOG.md
124
- - CONTRIBUTING.md
125
122
  - LICENSE.txt
126
123
  - README.md
127
- - assets/logo.png
128
- - assets/output.html.erb
129
124
  - bin/rubocop
130
125
  - config/default.yml
131
126
  - config/disabled.yml
@@ -507,39 +502,6 @@ files:
507
502
  - lib/rubocop/token.rb
508
503
  - lib/rubocop/version.rb
509
504
  - lib/rubocop/warning.rb
510
- - logo/rubo-logo-horizontal.png
511
- - logo/rubo-logo-square.png
512
- - logo/rubo-logo-symbol.png
513
- - relnotes/v0.19.0.md
514
- - relnotes/v0.19.1.md
515
- - relnotes/v0.20.0.md
516
- - relnotes/v0.20.1.md
517
- - relnotes/v0.21.0.md
518
- - relnotes/v0.22.0.md
519
- - relnotes/v0.23.0.md
520
- - relnotes/v0.24.0.md
521
- - relnotes/v0.24.1.md
522
- - relnotes/v0.25.0.md
523
- - relnotes/v0.26.0.md
524
- - relnotes/v0.26.1.md
525
- - relnotes/v0.27.0.md
526
- - relnotes/v0.27.1.md
527
- - relnotes/v0.28.0.md
528
- - relnotes/v0.29.0.md
529
- - relnotes/v0.29.1.md
530
- - relnotes/v0.30.0.md
531
- - relnotes/v0.30.1.md
532
- - relnotes/v0.31.0.md
533
- - relnotes/v0.32.0.md
534
- - relnotes/v0.32.1.md
535
- - relnotes/v0.33.0.md
536
- - relnotes/v0.34.0.md
537
- - relnotes/v0.34.1.md
538
- - relnotes/v0.34.2.md
539
- - relnotes/v0.35.0.md
540
- - relnotes/v0.36.0.md
541
- - relnotes/v0.37.0.md
542
- - rubocop.gemspec
543
505
  homepage: http://github.com/bbatsov/rubocop
544
506
  licenses:
545
507
  - MIT
@@ -560,7 +522,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
560
522
  version: '0'
561
523
  requirements: []
562
524
  rubyforge_project:
563
- rubygems_version: 2.2.2
525
+ rubygems_version: 2.4.5
564
526
  signing_key:
565
527
  specification_version: 4
566
528
  summary: Automatic Ruby code style checking tool.