tailor 1.0.1 → 1.1.0
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.
- 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
data/.tailor
CHANGED
data/Gemfile.lock
CHANGED
data/History.rdoc
CHANGED
@@ -1,3 +1,37 @@
|
|
1
|
+
=== 1.1.0 2012-05-07
|
2
|
+
|
3
|
+
* gh-89[https://github.com/turboladen/tailor/issues/89]
|
4
|
+
* You can now use {Tailor::RakeTask} to create a Rake task.
|
5
|
+
* gh-100[https://github.com/turboladen/tailor/issues/100]
|
6
|
+
* Added {Tailor::Configuration#recursive_file_set}. This lets you do the
|
7
|
+
following in your config file, which will recursively match all files in
|
8
|
+
your current path that end with '_spec.rb':
|
9
|
+
|
10
|
+
Tailor.config do |config|
|
11
|
+
config.recursive_file_set '*_spec.rb', :unit_tests do |style|
|
12
|
+
style.max_line_length 90, level: :warn
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
...which is equivalent to:
|
17
|
+
|
18
|
+
Tailor.config do |config|
|
19
|
+
config.file_set '*/**/*_spec.rb', :unit_tests do |style|
|
20
|
+
style.max_line_length 90, level: :warn
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
* gh-107[https://github.com/turboladen/tailor/issues/107]
|
25
|
+
* Fixed --no-color option.
|
26
|
+
* gh-108[https://github.com/turboladen/tailor/issues/108]
|
27
|
+
* Fixed --create-config, which created style level options with a missing ':'
|
28
|
+
for the Hash value.
|
29
|
+
* Configuration files now don't force you to use the :default file set. If you
|
30
|
+
don't specify any file sets, then the default is used; if you specify file
|
31
|
+
sets, it uses what you specify.
|
32
|
+
* CLI options now override config file options for all file sets (previously,
|
33
|
+
only the :default file set's option would get overridden by the CLI option).
|
34
|
+
|
1
35
|
=== 1.0.1 2012-04-23
|
2
36
|
|
3
37
|
* gh-104: Fixed incorrect rendering of config file when using
|
data/README.rdoc
CHANGED
@@ -92,6 +92,12 @@ Check only files ending in .rb under the 'test' directory:
|
|
92
92
|
Check defaults (lib/**/*.rb):
|
93
93
|
|
94
94
|
$ tailor
|
95
|
+
|
96
|
+
Use defaults via a Rake task:
|
97
|
+
|
98
|
+
require 'tailor/rake_task'
|
99
|
+
|
100
|
+
Tailor::RakeTask.new
|
95
101
|
|
96
102
|
==== On style...
|
97
103
|
|
@@ -224,7 +230,7 @@ rulers caused the problem to be found.
|
|
224
230
|
Tailor.config do |config|
|
225
231
|
|
226
232
|
# All defaults; implies "default" label
|
227
|
-
config.file_set 'lib/**/*.rb
|
233
|
+
config.file_set 'lib/**/*.rb'
|
228
234
|
|
229
235
|
config.file_set 'app/**/*.rb', :rails_app do |style|
|
230
236
|
style.max_line_length 100
|
@@ -242,6 +248,16 @@ rulers caused the problem to be found.
|
|
242
248
|
end
|
243
249
|
end
|
244
250
|
|
251
|
+
If it suits you better, use "recursive file sets" to get all matching files
|
252
|
+
in your current path. If you wanted to critique all .rb files:
|
253
|
+
|
254
|
+
# .tailor
|
255
|
+
Tailor.config do |config|
|
256
|
+
|
257
|
+
# All defaults; implies "default" label
|
258
|
+
config.recursive_file_set '*.rb'
|
259
|
+
end
|
260
|
+
|
245
261
|
Similarly to the CLI, if you want to turn off a default Ruler, set its problem
|
246
262
|
level to +:off+:
|
247
263
|
|
data/features/valid_ruby.feature
CHANGED
data/lib/ext/string_ext.rb
CHANGED
data/lib/tailor/cli/options.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'erb'
|
2
2
|
require 'optparse'
|
3
3
|
require 'ostruct'
|
4
|
+
require 'term/ansicolor'
|
4
5
|
require 'text-table'
|
5
6
|
require_relative '../version'
|
6
7
|
require_relative '../configuration'
|
@@ -193,11 +194,17 @@ class Tailor
|
|
193
194
|
end
|
194
195
|
|
195
196
|
opts.parse!(args)
|
196
|
-
|
197
|
+
colorize
|
197
198
|
|
198
199
|
options
|
199
200
|
end
|
200
201
|
|
202
|
+
# Sets colors based on --[no-]color. If the terminal doesn't support
|
203
|
+
# colors, it turns colors off, despite the CLI setting.
|
204
|
+
def self.colorize
|
205
|
+
Term::ANSIColor.coloring = @output_color ? STDOUT.isatty : false
|
206
|
+
end
|
207
|
+
|
201
208
|
# @return [String]
|
202
209
|
def self.banner
|
203
210
|
ruler + about + "\r\n" + usage + "\r\n"
|
@@ -251,7 +258,7 @@ tailor --show-config
|
|
251
258
|
File.dirname(__FILE__) + '/../tailorrc.erb')
|
252
259
|
formatters = Tailor::Configuration.default.formatters
|
253
260
|
file_list = 'lib/**/*.rb'
|
254
|
-
style = Tailor::Configuration.
|
261
|
+
style = Tailor::Configuration::Style.new.to_hash
|
255
262
|
default_config_file = ERB.new(File.read(erb_file)).result(binding)
|
256
263
|
File.open('.tailor', 'w') { |f| f.write default_config_file }
|
257
264
|
end
|
data/lib/tailor/configuration.rb
CHANGED
@@ -2,6 +2,7 @@ require_relative '../tailor'
|
|
2
2
|
require_relative 'logger'
|
3
3
|
require_relative 'runtime_error'
|
4
4
|
require_relative 'configuration/style'
|
5
|
+
require_relative 'configuration/file_set'
|
5
6
|
|
6
7
|
class Tailor
|
7
8
|
|
@@ -12,10 +13,13 @@ class Tailor
|
|
12
13
|
#
|
13
14
|
# It then basically represents a list of "file sets" and the rulers that
|
14
15
|
# should be applied against each file set.
|
16
|
+
#
|
17
|
+
# If a file list is given from the CLI _and_ a configuration file is
|
18
|
+
# given/found, tailor uses the style settings for the default file set and
|
19
|
+
# only checks the default file set.
|
15
20
|
class Configuration
|
16
21
|
include Tailor::Logger::Mixin
|
17
22
|
|
18
|
-
DEFAULT_GLOB = 'lib/**/*.rb'
|
19
23
|
DEFAULT_RC_FILE = Dir.home + '/.tailorrc'
|
20
24
|
DEFAULT_PROJECT_CONFIG = Dir.pwd + '/.tailor'
|
21
25
|
|
@@ -33,110 +37,138 @@ class Tailor
|
|
33
37
|
# @option options [Array] formatters
|
34
38
|
# @option options [Hash] style
|
35
39
|
def initialize(runtime_file_list=nil, options=nil)
|
36
|
-
@style = Style.new
|
37
40
|
@formatters = ['text']
|
38
|
-
@file_sets = {
|
39
|
-
default: {
|
40
|
-
file_list: file_list(DEFAULT_GLOB),
|
41
|
-
style: @style.to_hash
|
42
|
-
}
|
43
|
-
}
|
44
|
-
|
41
|
+
@file_sets = {}
|
45
42
|
@runtime_file_list = runtime_file_list
|
46
43
|
log "Got runtime file list: #{@runtime_file_list}"
|
44
|
+
|
47
45
|
@options = options
|
48
46
|
log "Got options: #{@options}"
|
47
|
+
|
48
|
+
unless @options.nil?
|
49
|
+
@config_file = @options.config_file unless @options.config_file.empty?
|
50
|
+
end
|
49
51
|
end
|
50
52
|
|
51
53
|
# Call this to load settings from the config file and from CLI options.
|
52
54
|
def load!
|
53
|
-
|
54
|
-
|
55
|
-
load_from_config_file(config_file) if config_file
|
55
|
+
if config_file
|
56
|
+
load_from_config_file(config_file)
|
56
57
|
|
57
|
-
|
58
|
-
if @rc_file_config
|
58
|
+
if @config_from_file
|
59
59
|
get_formatters_from_config_file
|
60
|
-
|
60
|
+
#get_file_sets_from_config_file unless @runtime_file_list
|
61
|
+
get_file_sets_from_config_file
|
61
62
|
end
|
63
|
+
else
|
64
|
+
log "Creating default file set..."
|
65
|
+
@file_sets = { default: FileSet.new(@runtime_file_list) }
|
62
66
|
end
|
63
67
|
|
64
68
|
get_formatters_from_cli_opts
|
65
|
-
|
69
|
+
get_file_sets_from_cli_opts
|
66
70
|
get_style_from_cli_opts
|
71
|
+
end
|
72
|
+
|
73
|
+
# Tries to open the file at the path given at +config_file+ and read in
|
74
|
+
# the configuration given there.
|
75
|
+
#
|
76
|
+
# @param [String] config_file Path to the config file to use.
|
77
|
+
def load_from_config_file(config_file)
|
78
|
+
user_config_file = File.expand_path(config_file)
|
67
79
|
|
68
|
-
if
|
69
|
-
|
80
|
+
if File.exists? user_config_file
|
81
|
+
log "Loading config from file: #{user_config_file}"
|
82
|
+
|
83
|
+
begin
|
84
|
+
@config_from_file = instance_eval(File.read(user_config_file), user_config_file)
|
85
|
+
log "Got new config from file: #{user_config_file}"
|
86
|
+
rescue LoadError => ex
|
87
|
+
raise Tailor::RuntimeError,
|
88
|
+
"Couldn't load config file: #{user_config_file}"
|
89
|
+
end
|
90
|
+
else
|
91
|
+
log "No config file found at #{user_config_file}."
|
70
92
|
end
|
71
93
|
end
|
72
94
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
log "file set: #{file_set}"
|
95
|
+
# @return [String] Name of the config file to use.
|
96
|
+
def config_file
|
97
|
+
return @config_file if @config_file
|
77
98
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
99
|
+
if File.exists?(DEFAULT_PROJECT_CONFIG)
|
100
|
+
return @config_file = DEFAULT_PROJECT_CONFIG
|
101
|
+
end
|
102
|
+
|
103
|
+
if File.exists?(DEFAULT_RC_FILE)
|
104
|
+
return @config_file = DEFAULT_RC_FILE
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def get_file_sets_from_config_file
|
109
|
+
return if @config_from_file.file_sets.empty?
|
110
|
+
|
111
|
+
@config_from_file.file_sets.each do |label, file_set|
|
112
|
+
log "label: #{label}"
|
113
|
+
log "file set file list: #{file_set[:file_list]}"
|
114
|
+
log "file set style: #{file_set[:style]}"
|
115
|
+
|
116
|
+
if @file_sets[label]
|
117
|
+
log "label already exists. Updating..."
|
118
|
+
@file_sets[label].update_file_list(file_set[:file_list])
|
119
|
+
@file_sets[label].update_style(file_set[:style])
|
120
|
+
else
|
121
|
+
log "Creating new label..."
|
122
|
+
@file_sets[label] =
|
123
|
+
FileSet.new(file_set[:file_list], file_set[:style])
|
88
124
|
end
|
89
125
|
end
|
90
126
|
end
|
91
127
|
|
92
128
|
def get_formatters_from_config_file
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
129
|
+
return if @config_from_file.formatters.empty?
|
130
|
+
|
131
|
+
@formatters = @config_from_file.formatters
|
132
|
+
log "@formatters is now #{@formatters}"
|
97
133
|
end
|
98
134
|
|
99
135
|
def get_style_from_cli_opts
|
100
|
-
|
101
|
-
|
136
|
+
return unless @options && @options.style
|
137
|
+
|
138
|
+
@options.style.each do |property, value|
|
139
|
+
@file_sets.keys.each do |label|
|
102
140
|
if value == :off || value == "off"
|
103
|
-
@file_sets[
|
141
|
+
@file_sets[label].style[property][1] = { level: :off }
|
104
142
|
else
|
105
|
-
@file_sets[
|
143
|
+
@file_sets[label].style[property][0] = value
|
106
144
|
end
|
107
145
|
end
|
108
146
|
end
|
109
147
|
end
|
110
148
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
149
|
+
# If any files are given from the CLI, this gets that list of files and
|
150
|
+
# replaces those in any :default file set.
|
151
|
+
def get_file_sets_from_cli_opts
|
152
|
+
return if @runtime_file_list.nil? || @runtime_file_list.empty?
|
153
|
+
|
154
|
+
# Only use options set for the :default file set because the user gave
|
155
|
+
# a different set of files to measure.
|
156
|
+
@file_sets.delete_if { |k, v| k != :default }
|
157
|
+
|
158
|
+
if @file_sets.include? :default
|
159
|
+
@file_sets[:default].file_list = @runtime_file_list
|
160
|
+
else
|
161
|
+
@file_sets = { default: FileSet.new(@runtime_file_list) }
|
117
162
|
end
|
118
163
|
end
|
119
164
|
|
120
165
|
def get_formatters_from_cli_opts
|
121
|
-
unless @options.formatters.empty? || @options.formatters.nil?
|
166
|
+
unless @options.nil? || @options.formatters.empty? || @options.formatters.nil?
|
122
167
|
@formatters = @options.formatters
|
123
168
|
log "@formatters is now #{@formatters}"
|
124
169
|
end
|
125
170
|
end
|
126
171
|
|
127
|
-
# @return [String] Name of the config file to use.
|
128
|
-
def config_file
|
129
|
-
return @config_file if @config_file
|
130
|
-
|
131
|
-
if File.exists?(DEFAULT_PROJECT_CONFIG)
|
132
|
-
return @config_file = DEFAULT_PROJECT_CONFIG
|
133
|
-
end
|
134
|
-
|
135
|
-
if File.exists?(DEFAULT_RC_FILE)
|
136
|
-
return @config_file = DEFAULT_RC_FILE
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
172
|
# @return [Array] The list of formatters.
|
141
173
|
def formatters(*new_formatters)
|
142
174
|
@formatters = new_formatters unless new_formatters.empty?
|
@@ -146,106 +178,27 @@ class Tailor
|
|
146
178
|
|
147
179
|
# Adds a file set to the list of file sets in the Configuration object.
|
148
180
|
#
|
149
|
-
# @param [String]
|
150
|
-
# can be a file, directory, or a glob.
|
181
|
+
# @param [String] file_expression The String that represents the file set. This
|
182
|
+
# can be a file, directory, or a (Ruby Dir) glob.
|
151
183
|
# @param [Symbol] label The label that represents the file set.
|
152
|
-
def file_set(
|
184
|
+
def file_set(file_expression='lib/**/*.rb', label=:default)
|
153
185
|
log "file sets before: #{@file_sets}"
|
154
186
|
log "file set label #{label}"
|
155
|
-
|
156
187
|
new_style = Style.new
|
157
188
|
|
158
|
-
if block_given?
|
159
|
-
yield new_style
|
160
|
-
|
161
|
-
if @file_sets[label]
|
162
|
-
@file_sets[label][:style].merge! new_style
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
if @file_sets[label]
|
167
|
-
@file_sets[label][:file_list].concat file_list(file_glob)
|
168
|
-
@file_sets[label][:file_list].uniq!
|
169
|
-
else
|
170
|
-
@file_sets[label] = {
|
171
|
-
file_list: file_list(file_glob),
|
172
|
-
style: @style.to_hash.merge(new_style)
|
173
|
-
}
|
174
|
-
end
|
189
|
+
yield new_style if block_given?
|
175
190
|
|
191
|
+
@file_sets[label] = FileSet.new(file_expression, new_style)
|
176
192
|
log "file sets after: #{@file_sets}"
|
177
193
|
end
|
178
194
|
|
179
|
-
#
|
180
|
-
#
|
181
|
-
#
|
182
|
-
# @param [String] config_file Path to the config file to use.
|
183
|
-
def load_from_config_file(config_file)
|
184
|
-
user_config_file = File.expand_path(config_file)
|
185
|
-
|
186
|
-
if File.exists? user_config_file
|
187
|
-
log "Loading config from file: #{user_config_file}"
|
188
|
-
|
189
|
-
begin
|
190
|
-
config = instance_eval File.read(user_config_file)
|
191
|
-
rescue LoadError => ex
|
192
|
-
raise Tailor::RuntimeError,
|
193
|
-
"Couldn't load config file: #{user_config_file}"
|
194
|
-
end
|
195
|
-
else
|
196
|
-
log "No config file found at #{user_config_file}."
|
197
|
-
end
|
198
|
-
|
199
|
-
if config
|
200
|
-
log "Got new config from file: #{config}"
|
201
|
-
@rc_file_config = config
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
# Gets a list of only files that are in +base_dir+.
|
206
|
-
#
|
207
|
-
# @param [String] base_dir The directory to get the file list for.
|
208
|
-
# @return [Array<String>] The List of files.
|
209
|
-
def all_files_in_dir(base_dir)
|
210
|
-
files = Dir.glob(File.join(base_dir, '**', '*')).find_all do |file|
|
211
|
-
file if File.file?(file)
|
212
|
-
end
|
213
|
-
|
214
|
-
files
|
215
|
-
end
|
216
|
-
|
217
|
-
# The list of the files in the project to check.
|
195
|
+
# A helper to #file_set that allows you to specify '*.rb' to get all files
|
196
|
+
# ending with +.rb+ in your current path and deeper.
|
218
197
|
#
|
219
|
-
# @param [String]
|
220
|
-
# @
|
221
|
-
def
|
222
|
-
|
223
|
-
log "Configured glob is an Array: #{glob}"
|
224
|
-
|
225
|
-
glob.map do |e|
|
226
|
-
if File.directory?(e)
|
227
|
-
all_files_in_dir(e)
|
228
|
-
else
|
229
|
-
e
|
230
|
-
end
|
231
|
-
end.flatten.uniq
|
232
|
-
elsif File.directory? glob
|
233
|
-
log "Configured glob is an directory: #{glob}"
|
234
|
-
all_files_in_dir(glob)
|
235
|
-
else
|
236
|
-
log "Configured glob is a glob/single-file: #{glob}"
|
237
|
-
Dir.glob glob
|
238
|
-
end
|
239
|
-
|
240
|
-
list_with_absolute_paths = []
|
241
|
-
|
242
|
-
files_in_project.each do |file|
|
243
|
-
list_with_absolute_paths << File.expand_path(file)
|
244
|
-
end
|
245
|
-
|
246
|
-
log "All files: #{list_with_absolute_paths}"
|
247
|
-
|
248
|
-
list_with_absolute_paths.sort
|
198
|
+
# @param [String] file_expression The expression to match recursively.
|
199
|
+
# @param [Symbol] label The file set label to use.
|
200
|
+
def recursive_file_set(file_expression, label=:default)
|
201
|
+
file_set("*/**/#{file_expression}", label)
|
249
202
|
end
|
250
203
|
|
251
204
|
# Displays the current configuration as a text table.
|