tailor 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +30 -28
  3. data/History.md +257 -0
  4. data/README.md +486 -0
  5. data/Rakefile +1 -9
  6. data/lib/ext/string_ext.rb +1 -1
  7. data/lib/tailor/cli.rb +3 -1
  8. data/lib/tailor/cli/options.rb +59 -39
  9. data/lib/tailor/configuration.rb +8 -5
  10. data/lib/tailor/configuration/file_set.rb +1 -3
  11. data/lib/tailor/configuration/style.rb +2 -0
  12. data/lib/tailor/critic.rb +2 -2
  13. data/lib/tailor/formatters/text.rb +17 -16
  14. data/lib/tailor/lexed_line.rb +2 -4
  15. data/lib/tailor/lexer.rb +9 -9
  16. data/lib/tailor/lexer/lexer_constants.rb +32 -32
  17. data/lib/tailor/lexer/token.rb +8 -10
  18. data/lib/tailor/logger.rb +1 -1
  19. data/lib/tailor/problem.rb +4 -1
  20. data/lib/tailor/rake_task.rb +4 -1
  21. data/lib/tailor/reporter.rb +3 -3
  22. data/lib/tailor/ruler.rb +2 -2
  23. data/lib/tailor/rulers/allow_camel_case_methods_ruler.rb +2 -2
  24. data/lib/tailor/rulers/allow_hard_tabs_ruler.rb +1 -1
  25. data/lib/tailor/rulers/allow_invalid_ruby_ruler.rb +1 -1
  26. data/lib/tailor/rulers/allow_screaming_snake_case_classes_ruler.rb +2 -2
  27. data/lib/tailor/rulers/indentation_spaces_ruler.rb +24 -22
  28. data/lib/tailor/rulers/indentation_spaces_ruler/indentation_manager.rb +13 -13
  29. data/lib/tailor/rulers/max_code_lines_in_class_ruler.rb +2 -2
  30. data/lib/tailor/rulers/max_code_lines_in_method_ruler.rb +2 -2
  31. data/lib/tailor/rulers/spaces_after_comma_ruler.rb +6 -6
  32. data/lib/tailor/rulers/spaces_after_conditional_ruler.rb +48 -0
  33. data/lib/tailor/rulers/spaces_after_lbrace_ruler.rb +8 -8
  34. data/lib/tailor/rulers/spaces_after_lbracket_ruler.rb +6 -6
  35. data/lib/tailor/rulers/spaces_after_lparen_ruler.rb +6 -6
  36. data/lib/tailor/rulers/spaces_before_comma_ruler.rb +2 -2
  37. data/lib/tailor/rulers/spaces_before_lbrace_ruler.rb +4 -4
  38. data/lib/tailor/rulers/spaces_before_rbrace_ruler.rb +9 -9
  39. data/lib/tailor/rulers/spaces_before_rbracket_ruler.rb +6 -6
  40. data/lib/tailor/rulers/spaces_before_rparen_ruler.rb +6 -6
  41. data/lib/tailor/rulers/spaces_in_empty_braces_ruler.rb +1 -1
  42. data/lib/tailor/rulers/trailing_newlines_ruler.rb +2 -2
  43. data/lib/tailor/tailorrc.erb +1 -1
  44. data/lib/tailor/version.rb +1 -1
  45. data/spec/functional/conditional_spacing_spec.rb +149 -0
  46. data/spec/functional/configuration_spec.rb +36 -26
  47. data/spec/functional/horizontal_spacing/braces_spec.rb +1 -1
  48. data/spec/functional/horizontal_spacing/brackets_spec.rb +14 -14
  49. data/spec/functional/horizontal_spacing/comma_spacing_spec.rb +8 -8
  50. data/spec/functional/horizontal_spacing/hard_tabs_spec.rb +13 -13
  51. data/spec/functional/horizontal_spacing/long_lines_spec.rb +6 -6
  52. data/spec/functional/horizontal_spacing/long_methods_spec.rb +55 -0
  53. data/spec/functional/horizontal_spacing/parens_spec.rb +17 -17
  54. data/spec/functional/horizontal_spacing/trailing_whitespace_spec.rb +8 -8
  55. data/spec/functional/horizontal_spacing_spec.rb +11 -11
  56. data/spec/functional/indentation_spacing/bad_indentation_spec.rb +83 -83
  57. data/spec/functional/indentation_spacing_spec.rb +10 -10
  58. data/spec/functional/naming/camel_case_methods_spec.rb +6 -6
  59. data/spec/functional/naming/screaming_snake_case_classes_spec.rb +10 -10
  60. data/spec/functional/naming_spec.rb +3 -3
  61. data/spec/functional/vertical_spacing/class_length_spec.rb +6 -6
  62. data/spec/functional/vertical_spacing/method_length_spec.rb +6 -6
  63. data/spec/functional/vertical_spacing_spec.rb +3 -3
  64. data/spec/support/conditional_spacing_cases.rb +37 -0
  65. data/spec/support/good_indentation_cases.rb +1 -1
  66. data/spec/unit/tailor/cli/options_spec.rb +50 -0
  67. data/spec/unit/tailor/cli_spec.rb +3 -3
  68. data/spec/unit/tailor/composite_observable_spec.rb +8 -8
  69. data/spec/unit/tailor/configuration/file_set_spec.rb +2 -2
  70. data/spec/unit/tailor/configuration/style_spec.rb +30 -29
  71. data/spec/unit/tailor/configuration_spec.rb +39 -24
  72. data/spec/unit/tailor/critic_spec.rb +18 -17
  73. data/spec/unit/tailor/formatter_spec.rb +15 -15
  74. data/spec/unit/tailor/formatters/yaml_spec.rb +1 -1
  75. data/spec/unit/tailor/lexed_line_spec.rb +258 -258
  76. data/spec/unit/tailor/lexer/token_spec.rb +11 -11
  77. data/spec/unit/tailor/lexer_spec.rb +35 -35
  78. data/spec/unit/tailor/problem_spec.rb +13 -13
  79. data/spec/unit/tailor/reporter_spec.rb +19 -18
  80. data/spec/unit/tailor/ruler_spec.rb +15 -15
  81. data/spec/unit/tailor/rulers/indentation_spaces_ruler/indentation_manager_spec.rb +72 -72
  82. data/spec/unit/tailor/rulers/indentation_spaces_ruler_spec.rb +32 -32
  83. data/spec/unit/tailor/rulers/spaces_after_comma_ruler_spec.rb +8 -8
  84. data/spec/unit/tailor/rulers/spaces_after_lbrace_ruler_spec.rb +36 -36
  85. data/spec/unit/tailor/rulers/spaces_before_lbrace_ruler_spec.rb +14 -14
  86. data/spec/unit/tailor/rulers/spaces_before_rbrace_ruler_spec.rb +14 -14
  87. data/spec/unit/tailor/rulers_spec.rb +2 -2
  88. data/spec/unit/tailor/version_spec.rb +1 -1
  89. data/spec/unit/tailor_spec.rb +4 -4
  90. data/tailor.gemspec +1 -1
  91. metadata +16 -9
  92. data/History.rdoc +0 -189
  93. data/README.rdoc +0 -422
  94. data/spec/unit/tailor/options_spec.rb +0 -6
