tailor 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.tailor +1 -0
- data/Gemfile.lock +1 -1
- data/History.rdoc +34 -0
- data/README.rdoc +17 -1
- data/features/valid_ruby.feature +1 -1
- data/lib/ext/string_ext.rb +0 -4
- data/lib/tailor/cli/options.rb +9 -2
- data/lib/tailor/configuration.rb +103 -150
- data/lib/tailor/configuration/file_set.rb +110 -0
- data/lib/tailor/formatters/text.rb +108 -79
- data/lib/tailor/rake_task.rb +148 -0
- data/lib/tailor/tailorrc.erb +1 -1
- data/lib/tailor/version.rb +1 -1
- data/spec/functional/configuration_spec.rb +244 -0
- data/spec/functional/horizontal_spacing/braces_spec.rb +238 -0
- data/spec/functional/horizontal_spacing/brackets_spec.rb +88 -0
- data/spec/functional/horizontal_spacing/comma_spacing_spec.rb +68 -0
- data/spec/functional/horizontal_spacing/hard_tabs_spec.rb +110 -0
- data/spec/functional/horizontal_spacing/long_lines_spec.rb +51 -0
- data/spec/functional/horizontal_spacing/parens_spec.rb +102 -0
- data/spec/functional/horizontal_spacing/trailing_whitespace_spec.rb +66 -0
- data/spec/functional/horizontal_spacing_spec.rb +59 -0
- data/spec/functional/indentation_spacing/bad_indentation_spec.rb +372 -0
- data/spec/functional/indentation_spacing_spec.rb +85 -0
- data/spec/functional/naming/camel_case_methods_spec.rb +56 -0
- data/spec/functional/naming/screaming_snake_case_classes_spec.rb +83 -0
- data/spec/functional/naming_spec.rb +35 -0
- data/spec/functional/vertical_spacing/class_length_spec.rb +67 -0
- data/spec/functional/vertical_spacing/method_length_spec.rb +61 -0
- data/spec/functional/vertical_spacing_spec.rb +35 -0
- data/spec/support/bad_indentation_cases.rb +265 -0
- data/{features/support/file_cases/indentation_cases.rb → spec/support/good_indentation_cases.rb} +6 -266
- data/spec/support/horizontal_spacing_cases.rb +136 -0
- data/spec/support/naming_cases.rb +26 -0
- data/{features/support/file_cases → spec/support}/vertical_spacing_cases.rb +0 -33
- data/spec/{tailor → unit/tailor}/cli_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/composite_observable_spec.rb +1 -1
- data/spec/unit/tailor/configuration/file_set_spec.rb +65 -0
- data/spec/{tailor → unit/tailor}/configuration/style_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/configuration_spec.rb +1 -59
- data/spec/{tailor → unit/tailor}/critic_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/formatter_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/lexed_line_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/lexer/token_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/lexer_spec.rb +1 -2
- data/spec/{tailor → unit/tailor}/options_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/problem_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/reporter_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/ruler_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/rulers/indentation_spaces_ruler/indentation_manager_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/rulers/indentation_spaces_ruler_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/rulers/spaces_after_comma_ruler_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/rulers/spaces_after_lbrace_ruler_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/rulers/spaces_before_lbrace_ruler_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/rulers/spaces_before_rbrace_ruler_spec.rb +1 -1
- data/spec/{tailor → unit/tailor}/rulers_spec.rb +1 -1
- data/spec/unit/tailor/version_spec.rb +6 -0
- data/spec/{tailor_spec.rb → unit/tailor_spec.rb} +1 -1
- data/tasks/spec.rake +8 -3
- metadata +121 -93
- data/features/horizontal_spacing.feature +0 -263
- data/features/indentation/bad_files_with_no_trailing_newline.feature +0 -91
- data/features/indentation/good_files_with_no_trailing_newline.feature +0 -219
- data/features/name_detection.feature +0 -72
- data/features/support/file_cases/horizontal_spacing_cases.rb +0 -266
- data/features/support/file_cases/naming_cases.rb +0 -51
- data/features/vertical_spacing.feature +0 -135
- data/m.rb +0 -15
- data/spec/tailor/version_spec.rb +0 -6
@@ -0,0 +1,110 @@
|
|
1
|
+
require_relative '../runtime_error'
|
2
|
+
require_relative '../logger'
|
3
|
+
require_relative 'style'
|
4
|
+
|
5
|
+
class Tailor
|
6
|
+
class Configuration
|
7
|
+
class FileSet < Hash
|
8
|
+
include Tailor::Logger::Mixin
|
9
|
+
|
10
|
+
DEFAULT_GLOB = 'lib/**/*.rb'
|
11
|
+
|
12
|
+
attr_reader :style
|
13
|
+
attr_accessor :file_list
|
14
|
+
|
15
|
+
# @param [Hash] style Style options to merge into the default Style
|
16
|
+
# settings.
|
17
|
+
# @param [String,Array] file_expression
|
18
|
+
def initialize(file_expression=nil, style=nil)
|
19
|
+
@style = if style
|
20
|
+
Style.new.to_hash.merge(style)
|
21
|
+
else
|
22
|
+
Style.new.to_hash
|
23
|
+
end
|
24
|
+
|
25
|
+
self[:style] = @style
|
26
|
+
|
27
|
+
file_expression ||= DEFAULT_GLOB
|
28
|
+
@file_list = build_file_list(file_expression)
|
29
|
+
self[:file_list] = @file_list
|
30
|
+
end
|
31
|
+
|
32
|
+
def update_file_list(file_expression)
|
33
|
+
new_list = build_file_list(file_expression)
|
34
|
+
@file_list.concat(new_list).uniq!
|
35
|
+
end
|
36
|
+
|
37
|
+
def update_style(new_style)
|
38
|
+
@style.to_hash.merge!(new_style)
|
39
|
+
end
|
40
|
+
|
41
|
+
def [](key)
|
42
|
+
if key == :style
|
43
|
+
@style.to_hash
|
44
|
+
elsif key == :file_list
|
45
|
+
@file_list
|
46
|
+
else
|
47
|
+
raise Tailor::RuntimeError, "Invalid key requested: #{key}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def file_list=(file_expression)
|
52
|
+
@file_list = build_file_list(file_expression)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# The list of the files in the project to check.
|
58
|
+
#
|
59
|
+
# @param [String] file_expression Path to the file, directory or file_expression to check.
|
60
|
+
# @return [Array] The list of files to check.
|
61
|
+
def build_file_list(file_expression)
|
62
|
+
files_in_project = if file_expression.is_a? Array
|
63
|
+
log "Configured file_expression is an Array: #{file_expression}"
|
64
|
+
|
65
|
+
file_expression.map do |e|
|
66
|
+
if File.directory?(e)
|
67
|
+
all_files_in_dir(e)
|
68
|
+
else
|
69
|
+
e
|
70
|
+
end
|
71
|
+
end.flatten.uniq
|
72
|
+
elsif File.directory? file_expression
|
73
|
+
log "Configured file_expression is an directory: #{file_expression}"
|
74
|
+
all_files_in_dir(file_expression)
|
75
|
+
elsif File.file? file_expression
|
76
|
+
log "Configured file_expression is a single-file: #{file_expression}"
|
77
|
+
[file_expression]
|
78
|
+
else
|
79
|
+
log "Configured file_expression is a glob: #{file_expression}"
|
80
|
+
Dir.glob file_expression
|
81
|
+
end
|
82
|
+
|
83
|
+
list_with_absolute_paths = []
|
84
|
+
|
85
|
+
files_in_project.each do |file|
|
86
|
+
new_file = File.expand_path(file)
|
87
|
+
log "file: #{new_file}"
|
88
|
+
|
89
|
+
if File.exists? new_file
|
90
|
+
list_with_absolute_paths << new_file
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
list_with_absolute_paths.sort
|
95
|
+
end
|
96
|
+
|
97
|
+
# Gets a list of only files that are in +base_dir+.
|
98
|
+
#
|
99
|
+
# @param [String] base_dir The directory to get the file list for.
|
100
|
+
# @return [Array<String>] The List of files.
|
101
|
+
def all_files_in_dir(base_dir)
|
102
|
+
files = Dir.glob(File.join(base_dir, '**', '*')).find_all do |file|
|
103
|
+
file if File.file?(file)
|
104
|
+
end
|
105
|
+
|
106
|
+
files
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -1,30 +1,28 @@
|
|
1
|
-
require 'text-table'
|
2
1
|
require 'pathname'
|
2
|
+
require 'term/ansicolor'
|
3
3
|
require_relative '../formatter'
|
4
4
|
|
5
|
+
|
5
6
|
class Tailor
|
6
7
|
module Formatters
|
7
8
|
class Text < Tailor::Formatter
|
9
|
+
include Term::ANSIColor
|
10
|
+
|
8
11
|
PROBLEM_LEVEL_COLORS = {
|
9
|
-
error:
|
10
|
-
warn:
|
12
|
+
error: 'red',
|
13
|
+
warn: 'yellow'
|
11
14
|
}
|
12
15
|
|
13
|
-
# @return [String] A line of "
|
14
|
-
def line(length=
|
15
|
-
"##{'-' * length}
|
16
|
+
# @return [String] A line of "#----#-", with length determined by +length+.
|
17
|
+
def line(length=78)
|
18
|
+
"##{'-' * length}#\n"
|
16
19
|
end
|
17
20
|
|
18
21
|
# @return [String] The portion of the header that displays the file info.
|
19
22
|
def file_header(file)
|
20
23
|
file = Pathname(file)
|
21
|
-
message = ""
|
22
|
-
message <<
|
23
|
-
"# #{'File:'.underscore}\n"
|
24
|
-
else
|
25
|
-
"# File:\n"
|
26
|
-
end
|
27
|
-
|
24
|
+
message = "# "
|
25
|
+
message << underscore { "File:\n" }
|
28
26
|
message << "# #{file.relative_path_from(@pwd)}\n"
|
29
27
|
message << "#\n"
|
30
28
|
|
@@ -34,13 +32,8 @@ class Tailor
|
|
34
32
|
# @return [String] The portion of the header that displays the file_set
|
35
33
|
# label info.
|
36
34
|
def file_set_header(file_set)
|
37
|
-
message = ""
|
38
|
-
message <<
|
39
|
-
"# #{'File Set:'.underscore}\n"
|
40
|
-
else
|
41
|
-
"# File Set:\n"
|
42
|
-
end
|
43
|
-
|
35
|
+
message = "# "
|
36
|
+
message << underscore { "File Set:\n" }
|
44
37
|
message << "# #{file_set}\n"
|
45
38
|
message << "#\n"
|
46
39
|
|
@@ -50,46 +43,32 @@ class Tailor
|
|
50
43
|
# @return [String] The portion of the report that displays all of the
|
51
44
|
# problems for the file.
|
52
45
|
def problems_header(problem_list)
|
53
|
-
message = ""
|
54
|
-
message <<
|
55
|
-
"# #{'Problems:'.underscore}\n"
|
56
|
-
else
|
57
|
-
"# Problems:\n"
|
58
|
-
end
|
46
|
+
message = "# "
|
47
|
+
message << underscore { "Problems:\n" }
|
59
48
|
|
60
49
|
problem_list.each_with_index do |problem, i|
|
61
|
-
color = PROBLEM_LEVEL_COLORS[problem[:level]] ||
|
62
|
-
|
63
|
-
position =
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
"#{problem[:line]}:#{problem[:column]}"
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
message << if defined? Term::ANSIColor
|
76
|
-
%Q{# #{(i + 1).to_s.bold}.
|
77
|
-
# * position: #{position}
|
78
|
-
# * property: #{problem[:type].to_s.send(color)}
|
79
|
-
# * message: #{problem[:message].send(color)}
|
80
|
-
}
|
81
|
-
else
|
82
|
-
%Q{# #{(i + 1)}.
|
83
|
-
# * position: #{position}
|
84
|
-
# * type: #{problem[:type]}
|
85
|
-
# * message: #{problem[:message]}
|
86
|
-
}
|
87
|
-
end
|
50
|
+
color = PROBLEM_LEVEL_COLORS[problem[:level]] || 'white'
|
51
|
+
|
52
|
+
position = position(problem[:line], problem[:column])
|
53
|
+
message << "# " + bold { "#{(i + 1)}." } + "\n"
|
54
|
+
message << "# * position: "
|
55
|
+
message << bold { instance_eval("#{color} position") } + "\n"
|
56
|
+
message << "# * property: "
|
57
|
+
message << instance_eval("#{color} problem[:type].to_s") + "\n"
|
58
|
+
message << "# * message: "
|
59
|
+
message << instance_eval("#{color} problem[:message].to_s") + "\n"
|
88
60
|
end
|
89
61
|
|
90
62
|
message
|
91
63
|
end
|
92
64
|
|
65
|
+
# @param [Fixnum] line
|
66
|
+
# @param [Fixnum] column
|
67
|
+
# @return [String] The position the problem was found at.
|
68
|
+
def position(line, column)
|
69
|
+
line == '<EOF>' ? '<EOF>' : "#{line}:#{column}"
|
70
|
+
end
|
71
|
+
|
93
72
|
# Prints the report on the file that just got checked.
|
94
73
|
#
|
95
74
|
# @param [Hash] problems Value should be the file name; keys should be
|
@@ -104,47 +83,97 @@ class Tailor
|
|
104
83
|
message << file_set_header(file_set_label)
|
105
84
|
message << problems_header(problem_list)
|
106
85
|
|
107
|
-
message <<
|
108
|
-
|
109
|
-
#-------------------------------------------------------------------------------
|
110
|
-
MSG
|
86
|
+
message << "#\n"
|
87
|
+
message << line
|
111
88
|
|
112
89
|
puts message
|
113
90
|
end
|
114
91
|
|
92
|
+
MAX_STRING_SIZE = 68
|
93
|
+
|
115
94
|
# Prints the report on all of the files that just got checked.
|
116
95
|
#
|
117
96
|
# @param [Hash] problems Values are filenames; keys are problems for each
|
118
97
|
# of those files.
|
119
98
|
def summary_report(problems)
|
120
|
-
|
121
|
-
|
122
|
-
else
|
123
|
-
summary_table = ::Text::Table.new
|
124
|
-
summary_table.head = [{ value: "Tailor Summary", colspan: 2 }]
|
125
|
-
summary_table.rows << [{ value: "File", align: :center },
|
126
|
-
{ value: "Total Problems", align: :center }]
|
127
|
-
summary_table.rows << :separator
|
128
|
-
|
129
|
-
problems.each do |file, problem_list|
|
130
|
-
file = Pathname(file)
|
131
|
-
summary_table.rows << [
|
132
|
-
file.relative_path_from(@pwd), problem_list.size
|
133
|
-
]
|
134
|
-
end
|
99
|
+
summary_table = summary_header
|
100
|
+
i = 0
|
135
101
|
|
136
|
-
|
102
|
+
problems.each do |file, problem_list|
|
103
|
+
report_line = summary_file_line(file, problem_list)
|
137
104
|
|
138
|
-
|
139
|
-
|
140
|
-
|
105
|
+
report_line = if i % 2 == 1
|
106
|
+
on_intense_black { report_line }
|
107
|
+
else
|
108
|
+
bold { report_line }
|
141
109
|
end
|
142
110
|
|
143
|
-
summary_table
|
144
|
-
|
111
|
+
summary_table << "# " << report_line << reset << "|\n"
|
112
|
+
i += 1
|
113
|
+
end
|
114
|
+
|
115
|
+
summary_table << line
|
116
|
+
summary_table << summary_level_totals(problems)
|
117
|
+
summary_table << "# " << bold{ summary_first_col('TOTAL', 67) }
|
118
|
+
summary_table << "|"
|
119
|
+
summary_table << bold { total_problems(problems).to_s.rjust(6) }
|
120
|
+
summary_table << " |\n"
|
121
|
+
summary_table << line
|
122
|
+
|
123
|
+
puts summary_table
|
124
|
+
end
|
125
|
+
|
126
|
+
def summary_header
|
127
|
+
summary_table = line
|
128
|
+
summary_table << "# "
|
129
|
+
summary_table << bold { 'Tailor Summary'.rjust(40) }
|
130
|
+
summary_table << "|\n".rjust(39)
|
131
|
+
summary_table << line
|
132
|
+
summary_table << '# ' << summary_first_col('File', 67) + '| '
|
133
|
+
summary_table << 'Probs'.rjust(1)
|
134
|
+
summary_table << " |\n".rjust(2)
|
135
|
+
summary_table << line
|
136
|
+
|
137
|
+
summary_table
|
138
|
+
end
|
139
|
+
|
140
|
+
def summary_file_line(file, problem_list)
|
141
|
+
file = Pathname(file)
|
142
|
+
relative_path = file.relative_path_from(@pwd)
|
143
|
+
problem_count = problem_list.size
|
144
|
+
|
145
|
+
"#{summary_first_col(relative_path)} | " + problem_count.to_s.rjust(5) + " "
|
146
|
+
end
|
145
147
|
|
146
|
-
|
148
|
+
def summary_first_col(path, string_size=MAX_STRING_SIZE)
|
149
|
+
fp = path.to_s.ljust(string_size)
|
150
|
+
offset = fp.size - string_size
|
151
|
+
end_of_string = fp[offset..-1]
|
152
|
+
end_of_string.sub!(/^.{3}/, '...') unless offset.zero?
|
153
|
+
|
154
|
+
end_of_string
|
155
|
+
end
|
156
|
+
|
157
|
+
def summary_level_totals(problems)
|
158
|
+
return "" if total_problems(problems).zero?
|
159
|
+
|
160
|
+
output = problem_levels(problems).inject("") do |result, level|
|
161
|
+
color = PROBLEM_LEVEL_COLORS[level] || 'white'
|
162
|
+
|
163
|
+
result << "# "
|
164
|
+
result << instance_eval("#{color} { summary_first_col(level.capitalize, 67) }")
|
165
|
+
result << "|"
|
166
|
+
result << instance_eval("#{color} { problems_at_level(problems, level).size.to_s.rjust(6) }")
|
167
|
+
result << " |\n"
|
147
168
|
end
|
169
|
+
|
170
|
+
output << line
|
171
|
+
|
172
|
+
output
|
173
|
+
end
|
174
|
+
|
175
|
+
def total_problems(problems)
|
176
|
+
problems.values.flatten.size
|
148
177
|
end
|
149
178
|
end
|
150
179
|
end
|
data/lib/tailor/rake_task.rb
CHANGED
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
require_relative 'critic'
|
4
|
+
require_relative 'configuration'
|
5
|
+
require_relative 'logger'
|
6
|
+
require_relative 'reporter'
|
7
|
+
require_relative 'cli/options'
|
8
|
+
|
9
|
+
begin
|
10
|
+
# Support Rake > 0.8.7
|
11
|
+
require 'rake/dsl_definition'
|
12
|
+
rescue LoadError
|
13
|
+
end
|
14
|
+
|
15
|
+
class Tailor
|
16
|
+
|
17
|
+
# This class lets you define Rake tasks to drive tailor. Specifying options
|
18
|
+
# is similar to specifying options in a configuration file.
|
19
|
+
#
|
20
|
+
# @example Use Tailor CLI Options
|
21
|
+
# Tailor::RakeTask.new do |task|
|
22
|
+
# task.tailor_opts = %w(--no-color --max-line-length=100)
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# @example A task specifically for features
|
26
|
+
# Tailor::RakeTask.new(:tailor_features) do |task|
|
27
|
+
# task.file_set 'features/**/*.rb', :features do |style|
|
28
|
+
# style.max_line_length 100, level: :warn
|
29
|
+
# style.trailing_newlines 2
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# @example Use and override a configuration file
|
34
|
+
# Tailor::RakeTask.new do |task|
|
35
|
+
# task.config_file = 'hardcore_stylin.rb'
|
36
|
+
# task.file_set 'lib/**/*.rb' do |style|
|
37
|
+
# style.indentation_spaces 2, level: :warn
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
class RakeTask < ::Rake::TaskLib
|
41
|
+
include ::Rake::DSL if defined? ::Rake::DSL
|
42
|
+
|
43
|
+
# Use a specific configuration file. If you have a .tailor file, your
|
44
|
+
# RakeTask will automatically use that.
|
45
|
+
#
|
46
|
+
# @return [String] The path to the configuration file.
|
47
|
+
attr_accessor :config_file
|
48
|
+
|
49
|
+
# Specify any extra options (CLI options). These will override any options
|
50
|
+
# set in your config file.
|
51
|
+
attr_accessor :tailor_opts
|
52
|
+
|
53
|
+
attr_accessor :formatters
|
54
|
+
|
55
|
+
# @param [String] name The task name.
|
56
|
+
# @param [String] desc Description of the task.
|
57
|
+
def initialize(name = "tailor", desc = "Check style")
|
58
|
+
Tailor::Logger.log = false
|
59
|
+
|
60
|
+
@name, @desc = name, desc
|
61
|
+
@tailor_opts = []
|
62
|
+
@file_sets = []
|
63
|
+
@recursive_file_sets = []
|
64
|
+
|
65
|
+
yield self if block_given?
|
66
|
+
|
67
|
+
define_task
|
68
|
+
end
|
69
|
+
|
70
|
+
# Add a file set to critique, just like you would in a config file.
|
71
|
+
#
|
72
|
+
# @param [String] file_expression
|
73
|
+
# @param [Symbol] label
|
74
|
+
def file_set(file_expression, label=:default, &block)
|
75
|
+
@file_sets << [file_expression, label, block]
|
76
|
+
end
|
77
|
+
|
78
|
+
# Add a recursive file set to critique, just like you would in a config
|
79
|
+
# file.
|
80
|
+
#
|
81
|
+
# @param [String] file_expression
|
82
|
+
# @param [Symbol] label
|
83
|
+
def recursive_file_set(file_expression, label=:default, &block)
|
84
|
+
@recursive_file_sets << [file_expression, label, block]
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def define_task
|
90
|
+
desc @desc
|
91
|
+
task @name do
|
92
|
+
if config_file
|
93
|
+
@tailor_opts.concat %W(--config-file=#{config_file})
|
94
|
+
end
|
95
|
+
|
96
|
+
configuration = create_config
|
97
|
+
@reporter = Tailor::Reporter.new(configuration.formatters)
|
98
|
+
|
99
|
+
create_file_sets_for configuration
|
100
|
+
create_recursive_file_sets_for configuration
|
101
|
+
check_default_file_set_in configuration
|
102
|
+
|
103
|
+
critic = Tailor::Critic.new
|
104
|
+
|
105
|
+
critic.critique(configuration.file_sets) do |problems_for_file, label|
|
106
|
+
@reporter.file_report(problems_for_file, label)
|
107
|
+
end
|
108
|
+
|
109
|
+
@reporter.summary_report(critic.problems)
|
110
|
+
|
111
|
+
critic.problem_count > 0
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# @return [Tailor::Configuration]
|
116
|
+
def create_config
|
117
|
+
configuration = Tailor::Configuration.new([],
|
118
|
+
Tailor::CLI::Options.parse!(@tailor_opts))
|
119
|
+
configuration.load!
|
120
|
+
configuration.formatters(formatters) if formatters
|
121
|
+
|
122
|
+
configuration
|
123
|
+
end
|
124
|
+
|
125
|
+
# @param [Tailor::Configuration] config
|
126
|
+
def create_recursive_file_sets_for config
|
127
|
+
unless @recursive_file_sets.empty?
|
128
|
+
@recursive_file_sets.each do |fs|
|
129
|
+
config.recursive_file_set(fs[0], fs[1], &fs[2])
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# @param [Tailor::Configuration] config
|
135
|
+
def create_file_sets_for config
|
136
|
+
unless @file_sets.empty?
|
137
|
+
@file_sets.each { |fs| config.file_set(fs[0], fs[1], &fs[2]) }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# @param [Tailor::Configuration] config
|
142
|
+
def check_default_file_set_in config
|
143
|
+
if @file_sets.none? { |fs| fs[1] == :default }
|
144
|
+
config.file_sets.delete(:default)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|