data/Rakefile CHANGED
@@ -45,18 +45,10 @@ end
45
45
  # yard
46
46
  #------------------------------------------------------------------------------
47
47
  YARD::Rake::YardocTask.new do |t|
48
- t.files = %w(lib/**/*.rb - History.rdoc)
48
+ t.files = %w(lib/**/*.rb - History.md)
49
49
  t.options = %w(--private --protected --verbose)
50
50
  end
51
51
 
52
- namespace :yard do
53
- YARD::Rake::YardocTask.new(:with_features) do |t|
54
- YARD::Config.load_plugin 'cucumber'
55
-
56
- t.files = %w(lib/**/*.rb features/**/*.feature - History.rdoc)
57
- end
58
- end
59
-
60
52
 
61
53
  desc "Run RSpec examples and Cucumber features"
62
54
  task test: [:spec, :features]
@@ -7,7 +7,7 @@ class String
7
7
  self.gsub(/::/, '/').
8
8
  gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
9
9
  gsub(/([a-z\d])([A-Z])/, '\1_\2').
10
- tr("-", "_").
10
+ tr('-', '_').
11
11
  downcase
12
12
  end
13
13
  end
@@ -47,7 +47,9 @@ class Tailor
47
47
  @reporter.file_report(problems_for_file, label)
48
48
  end
49
49
 
50
- @reporter.summary_report(@critic.problems, output_file: @configuration.output_file)
50
+ @reporter.summary_report(@critic.problems,
51
+ output_file: @configuration.output_file)
52
+
51
53
  @critic.problem_count(:error) > 0
52
54
  end
53
55
 
@@ -9,9 +9,11 @@ require_relative '../configuration'
9
9
  class Tailor
10
10
  class CLI
11
11
  class Options
12
+ INTEGER_OR_OFF = /^(\d+|false|off)$/
12
13
  @output_color = true
13
14
 
14
15
  def self.parse!(args)
16
+ register_custom_option_types
15
17
  options = OpenStruct.new
16
18
  options.config_file = ''
17
19
  options.output_file = ''
@@ -21,32 +23,32 @@ class Tailor
21
23
 
22
24
  opts = OptionParser.new do |opt|
23
25
  opt.banner = self.banner
24
- opt.separator ""
25
- opt.separator " " + ("-" * 73)
26
- opt.separator ""
27
- opt.separator "Config file options:"
26
+ opt.separator ''
27
+ opt.separator ' ' + ('-' * 73)
28
+ opt.separator ''
29
+ opt.separator 'Config file options:'
28
30
  opt.on('-s', '--show-config', 'Show your current config.') do
29
31
  options.show_config = true
30
32
  end
31
33
 
32
34
  opt.on('-c', '--config-file FILE',
33
- "Use a specific config file.") do |config|
35
+ 'Use a specific config file.') do |config|
34
36
  options.config_file = config
35
37
  end
36
38
 
37
39
  opt.on('-o', '--output-file FILE',
38
- "Print result in a output file if using the proper formatter.") do |output|
40
+ 'Print result in a output file if using the proper formatter.') do |output|
39
41
  options.output_file = output
40
42
  end
41
43
 
42
44
  opt.on('--create-config', 'Create a new .tailor file') do
43
45
  if create_config
44
- msg = "Your new tailor config file was created at "
46
+ msg = 'Your new tailor config file was created at '
45
47
  msg << "#{Dir.pwd}/.tailor"
46
48
  $stdout.puts msg
47
49
  exit
48
50
  else
49
- $stderr.puts "Creation of .tailor failed!"
51
+ $stderr.puts 'Creation of .tailor failed!'
50
52
  exit 1
51
53
  end
52
54
  end
@@ -54,14 +56,14 @@ class Tailor
54
56
  #---------------------------------------------------------------------
55
57
  # Style options
56
58
  #---------------------------------------------------------------------
57
- opt.separator ""
58
- opt.separator "Style Options:"
59
+ opt.separator ''
60
+ opt.separator 'Style Options:'
59
61
  opt.separator " (Any option that doesn't have an explicit way of"
60
- opt.separator " turning it off can be done so simply by passing"
62
+ opt.separator ' turning it off can be done so simply by passing'
61
63
  opt.separator " passing it 'false'.)"
62
64
 
63
- opt.separator ""
64
- opt.separator " * Horizontal Spacing:"
65
+ opt.separator ''
66
+ opt.separator ' * Horizontal Spacing:'
65
67
  opt.on('--allow-hard-tabs BOOL',
66
68
  'Check for hard tabs? (default: true)') do |c|
67
69
  options.style[:allow_hard_tabs] = c
@@ -73,70 +75,75 @@ class Tailor
73
75
  options.style[:allow_trailing_line_spaces] = c
74
76
  end
75
77
 
76
- opt.on('--indentation-spaces NUMBER',
78
+ opt.on('--indentation-spaces NUMBER', INTEGER_OR_OFF,
77
79
  'Spaces to expect indentation. (default: 2)') do |c|
78
80
  options.style[:indentation_spaces] = c
79
81
  end
80
82
 
81
- opt.on('--max-line-length NUMBER',
83
+ opt.on('--max-line-length NUMBER', INTEGER_OR_OFF,
82
84
  'Max characters in a line. (default: 80)') do |c|
83
85
  options.style[:max_line_length] = c
84
86
  end
85
87
 
86
- opt.on('--spaces-after-comma NUMBER',
88
+ opt.on('--spaces-after-comma NUMBER', INTEGER_OR_OFF,
87
89
  'Spaces to expect after a comma. (default: 1)') do |c|
88
90
  options.style[:spaces_after_comma] = c
89
91
  end
90
92
 
91
- opt.on('--spaces-before-comma NUMBER',
93
+ opt.on('--spaces-before-comma NUMBER', INTEGER_OR_OFF,
92
94
  'Spaces to expect before a comma. (default: 0)') do |c|
93
95
  options.style[:spaces_before_comma] = c
94
96
  end
95
97
 
96
- opt.on('--spaces-after-lbrace NUMBER',
98
+ opt.on('--spaces-after-conditional NUMBER', INTEGER_OR_OFF,
99
+ 'Spaces to expect after a conditional. (default: 1)') do |c|
100
+ options.style[:spaces_after_conditional] = c
101
+ end
102
+
103
+ opt.on('--spaces-after-lbrace NUMBER', INTEGER_OR_OFF,
97
104
  'Spaces to expect after a {. (default: 1)') do |c|
98
105
  options.style[:spaces_after_lbrace] = c
99
106
  end
100
107
 
101
- opt.on('--spaces-before-lbrace NUMBER',
108
+ opt.on('--spaces-before-lbrace NUMBER', INTEGER_OR_OFF,
102
109
  'Spaces to expect before a {. (default: 1)') do |c|
103
110
  options.style[:spaces_before_lbrace] = c
104
111
  end
105
112
 
106
- opt.on('--spaces-before-rbrace NUMBER', Integer,
113
+ opt.on('--spaces-before-rbrace NUMBER', INTEGER_OR_OFF,
107
114
  'Spaces to expect before a }. (default: 1)') do |c|
108
115
  options.style[:spaces_before_rbrace] = c
109
116
  end
110
117
 
111
- opt.on('--spaces-in-empty-braces NUMBER', Integer,
118
+ opt.on('--spaces-in-empty-braces NUMBER', INTEGER_OR_OFF,
112
119
  'Spaces to expect between a { and }. (default: 0)') do |c|
113
120
  options.style[:spaces_in_empty_braces] = c
114
121
  end
115
122
 
116
- opt.on('--spaces-after-lbracket NUMBER', Integer,
123
+ opt.on('--spaces-after-lbracket NUMBER', INTEGER_OR_OFF,
117
124
  'Spaces to expect after a [. (default: 0)') do |c|
118
125
  options.style[:spaces_after_lbracket] = c
119
126
  end
120
127
 
121
- opt.on('--spaces-before-rbracket NUMBER', Integer,
128
+ opt.on('--spaces-before-rbracket NUMBER', INTEGER_OR_OFF,
122
129
  'Spaces to expect before a ]. (default: 0)') do |c|
123
130
  options.style[:spaces_before_rbracket] = c
124
131
  end
125
132
 
126
- opt.on('--spaces-after-lparen NUMBER', Integer,
133
+ opt.on('--spaces-after-lparen NUMBER', INTEGER_OR_OFF,
127
134
  'Spaces to expect after a (. (default: 0)') do |c|
128
135
  options.style[:spaces_after_lparen] = c
129
136
  end
130
137
 
131
- opt.on('--spaces-before-rparen NUMBER', Integer,
138
+ opt.on('--spaces-before-rparen NUMBER', INTEGER_OR_OFF,
132
139
  'Spaces to expect before a ). (default: 0)') do |c|
133
140
  options.style[:spaces_before_rparen] = c
134
141
  end
135
142
 
136
- opt.separator ""
137
- opt.separator ""
143
+ opt.separator ''
144
+ opt.separator ''
138
145
 
139
- opt.separator " * Naming:"
146
+ opt.separator ' * Naming:'
140
147
 
141
148
  opt.on('--allow-camel-case-methods BOOL',
142
149
  'Check for camel-case method names?', '(default: true)') do |c|
@@ -149,21 +156,21 @@ class Tailor
149
156
  instance_eval(c)
150
157
  end
151
158
 
152
- opt.separator ""
153
- opt.separator ""
154
- opt.separator " * Vertical Spacing"
159
+ opt.separator ''
160
+ opt.separator ''
161
+ opt.separator ' * Vertical Spacing'
155
162
 
156
- opt.on('--max-code-lines-in-class NUMBER', Integer,
163
+ opt.on('--max-code-lines-in-class NUMBER', INTEGER_OR_OFF,
157
164
  'Max number lines of code in a class.', '(default: 300)') do |c|
158
165
  options.style[:max_code_lines_in_class] = c
159
166
  end
160
167
 
161
- opt.on('--max-code-lines-in-method NUMBER', Integer,
168
+ opt.on('--max-code-lines-in-method NUMBER', INTEGER_OR_OFF,
162
169
  'Max number lines of code in a method.', '(default: 30)') do |c|
163
170
  options.style[:max_code_lines_in_method] = c
164
171
  end
165
172
 
166
- opt.on('--trailing-newlines NUMBER', Integer,
173
+ opt.on('--trailing-newlines NUMBER', INTEGER_OR_OFF,
167
174
  'Newlines to expect at the end of the file.', '(default: 1)') do |c|
168
175
  options.style[:trailing_newlines] = c
169
176
  end
@@ -171,8 +178,8 @@ class Tailor
171
178
  #---------------------------------------------------------------------
172
179
  # Common options
173
180
  #---------------------------------------------------------------------
174
- opt.separator ""
175
- opt.separator "Common options:"
181
+ opt.separator ''
182
+ opt.separator 'Common options:'
176
183
 
177
184
  =begin
178
185
  opt.on('-f', '--format FORMATTER') do |format|
@@ -180,16 +187,16 @@ class Tailor
180
187
  end
181
188
  =end
182
189
 
183
- opt.on('--[no-]color', "Output in color") do |color|
190
+ opt.on('--[no-]color', 'Output in color') do |color|
184
191
  @output_color = color
185
192
  end
186
193
 
187
- opt.on_tail('-v', '--version', "Show the version") do
194
+ opt.on_tail('-v', '--version', 'Show the version') do
188
195
  puts version
189
196
  exit
190
197
  end
191
198
 
192
- opt.on_tail('-d', '--debug', "Turn on debug logging") do
199
+ opt.on_tail('-d', '--debug', 'Turn on debug logging') do
193
200
  Tailor::Logger.log = true
194
201
  end
195
202
 
@@ -269,6 +276,19 @@ tailor --show-config
269
276
  File.open('.tailor', 'w') { |f| f.write default_config_file }
270
277
  end
271
278
  end
279
+
280
+ def self.register_custom_option_types
281
+ # We need to be able to mark integer options as :off as zero may be a
282
+ # valid value.
283
+ OptionParser.accept(INTEGER_OR_OFF) do |s|
284
+ raise OptionParser::InvalidArgument unless s =~ INTEGER_OR_OFF
285
+ if s == false.to_s || s == 'off'
286
+ :off
287
+ else
288
+ s.to_i
289
+ end
290
+ end
291
+ end
272
292
  end
273
293
  end
274
294
  end
@@ -68,7 +68,7 @@ class Tailor
68
68
  get_file_sets_from_config_file
69
69
  end
70
70
  else
71
- log "Creating default file set..."
71
+ log 'Creating default file set...'
72
72
  @file_sets = { default: FileSet.new(@runtime_file_list) }
73
73
  end
74
74
 
@@ -89,7 +89,8 @@ class Tailor
89
89
  log "Loading config from file: #{user_config_file}"
90
90
 
91
91
  begin
92
- @config_from_file = instance_eval(File.read(user_config_file), user_config_file)
92
+ @config_from_file =
93
+ instance_eval(File.read(user_config_file), user_config_file)
93
94
  log "Got new config from file: #{user_config_file}"
94
95
  rescue LoadError => ex
95
96
  raise Tailor::RuntimeError,
@@ -122,7 +123,7 @@ class Tailor
122
123
  log "file set style: #{file_set[:style]}"
123
124
 
124
125
  if @file_sets[label]
125
- log "label already exists. Updating..."
126
+ log 'label already exists. Updating...'
126
127
  @file_sets[label].update_file_list(file_set[:file_list])
127
128
  @file_sets[label].update_style(file_set[:style])
128
129
  else
@@ -145,7 +146,7 @@ class Tailor
145
146
 
146
147
  @options.style.each do |property, value|
147
148
  @file_sets.keys.each do |label|
148
- if value == :off || value == "off"
149
+ if value == :off || value == 'off'
149
150
  @file_sets[label].style[property][1] = { level: :off }
150
151
  else
151
152
  @file_sets[label].style[property][0] = value
@@ -213,7 +214,9 @@ class Tailor
213
214
  # @param [String] file_expression The expression to match recursively.
214
215
  # @param [Symbol] label The file set label to use.
215
216
  def recursive_file_set(file_expression, label=:default)
216
- file_set("*/**/#{file_expression}", label)
217
+ file_set("*/**/#{file_expression}", label) do |style|
218
+ yield style if block_given?
219
+ end
217
220
  end
218
221
 
219
222
  # Displays the current configuration as a text table.
@@ -99,11 +99,9 @@ class Tailor
99
99
  # @param [String] base_dir The directory to get the file list for.
100
100
  # @return [Array<String>] The List of files.
101
101
  def all_files_in_dir(base_dir)
102
- files = Dir.glob(File.join(base_dir, '**', '*')).find_all do |file|
102
+ Dir.glob(File.join(base_dir, '**', '*')).find_all do |file|
103
103
  file if File.file?(file)
104
104
  end
105
-
106
- files
107
105
  end
108
106
  end
109
107
  end
@@ -35,6 +35,7 @@ class Tailor
35
35
  define_property :max_code_lines_in_method
36
36
  define_property :max_line_length
37
37
  define_property :spaces_after_comma
38
+ define_property :spaces_after_conditional
38
39
  define_property :spaces_after_lbrace
39
40
  define_property :spaces_after_lbracket
40
41
  define_property :spaces_after_lparen
@@ -58,6 +59,7 @@ class Tailor
58
59
  max_code_lines_in_method(30, level: :error)
59
60
  max_line_length(80, level: :error)
60
61
  spaces_after_comma(1, level: :error)
62
+ spaces_after_conditional(1, level: :error)
61
63
  spaces_after_lbrace(1, level: :error)
62
64
  spaces_after_lbracket(0, level: :error)
63
65
  spaces_after_lparen(0, level: :error)
@@ -65,7 +65,7 @@ class Tailor
65
65
  log "<#{self.class}> Checking style of file: #{file}."
66
66
  lexer = Tailor::Lexer.new(file)
67
67
  ruler = Ruler.new
68
- log "Style:"
68
+ log 'Style:'
69
69
  style.each { |property, values| log "#{property}: #{values}" }
70
70
  init_rulers(style, lexer, ruler)
71
71
 
@@ -89,7 +89,7 @@ class Tailor
89
89
  style.each do |ruler_name, values|
90
90
  ruler = "Tailor::Rulers::#{camelize(ruler_name.to_s)}Ruler"
91
91
 
92
- if values.last[:level] == :off || values.last[:level] == "off"
92
+ if values.last[:level] == :off || values.last[:level] == 'off'
93
93
  msg = "Style option set to '#{values.last[:level]}'; "
94
94
  log msg << "skipping init of '#{ruler}'"
95
95
  next
@@ -21,7 +21,7 @@ class Tailor
21
21
  # @return [String] The portion of the header that displays the file info.
22
22
  def file_header(file)
23
23
  file = Pathname(file)
24
- message = "# "
24
+ message = '# '
25
25
  message << underscore { "File:\n" }
26
26
  message << "# #{file.relative_path_from(@pwd)}\n"
27
27
  message << "#\n"
@@ -32,7 +32,7 @@ class Tailor
32
32
  # @return [String] The portion of the header that displays the file_set
33
33
  # label info.
34
34
  def file_set_header(file_set)
35
- message = "# "
35
+ message = '# '
36
36
  message << underscore { "File Set:\n" }
37
37
  message << "# #{file_set}\n"
38
38
  message << "#\n"
@@ -43,19 +43,19 @@ class Tailor
43
43
  # @return [String] The portion of the report that displays all of the
44
44
  # problems for the file.
45
45
  def problems_header(problem_list)
46
- message = "# "
46
+ message = '# '
47
47
  message << underscore { "Problems:\n" }
48
48
 
49
49
  problem_list.each_with_index do |problem, i|
50
50
  color = PROBLEM_LEVEL_COLORS[problem[:level]] || 'white'
51
51
 
52
52
  position = position(problem[:line], problem[:column])
53
- message << "# " + bold { "#{(i + 1)}." } + "\n"
54
- message << "# * position: "
53
+ message << '# ' + bold { "#{(i + 1)}." } + "\n"
54
+ message << '# * position: '
55
55
  message << bold { instance_eval("#{color} position") } + "\n"
56
- message << "# * property: "
56
+ message << '# * property: '
57
57
  message << instance_eval("#{color} problem[:type].to_s") + "\n"
58
- message << "# * message: "
58
+ message << '# * message: '
59
59
  message << instance_eval("#{color} problem[:message].to_s") + "\n"
60
60
  end
61
61
 
@@ -108,14 +108,14 @@ class Tailor
108
108
  bold { report_line }
109
109
  end
110
110
 
111
- summary_table << "# " << report_line << reset << "|\n"
111
+ summary_table << '# ' << report_line << reset << "|\n"
112
112
  i += 1
113
113
  end
114
114
 
115
115
  summary_table << line
116
116
  summary_table << summary_level_totals(problems)
117
- summary_table << "# " << bold{ summary_first_col('TOTAL', 67) }
118
- summary_table << "|"
117
+ summary_table << '# ' << bold{ summary_first_col('TOTAL', 67) }
118
+ summary_table << '|'
119
119
  summary_table << bold { total_problems(problems).to_s.rjust(6) }
120
120
  summary_table << " |\n"
121
121
  summary_table << line
@@ -125,7 +125,7 @@ class Tailor
125
125
 
126
126
  def summary_header
127
127
  summary_table = line
128
- summary_table << "# "
128
+ summary_table << '# '
129
129
  summary_table << bold { 'Tailor Summary'.rjust(40) }
130
130
  summary_table << "|\n".rjust(39)
131
131
  summary_table << line
@@ -142,7 +142,8 @@ class Tailor
142
142
  relative_path = file.relative_path_from(@pwd)
143
143
  problem_count = problem_list.size
144
144
 
145
- "#{summary_first_col(relative_path)} | " + problem_count.to_s.rjust(5) + " "
145
+ "#{summary_first_col(relative_path)} | " +
146
+ problem_count.to_s.rjust(5) + ' '
146
147
  end
147
148
 
148
149
  def summary_first_col(path, string_size=MAX_STRING_SIZE)
@@ -155,14 +156,14 @@ class Tailor
155
156
  end
156
157
 
157
158
  def summary_level_totals(problems)
158
- return "" if total_problems(problems).zero?
159
+ return '' if total_problems(problems).zero?
159
160
 
160
- output = problem_levels(problems).inject("") do |result, level|
161
+ output = problem_levels(problems).inject('') do |result, level|
161
162
  color = PROBLEM_LEVEL_COLORS[level] || 'white'
162
163
 
163
- result << "# "
164
+ result << '# '
164
165
  result << instance_eval("#{color} { summary_first_col(level.capitalize, 67) }")
165
- result << "|"
166
+ result << '|'
166
167
  result << instance_eval("#{color} { problems_at_level(problems, level).size.to_s.rjust(6) }")
167
168
  result << " |\n"
168
169
  end